前提:
本篇文章使用了2张表,其表内容如下:
- websites:
-
access_log
其中:websites.id=access_log.site_id
Join 分类
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER JOIN
- inner join也就是最普通的join)
- INNER JOIN 关键字在表中存在至少一个匹配时返回行。
- 如果 “Websites” 表中的行在 “access_log” 中没有匹配,则不会列出这些行
SELECT websites.name, access_log.count, access_log.date
FROM websites
INNER JOIN access_log ON websites.id = access_log.site_id
ORDER BY access_log.count;
left join(也称为 LEFT OUTER JOIN)
- LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。
- 如果右表中没有匹配,则结果为 NULL。
- LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。
SELECT websites.name, access_log.count, access_log.date
FROM websites
LEFT JOIN access_log ON websites.id = access_log.site_id
ORDER BY access_log.count DESC;
- LEFT JOIN 关键字从左表(access_log)返回所有的行,即使右表(access_log)中没有匹配。
SELECT websites.name, access_log.count, access_log.date
FROM access_log
LEFT JOIN websites ON websites.id = access_log.site_id
ORDER BY access_log.count DESC;
right join( 也称为 RIGHT OUTER JOIN)
- RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。
- 如果左表中没有匹配,则结果为 NULL。
- RIGHT JOIN 关键字从右表(Websites)返回所有的行,即使左表(access_log)中没有匹配。
SELECT websites.name, access_log.count, access_log.date
FROM access_log
RIGHT JOIN websites ON access_log.site_id = websites.id
ORDER BY access_log.count DESC;
- RIGHT JOIN 关键字从右表(access_log)返回所有的行,即使左表(Websites)中没有匹配。
SELECT websites.name, access_log.count, access_log.date
FROM websites
RIGHT JOIN access_log ON access_log.site_id = websites.id
ORDER BY access_log.count DESC;
Group by
-
用于结合聚合函数,根据一个或多个列对结果集进行分组
-
常用聚合函数:
- count(*):获取数量
- sum():求和
- avg():求平均数
- max():求最大值
- min():求最小值
- 这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
-
我们需要注意的是:在使用group by的SQL语句中,select中返回的字段,必须满足以下两个条件之一:
- 包含在group by语句的后面,作为分组的依据;
- 这些字段包含在聚合函数中
SELECT websites.name, COUNT(access_log.aid) AS nums
FROM access_log
LEFT JOIN websites ON access_log.site_id = websites.id
GROUP BY websites.name;