聯結查詢
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 | +------+--------+--------+------------+--------+--------------+------+------------+-------------+---------------+---------+---------------+
總結
- 查兩表關聯列相等的數據用內連接
- table1是table2的子集時用右外連接
- table1是table2的子集時用左外連接
- table1和table2彼此有交集但彼此互不為子集時候用全外
- 求差操作的時候用聯合查詢
- 多個表查詢的時候,這些不同的連接類型可以寫到一塊
組合查詢
UNION---執行多個查詢,也就是多條select語句,並將結果作為單個查詢結果集返回,稱為並或符合查詢。
使用情況
- 單個查詢中從不同的表返回類似結構的數據
- 單個表執行多個查詢,按單個查詢返回數據
使用規則
- 必須由兩條及以上的select組成,語句間用UNION
- UNION中每個查詢包含相同的列,表達式,或聚集函數
- 數據類型兼容,不必完全相同,DBMS可以隱士轉換,如:不同日期類型或不同數值類型
總結
- UNION從查詢結果集中自動除去了重復的行,這是默認的若果需要可以改變,用UNION ALL而不是UNION
- 只能使用一條order by,必須出現在最后一條select之后,不存在對結果集一部分排序一部分不排序