自連線、外連線和自連線查詢
阿新 • • 發佈:2019-01-29
表1:teacher
+----+--------+
| id | name |
+----+--------+
| 1 | 劉德華 |
| 2 | 張學友 |
| 4 | 黎明 |
+----+--------+
表2:student
+----+------+--------+
| id | name | tea_id |
+----+------+--------+
| 1 | 張三 | 1 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 趙六 | 2 |
| 5 | 孫七 | 2 |
+----+------+--------+
1.內連線:在每個表中找出符合條件的共有記錄。[x inner join y on...]
第一種寫法:(相當於多表查詢,用的是where!)
select t.*,s.* from teacher t,student s where t.id=s.tea_id;
第二種寫法:(inner省略了)
select t.*,s.* from teacher t join student s on t.id=s.tea_id;
第三種寫法:
select t.*,s.* from teacher t inner join student s on t.id=s.tea_id;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
+----+--------+----+------+--------+
2.外連線有三種方式:左連線,右連線和全連線。
2.1 左連線:根據左表的記錄,在被連線的右表中找出符合條件的記錄與之匹配
找不到與左表匹配的,用null表示。[x left [outer] join y on...]
第一種寫法:
select t.*,s.* from teacher t left join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t left outer join student s on t.id=s.tea_id;
+----+--------+------+------+--------+
| id | name | id | name | tea_id |
+----+--------+------+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
| 4 | 黎明 | NULL | NULL | NULL |
+----+--------+------+------+--------+
2.2 右連線:根據右表的記錄,在被連線的左表中找出符合條件的記錄與之匹配,
找不到匹配的,用null填充。[x right [outer] join y on...]
第一種寫法:
select t.*,s.* from teacher t right join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t right outer join student s on t.id=s.tea_id;
+------+--------+----+------+--------+
| id | name | id | name | tea_id |
+------+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
+------+--------+----+------+--------+
2.3 全連線:返回符合條件的所有表的記錄,沒有與之匹配的,用null表示(結果是左連線和右連線的並集)
第一種寫法:
select t.*,s.* from teacher t full join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t full outer join student s on t.id=s.tea_id;
3 交叉連線(結果是笛卡爾積)
select t.*,s.* from teacher t cross join student s;
等效於:
select t.*,s.* from teacher t,student s;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 2 | 張學友 | 1 | 張三 | 1 |
| 4 | 黎明 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 2 | 張學友 | 2 | 李四 | 1 |
| 4 | 黎明 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 3 | 王五 | 1 |
| 4 | 黎明 | 3 | 王五 | 1 |
| 1 | 劉德華 | 4 | 趙六 | 2 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 4 | 黎明 | 4 | 趙六 | 2 |
| 1 | 劉德華 | 5 | 孫七 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
| 4 | 黎明 | 5 | 孫七 | 2 |
+----+--------+----+------+--------+
5自連線:連線的表都是同一個表,同樣可以由內連線,外連線各種組合
方式,按實際應用去組合。
SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --連線的兩表是同一個表,別稱不一樣
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左連線寫法
+----+--------+
| id | name |
+----+--------+
| 1 | 劉德華 |
| 2 | 張學友 |
| 4 | 黎明 |
+----+--------+
表2:student
+----+------+--------+
| id | name | tea_id |
+----+------+--------+
| 1 | 張三 | 1 |
| 2 | 李四 | 1 |
| 3 | 王五 | 1 |
| 4 | 趙六 | 2 |
| 5 | 孫七 | 2 |
+----+------+--------+
1.內連線:在每個表中找出符合條件的共有記錄。[x inner join y on...]
第一種寫法:(相當於多表查詢,用的是where!)
select t.*,s.* from teacher t,student s where t.id=s.tea_id;
第二種寫法:(inner省略了)
select t.*,s.* from teacher t join student s on t.id=s.tea_id;
第三種寫法:
select t.*,s.* from teacher t inner join student s on t.id=s.tea_id;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
+----+--------+----+------+--------+
2.外連線有三種方式:左連線,右連線和全連線。
2.1 左連線:根據左表的記錄,在被連線的右表中找出符合條件的記錄與之匹配
找不到與左表匹配的,用null表示。[x left [outer] join y on...]
第一種寫法:
select t.*,s.* from teacher t left join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t left outer join student s on t.id=s.tea_id;
+----+--------+------+------+--------+
| id | name | id | name | tea_id |
+----+--------+------+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
| 4 | 黎明 | NULL | NULL | NULL |
+----+--------+------+------+--------+
2.2 右連線:根據右表的記錄,在被連線的左表中找出符合條件的記錄與之匹配,
找不到匹配的,用null填充。[x right [outer] join y on...]
第一種寫法:
select t.*,s.* from teacher t right join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t right outer join student s on t.id=s.tea_id;
+------+--------+----+------+--------+
| id | name | id | name | tea_id |
+------+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
+------+--------+----+------+--------+
2.3 全連線:返回符合條件的所有表的記錄,沒有與之匹配的,用null表示(結果是左連線和右連線的並集)
第一種寫法:
select t.*,s.* from teacher t full join student s on t.id=s.tea_id;
第二種寫法:
select t.*,s.* from teacher t full outer join student s on t.id=s.tea_id;
3 交叉連線(結果是笛卡爾積)
select t.*,s.* from teacher t cross join student s;
等效於:
select t.*,s.* from teacher t,student s;
+----+--------+----+------+--------+
| id | name | id | name | tea_id |
+----+--------+----+------+--------+
| 1 | 劉德華 | 1 | 張三 | 1 |
| 2 | 張學友 | 1 | 張三 | 1 |
| 4 | 黎明 | 1 | 張三 | 1 |
| 1 | 劉德華 | 2 | 李四 | 1 |
| 2 | 張學友 | 2 | 李四 | 1 |
| 4 | 黎明 | 2 | 李四 | 1 |
| 1 | 劉德華 | 3 | 王五 | 1 |
| 2 | 張學友 | 3 | 王五 | 1 |
| 4 | 黎明 | 3 | 王五 | 1 |
| 1 | 劉德華 | 4 | 趙六 | 2 |
| 2 | 張學友 | 4 | 趙六 | 2 |
| 4 | 黎明 | 4 | 趙六 | 2 |
| 1 | 劉德華 | 5 | 孫七 | 2 |
| 2 | 張學友 | 5 | 孫七 | 2 |
| 4 | 黎明 | 5 | 孫七 | 2 |
+----+--------+----+------+--------+
5自連線:連線的表都是同一個表,同樣可以由內連線,外連線各種組合
方式,按實際應用去組合。
SELECT a.*,b.* FROM table_1 a,table_1 b WHERE a.[name]=b.[name] --連線的兩表是同一個表,別稱不一樣
SELECT a.*,b.* FROM table_1 a LEFT JOIN table_1 b ON a.[name]=b.[name] --左連線寫法