日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql与orancl_清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

發布時間:2025/3/8 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql与orancl_清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

清晰講解SQL語句中的外連接,通用于Mysql和Oracle,全是干貨哦

直入主題:

我們做一個操作,將員工SCOTT的部門去掉,再次通過內連接查看數據,看看會產生什么現象?

使用內連接,查詢數據

問題:找不到SCOTT員工了,只有13條數據,這顯然不合理;這就是內連接的缺點

-- 內連接:只顯示匹配的數據

-- 外連接:顯示匹配的數據,還顯示(部分或者全部)不匹配的數據,那就是顯示(全部)的數據

(1)左外連接:left join

特點:左表全部顯示,包括不匹配的數據,右表進行匹配顯示

(2)右外連接:right join

右表全部顯示,包括不匹配的數據,左表進行匹配顯示

(3)全外連接

左表和右表的數據都會顯示,包括不匹配的數據

注意:在oracle中支持full join

在mysql中不支持全外連接,但是,可以通過union 連接左外連接和右外連接,達到全外連接的效果

(4)自連接

思路:將一張表看做兩張表 下級表 上級表

舉例:顯示沒有上級的員工(king)

知識擴展:

三表查詢:

就是先查兩張表,將查出的結果看成一張表,然后跟第三張表進行聯合查詢,本質還是兩表查詢

準備工作:先添加一張薪資等級表

第一步:連接emp和dept表

查詢員工的編號、姓名、薪水、部門編號、部門名稱

第二步:連接第三張表

-- 查詢員工的編號、姓名、薪水、部門編號、部門名稱、薪水等級

至此,全部的表連接講解完畢!

歡迎留言,指出問題,有則改之無則加勉

下面,分享所有的SQL語句:

復制代碼

create table DEPT

(

DEPTNO int(2) not null,

DNAME VARCHAR(14),

LOC VARCHAR(13)

);

alter table DEPT

add 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 EMP

add 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;

復制代碼

復制代碼

-- 一、內連接

-- 交叉連接 cross JOIN

-- 笛卡爾積現象

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 右表,左表全部顯示,包括沒有數據的列

SELECT *

FROM emp e -- 左表

LEFT JOIN dept d -- 右表

on(e.deptno = d.deptno);

-- 右外連接 emp左表, dept右表,右表全部顯示,包括沒有數據的列

SELECT *

FROM emp e -- 左表

RIGHT JOIN dept d -- 右表

on(e.deptno = d.deptno);

-- 全外連接 ,oracle支持,mysql不支持

-- 可以通過關鍵字union進行解決,左表和右表的無對應數據列都會顯示

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;

-- 四、自連接

-- 不是所有表都可以進行自連接,只有表中的兩列有關聯關系,才可以進行自連接查詢

-- 將自身分解成兩張表

SELECT e.empno,e.ename,e.mgr,m.empno,m.ename

FROM emp e

LEFT JOIN emp m

ON e.mgr = m.empno;

復制代碼

總結

以上是生活随笔為你收集整理的mysql与orancl_清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。