SQL-Join從句
Join從句是SQL中用來處理兩張表中關聯數據的語句
使用以下兩張表table_a
和table_b
作爲栗子進行說明
mysql> select * from table_a;
+----------+-------+
| name | score |
+----------+-------+
| zhangsan | 10 |
| lisi | 20 |
| wangwu | 30 |
+----------+-------+
3 rows in set (0.00 sec)
mysql> select * from table_b;
+----------+------+
| name | age |
+----------+------+
| maer | 21 |
| zhangsan | 22 |
| lisi | 23 |
+----------+------+
3 rows in set (0.00 sec)
Join語句如下,查詢兩個表中關聯的數據:
SELECT * FROM table_a A INNER JOIN table_b B ON A.name = B.name;
Join從句
內連接
mysql> SELECT * FROM table_a A INNER JOIN table_b B ON A.name = B.name;
+----------+-------+----------+------+
| name | score | name | age |
+----------+-------+----------+------+
| zhangsan | 10 | zhangsan | 22 |
| lisi | 20 | lisi | 23 |
+----------+-------+----------+------+
2 rows in set (0.00 sec)
內連接是SQL的默認方式,就是取兩個表中的交集
左連接
mysql> SELECT * FROM table_a A left JOIN table_b B ON A.name = B.name;
+----------+-------+----------+------+
| name | score | name | age |
+----------+-------+----------+------+
| zhangsan | 10 | zhangsan | 22 |
| lisi | 20 | lisi | 23 |
| wangwu | 30 | NULL | NULL |
+----------+-------+----------+------+
3 rows in set (0.00 sec)
在內連接的基礎上還查詢出了table_a
中有而table_b
中沒有的數據,這裏的左右是left JOIN
的左右來決定的
右連接
mysql> SELECT * FROM table_a A right JOIN table_b B ON B.name = A.name;
+----------+-------+----------+------+
| name | score | name | age |
+----------+-------+----------+------+
| NULL | NULL | maer | 21 |
| zhangsan | 10 | zhangsan | 22 |
| lisi | 20 | lisi | 23 |
+----------+-------+----------+------+
3 rows in set (0.00 sec)
全外連接
外連接查詢能返回左右表裏的所有記錄,其中左右表中關聯的數據被連接後返回,不過MySQL
就不支持全外連接
交叉連接
返回被連接的兩個表中符合條件數據的笛卡爾積
交叉連接的效果和內連接是一樣的,但是內連接的效率更好
主要是交叉連接會將所有數據生成一張笛卡爾積表(表a的數量*表b的數量),然後再排出不合法的數據
延伸
Left Excluding JOIN
返回左表中有但是右表中沒有的數據
mysql> SELECT * FROM table_a A left JOIN table_b B ON B.name = A.name WHERE B.name is NULL;
+--------+-------+------+------+
| name | score | name | age |
+--------+-------+------+------+
| wangwu | 30 | NULL | NULL |
+--------+-------+------+------+
1 row in set (0.00 sec)
這其實是一種邏輯組合而不是真的支持這種Join語句
按照這種思路,返回右表有但左表沒有關聯數據的記錄集、返回左表和右表裏沒有相互關聯的記錄集都可以實現了