Join從句 SQL-Join從句

SQL-Join從句

Join從句是SQL中用來處理兩張表中關聯數據的語句

使用以下兩張表table_atable_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語句

按照這種思路,返回右表有但左表沒有關聯數據的記錄集、返回左表和右表裏沒有相互關聯的記錄集都可以實現了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章