MySQL day04(内外连接 ,子查询,limit)

时间:2021-08-25 09:49:15

在连接查询的时候虽然使用了限制条件 但是匹配的次数没有减少 还是56次只不过这一次的结果都是有效记录

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 join dept d on e.deptno=d.deptno;

SQL99语法优点 表连接独立出来 结构更加清晰 对表连接不满意的话 可以追加where进行过滤 

select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;  (inner)可以省略不写

SQL 内连接的非等值连接

select e.ename,e.sal,s,salgrade from emp e , salgrade s where e.sal between  s.losal and s.hisal;

SQL99 内连接中的非等值连接

select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;

select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;(inner)可以省略不写

SQL92内连接的自连接

select a.ename,b,ename leadername from emp a ,emp b where a.mgr=b.empno;

SQL99 内链接的自连接

select a.ename,b.ename leadername from emp a join emp b on a.mgr=b.empno ;

select a.ename,b.ename leadername from emp a inner join emp b on a.mgr=b.empno; (inner)可以省略不写 

外连接就是除了内连接的记录之外 将 其中一个表的数据无条件全部出巡出来 如果没有匹配的 会模拟出空值与表匹配 左外连接就是将左边的都打印出来 外连接查询结果条数>=内连接查询结果条数

内连接就是将两个表匹配的记录全都查询出来 

全连接就是 所有表都打印出来

SQL99语法 外连接的右外连接

select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;

select e.ename,d.dname from emp e right outer join dept d on e.deptno=d.deptno;

SQL99语法 外连接的左外连接

select e.ename,d.dname from dept d left join emp e  on e.deptno=d.deptno;

select e.ename,d.dname from dept d right outer join emp e on e.deptno=d.deptno;

任何一个右外连接都可以写成左外连接 任何一个左外连接也同样可以写成右外连接

inner outer 加上去可读性强 可以省略 因为区分内外连接依靠sql中是否存在left right

多张表进行表连接的语法格式

select  xxx  from a join b on 条件 join c on 条件  a和b join 后 a 再和 c join

原理 a和b表进行表连接后 a表再和c表进行表连接

select e.ename ,d.dname, s.grade from emp a join dept d on e.deptno= d.deptno join salgrade s on e.sal between s.losal and s.hisal;

子查询

子查询就是嵌套的select 语句 可以理解为子查询是一张表

select 语句嵌套select 语句

子查询出现在  select  ...(select)  from...(select) where..(select)

select ename,sal from emp  where sal>avg(sal); 报错

分组函数不能直接使用在where 后面

select  ename,sal from emp where sal>(select avg(sal) from emp);

from 后面使用子查询 将查询结果当作临时表

select t.deptno,t.avgsal,s,salgrade from (select deptno,avg(sal) as  avgsal from emp group by deptno ) t join salgrade s on t.avgsal between s.losal and s.hisal;

select t.*,s.salgrade from (select deptno,avg(sal) as  avgsal from emp group by deptno ) t join salgrade s on t.avgsal between s.losal and s.hisal;


在select  后面使用子查询【了解】

select  e.ename, (select d.dname from dept d where e.deptno=d.deptno ) as dname from emp e;将编号换成了 具体的名称


union 将2个查询结果合并 字段个数不同会报错   对应字段不同可以  可以来自不同的表 还可以合并字段   oracle 要求字段个数相同且类型对应


limit 1、用来获取一张表的某部分数据2、 只在MySQL数据库中存在 不通用 是MYSQL数据库管理系统的特色

select ename  from emp limit 5;以上SQL语句中的limit 5 表示从表中记录下标0开始取5条 等同于 select ename from limit 0,5;

limit 的使用语法格式 :limit 起始下标,长度 起始下标没有指定 默认从0开始 0表示表中第一条记录


select ename,sal from emp order by sal desc limit 5 ;降序排的前5个 


找出排名在3-9名的员工

select ename,sal from emp order by sal desc limit 2,7;


MYSQL通用的分页SQL语句

每页显示3条数据

第一页 0,3

第二页 3,3

第三页 6,3

每页显示pagesize条记录

第pageNo页 (pageNo-1)*pagesize, pagesize

通用的分页SQL(只适合MySQL数据库管理系统)

select t.* from t order by t.x desc /asc limit (pagesize - 1)pagesize,pagesize;