目录
1、数据查询语言(DQL)
1.1、基础查询(SELECT)
sql
#全列查询
select * from students;
#指定列查询
select id ,name from students;
#查询字段为表达式
select id,name,chinese+math+english from students;
#为查询结果去别名
select id,name.chinese+math+english as(可以省略) 总分 from students;
#查询结果去重
select distinct math from students;
1.2、进阶查询
1.2.1、条件查询
比较运算符

逻辑运算符

sql
#查询总分大于200的同学
#这是错误的写法,因为前面的select是挑选最终要显示哪些列(列级筛选),where是筛选数据(行级筛选),顺序是先筛选出来再选择要显示哪些列,所以不认识'总分'
select name,chinese+math+enlish 总分 from student where 总分>200;
#正确写法
select name,chinese+math+english 总分 from student where chinese+math+english>200;
1.2.2、排序与分页
排序(ORDER BY)
sql
#ASC 为升序排序
#DESC 为降序排序
#默认是ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
实例:
select name,math from students order by math;
#注意排序时,如果涉及到NULL,认为NULL比任何值都要小
#查询学生的总分,由高到低显示
#这里的顺序是数据先选择要显示哪些列,再对选择的数据按指定列排序,所以认识'总分'
select name,chinese+math,english 总分 from students order by 总分 desc;
分页(LIMIT)
sql
#起始下标为0
#从0开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
#从s开始,筛选n条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
或
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
1.2.3、聚合函数与分组
聚合函数
只使用聚合函数查询时,指定查询的列不能出现没有参与聚合函数运算过程的列

分组(GROUP BY + HAVING )
分组和聚合函数同时使用时,指定查询的列可以出现分组的列
sql
select column1, column2, .. from table group by column;
#若在分组之后,还有筛选数据的条件,则搭配having使用,where不行
实例:查询员工表中,平均工资低于2000的部门和其平均工资
select deptno,avg(sal) mysal from emp group by deptno having mysal<2000;
1.2.4、多表查询
连接查询:
1.内连接:内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选
sql
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件
2.左外连接:左外连接:如果联合查询时,左侧的表完全显示我们就说是左外连接
sql
select 字段 from 表1 left join 表2 on 连接条件
3.右外连接:如果联合查询时,右侧的表完全显示我们就说是右外连接
sql
select 字段 from 表1 right join 表2 on 连接条件
4.子查询:嵌套在另一个sql语句中的SELECT语句
单行子查询
sql
SELECT name FROM user WHERE id = (SELECT MAX(id) FROM user);
多行子查询
·in关键字
sql
#查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
select ename,job,sal,deptno from emp
where job in (select distinct job from emp where deptno=10) and deptno<>10;
·all关键字
sql
#显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP
where sal > all(select sal from EMP where deptno=30);
·any关键字
sql
#显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
select ename, sal, deptno from EMP
where sal > any(select sal from EMP where deptno=30);
多列子查询
sql
#查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
select ename from EMP where (deptno, job)=
(select deptno, job from EMP where ename='SMITH') and ename <> 'SMITH';
1.2.5、合并查询
union:用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
sql
#将工资大于2500或职位是MANAGER的人找出来
select ename, sal, job from EMP where sal>2500 union
select ename, sal, job from EMP where job='MANAGER';
union all:与union的唯一区别时,不会去掉结果集中的重复行
MySQL中查询各个关键字的执行顺序
from>on>join>where>group by>with>having>select>distinct>order by>limit
2、数据控制语言(DCL)
2.1、用户管理
MySQL中的用户,都存储在系统数据库mysql的user表中
可以通过SELECT来查询用户相关信息,包括host、user、authentication_string、*_priv
字段解释:
host:表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
user:用户名
authentication_string:用户密码通过password函数加密后的
*_priv:用户拥有的权限
2.1.1、创建用户
sql
create user '用户名'@'登录主机/ip' identified by '密码'
2.1.2、删除用户
sql
drop user '用户名'@'主机名'
2.1.3、修改用户密码
sql
#修改自己的密码
set password=password('新密码')
#root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新密码')
2.2、权限管理
2.2.1、授权给用户
sql
#权限列表,多个权限之间用逗号隔开
grant 权限列表 on 库.对象名 to '用户名'@'主机名' [identified by '密码'];
#查看指定用户的现有权限
show grants for '用户名'@'主机名';
2.2.2、回收权限
sql
revoke 权限列表 on 库.对象名 from '用户名'@'主机名'
2.2.3、刷新权限
sql
#修改权限后执行
flush privileges;
3、事务控制语言(TCL)
3.1、事务的概念及特性
3.1.1、事务的概念
事务的概念:事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部 失败,是一个整体。事务可以是多条sql语句,也可以是一条。
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
3.1.2、ACID特性
1.原子性:事务要么全执行,要么全不执行
2.一致性:事务执行前后数据状态合法
3.隔离性:多个事务并发执行时互不干扰
4.持久性:事务提交后,修改用久保存到磁盘
3.2、隔离级别
MySQL服务可能会同时被多个客户端进程(线程)访问,访问方式以事务的方式进行。为了保证事务执行过程中尽量不受到干扰,就有了一个重要特征:隔离性。同时为了允许事务受到不同程度的干扰,就有了隔离级别。
3.2.1、查看隔离级别
sql
#查看全局隔离级别
select @@global.transaction_isolation;
#查看会话(当前)隔离级别
select @@session.transaction_isolation;
select @@transaction_isolation;
3.2.2、设置隔离级别
sql
#设置全局的隔离级别 当前会话不会立即生效,需要退出重新登录才会生效
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
#设置会话的隔离级别,仅当前连接生效,关闭连接后失效
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
3.2.3、隔离级别类型
1.读未提交(READ UNCOMMITED)
在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。会有脏读、幻读、不可重复读等问题,同时不会加锁读。
2.读提交(READ COMMITED)
在该隔离级别,一个事务只能看到其他的已经提交的事务所做的改变。会有不可重复读、幻读问题,同时不会加锁读。
3.可重复读(REPEATABLE READ)
这是MySQL的默认隔离级别,它确保同一事务,在执行中多次读取操作数据时,会看到同样的数据行。会有幻读问题(insert的时候),同时不会加锁读。
4.串行化(SERIALIZABLE)
通过强制事务排序,使之不可能相互冲突。会加锁读,同时会产生超时和锁竞争问题。
3.3、并发问题
1.脏读:读取到其他事务未提交的修改
2.不可重复读:同一事务内多次查询同一数据,结果不同(其他事务修改并提交)
3.幻读:同一事务内多次执行统一查询,结果行数不同(其他事务插入/撒谎从删除并提交)
3.4、事务的操作
3.4.1、事务的开启
sql
START TRANSACTION(或 BEGIN)
3.4.2、事务的提交
事务的提交方式分为:自动提交、手动提交
1.查看事务的提交方式以及修改事务的提交方式
sql
#查看事务的提交方式
show variables like 'autocommit';
#修改事务的提交方式
set autocommit=值 (0表示禁止自动提交,1表示开启自动提交)
#若禁止自动提交,则需要commit方式手动提交
commit;
3.4.3、事务的回滚
sql
#回滚到指定的保存点
rollback to '保存点'
#回滚到最初的状态
rollback
3.4.4、设置保存点
sql
savepoint 保存点名字;
结论:
只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。
事务InnoDB每一条SQL语言都默认封装成事务,自动提交。
事务可以手动回滚,同时,当操作异常,MySQL会自动回滚。
事务操作注意事项:如果没有设置保存点,也可以回滚,用rollback回滚到事务的开始。
如果一个事务被提交了,则不可以回退。
可以选择回退到哪个保存点。