------连接查询/多表关联查询:使用多张表连接起来进行查询,拿到我们要想要的结果
--分为 内连接 和 外连接
EMP(员工信息表)
DEPT(部门信息表)
SELECT * FROM DEPT;
SELECT * FROM EMP;
7782 CLARK MANAGER 7839 1981/6/9 星期二 2550.00 10 ACCOUNTING NEW YORK
7839 KING PRESIDENT 1981/11/17 星期二 5000.00 10 ACCOUNTING NEW YORK
7934 MILLER CLERK 7782 1982/1/23 星期六 1300.00 10 ACCOUNTING NEW YORK
COMMENT ON COLUMN DEPT.DEPTNO IS '部门编号';
COMMENT ON COLUMN DEPT.DNAME IS '部门名称';
COMMENT ON COLUMN DEPT.LOC IS '办公地点';
---------------------内连接(INNER JOIN)
两张关联的表,只有满足 ON 后面的关联条件的数据才可以被连接起来
标准写法。语法结构:
SELECT 要查询的字段/列
FROM 表1
INNER JOIN 表2
ON 关联条件 -- 表1中的某个字段跟表2中的某个字段关联起来
WHERE 过滤条件;
SELECT T1.*
,T2.*
FROM EMP T1
INNER JOIN DEPT T2
ON T1.DEPTNO = T2.DEPTNO --EMP 和 DEPT 的数据要连接在一起就要满足部门编号相等的条件
--表关联之后的数据(结果集)可以理解成一张表,运用单表查询的过滤方法对他进行过滤
WHERE T2.DEPTNO = 10;
SELECT T2.DNAME
,SUM(T1.SAL)
FROM EMP T1
INNER JOIN DEPT T2
ON T1.DEPTNO = T2.DEPTNO
--表关联之后的数据(结果集)可以理解成一张表,运用单表查询的过滤方法对他进行过滤
WHERE T1.DEPTNO IN(10,20)
---对关联出来的数据当做一张表做分组聚合的计算
GROUP BY T2.DNAME;
账户表
账号 客户编号 当前余额
客户表
客户编号 客户姓名 客户手机号
---想得到
账号 客户姓名 客户手机号
--------------------外连接([OUTER] JOIN)
分为:左[外]连接、右[外]连接、全[外]连接
-----左连接
标准(sql)语法。语法结构:
SELECT 要查询的字段/列
FROM 表1 ---主表 主表的数据就算不满足关联条件也可以被查询出来,
LEFT JOIN 表2 ---从表 只有满足关联条件的数据才能被查询出来
ON 关联字段;
SELECT T1.*
,T2.*
FROM DEPT T1
LEFT JOIN EMP T2
ON T1.DEPTNO = T2.DEPTNO;
-----右连接
SELECT 要查询的字段/列
FROM 表1 --从表
RIGHT JOIN 表2 ---主表
ON 关联字段;
SELECT T1.*
,T2.*
FROM EMP T1
RIGHT JOIN DEPT T2
ON T1.DEPTNO = T2.DEPTNO
--总结
左外连接,LEFT Join 前面的那张表作为主表
右外连接 RIGHT JOIN 后面的那张表作为主表
共同点就是 主表的数据就算不能满足 ON 后面的关联条件,都可以被查询出来
--内关联和外关联的区别,什么时候该用内关联或者关联
内关联是只有满足关联条件的数据才可以被查询出来,外关联是主表的数据就算不满足关联条件也可以被查询出来
当题目中有 只有满足关联条件的数据才能被查询出来的时候就用内关联
当题目中有 就算不满足关联条件,这张表的数据也要被查询出来就要用外关联
用表外关联的方法,找出没有员工的部门编号,部门名称
SELECT T1.*
,T2.*
FROM DEPT T1
LEFT JOIN EMP T2
ON T1.DEPTNO = T2.DEPTNO
WHERE T2.DEPTNO IS NULL;
--练习
1 查询出每个员工的工号,姓名,所在部门名称
SELECT T1.EMPNO
,T1.ENAME
,T2.DNAME
FROM EMP T1
INNER JOIN DEPT T2
ON T1.DEPTNO = T2.DEPTNO ;
2 计算DEPT 表中4个部门里每个部门的员工人数,如果某个部门没有员工,员工人数就显示为 0
SELECT T1.DEPTNO
,COUNT(T2.EMPNO) AS COUNT_EMPNO
FROM DEPT T1
LEFT JOIN EMP T2
ON T1.DEPTNO = T2.DEPTNO
GROUP BY T1.DEPTNO ;
---过滤条件写在 WHERE 后面和 ON 后面的区别
--1. 内关联的时候,过滤条件写在 WHERE 后面 是两张表先关联出来,再做过滤,ON 后面 就是先过滤再关联
SELECT T1.*
,T2.*
FROM DEPT T1
INNER JOIN EMP T2
ON T1.DEPTNO = T2.DEPTNO
AND T2.DEPTNO = 10 ---EMP 表只取出 10部门的数据和 DEPT表关联, 20 30 号部门的数据不参与关联,也就是先过滤再关联
--WHERE T2.DEPTNO = 10;
--2. 外关联
----ON 后面就是作为关联条件,但是主表里没有满足关联条件的数据也是可以被查询出来
---WHERE 后面,就是对关联出来的数据做一个过滤
SELECT T1.*
,T2.*
FROM DEPT T1
RIGHT JOIN EMP T2 --主表
ON T1.DEPTNO = T2.DEPTNO
AND T2.DEPTNO = 10 ---EMP 表只取出 10部门的数据和 DEPT表关联,20 30 号部门是作为主表的数据被查询出来的
--WHERE T2.DEPTNO = 10;
--全外联
--全外联 (左外关联和右外关联的结合)
--------造表 造数据----------------------------------------
;
CREATE TABLE EMP_723
---把 AS 后面的查询结果集创建成一张表
AS
SELECT T.* FROM EMP T;
UPDATE EMP_723 T SET T.DEPTNO = 60 WHERE T.DEPTNO = 30;
COMMIT;
--------造表 造数据----------------------------------------
SELECT * FROM EMP_723;
SELECT * FROM DEPT;
语法
SELECT
FROM 表1
FULL JOIN 表2
ON 关联条件;
SELECT T1.*,T2.*
FROM EMP_723 T1
FULL JOIN DEPT T2
ON T1.DEPTNO = T2.DEPTNO;
----不等值关联
--不等值关联是相对于等值关联而言,就是关联关系是 > < >= <= 这些符号
--在内关联和外关联中都可以写不等值关联
工资等级表 SALGRADE
SELECT * FROM EMP;
SELECT * FROM SALGRADE;
INSERT INTO SALGRADE VALUES(6,10000,20000);
COMMIT;
下限 上限
6 10000 20000
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
SELECT T1.*
,T2.*
FROM EMP T1
RIGHT JOIN SALGRADE T2
ON T1.SAL >= T2.LOSAL
AND T1.SAL <= T2.HISAL
---ON T1.SAL BETWEEN T2.LOSAL AND T2.HISAL
---练习
计算出每个工资级别的人数,该级别里最高的工资是多少,最低的工资是多少
,如果没有员工的工资是属于这个级别的,也要将这个级别查询出来,最高工资和最低工资就展示为0 ---NVL(MAX(SAL),0)
SELECT T2.GRADE
,COUNT(T1.EMPNO ) AS COUNT_EMPNO
,NVL(MAX(T1.SAL),0) AS MAX_SAL
,NVL(MIN(T1.SAL),0) AS MIN_SAL
FROM EMP T1
RIGHT JOIN SALGRADE T2
ON T1.SAL BETWEEN T2.LOSAL AND T2.HISAL
GROUP BY T2.GRADE