MySQL聯結查詢和組合查詢


聯結查詢

  1.關系表

    主鍵:一列或一組列,能夠唯一區分表中的每一行,用來表示一個特定的行

    外鍵:為某個表中的一列,包含另一個表的主鍵,定義量表的關系。

  2.創建聯結

    規定要連接的表和他們如何關聯即可

    在聯結兩個表時,將第一個表中的每一行與第二個表中的每一行配對,where子句作為過濾條件,只包含那些匹配給定的條件。如果不加where,返回檢索數目為兩表行數的乘積,也就是笛卡爾積。

內聯接

  用典型的聯接運算,使用像 =  或 <> 之類的比較運算符,包括相等聯接和自然聯接。使用:table1 inner join table2 on 條件,on傳遞聯結條件

select user.*,orders.* from user inner join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd  | u_truename | u_role | u_email      | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

外聯結

  1.左外聯結

  LEFT  JOIN或LEFT OUTER JOIN,左向外聯接的結果集包括  LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

select user.*,orders.* from user left join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd  | u_truename | u_role | u_email      | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    4 | xh     | adadad | xiaohong   | seller | hong@163.com | NULL |       NULL |        NULL |          NULL | NULL    | NULL          |
|    5 | xm     | kkkkk  | xiaoming   | seller | ming@qq.com  | NULL |       NULL |        NULL |          NULL | NULL    | NULL          |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

  2.右外聯結

  RIGHT  JOIN 或 RIGHT  OUTER  JOIN,右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

user在左orders在右

select user.*,orders.* from user right join orders on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd  | u_truename | u_role | u_email      | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

orders在左user在右

select user.*,orders.* from orders right join user on user.u_id=orders.o_buyer_id;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd  | u_truename | u_role | u_email      | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    4 | xh     | adadad | xiaohong   | seller | hong@163.com | NULL |       NULL |        NULL |          NULL | NULL    | NULL          |
|    5 | xm     | kkkkk  | xiaoming   | seller | ming@qq.com  | NULL |       NULL |        NULL |          NULL | NULL    | NULL          |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

完全聯結

  FULL  JOIN 或 FULL OUTER JOIN完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。mysql不支持

交叉連接 

  將兩個表的所有行進行組合,連接后的行數為兩個表的乘積數(笛卡爾積),相當於用兩表聯結時不用where加聯結條件,FROM 表名1 CROSS JOIN 表名2

select user.*,orders.* from user cross join orders;
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
| u_id | u_name | u_pwd  | u_truename | u_role | u_email      | o_id | o_buyer_id | o_seller_id | o_totalprices | o_state | o_information |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    1 | z3     | aaaaa  | zhang3     | seller | zhang@qq.com |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    2 | w5     | aaabbb | wang5      | buyer  | wang@163.com |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    3 | ll     | cccbbb | lili       | buyer  | li@163.com   |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    4 | xh     | adadad | xiaohong   | seller | hong@163.com |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    4 | xh     | adadad | xiaohong   | seller | hong@163.com |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    4 | xh     | adadad | xiaohong   | seller | hong@163.com |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
|    5 | xm     | kkkkk  | xiaoming   | seller | ming@qq.com  |    1 |          1 |           1 |           2.5 | sale    | qianbi        |
|    5 | xm     | kkkkk  | xiaoming   | seller | ming@qq.com  |    2 |          2 |           2 |           3.5 | sale    | xiangpi       |
|    5 | xm     | kkkkk  | xiaoming   | seller | ming@qq.com  |    3 |          3 |           3 |             3 | empty   | wenjuhe       |
+------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+

總結

  1. 查兩表關聯列相等的數據用內連接
  2. table1是table2的子集時用右外連接
  3. table1是table2的子集時用左外連接
  4. table1和table2彼此有交集但彼此互不為子集時候用全外
  5. 求差操作的時候用聯合查詢
  6. 多個表查詢的時候,這些不同的連接類型可以寫到一塊

組合查詢

  UNION---執行多個查詢,也就是多條select語句,並將結果作為單個查詢結果集返回,稱為並或符合查詢。

使用情況

  1. 單個查詢中從不同的表返回類似結構的數據
  2. 單個表執行多個查詢,按單個查詢返回數據

使用規則

  1. 必須由兩條及以上的select組成,語句間用UNION
  2. UNION中每個查詢包含相同的列,表達式,或聚集函數
  3. 數據類型兼容,不必完全相同,DBMS可以隱士轉換,如:不同日期類型或不同數值類型

總結

  1. UNION從查詢結果集中自動除去了重復的行,這是默認的若果需要可以改變,用UNION ALL而不是UNION
  2. 只能使用一條order by,必須出現在最后一條select之后,不存在對結果集一部分排序一部分不排序


免責聲明!

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



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