一、 建表Tables
column: 列名称
dateType:这一列的类型(int整数类型、varchar字符串类型 varchar(20)值的最大长度是20、longtext可以存储很大数据,最多可存储4G大小、bigint用来存储更大数据的整数类型)
pk主键:这一列的值不能重复(主键的意思就是保证不能重复)如何保证不能重复呢?
AI自动增加:设置为Y
nn不为空:这一列的值是不是允许为空(Y是不允许为空)
Default: 默认值
修改表:图形界面表名右键选择Alter Table
二、操作表(增删改查)
1.想要操作数据库,首先先use这个数据库,然后执行这个语句
use 数据库名;
2.显示所有数据库的表
show tables;
注释的写法 --
-- show tables;
3.给users表增加数据 insert into 表名 (列名) values (数据);
insert into users (username, `password`, realname) values ('zhangsan','123','张三');
- 批量插入:
insert into test_table (name, age, sex) values ('张三', 18, '男'), ('李四',16,'女'), ('王五',19,'女')
- 查询
- 查询全部
select * from users;
出于性能考虑,一般情况下,避免使用*
- 查询部分
select 列名 from 表
select id, username from users;
- 加查询条件 (后面加
where条件)
select * from users where username='zhangsan';
- 多个查询条件(
where条件1and条件2)
(where条件1or条件2)
select * from users where username='zhangsan' and `password`='123';
- 模糊查询
like
select * from users where username like '%zhang%';
- 排序
order by默认正序,加desc后是倒序
select * from users where password like '%1%' order by id desc;
- 更新
update表名set值where条件
update users set realname='李四' where username='lisi';
若执行update报错,则需执行下面的语句,执行完删除,重新执行刚才的update语句
SET SQL_SAFE_UPDATES = 0;
6.删除 delete from 表名 where 条件
一般删除是软删除,不会直接使用delete,而是使用update
- 比如加一列state状态,是1的话存在,0的话删除
update users set state='0' where username='lisi';
select * from users where state='1';
- 如果想要查询state不等于0,使用
<>
select * from users where state <> '0';
三、nodejs连接数据库
- 下载mysql包
npm i mysql -S
- 引用
const mysql = require('mysql')
3.配置并连接数据库
// 创建链接对象
const con = mysql.createConnection({
// 配置
})
// 开始连接
con.connect()
4.执行sql
const sql = `select * from users`;
con.query(sql, (err, result) => {
if (err) {
return
}
console.log(result)
})
四、工作中遇到的一些sql 关键字的意思:
as 作为(列或表的)别名(可省略)
Coalesce(A,B)相当于三目表达式,如果A不为null返回A,否则如果B不为null返回B,否则返回null
distinct去重
in查询满足指定范围内的数据
select column1, column2 from table where column1 in (value1, value2, value3)
between .... and ...:查询某个范围内的值
select * from table where column between value1 and value2
to_char(A, B)把A转成B格式的字符串
inner join ...on...
根据on的条件将两个表链接起来,当两表同时满足链接的条件,满足的部分才会列出
left join返回左表的全部行和右表满足on条件的行
// Table A是左边的表,Table B是右边的表
select * from Table A left join Table B
on Table A.id=Table B.id
right join返回右表的全部行和左表满足on条件的行
// Table A是左边的表,Table B是右边的表
select * from Table A right join Table B
on Table A.id=Table B.id
不等于 <> 或者!=
like +通配符字符串:模糊查询
mysql通配符有两个:
%:表示0个或多个字符(任意个字符)
_ : 表示一个字符
order by 子句进行排序 ,默认是升序
order by 字段名 asc(升序
order by 字段名 desc(降序
组合排序:就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推
select * from 表名 where 字段= 值 order by 字段名1 asc,字段名2 desc;
聚合函数:
之前所做的查询都是横向查询,它们都是根据条件一行一行进行判断。而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值
五个聚合函数:count sum max min avg
聚合函数写在select后字段名的地方:
Select 字段名 from 表名
Select count(age) from 表名;
// 统计所有数据个数:
select count(*) from 表名;
分组查询:
使用group by语句对查询信息进行分组,将分组字段结果中相同内容作为一组;
Select 字段1,字段2 from 表名 group by 分组字段 having 条件;
Select * from 表名 group by sex;
这句话会将sex相同的数据作为一组,但是会返回每组的第一条,没有任何意义;
分组的目的就是为了统计,一般分组查询会跟聚合函数一起搭配使用;
分组后聚合函数不是操作所有数据,而是操作一组数据。
select sum(score), sex from 表名 group by sex;
注意:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪个组的
where是分组前的条件,分组后的过滤条件使用having;
Select count(*), sex from hero where age < 30 group by sex having count(*) > 2;
having和where的区别:
- having在分组后对数据进行过滤
- where是在分组前对数据进行过滤
- having后面可以使用聚合函数
- where后面不可以使用聚合函数
limit:限制查询记录的条数 limit offset, length 或者 limit length(只适用第一页);
offset指的是偏移量,可以认为是跳过的记录数量,默认为0
length是指需要显示的总记录数
select 字段列表 [as 别名] from 表名 [where子句] [group by子句] [having子句] [order by子句] [limit子句];
case when ... then ... else ... End
case when 条件A then A when条件B then B when条件C then C else D end相当于if else语句
select name, (case when score < 60 then 'fail' when score >=60 and score < 80 then 'pass' else 'fine' end) as grade from table
sql中除了数值类型,其他字段类型的值必须使用引号引起,建议单引号
desc 表名:查看表结构
子查询就是在主select 里面套select from, 相当于从一个结果集里面去查询。子查询一般都写在括号里面,然后在括号外面用as接收这个子查询出来的值