SQL 中的 join 及group by

本文详细介绍了SQL中的JOIN操作,包括INNER JOIN、LEFT JOIN和RIGHT JOIN,以及GROUP BY子句的使用。通过实例展示了如何根据共同字段联合不同表的行,并解释了各种JOIN类型的工作原理。同时,文章还探讨了GROUP BY与聚合函数如COUNT、SUM、AVG、MAX和MIN的配合使用,强调了在使用GROUP BY时对SELECT字段的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:

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

  • websites:

image-20190424212239196

  • access_log

    image-20190424212337650

其中:websites.id=access_log.site_id

Join 分类

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

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

image-20190424212024321

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

image-20190424212456969

left join(也称为 LEFT OUTER JOIN)

image-20190424212829531

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

image-20190424212753878

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

image-20190424212732198

right join( 也称为 RIGHT OUTER JOIN)

image-20190424213029809

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

image-20190424213142330

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

image-20190424213158523

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;

image-20190424214004381

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值