数据库源文件
链接: https://pan.baidu.com/s/1roFNgai-wC3kamBGQvVlkA
提取码:2cg8
表连接
-
内连接
两个表的关联字段匹配的数据才显示,不匹配就都不显示SELECT a.*,b.* FROM a,b WHERE a.key=b.key SELECT a.*,b.* FROM a INNER JOIN b ON a.key=b.key
-
外连接
- 左外连接:
第一张表为主表,被连接的表为副表,主表
数据一定显示,副表数据被关键字匹配的显示,不匹配
显示为null
SELECT e.ename,d.dname FROM emp e, dept d WHERE e.deptno = d.deptno(+) SELECT e.ename,d.dname FROM emp e LEFT [outer] JOIN dept d ON e.deptno = d.deptno
- 右外连接
第一张表为副表,被连接的表为副表,主表
数据一定显示,副表数据被关键字匹配的显示,不匹配
显示为null
SELECT e.ename,d.dname FROM emp e, dept d WHERE e.deptno(+) = d.deptno SELECT e.ename,d.dname FROM emp e RIGHT [outer] JOIN dept d ON e.deptno = d.deptno
- 全外连接 :
两张表的数据都会显示,匹配的在一行显示
不匹配的在同行显示为null
SELECT e.ename,d.dname FROM emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno
- 左外连接:
- 交叉连接
无关联条件,会产生笛卡尔积select a.*, b.* from a ,b select a.*, b.* from a cross join b
合并查询
- 并集
union 去除重复,且排序
union all 直接合并, 不做处理(不去重,不排序)SELECT empno,ename FROM emp WHERE empno IN(7369, 7499, 7521) union SELECT empno aa,ename bb FROM emp WHERE empno IN(7369, 7654, 7698);
SELECT empno,ename FROM emp WHERE empno IN(7369, 7499, 7521) union all SELECT empno aa,ename bb FROM emp WHERE empno IN(7369, 7654, 7698);
- 交集
intersectSELECT empno,ename FROM emp WHERE empno IN(7369, 7499, 7521) intersect SELECT empno aa,ename bb FROM emp WHERE empno IN(7369, 7654, 7698);
- 差集
minusSELECT empno,ename FROM emp WHERE empno IN(7369, 7499, 7521) minus SELECT empno aa,ename bb FROM emp WHERE empno IN(7369, 7654, 7698);
分组查询
- group by 分组
要求: group by 写在where的后面,对列进行分组
聚合/分组函数: 分组函数查询的时候,
如果带有普通列,那么这个普通列就必须出现在
group by中…SELECT job 岗位, MAX(sal) 最高工资, min(sal) 最低工资,AVG(sal) 平均工资, SUM(sal) 总和工资,COUNT(1) 岗位人数 FROM emp GROUP BY job;
- having二次查询
where和having的区别.
where是在分组之前先筛选,不能筛选分组函数
having是二次筛选,在group by之后筛选条件,
可以筛选普通列和分组函数了SELECT job,MAX(sal),AVG(sal),COUNT(1) FROM emp WHERE deptno = 20 GROUP BY job HAVING job='CLERK'
子查询
-
查询嵌套查询,把查询的结果当做新的值
给的另一个查询使用 如:查询和部门10相同岗位的人
SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE deptno=10)
比30部门所有人工资高的人
SELECT * FROM emp WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno=30)
和SMITH部门和岗位都相同的人
SELECT ename,deptno,job FROM emp WHERE (deptno,job) = ( SELECT deptno,job FROM emp WHERE ename='SMITH' )
查询高于自己部门平均工资的员工信息
SELECT * FROM ( SELECT e.ename,e.deptno,e.sal,b.avgsal FROM emp e LEFT JOIN (SELECT deptno,AVG(sal) avgsal FROM emp GROUP BY deptno) b ON e.deptno = b.deptno WHERE e.sal > b.avgsal )