SQL 中的 join 及group by

文章目录

      • 前提:
      • Join 分类
        • INNER JOIN
        • left join(也称为 LEFT OUTER JOIN)
        • right join( 也称为 RIGHT OUTER JOIN)
        • Group by

前提:

本篇文章使用了2张表,其表内容如下:

  • websites:

SQL 中的 join 及group by_第1张图片

  • access_log

    SQL 中的 join 及group by_第2张图片

其中:websites.id=access_log.site_id

Join 分类

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN:只要其中一个表中存在匹配,则返回行

INNER JOIN

SQL 中的 join 及group by_第3张图片

  • 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;

SQL 中的 join 及group by_第4张图片

left join(也称为 LEFT OUTER JOIN)

SQL 中的 join 及group by_第5张图片

  • 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;

SQL 中的 join 及group by_第6张图片

  • 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;

SQL 中的 join 及group by_第7张图片

right join( 也称为 RIGHT OUTER JOIN)

SQL 中的 join 及group by_第8张图片

  • 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;

SQL 中的 join 及group by_第9张图片

  • 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;

SQL 中的 join 及group by_第10张图片

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;

SQL 中的 join 及group by_第11张图片

你可能感兴趣的:(Join)