Mysql中的自連接問題
Mysql自連接
1、在日常對數(shù)據(jù)庫的操作中,我們很熟悉使用INNER JOIN,LEFT JOIN 把一個表和另外一個表連接起來,潛意識里會認為只有兩個表才可以連接,有一個特殊情況,需要將表自身連接,這被稱為自連接。
2、想將表中行與同一表中的其他行組合時,可以使用自連接。要執(zhí)行自聯(lián)接操作必須使用表別名來幫助MySQL在單個查詢中區(qū)分左表與同一張表的右表。
DEMO
1、比如組織機構的樹形的,數(shù)據(jù)會有上下級區(qū)分,當需要展示組織機構的父級機構名稱時,我們可以使用自連接。
2、表結構如圖所示:
3、sql
select a.id, a.party_org_name, a.parent_id,b.party_org_name as parent_name FROM sinosoft_party_org a left join sinosoft_party_org b on a.parent_id=b.id
MySQL自連接和內連接和外連接_左外連接+右外連接
自連接:將一張表看作兩張表
練習:查詢員工id,員工姓名及其管理者的id和姓名
select emp.employee_id, ?? ? ? emp.last_name, ?? ? ? mgr.employee_id, ?? ? ? mgr.last_name from employees emp,employees mgr where emp.manager_id = mgr.employee_id;
內連接
只是把左表和右表滿足連接條件的數(shù)據(jù)查出來,其它的數(shù)據(jù)都沒有要?。?!
select employee_id,department_name from employees e join departments d on e.`department_id`=d.`department_id`
外連接
JOIN … ON
左外連接 left join…on
左外連接,左表和右表滿足條件的數(shù)據(jù),和左表中不滿足條件的數(shù)據(jù)!?。?/p>
練習:查詢所有員工的last_name,department_name信息
select last_name,department_name? from employees e left join departments d on e.`department_id`=d.`department_id`;
右外連接 right join … on
右外連接,右表和左表滿足條件的數(shù)據(jù),和右表中不滿足條件的數(shù)據(jù)?。?!
練習:查詢所有員工的last_name,department_name信息
select last_name,department_name? from departments d right join employees e on e.`department_id`=d.`department_id`;
七種 SQL JOINS 的實現(xiàn)
UNION的使用
合并查詢結果
- 利用UNION關鍵字,可以給出多條SELECT語句,并將它們的結果組合成單個結果集。
- 合并時,兩個表對應的列數(shù)和數(shù)據(jù)類型必須相同,并且相互對應。
- 各個SELECT語句之間使用UNION或UNION ALL關鍵字分隔。
UNION操作符
UNION 操作符返回兩個查詢的結果集的并集,去除重復記錄。
UNION ALL操作符
UNION ALL操作符返回兩個查詢的結果集的并集。對于兩個結果集的重復部分,不去重。
注意:執(zhí)行UNION ALL語句時所需要的資源比UNION語句少。
如果明確知道合并數(shù)據(jù)后的結果數(shù)據(jù)不存在重復數(shù)據(jù),或者不需要去除重復的數(shù)據(jù),則盡量使用UNION ALL語句,以提高數(shù)據(jù)查詢的效率。
1、內連接(兩表只要滿足條件的)
SELECT employee_id,last_name,department_name FROM employees e JOIN departments d ON e.`department_id` = d.`department_id`;
2、左外連接(左和右滿足條件的,和左中不滿足條件的)
SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`;
3、右外連接(右和左滿足條件的,和右中不滿足條件的)
SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
4、在左外連接的基礎上,右表取null值(滿足條件的肯定不是null,我們不?。?/strong>
SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL
5、在右外連接的基礎上,我們取左表的null值
SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL
6、右外連接取左表null值,和左外連接合并UNION ALL
SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL #沒有去重操作,效率高 SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
7、
SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL數(shù)據(jù)庫優(yōu)化推薦的編譯安裝參數(shù)小結
這篇文章主要介紹了MySQL數(shù)據(jù)庫優(yōu)化推薦的編譯安裝參數(shù)小結,需要的朋友可以參考下2015-04-04MySQL校對規(guī)則(COLLATION)的具體使用
本文主要介紹了MySQL校對規(guī)則(COLLATION)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08