Mysql筆記(四)多表連線查詢
阿新 • • 發佈:2019-01-02
版權宣告:本文為博主原創文章,轉載請附上博文連結! https://blog.csdn.net/csdnluolei/article/details/83410321
資料庫的建立參考我的另一篇部落格 https://blog.csdn.net/csdnluolei/article/details/83409945
#多表連線查詢
- 交叉連線:交叉連線又叫笛卡爾積,它是指不使用任何條件,直接將一個表的所有記錄和另一個表中的所有記錄一一匹配。取兩個表並集。
- 內連線則是隻有條件的交叉連線,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出現在結果集中,即內連線只連線匹配的行。取兩個表交集。
- 外連線左外連線、右外連線、全外連結
- 左外連線,也稱左連線,左表為主表,左表中的所有記錄都會出現在結果集中,對於那些在右表中並沒有匹配的記錄,仍然要顯示,右邊對應的那些欄位值以NULL來填充。
- 右外連線,也稱右連線,右表為主表,左連線和右連線可以互換。
- MySQL目前還不支援全外連線。可以用左連線union右連線實現。
自連線只有一個表的查詢
#JOIN
#相當於我們平時用的where,就是把兩張表中同時滿足a.id=b.id的資料找出來;
SELECT *FROM tb_depta JOIN tb_emp b ON a.s_id=b.s_id;
#1、交叉連線/迪卡爾交集
SELECT *FROM tb_dept,tb_emp;
#標準
SELECT
*
FROM
tb_dept
CROSS JOIN
tb_emp;
#2、內連線,條件:主外來鍵關聯
-
SELECT * FROM tb_dept INNER JOINt b_emp WHERE tb_dept.deptno=tb_emp.dept_id;
#3、外連線
#左連線:以左表為主表,取兩表交集,加上左表剩下的將被查詢
SELECT * FROM tb_deptd LEFT JOIN tb_empe ONd.deptno=e.dept_id;
#右連線
SELECT
*
FROM
tb_dept d
RIGHT JOIN tb_empe
ON d.deptno=e.dept_id;
#4、自連線:只涉及到一個表
SELECT
*
FROM
tb_empe1,tb_empe2
WHERE
e1.dept_id=e2.dept_id;
#5、外連線:OUTERJOIN(MySQL不支援OUTERJOIN,)
#外連線就是求兩個集合的並集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然後加上左表中剩餘的記錄,最後加上右表中剩餘的記錄。
#另外MySQL不支援OUTERJOIN,但是我們可以對左連線和右連線的結果做UNION操作來實現。
SELECT
*
FROM
tb_deptd
LEFT JOIN tb_empe
ON d.deptno=e.dept_id
UNION
SELECT
*
FROM
tb_deptd
RIGHT JOIN tb_empe
ON d.deptno=e.dept_id;
#USING子句
#功能相當於ON,區別在於USING指定一個屬性名用於連線兩個表,而ON指定一個條件。
#deptno與dept_id不同名,無法用Using,這裡用id代替下。
SELECT
*
FROM
tb_deptd
LEFT JOIN tb_empe
USING(id);
#子查詢
#查詢工資比Smith高的員工資訊
SELECT
*
FROM
tb_emp
WHERE
sal>(
SELECT
sal
FROM
tb_emp
WHERE
ename='Smith'
);
#查詢月工資最高的員工姓名
SELECT
ename
FROM
tb_emp
WHERE
sal=(SELECT MAX(sal) FROM tb_emp);
#ANY與子查詢返回的任意值比較,大於最小,小於最大
#查詢工資比開發工程師工資高的員工資訊
SELECT
*
FROM
tb_emp
WHERE
sal>ANY(
SELECT
sal
FROM
tb_emp
WHERE
job='開發工程師'
);
#ALL,大於最大,小於最小
#查詢工資比開發工程師工資低的員工資訊
SELECT
*
FROM
tb_emp
WHERE
sal<ALL(
SELECT
sal
FROM
tb_emp
WHERE
job='開發工程師'