mysql之內連接,外連接(左連接,右連接),union,union all的區別


內連接,外連接,左連接,右連接,全連接

測試數據:
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)

一張表中顯示了兩張表的所有數據,先查詢的表,其結果放在前面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM