示例表A:sql
author_id | author_name |
1 | Kimmy |
2 | Abel |
3 | Bill |
4 | Berton |
示例表B:函數
book_id | author_id | start_date | end_date |
9 | 1 | 2017-09-25 21:16:04 | 2017-09-25 21:16:06 |
10 | 3 | ||
11 | 2 | 2017-09-25 21:21:46 | 2017-09-25 21:21:47 |
12 | 1 | ||
13 | 8 |
示例表C:blog
order_id | book_id | price | order_date |
1 | 9 | 0.2 | 2017-09-24 21:21:46 |
2 | 9 | 0.6 | 2017-09-25 21:16:04 |
3 | 11 | 0.1 | 2017-09-25 21:21:46 |
在以上表中執行AB表關聯table
SELECT `authors`.*, `books`.book_id FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id
結果class
author_id | author_name | book_id |
1 | Kimmy | 9 |
3 | Bill | 10 |
2 | Abel | 11 |
1 | Kimmy | 12 |
4 | Berton |
結果出現了2條author_id爲1的記錄,由於右表中存在了兩條關聯author_id=1的行date
右邊出現N條關聯左邊的記錄,結果就會相應出現N條關聯了右表出現的記錄語法
在以上表中執行ABC表關聯im
SELECT `authors`.*, `books`.book_id, `orders`.order_id, `orders`.price FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id
結果統計
author_id | author_name | book_id | order_id | order_price |
1 | Kimmy | 9 | 1 | 0.2 |
1 | Kimmy | 9 | 2 | 0.6 |
2 | Abel | 11 | 3 | 0.1 |
3 | Bill | 10 | ||
1 | Kimmy | 12 | ||
4 | Berton |
結果出現了3條author_id=1的記錄,由於authors第一次關聯了books表book_id爲9和12的book關聯了author_id爲1的做者,而book_id爲9的書本則關聯了兩個orders記錄,因此結果集包含3條author_id爲1的記錄查詢
能夠運用
count(),sum()
等函數經過
group by
來統計結果
SELECT `authors`.*, sum(`orders`.price) FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id GROUP BY `books`.book_id
結果集會基於book_id來統計每一本書的訂單總額
author_id | author_name | book_id | sum(order_price) |
4 | Berton | ||
1 | Kimmy | 9 | 0.80 |
3 | Bill | 10 | |
2 | Abel | 11 | 0.10 |
1 | Kimmy | 12 |
book_id爲9的訂單總額爲0.80,而且9的記錄從多條合併爲1條。
多條件join
SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date GROUP BY `books`.book_id
選取在必定時間區間範圍內的order訂單,能夠看到訂單order_id爲1的訂單再也不歸入book_id爲9的統計當中,由於它的時間區間不符合join條件
author_id | author_name | book_id | order_id | sum(`order`.price) |
4 | Berton | |||
1 | Kimmy | 9 | 2 | 0.60 |
3 | Bill | 10 | ||
2 | Abel | 11 | 3 | 0.10 |
1 | Kimmy | 12 |
關於where的使用,看下面示範
SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date WHERE prices is not NULL GROUP BY `books`.book_id
以上語句假設選取price不爲空的記錄,致使了一個錯誤的出現
[Err] 1054 - Unknown column 'prices' in 'where clause'
由於where不能用於選取列的AS別名判斷,MYSQL的處理機制是先進行選取,再進行篩選,在選取階段就啓用了where條件,由於這時並不存在prices的篩選結果後才產生的字段,因此這裏會拋出錯誤
咱們能夠這樣作
SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date WHERE `orders`.price is not NULL GROUP BY `books`.book_id
選取階段order表是存在price字段的,因此只有price不爲空的記錄纔會被選取
author_id | author_name | book_id | order_id | prices |
2 | Abel | 11 | 3 | 0.10 |
1 | Kimmy | 9 | 2 | 0.60 |
運用
having
對那些沒法進行 WHERE 的AS別名的字段進行一些篩選查詢
SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id GROUP BY `books`.book_id HAVING prices > 0.1
這時只有sum爲0.8的結果被選中
author_id | author_name | book_id | sum(order_price) |
1 | Kimmy | 9 | 0.80 |
對於組合其餘語法查詢,也是沒問題的
SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors` LEFT JOIN `books` ON `authors`.author_id = `books`.author_id LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id GROUP BY `books`.book_id HAVING prices >= 0.1 ORDER BY prices asc LIMIT 1,1