內連接,外連接,左連接,右連接,全連接
測試數據:
CREATE TABLE `a_table` (
`a_id` int(11) DEFAULT NULL,
`a_name` varchar(10) DEFAULT NULL,
`a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into a_table values(1,"老潘","總裁部"),(2,"老王","秘書部"),(3,"老張","設計部"),(4,"老李","運營部");
select * from a_table;
create table `b_table` (
`b_id` int(11) DEFAULT NULL,
`b_name` varchar(10) DEFAULT NULL,
`b_part` varchar(10) DEFAULT NULL
)ENGINE = INNODB DEFAULT CHARSET = utf8;
insert into b_table values(2,"老王","秘書部"),(3,"老張","設計部"),(5,"老劉","人事部"),(6,"老黃","生產部");
select * from b_table;
內連接 :
inner join...on
join...on
cross join...on
以上三種都是內連接語法
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part |
+------+--------+-----------+
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
# 內連接
mysql> select * from a_table a inner join b_table b on a.a_id=b.b_id;
+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+-----------+------+--------+-----------+
| 2 | 老王 | 秘書部 | 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 | 3 | 老張 | 設計部 |
+------+--------+-----------+------+--------+-----------+
2 rows in set (0.02 sec)
# 同時可以使用以下的三種方法:
mysql> select * from a_table, b_table where a_table.a_id = b_table.b_id;
mysql> select * from a_table a cross join b_table b on a.a_id=b.b_id;
mysql> select * from a_table a join b_table b on a.a_id=b.b_id;
組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集(陰影)部分。
左連接(左外連接)
left join ... on ...
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part |
+------+--------+-----------+
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
# 左連接
mysql> select * from a_table a left join b_table b on a.a_id=b.b_id;
+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+-----------+------+--------+-----------+
| 2 | 老王 | 秘書部 | 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 | 3 | 老張 | 設計部 |
| 1 | 老潘 | 總裁部 | NULL | NULL | NULL |
| 4 | 老李 | 運營部 | NULL | NULL | NULL |
+------+--------+-----------+------+--------+-----------+
4 rows in set (0.04 sec)
說明:left join 是left outer join的簡寫,它的全稱是左外連接,是外連接中的一種。
左(外)連接,左表(a_table)的記錄將會全部表示出來,而右表(b_table)只會顯示符合搜索條件的記錄。右表記錄不足的地方均為NULL。
右連接(右外連接)
right join ... on ...
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part |
+------+--------+-----------+
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from a_table a right join b_table b on a.a_id=b.b_id;
+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part | b_id | b_name | b_part |
+------+--------+-----------+------+--------+-----------+
| 2 | 老王 | 秘書部 | 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 | 3 | 老張 | 設計部 |
| NULL | NULL | NULL | 5 | 老劉 | 人事部 |
| NULL | NULL | NULL | 6 | 老黃 | 生產部 |
+------+--------+-----------+------+--------+-----------+
4 rows in set (0.00 sec)
說明:right join是right outer join的簡寫,它的全稱是右外連接,是外連接中的一種。
與左(外)連接相反,右(外)連接,左表(a_table)只會顯示符合搜索條件的記錄,而右表(b_table)的記錄將會全部表示出來。左表記錄不足的地方均為NULL。
union
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part |
+------+--------+-----------+
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from a_table union select * from b_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
6 rows in set (0.00 sec)
一張表中顯示了兩張表的數據(不重復的數據),先查詢的表,其結果放在前面。
union all
mysql> select * from a_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from b_table;
+------+--------+-----------+
| b_id | b_name | b_part |
+------+--------+-----------+
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
4 rows in set (0.00 sec)
mysql> select * from a_table union all select * from b_table;
+------+--------+-----------+
| a_id | a_name | a_part |
+------+--------+-----------+
| 1 | 老潘 | 總裁部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 4 | 老李 | 運營部 |
| 2 | 老王 | 秘書部 |
| 3 | 老張 | 設計部 |
| 5 | 老劉 | 人事部 |
| 6 | 老黃 | 生產部 |
+------+--------+-----------+
8 rows in set (0.00 sec)
一張表中顯示了兩張表的所有數據,先查詢的表,其結果放在前面。