創數據庫多表查詢之 where & INNER JOIN
幾個join的區別
通過一個例子來說明幾個join:
目標:列出lastName+FirstName+OderNo
如圖
也就是找到全名並且找到該用戶對應的訂購號,只列出匹配的行。
實現這個目標我們可以使用where條件,比如
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
可以滿足目標,但是我們也可以使用join來得到結果。
inner join (join)
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
可以看到查找到的結果,id_p=2的人沒有對應的order所以就不列出來。
left join
如果我們想得到的是以第一個人名錶爲基準的呢,也就是說我要列出所有人的訂購order,即使他沒有order我也列出來,也就是說以左表爲基準。這時我們只使用left join
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
當然即使左表有重複的行,也都會返回,也就是說結果>=左表所有數據。
ps:條件和主鍵無關,只要兩個表能夠匹配上的條件即可。
right join
如果我們想列出所有order呢,即使這個order沒有人訂購,我們關注點不是人,而是order,使用right join也就是以右表爲基準
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
full join
現在我想列出兩個表全部的數據不管是否有對應的字段。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
秒數轉化爲時間格式
(Round四捨五入時間)
SEC_TO_TIME( ROUND( message_reply_time.reply_duration / 1000 ) ) AS r_duration