创数据库多表查询之 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