1.简单查询 —— 分页查询
查询的结果有太多数据,一次显示不完可以做成分页显示
需要提供两个条件:当前的页码、每页的数据量
每页开始查询的值 = (当前的页码 - 1) * 每页的数据量 |
语法结构:
select * from emp limit 开始查询的值, 每页的数据量;
练习:假设每页显示5条数据,查询出前4页每页的数据
第1页:select * from emp limit 0,5;
第2页:select * from emp limit 5,5;
第3页:select * from emp limit 10,5;
第4页:select * from emp limit 15,5;
2.复杂查询
(1)聚合查询/分组查询
示例:查询出所有员工的数量
select count(*) from emp;
练习:通过员工的编号列查询数量
select count(eid) from emp; #推荐用主键列
练习:通过员工的部门编号列查询数量
select count(deptId) from emp;
函数:是一个功能体,提供若干个数据,返回结果 —— 饺子机 聚合函数 count()/sum()/avg()/max()/min() 数量 总和 平均 最大 最小 |
练习:查询出所有女员工的工资总和
select sum(salary) from emp where sex=0;
练习:查询出10号部门的平均工资
select avg(salary) from emp where deptId=10;
练习:查询出年龄最大的员工的生日
select min(birthday) from emp;
练习:查询出20号部门的最高工资
select max(salary) from emp where deptId=20;
分组查询通常只能查询分组条件列和聚合函数 |
示例:查询出男女员工的最高工资、最低工资、平均工资各是多少
select max(salary),min(salary),avg(salary),sex,ename from emp group by sex;
练习:查询出各部门的员工数量,工资总和,平均工资
select count(eid),sum(salary),avg(salary),deptId from emp group by deptId;
year() 获取日期中的年份 md5() 加密的函数 |
示例:查询出2021-8-5的年份
select year('2021-8-5');
练习:查询出1993年出生的员工有哪些
select * from emp where year(birthday)=1993;
示例:对123456进行md5加密
select md5('123456');
(2)子查询
子查询是多个SQL命令的组合,把一个SQL命令的结果作为另一个SQL命令的条件 |
示例:查询出工资最高的员工是谁
步骤1:查询出工资的最高值 —— 50000
select max(salary) from emp;
步骤2:查询出工资为50000的员工
select * from emp where salary=50000;
综合:
select * from emp where salary=(select max(salary) from emp);
练习:查询出比tom工资高的员工有哪些
步骤1:查询出tom工资的值 —— 6000
select salary from emp where ename='tom';
步骤2:查询出工资高于6000的员工
select * from emp where salary>6000;
综合:
select * from emp where salary>(select salary from emp where ename='tom');
练习:查询出和tom同一年出生的员工有哪些
步骤1:查询出tom出生的年份 —— 1990
select year(birthday) from emp where ename='tom';
步骤2:查询出1990年出生的员工有哪些
select * from emp where year(birthday)=1990;
综合:
select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom') and ename!='tom';
(3)多表查询
要查询的列分别在多个表中,前提表之间要有关联
示例:查询出所有的员工姓名及其部门名称
select ename,dname from emp,dept where deptId=did;
select emp.ename,dept.dname from emp,dept where emp.deptId=dept.did;
内连接
select ename,dname from emp inner join dept on deptId=did;
和之前的查询结果一样
左外连接
select ename,dname from emp left outer join dept on deptId=did;
显示左侧表中所有的记录,先写哪个表哪个就是左,outer可以省略
右外连接
select ename,dname from emp right outer join dept on deptId=did;
显示右侧表中所有的记录,后写哪个表哪个就是右,outer可以省略
全连接
full join on
mysql不支持全连接
联合(全连接的解决的方法)
union 联合后合并相同的记录
union all 联合后不合并相同的记录
(select ename,dname from emp left outer join dept on deptId=did) union (select ename,dname from emp right outer join dept on deptId=did); |
显示左侧和右侧所有的记录