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
- Mysql第六講 select查詢基礎篇MySql
- MySQL之連線查詢和子查詢MySql
- mysql查詢語句5:連線查詢MySql
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- Mysql系列第十一講 深入瞭解連線查詢及原理MySql
- Mysql系列第七講 玩轉select條件查詢,避免採坑MySql
- 《MySQL 入門教程》第 18 篇 連線查詢MySql
- MySQL學習-連線查詢MySql
- PostgreSQL技術大講堂 - 第33講:並行查詢管理SQL並行
- 連線查詢
- MySQL內連線查詢語句MySql
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql
- MySql中的資料查詢語言(DQL)三:連線查詢MySql
- oracle 連線查詢Oracle
- SQL連線查詢SQL
- PHP連線、查詢MySQL資料庫PHPMySql資料庫
- MySQL 連線查詢超全詳解MySql
- sql 連線查詢例項(left join)三表連線查詢SQL
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- MySQL講義第8講——資料更新之 DELETEMySqldelete
- mysql常用連線查詢join,left,right,crossMySqlROS
- nodejs 連線 mysql 查詢事務處理NodeJSMySql
- Mysql系列第九講 分組查詢詳解(group by & having)MySql
- 離線查詢與線上查詢
- MySQL join連表查詢示例MySql
- Mysql之查詢語句MySql
- Mysql中常用函式 分組,連線查詢MySql函式
- sql查詢更新update selectSQL
- 1112跨表連線查詢
- oracle連線查詢詳解Oracle
- MySQL查詢MySql
- 【由淺入深學MySQL】- MySQL連線查詢詳解MySql
- MySQL - 資料查詢 - 簡單查詢MySql
- php基礎之連線mysql資料庫和查詢資料PHPMySql資料庫
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- SQL Sever 實現查詢超過自己經理工資的員工(自連線查詢)SQL
- MySQL入門系列:查詢簡介(七)之組合查詢MySql