在连接查询的时候虽然使用了限制条件 但是匹配的次数没有减少 还是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;