Nodejs的学习Ⅴ(node连接mysql、MySQL的语句)
⼀、node连接mysql和⼀些简单的操作
1、安装
npm install mysql // 安装
2、连接数据库
在以下实例中根据你的实际配置修改数据库⽤户名、及密码及数据库名:
const mysql =require('mysql');
let options ={
host:'localhost',
port:'3306',// 可选,默认是3306
user:'root',
password:'password_here',
database:'mysqldb'
};
let connection = ateConnection(options);// create链接
function mysqlQuery(sql, arr){
return new Promise((resolve, reject, fields)=>{
connection.query(sql, arr,(err, result)=>{// 数据查询
if(err){
reject(err)// 查询失败
}else{
console.log(fields);// 与查询的字段相关的信息
resolve(result)// 查询结果
}
})
})
}
3、创建表
let sqlStr =`create table student (
id int(3) primary key auto_increment comment '学号',
name varchar(10) not null default '',
age int(3) default 0,
gender varchar(10) not null,
habbies varchar(100)
)engine=InnoDB default charset=utf8`;
connection.query(sqlStr,function(error, results, fields){
if(error)throw error;
console.log('The result is: ', results);
console.log(fields);
});
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 但不能在操作数据库时如果输⼊该字段
的数据为NULL ,因为会报错。AUTO_INCREMENT定义列为⾃增的属性,⼀般⽤于主键,数值会⾃动加1。
PRIMARY KEY关键字⽤于定义列为主键。 您可以使⽤多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
4、插⼊数据
let sqlStr =`insert into student (id, name, age, gender, habbies) values (?, ?, ?, ?, ?)`;
思莱德the editlet sqlData =[1,'李⽼板',40,'male',''];
connection.query(sqlStr, sqlData,function(error, results, fields){
if(error)throw error;
console.log('The result is: ', results);
// console.log(fields);
});
5、更改数据
let sqlStr =`update student set age = ? where id = ?`;
let sqlData =[20,1];
6、删除数据表内的某条数据
delete from student where id =6;
7、删除数据库
drop database <;数据库名>;
8、删除数据表
drop table table_name ;
9、切换数据库
use mysqldb;
10、MySQL 数据类型
数值类型
tinyint:1 字节,有符号范围(-128,127), ⽆符号范围(0,255)
smallint:2 字节,有符号范围(-32 768,32 767), ⽆符号范围(0,65 535)
integer或int:4 字节,有符号范围(-2 147 483 648,2 147 483 647), ⽆符号范围(0,4 294 967 295)
bigint:8 字节,有符号范围(-9,223,372,036,854,775,808,9 223 372 036 854 775 807), ⽆符号范围(0,18 446 744 073 709 551 615)
double:8 字节
float:4 字节
⽇期和时间类型
date:3字节,范围(1000-01-01/9999-12-31),格式YYYY-MM-DD
time:3字节,范围( ‘-838:59:59’/‘838:59:59’),格式 HH:MM:SS
mysql case whenyear:1字节,范围( 1901/2155),格式YYYY
datetime:8字节,范围( 1000-01-01 00:00:00/9999-12-31 23:59:59),格式YYYY-MM-DD HH:MM:SS
字符串类型
char:⼤⼩ 0-255字节,⽤于定长字符串
varchar:⼤⼩0-65535 字节,⽤于 变长字符串
text:⼤⼩0-65 535字节,⽤于长⽂本数据
longtext:⼤⼩0-4 294 967 295字节,⽤于极⼤⽂本数据
blob:⼤⼩0-65 535字节,⽤于 ⼆进制形式的长⽂本数据
11、查询语句
注意查询的结果是⼀个数组(不是类数组),⽽⾥⾯的每个值⼜为对象,所以传输数据时需要把数组转化为JSON格式的字符串
select *from student;
12、去重
distinct,要注意的是,DISTINCT短语的作⽤范围是所有列
/*正确写法*/
select DISTINCT cno, grade from sc;
/*错误写法*/
select DISTINCT cno,DISTINCT grade from sc;
⼆、SELECT的语句(WHERE)
前端开发菜鸟教程where ⽤于 引出查询条件,常⽤的查询条件:
⽐较:=,>,<,>=,<=,!=,<>,!>,!<,not
确定范围:between … and,not between … and
确定集合:in,not in
字符匹配:like,not like
空值:is null,is not null
多重条件:and,or,not
条件嵌入式硬件开发培训
等于 = ,⼤于 >,⼤于等于 >=,⼩于 < ,⼩于等于 <= ,不等于 !=或<>
select *from students where sname <>'黄蓉';// 查询姓名不是“黄蓉”的学⽣
逻辑运算符
and,or,not
mysql语句分类select *from students where id>3 and gender=0;// 查询编号⼤于3的⼥同学
select *from students where id<4 or isdelete=0;// 查询编号⼩于4或没被删除的学⽣
模糊查询
like
% 表⽰任意多个任意字符
_ 表⽰⼀个任意字符
但是 当选要查询的内容本⾝就有“-”或者“%” 的时候就需要使⽤escape(逃避),可以理解为 “\”本⾝没有特殊含义 ,但当 “\”出现在待查询内容时,会被当成普通字符,⽽不是转义字符,这时 需要使⽤escape来避免读取“\” ,以达到可以⽤于转义字符的⽬的
/*普通情况*/
select *from students where sname like '黄%';// 查询姓黄的学⽣
select *from students where sname like '黄_';// 查询姓黄并且名字是⼀个字的学⽣
/*当查询条件本⾝有特殊内容时*/
select *from coures where cname like 'DB\_%' escape '\';// 查询以“DB_”开头的内容
范围查询
in表⽰在⼀个⾮连续的范围内, in中的⼦查询只能包含⼀个列
between … and … 表⽰在⼀个连续的范围内
select *from students where id in(1,3,8);// 查询编号是1或3或8的学⽣
select *from students where id between 3 and 8;// 查询学⽣是3⾄8的学⽣
select name from emp where dept_id in(select id from dept where name ="财务");// 正确的写法
select name from emp where dept_id in(select *from dept where name ="财务");// 错误的写法
空判断
注意:null与 空字符(‘’) 是不同的,判空is null,判⾮空is not null,⽽不能是“= null”
select *from students where hometown is null;// 查询没有填写地址的学⽣
select *from students where hometown is not null;// 查询填写了地址的学⽣
优先级
⼩括号,not,⽐较运算符,逻辑运算符,and⽐or先运算,如果同时出现并希望先算or,需要结合()使⽤
还要注意的是where中不能出现集函数
/*正确*/
select sno,avg(grade)from sc where grade group by sno;
/*错误*/
select sno,avg(grade)from sc where avg(grade)>=80 group by sno;// 出现了cno(⾮集函数或者分组属性)
三、SELECT的语句(ORDER BY)
排序
asc从⼩到⼤排列,即升序(默认),desc从⼤到⼩排序,即降序
select *from表名// 将⾏数据按照列1进⾏排序,如果某些⾏列1的值相同时,则按照列2排序,以此类推
order by 列1 asc|desc,列2 asc|desc,...
select *from students // 查询未删除男⽣学⽣信息,按学号降序
where gender=1 and isdelete=0
order by id desc;
四、SELECT的语句(GROUP BY)
按照字段分组,表⽰此字段相同的数据会被放到⼀个组中,可以对分组后的数据进⾏统计,做聚合运算或筛选select gender as性别,count(*)// 查询男⼥⽣各位多少
from students
group by gender;
select gender as性别,count(*)// 查询男⽣总⼈数(男⽣标识符位1)
from students
group by gender
having gender=1;
且当在使⽤了group by⼦句后,select⼦句的列名列表中只能出现分组属性和集函数
/*正确*/
select sno,avg(grade)from sc group by sno;
/*错误*/
select sno, cno,avg(grade)from sc group by sno;// 在select后⾯出现了cno(⾮集函数或者分组属性)
还有在having后⾯只能出现集函数或者分组属性
且当select⾥⾯有having时,则必有group by
/*正确*/
select sno,avg(grade)from sc group by sno having avg(grade)>=80;
/*错误*/
select sno,avg(grade)from sc group by sno having grade >=80;// 在having后出现了grade(⾮集函数或者分组属性)五、MySQL的语法(函数)
当select语句未分组时,函数针对整个查询结果;但是当有分组时,函数将作⽤每个分组
聚合函数
count():表⽰计算总⾏数,括号中写星与列名,结果是相同的
select count(*)from students;// 查询学⽣总数
max():表⽰求此列的最⼤值
select max(id)from students where gender=0;// 查询⼥⽣的编号最⼤值
min():表⽰求此列的最⼩值
select min(id)from students where isdelete=0;// 查询未删除的学⽣最⼩编号
sum():表⽰求此列的和
select sum(id)from students where gender=1;// 查询男⽣的编号之后
avg():表⽰求此列的平均值
select avg(id)from students where isdelete=0 and gender=0;// 查询未删除⼥⽣的编号平均值
六、MySQL的其他内容
mysql中的SQL语句执⾏顺序
from => on => join => where => group by => with => having => select => distinct => order by => limit
⼀条SQL会经过这11步的,中间的每⼀步都会⽣成⼀张虚拟表,后⾯的步骤都是在上⼀张虚拟表中进⾏筛选与查询的
别名
split用法吃select ssex sgender form student;// 给ssex设置别名为sgender
select ssex as sgender form mytable;// 给ssex设置别名为sgender
对⽐where与having
where是对from后⾯指定的表进⾏数据筛选,属于对原始数据的筛选
having是对group by的结果进⾏筛选
update和alter之间的区别
alter⽤来修改基本表,是对表的结构进⾏操作,⽐如对字段增加,删除,修改类型
update⽤来修改表中的数据,修改某⼀⾏某⼀列的值
delete 和drop 之间的区别
drop 会把表数据和表结构⼀起删除
delete 仅仅删除表数据
分页
当数据量过⼤时,在⼀页中查看数据是⼀件⾮常⿇烦的事情,分页可以解决这个问题
select *from表名// 从start开始,获取count条数据,start索引从0开始
limit start,count
范式⽬的
为了更好的分开每个表的职能,减少数据冗余,以及避免发⽣修改异常,新增异常,删除异常等等
在 关系数据库模型 设计中,如果⼀个表具有良好的主外键设计,就应该是满⾜3NF的表。规范化带来的好处是通过减少数据冗余提⾼更新数据的效率,同时保证数据完整性。然⽽,我们在实际应⽤中也要防⽌过度规范化的问题。规范化程度越⾼,划分的表就越多,在查询数据时越有可能使⽤表连接操作。⽽如果连接的表过多,会影响查询性能。关键的问题是要依据业务需求,仔细权衡数据查询和数据更新关系,指定最合适的规范化程度。不要为了遵循严格的规范化规则⽽修改业务需求
第⼀范式(1NF)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论