清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
直入主題:
我們做一個操作,將員工SCOTT的部門去掉,再次通過內(nèi)連接查看數(shù)據(jù),看看會產(chǎn)生什么現(xiàn)象?
使用內(nèi)連接,查詢數(shù)據(jù)
問題:找不到SCOTT員工了,只有13條數(shù)據(jù),這顯然不合理;這就是內(nèi)連接的缺點
-- 內(nèi)連接:只顯示匹配的數(shù)據(jù)
-- 外連接:顯示匹配的數(shù)據(jù),還顯示(部分或者全部)不匹配的數(shù)據(jù),那就是顯示(全部)的數(shù)據(jù)
(1)左外連接:left join
特點:左表全部顯示,包括不匹配的數(shù)據(jù),右表進行匹配顯示
(2)右外連接:right join
右表全部顯示,包括不匹配的數(shù)據(jù),左表進行匹配顯示
(3)全外連接
左表和右表的數(shù)據(jù)都會顯示,包括不匹配的數(shù)據(jù)
注意:在oracle中支持full? join
在mysql中不支持全外連接,但是,可以通過union 連接左外連接和右外連接,達到全外連接的效果
(4)自連接
?思路:將一張表看做兩張表? 下級表? ?上級表
舉例:顯示沒有上級的員工(king)
?
?知識擴展:
三表查詢:
就是先查兩張表,將查出的結(jié)果看成一張表,然后跟第三張表進行聯(lián)合查詢,本質(zhì)還是兩表查詢
準備工作:先添加一張薪資等級表
第一步:連接emp和dept表
?查詢員工的編號、姓名、薪水、部門編號、部門名稱
第二步:連接第三張表
-- 查詢員工的編號、姓名、薪水、部門編號、部門名稱、薪水等級
至此,全部的表連接講解完畢!
歡迎留言,指出問題,有則改之無則加勉
下面,分享所有的SQL語句:
create table DEPT (DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) ); alter table DEPTadd constraint PK_DEPT primary key (DEPTNO); create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR int(4),HIREDATE DATE,SAL double(7,2),COMM double(7,2),DEPTNO int(2) ); alter table EMPadd constraint FK_DEPTNO foreign key (DEPTNO)references DEPT (DEPTNO); create table SALGRADE (GRADE int primary key,LOSAL double(7,2),HISAL double(7,2) ); create table BONUS (ENAME VARCHAR(10),JOB VARCHAR(9),SAL double(7,2),COMM double(7,2) ); commit; insert into DEPT (DEPTNO, DNAME, LOC) values (10, 'ACCOUNTING', 'NEW YORK'); insert into DEPT (DEPTNO, DNAME, LOC) values (20, 'RESEARCH', 'DALLAS'); insert into DEPT (DEPTNO, DNAME, LOC) values (30, 'SALES', 'CHICAGO'); insert into DEPT (DEPTNO, DNAME, LOC) values (40, 'OPERATIONS', 'BOSTON'); commit; insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10); commit; insert into SALGRADE (GRADE, LOSAL, HISAL) values (1, 700, 1200); insert into SALGRADE (GRADE, LOSAL, HISAL) values (2, 1201, 1400); insert into SALGRADE (GRADE, LOSAL, HISAL) values (3, 1401, 2000); insert into SALGRADE (GRADE, LOSAL, HISAL) values (4, 2001, 3000); insert into SALGRADE (GRADE, LOSAL, HISAL) values (5, 3001, 9999); commit; -- 一、內(nèi)連接 -- 交叉連接 cross JOIN -- 笛卡爾積現(xiàn)象 SELECT * FROM emp CROSS JOIN dept; -- 使用using,只顯示指定的同名字段 SELECT * FROM emp e CROSS JOIN dept d USING (deptno); -- 使用on,指定不同名的字段 SELECT * FROM emp e CROSS JOIN dept d ON(e.deptno = d.deptno); -- natural join 自然連接 所有同名列只顯示一次 SELECT * FROM emp NATURAL JOIN dept; -- 二、外連接 -- 左外連接 emp左表,dept 右表,左表全部顯示,包括沒有數(shù)據(jù)的列 SELECT * FROM emp e -- 左表 LEFT JOIN dept d -- 右表 on(e.deptno = d.deptno); -- 右外連接 emp左表, dept右表,右表全部顯示,包括沒有數(shù)據(jù)的列 SELECT * FROM emp e -- 左表 RIGHT JOIN dept d -- 右表 on(e.deptno = d.deptno); -- 全外連接 ,oracle支持,mysql不支持 -- 可以通過關(guān)鍵字union進行解決,左表和右表的無對應(yīng)數(shù)據(jù)列都會顯示 SELECT * FROM emp e LEFT JOIN dept d on(e.deptno = d.deptno); UNION SELECT * FROM emp e RIGHT JOIN dept d on(e.deptno = d.deptno); -- 三、三表查詢 SELECT * FROM emp; SELECT * FROM dept; SELECT * FROM salgrade; -- 第一步,先查兩張表 SELECT e.empno,e.ename,e.sal,d.deptno,d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; -- 第二步,連接第三張表 SELECT e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade FROM emp e JOIN dept d ON e.deptno = d.deptno JOIN salgrade sg ON e.sal BETWEEN sg.losal AND sg.hisal; -- 四、自連接 -- 不是所有表都可以進行自連接,只有表中的兩列有關(guān)聯(lián)關(guān)系,才可以進行自連接查詢 -- 將自身分解成兩張表 SELECT e.empno,e.ename,e.mgr,m.empno,m.ename FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;?
轉(zhuǎn)載于:https://www.cnblogs.com/ncl-960301-success/p/10753559.html
總結(jié)
以上是生活随笔為你收集整理的清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome添加Axure RP插件
- 下一篇: ACM-最短路之中的一个个人的旅行——h