根据B站黑马程序员MySQL数据库整理,用于自查
DDL
全称Data Definition Language,数据定义语言,对数据库进行增删改查。
- create table/database [if not exists]表名/数据库名;
- drop table/database 表名/数据库名;
- truncate table 表名;
- alter table 表名 add 字段名 字段类型;
- alter table 表名 drop 字段名;
- alter table 表名 modify 字段名 字段类型(修改字段类型);
- alter table 表名 change 旧字段名 新字段名 新字段类型(修改字段名和字段类型);
- alter table 旧表名 rename to 新表名;
- show tables/databses;
- desc table 表名;
DML
全称Data Manipulation Language,数据操纵语言,对表中数据进行增删改。
- insert into 表名 (字段…) values(值…)
- insert into 表名 values (值…)
- insert into 表名 (字段…) values (值…),(值…)…
- insert into 表名 values (值…),(值…),…
- delete from 表名 where
- update 表名 set 字段=值,… where
DQL
全称Data Query Language,数据查询语言。
- where
- like ‘__’ 和 like ‘%’
- 解析顺序:自下而上
- 聚合函数
- max min count avg sum
- null不参与聚合函数运算
- select 聚合函数 from 表名
- 分组查询
- group by 字段名 having 条件
where和having区别:
where是group by前过滤,having是group by之后过滤;
where后不能加聚合函数,having后可以通过聚合函数过滤;
where中不可以使用select中的别名,having中可以使用别名。
eg. 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age<45 group by workaddress having address_count >= 3;
- 排序查询
- order by 默认asc
- 分页查询
- limit 要写在最后(编写顺序)
- select 字段列表 from 表名 limit 起始索引,查询记录数
语法顺序:select -> from -> where -> group by -> having -> order by -> limit
执行顺序:from -> where -> group by -> having -> select -> order by -> limit
DCL
全称Data Control Language,数据控制语言,管理用户。
- use / create / alter / drop
- 权限控制
- 查:show grants for ‘用户名’@‘主机名’
- 改/增:grant 权限 on 数据库名.表名 to ‘用户名’@‘主机名’
- 删:revoke 权限 on 数据库名.表名 to ‘用户名’@‘主机名’
函数
字符串函数
- concat(s1,s2,…)
- lower()/upper()
- lpad(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
- rpad(str,n,pad)右填充
- trim()
- substring(str,start,len) 将str从start位置(从1开始)起截取len个长度
数值函数
- ceil 向上取整
- floor向下取整
- mod 取模
- rand 0~1内随机数
- round(x,y) x四舍五入,保留y位小数
日期函数
- curdate()
- curtime()
- now()
- year(date)
- month(date)
- day(date)
- date_add(date,interval expr type)
- datediff(date1,date2) date1和date2相差的天数
流程函数
- if(value,t,f)
- ifnull(value1,value2)
- case when then end
约束
- 非空约束 not null
唯一约束 unique
主键约束 primary key, auto_increment
默认约束 dedault
检查约束 check(条件1 && || 条件2)
外键约束 foreign key referrnces 表名(主表列名) - 设置emp表外键dept_id,和dept表id关联,删除和更新时,删除和更新关联表中的数据
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade; - 设置emp表外键dept_id,和dept表id关联,删除时,关联表中的数据置为null
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on delete set null; - 删除外键
alter table emp drop foreign key fk_emp_dept_id;
多表查询
- select * from A,B(笛卡尔积)
- select * from A,B where … 等价于 select * from A inner join B on… (任何条件字段为空,这条数据都查询不到)
- Union 去重
Union all 不去重 - all/some/any
- 比财务部所有人工资都高的员工信息
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name=‘财务部’); - 比财务部任意一个工资高的员工信息
select * from emp where salary > any/some (select salary from emp where dept_id = (select id from dept where name=‘财务部’);
- 查询与’张三’,'李四’的职位和薪资相同的员工信息
select *from emp where (job,salary) in (select job,salary from emp where name=‘张三’ or name=‘李四’);
事务
事务是一组操作的集合,他是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功要么同时失败。
事务四大特性
原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性:事务完成时,必须所有数据都保持一致状态。
隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:事务一旦提交或回滚,它对数据库中的数据的改变是永久的。
事务操作
- MySQL数据库中默认自动提交,也可设置为手动提交 set @@autocommit = 0;
- 开启事务:start transaction 或begin
- 提交事务:commit;
- 回滚事务:rollback;
- 查看事务隔离级别:select @@transaction_isolation;
- 设置事务隔离级别:set transaction isolation level {read uncommitted | read committed | repeatable read | serializable};
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
mysql默认隔离级别是repeatable read,oracle是read committed
- 脏读:一个事务读到另外一个事务还没提交的数据。
- 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
- 幻读指并发插入、删除时,另一个事务前后执行相同条件的查询得到的数据不一致
隔离级别越高,安全性越高,并行度越低,付出的代价越大。