MySQL講義第27講——select 查詢之自連線查詢
MySQL講義第27講——select 查詢之自連線查詢
顧名思義,自連線查詢就是一張表和自己進行連線。就是把一張表看成兩張表,使用別名進行區分。
一、資料準備
建立一張員工(emp)表,每個員工都有一個部門領導(leader),資料如下:
mysql> select * from emp;
+------+-----------+--------+---------+--------+
| e_id | e_name | gender | salary | leader |
+------+-----------+--------+---------+--------+
| 1101 | 張美華 | 女 | 5000.00 | 1104 |
| 1102 | 王濤 | 男 | 5200.00 | 1104 |
| 1103 | 張學有 | 男 | 4700.00 | 1104 |
| 1104 | 劉得華 | 男 | 5200.00 | 1104 |
| 1105 | 董雯花 | 女 | 5900.00 | 1104 |
| 1106 | 宋族營 | 男 | 6500.00 | 1104 |
| 2201 | 李霜江 | 男 | 7200.00 | 2202 |
| 2202 | 樑美麗 | 女 | 6400.00 | 2202 |
| 2203 | 王大強 | 男 | 6100.00 | 2202 |
| 3301 | 張美華 | 女 | 7800.00 | 1104 |
| 3302 | 趙紫龍 | 男 | 6900.00 | 1104 |
| 3303 | 諸葛量 | 男 | 9200.00 | 1104 |
| 3304 | 曹夢德 | 男 | 8400.00 | 1104 |
+------+-----------+--------+---------+--------+
13 rows in set (0.00 sec)
二、對自連線的理解
為了更好地理解自連線,根據 emp 表建立一個和 emp 中的資料完全相同的檢視,檢視名稱為 leader。
mysql> CREATE VIEW leader
-> AS
-> SELECT
-> *
-> FROM
-> emp;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from leader;
+------+-----------+--------+---------+--------+
| e_id | e_name | gender | salary | leader |
+------+-----------+--------+---------+--------+
| 1101 | 張美華 | 女 | 5000.00 | 1104 |
| 1102 | 王濤 | 男 | 5200.00 | 1104 |
| 1103 | 張學有 | 男 | 4700.00 | 1104 |
| 1104 | 劉得華 | 男 | 5200.00 | 1104 |
| 1105 | 董雯花 | 女 | 5900.00 | 1104 |
| 1106 | 宋族營 | 男 | 6500.00 | 1104 |
| 2201 | 李霜江 | 男 | 7200.00 | 2202 |
| 2202 | 樑美麗 | 女 | 6400.00 | 2202 |
| 2203 | 王大強 | 男 | 6100.00 | 2202 |
| 3301 | 張美華 | 女 | 7800.00 | 1104 |
| 3302 | 趙紫龍 | 男 | 6900.00 | 1104 |
| 3303 | 諸葛量 | 男 | 9200.00 | 1104 |
| 3304 | 曹夢德 | 男 | 8400.00 | 1104 |
+------+-----------+--------+---------+--------+
13 rows in set (0.00 sec)
然後根據 emp 表和檢視 leader 建立連線,查詢結果如下:
mysql> SELECT
-> e.e_id,
-> e.e_name emp_name,
-> e.gender,
-> e.salary,
-> l.leader leader_id,
-> l.e_name leader_name
-> FROM
-> emp e JOIN leader l ON e.leader = l.e_id;
+------+-----------+--------+---------+-----------+-------------+
| e_id | emp_name | gender | salary | leader_id | leader_name |
+------+-----------+--------+---------+-----------+-------------+
| 1101 | 張美華 | 女 | 5000.00 | 1104 | 劉得華 |
| 1102 | 王濤 | 男 | 5200.00 | 1104 | 劉得華 |
| 1103 | 張學有 | 男 | 4700.00 | 1104 | 劉得華 |
| 1104 | 劉得華 | 男 | 5200.00 | 1104 | 劉得華 |
| 1105 | 董雯花 | 女 | 5900.00 | 1104 | 劉得華 |
| 1106 | 宋族營 | 男 | 6500.00 | 1104 | 劉得華 |
| 2201 | 李霜江 | 男 | 7200.00 | 2202 | 樑美麗 |
| 2202 | 樑美麗 | 女 | 6400.00 | 2202 | 樑美麗 |
| 2203 | 王大強 | 男 | 6100.00 | 2202 | 樑美麗 |
| 3301 | 張美華 | 女 | 7800.00 | 1104 | 劉得華 |
| 3302 | 趙紫龍 | 男 | 6900.00 | 1104 | 劉得華 |
| 3303 | 諸葛量 | 男 | 9200.00 | 1104 | 劉得華 |
| 3304 | 曹夢德 | 男 | 8400.00 | 1104 | 劉得華 |
+------+-----------+--------+---------+-----------+-------------+
13 rows in set (0.00 sec)
三、把以上的查詢用自連線表示
以上基於 emp 表和 leader 檢視的連線要轉換為自連線,只需要把檢視換成 emp 表,並指定一個別名即可,程式碼如下:
mysql> SELECT
-> e.e_id,
-> e.e_name emp_name,
-> e.gender,
-> e.salary,
-> l.leader leader_id,
-> l.e_name leader_name
-> FROM
-> emp e JOIN emp l ON e.leader = l.e_id;
+------+-----------+--------+---------+-----------+-------------+
| e_id | emp_name | gender | salary | leader_id | leader_name |
+------+-----------+--------+---------+-----------+-------------+
| 1101 | 張美華 | 女 | 5000.00 | 1104 | 劉得華 |
| 1102 | 王濤 | 男 | 5200.00 | 1104 | 劉得華 |
| 1103 | 張學有 | 男 | 4700.00 | 1104 | 劉得華 |
| 1104 | 劉得華 | 男 | 5200.00 | 1104 | 劉得華 |
| 1105 | 董雯花 | 女 | 5900.00 | 1104 | 劉得華 |
| 1106 | 宋族營 | 男 | 6500.00 | 1104 | 劉得華 |
| 2201 | 李霜江 | 男 | 7200.00 | 2202 | 樑美麗 |
| 2202 | 樑美麗 | 女 | 6400.00 | 2202 | 樑美麗 |
| 2203 | 王大強 | 男 | 6100.00 | 2202 | 樑美麗 |
| 3301 | 張美華 | 女 | 7800.00 | 1104 | 劉得華 |
| 3302 | 趙紫龍 | 男 | 6900.00 | 1104 | 劉得華 |
| 3303 | 諸葛量 | 男 | 9200.00 | 1104 | 劉得華 |
| 3304 | 曹夢德 | 男 | 8400.00 | 1104 | 劉得華 |
+------+-----------+--------+---------+-----------+-------------+
13 rows in set (0.00 sec)
相關文章
- MySQL講義第 47 講——select 查詢之查詢練習(五)MySql
- select查詢之四:連線查詢
- MySQL之連線查詢和子查詢MySql
- MySQL之連線查詢MySql
- Mysql第六講 select查詢基礎篇MySql
- mysql查詢語句5:連線查詢MySql
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- Mysql系列第十一講 深入瞭解連線查詢及原理MySql
- select查詢中union連線符
- 《MySQL 入門教程》第 18 篇 連線查詢MySql
- MySQL學習-連線查詢MySql
- MySQL8:連線查詢MySql
- PostgreSQL技術大講堂 - 第33講:並行查詢管理SQL並行
- Mysql系列第七講 玩轉select條件查詢,避免採坑MySql
- MySQL內連線查詢語句MySql
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql
- MySql中的資料查詢語言(DQL)三:連線查詢MySql
- SQL連線查詢SQL
- oracle 連線查詢Oracle
- 【Oracle】--連線查詢Oracle
- select查詢之三:子查詢
- select查詢之一:普通查詢
- sql 連線查詢例項(left join)三表連線查詢SQL
- MySQL 連線查詢超全詳解MySql
- PHP連線、查詢MySQL資料庫PHPMySql資料庫
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- MySQL講義第8講——資料更新之 DELETEMySqldelete
- 資料庫資料的查詢----連線查詢資料庫
- 水煮oracle31----連線查詢&合併查詢Oracle
- Mysql優化_慢查詢開啟說明及Mysql慢查詢分析工具mysqldumpslow用法講解MySql優化
- select查詢之五:分析函式在查詢的運用函式
- 【閃回特性之閃回查詢】使用閃回查詢(select as of)
- select子查詢
- 查詢之折半查詢
- oracle連線查詢詳解Oracle
- Hibernate連線查詢join
- 【janes】多表查詢 外連線