数据库的复杂查询
存储时间:存储的是距离计算机元年(1970-1-1 0:0:0)的毫秒数(时间戳)
用 bigint 来存储速度更快
# 简单查询
- 分页查询
- 查询的结果中有太多的数据,一次显示不完可以做成分页查询
- 需要两个已知的条件:
- 当前的页码
- 每页显示的数量
- 开始的查询值=(当前页码-1)*每页数量
- limit 后的数值不能加引号
select * from emp limit 开始查询的值,每页的数据量
select * from emp limit 0,5;
select * from emp limit 15,5;
select * from emp order by salary desc limit 0,5;
# 复杂查询
聚合查询、分组查询
函数:是一个独立的功能体,需要提供若干个数据,返回结果
聚合函数:
- count() 数量
- sum() 总和
- avg() 平均
- max() 最大
- min() 最小
select count(deptid) from emp; select count(eid) from emp;#使用主键列 select sum(salary) 总工资 from emp where sex=1; select avg(salary) 平均工资 from emp where deptid=10; select ename,max(salary) from emp where sex=0; select min(birthday) from emp;
分组查询
- group by 分组指令
- 分组查询只能查询分组条件和聚合查询
select count(eid),sum(salary),sex from emp group by sex; select deptid,avg(salary),max(salary),min(salary) from emp group by deptid;
md5() 加密函数
select md5('123456');
year() 获取日期中的年份
select * from emp where year(birthday)=1993; select * from emp where month(birthday)=12; select * from emp where day(birthday)=3;
子查询
- 是多个命令
select * from emp where salary=(select max(salary) from emp); select * from emp where salary>(select salary from emp where ename='king'); select * from emp where year(birthday)=year((select birthday from emp where ename='tom'))&&ename!='tom'; select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom')&&ename!='tom';
多表查询
- 前提是表之间是有关联的(外键和另一个表的主键)
- 多表查询是指查询的列分布在不同的表中
#基础写法 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; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Leo | 市场部 | | Lucy | 市场部 | | NULL | 测试部 | | Jerry | 研发部 | | Maria | 研发部 | | Black | 研发部 | | Peter | 研发部 | | Tacy | 研发部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | tao | 运营部 | | David | 运营部 | | Franc | 运营部 | | Jone | 运营部 | +-------+--------+ select dname,ename from dept left outer join emp on deptid=did; #先写那个表那个表的数据全部显示
右外连接
select dname,ename from dept **right outer join** emp on deptid=did; select dname,ename from dept right join emp on deptid=did;**#outer可以省略** +--------+-------+ | dname | ename | +--------+-------+ | 运营部 | tao | | 市场部 | Tom | | 研发部 | Jerry | | 运营部 | David | | 研发部 | Maria | | 市场部 | Leo | | 研发部 | Black | | 研发部 | Peter | | 运营部 | Franc | | 研发部 | Tacy | | 市场部 | Lucy | | 运营部 | Jone | | 研发部 | Lily | | 研发部 | Lisa | | 研发部 | King | | NULL | Brown | +--------+-------+ #后写那个表那个表的数据全部显示 (select dname,ename from dept left outer join emp on deptid=did) union (select dname,ename from dept right join emp on deptid=did); (select dname,ename from dept left outer join emp on deptid=did) union all (select dname,ename from dept right join emp on deptid=did);
全连接
- 左侧跟右侧左右的记录都显示
- mysql 不支持全连接
- 联合
- union 、合并相同的记录
- union all、不合并相同的记录
- 左外连接跟右外连接进行联合,合并相同的记录