Mysql学习笔记
以下内容图片来自黑马程序员(黑马打钱)
SQL语法
-
DDL数据库操作
查询
查询所有数据库 show databases; 查询当前数据库 select database();
创建
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
删除
drop database [if exists] 数据库名;
使用
use 数据库名;
查询当前数据库所有表
show tables;
查询表结构
desc 表名;
查询制定表的建表语句
show create table 表名;
创建表
create table 表名( 字段1 字段1类型[comment 字段1注释], 字段2 字段2类型[comment 字段2注释], 字段3 字段3类型[comment 字段3注释], ... 字段n 字段n类型[comment 字段n注释] )[comment 表注释];
数据类型
数值类型
精度代表位数 标度代表小数点位数 123.45 M = 5, D = 2 double(5, 2);
字符类型
char(10) vachar(10) char 无论字符多大都会占用10字符空间 性能好 varchar 低于10字符会只存储和所存储字符大小一样的空间 性能较差
修改
alter table 表名 add 字段名 类型(长度) [comment 注释][约束];
修改数据类型
alter table 表名 modify 字段名 数据类型(长度);
修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释][约束];
删除字段
alter table 表名 drop 字段名;
修改表名
alter table 表名 rename to 新表名;
删除表
drop table [if exists] 表名;
删除指定表,并重新创建该表
truncate table 表名;
-
DML
添加数据
给指定字段添加数据
insert into 表名(字段名1,字段名2,……) values(值1,值2);
给全部字段添加数据
insert into 表名 values(值1,值2,……);
批量添加数据
insert into 表名(字段名1,字段名2,……) values (值1,值2,……),(值1,值2,……),(值1,值2,……);
insert into 表名 values (值1,值2,……),(值1,值2,……),(值1,值2,……);
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
字符串和日期型数据应该包含在引号中。
插入的数据大小,应该在字段的规定范围内。
修改数据
update 表名 set 字段名1 = 值1, 字段名2 = 值2, ……[where 条件];
删除数据
delete from 表名[where 条件];
delete语句的条件可以有也可以没有,如果没有条件,则会删除整张表的所有数据。
delete语句不能删除某一个字段的值(可以使用update)
-
DQL
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组字段列表 order by 排序字段列表 limit 分页参数
基本查询
查询多个字段
select 字段1, 字段2, 字段3…… from 表名;
设置别名
select 字段1[as 别名], 字段2[as 别名]…… from 表名;
去除重复记录
select distinct 字段列表 from 表名;
where条件查询
聚合函数
select 聚合函数(字段列表) from 表名;
null值不参与聚合函数运算。
分组查询
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
where 与 having 的区别
执行时机不同:where是分组之前进行过滤,不满足where条件不进行分组,而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
执行顺序:where > 聚合函数 > having
分组之后查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
排序查询
select 字段列表 from 表名 order by 字段1 排序方式1, 字段2 排序方式2……;
排序方式
asc升序 desc降序
如果是多字段排序,当第一个字段相同时,才会根据第二个字段排序。
分页查询
select 字段列表 from 表名 limit 起始索引, 查询记录数;
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页的显示数
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
执行顺序
from -> where -> group by/having -> select -> order by -> limit
-
DCL
查询用户
use mysql; select * from user;
创建用户
create user '用户名'@'主机名' identified by '密码';
修改用户密码
alter user '用户名'@'主机名' identified with mysql_navtive_password by '新密码';
删除用户
drop user '用户名'@'主机名';
权限控制
查询权限
show grants for '用户名'@'主机名';
授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
函数
-
字符串函数
字符串索引从1开始。 -
数值函数
-
日期函数
-
流程控制函数
-
约束
-
外键约束
添加外键
create table 表名( 字段名 数据类型, ……, [constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名) ); alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
删除外键
alter table 表名 drop foreign key 外键名称;
删除/更新行为
alter table 表名 add constraint 外键名称 foreign key(外键字段) references 主表名(主表字段名) on update cascade on delete cascade;
-
连接查询
隐式内连接
select 字段列表 from 表1, 表2 where 条件...;
显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件...;
自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;
联合查询
select 字段列表 from 表A... union [all] select 字段列表 from 表B...
union all会把所有结果查询出来
union会对查询结果进行去重
子查询
列子查询
事务
-
查看/设置事务提交方式
select @@autocommit; set @@autocommit = 0;
-
提交事务
commit;
-
回滚事务
rollback;
-
事务隔离