简单查询
执行顺序
mysql执行sql的顺序从 From 开始,以下是执行的顺序流程
1、FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1
2、JOIN table2 所以先是确定表,再确定关联条件
3、ON table1.column = table2.columu 确定表的绑定条件 由Temp1产生中间表Temp2
4、WHERE 对中间表Temp2产生的结果进行过滤 产生中间表Temp3
5、GROUP BY 对中间表Temp3进行分组,产生中间表Temp4
6、HAVING 对分组后的记录进行聚合 产生中间表Temp5
7、SELECT 对中间表Temp5进行列筛选,产生中间表 Temp6
8、DISTINCT 对中间表 Temp6进行去重,产生中间表 Temp7
9、ORDER BY 对Temp7中的数据进行排序,产生中间表Temp8
10、LIMIT 对中间表Temp8进行分页,产生中间表Temp9
语法格式
select 字段1,字段2,字段3.... from 表名;
注:
1、任何一条sql语句以“;”结尾
2、sql语句不区分大小写
3、字段可以参与数据运算
给查询结果重命名
select 字段1 as '重命名' from 表名;
注:
1、标准sql语句中要求字符串使用单引号括起来。【MySQL也支持双引号,但是代码不通用,建议使用单引号】
查询全部字段
select * from 表名;
注:
1、实际开发中不建议使用*,效率低。
条件查询
语法格式
select 字段 from 表 where 条件;
注:
1、不等号表达:<>或者!=
2、结果集的去重:distinct
distinct出现在最前方,是后面所有字段联合起来去重。
distinct出现在某个字段前而不是最前方,只对当前字段去重
范围表示
第一种方式:
select name from emp where sal>=1000 and sal<=3000;
第二种方式:
select name from emp where sal between 1000 and 3000;
注:
(1)between...and...是闭区间[1000,3000]
(2)除了使用在数字方面,还可以用在字符串方面,例如:
select name from emp where name between 'A' and 'B';// 左闭右开
is null
is null或者is not null
如:select name from emp where sal is not null;
and、or
1、and:且
2、or:或
3、联合使用:注意优先级【运算符优先级不确定,加小括号】
in
select name from emp where name in( 'A', 'B');
可以等同于or,表示在括号中的都满足
not in
1、除了在括号内的
模糊查询like
%:表示任意多个字符
_:表示任意一个字符
select name from emp where name like ‘%O%’
表示找出名字里包含字母O的记录
select name from emp where name like '_A%'
表示找出名字第二个字母是A
注:
(1)可以使用转义字符\,将_或%变成普通字符
排序order by(升序、降序)
单字段排序
select ename from emp order by sal;
注意:(1)默认是升序排列,asc表示升序,desc表示降序
指定降序排序:select ename from emp order by sal desc;
(2)order by后可以跟数字,表示根据第几列排序
如:select ename from emp order by 1;【表示根据第一列字段进行排序,不建议使用,健壮性较差】
多字段排序
select ename from emp order by sal desc , ename asc;
注:(1)越靠前的字段越能起到主导作用,只有在前面的字段无法完成排序的时候,才会启用后面的字段。
单行处理函数
1、只要有NULL参与的运算结果一定是NULL。
ifnull
查询一年工资
select ename, (sal + ifnull(com,0))*12 from emp;
分组函数/聚合函数/多处理函数
1、所有分组函数都是对“某一组”数据进行操作的。
2、分组函数自动忽略NULL,不需要添加额外条件。
3、分组函数不可直接使用在where子句中。【因为group by子句是在where执行之后才能执行,而分组函数必须在分完组之后使用】
count
取得记录数
查询总人数:
select count(*) from emp;
注:(1)count(*)和count(某个字段),count(*)是统计总记录条数,与某个字段无关;count(某个字段)是统计某个字段中不为NULL的数据总数量。
sum
查询工资总和
select sum(sal) from emp;
avg
查询平均工资
select avg(sal) from emp;
max
查询最高工资
select max(sal) from emp;
min
查询最低工资
select min(sal) from emp;
group by 和 having
1、group by:按照某个字段或者某些字段进行分组。【分组函数一般都会和gruop by联合使用】
2、having:having是对分组之后的数据进行再次过滤。【能使用where尽量使用where,having效率低】
3、并且任何一个分组函数都在group by语句执行结束之后才执行的。
4、一条语句中有group by 的话,select后面只能跟分组函数和参加分组的字段。
连接查询
1、大部分情况下,都不是从单表中查询,一般都是从多张表联合查询取出最终结果。
连接查询的分类
1、根据语法出现年代划分:
(1)SQL92(一些老的DBA可能还在使用这种语法,Database Administrator,数据库管理员)
(2)SQL99(比较新的语法)
2、根据表的连接方式划分:
(1)内连接:
①等值连接
最大特点:条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名。
SQL92:
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;
SQL99(常用):
select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;
上述语句中inner可以省略
②非等值连接
最大特点:关系是非等量关系
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级
代码:select e.name, e.sal, s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
③自连接
最大特点:一张表看做两张表,自己连接自己。
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
代码:select a.ename, b.ename from emp a inner join emp b on a.mgr = b.empno;
(2)外连接:【左、右连接可以互相转换】
若查询没有数据匹配,则自动填NULL
①左外连接(左连接)【左边的表是主表】
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.name, b.name from emp a left outer join emp b on a.mgr = b.empno;
②右外连接(右连接)【右边的表是主表】
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
select a.name, b.name from emp b right outer join emp a on a.mgr = b.empno;
注:outer可以省略
(3)全连接(不常用)
三张表的连接查询
案例:找出每一个员工的部门名称以及工资等级
代码:select e.ename, d.dname, s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal
注意:...
A
join
B
join
C
on
...
表示:A表先和B表进行连接,连接之后A表再继续和C表连接。
子查询
子查询可以出现的位置:
select
..(select)..
from
..(select)..
where
..(select)..
from后嵌套子查询
案例:找出每个部门平均薪水的薪资等级
代码:select t.*, s.grade
from
(select deptno, avg(sal) as avgsal from emp group by deptno) as t
join
salgrade s
on
t.avgsal between s.losal adn s.hisal;
select后嵌套子查询
案例:找出每个员工所在的部门名称,要求显示员工名和部门名
代码:select e.ename,(select d.dname from dept where e.deptno = d.deptno) as dname from emp e;
union【将查询结果集相加】
案例:找出工作岗位是SALESMAN和MANAGER的员工
代码:select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN'
注:(1)可以用于两张互不相关的表的查询结果拼接
(2)union拼接的查询结果必须要有相同的字段数
limit
1、是mysql中特有的,用于分页查询。
2、limit取结果集中的的部分数据
3、语法机制
limit startIndex, length
startIndex表示起始位置,第一个位置是0,不写默认是0
length表示取记录条数
案例:取出工资前5名的员工
代码:select ename, sal from emp order by sal desc limit 0,5;
4、limit是sql语句最后执行的一个环节