SQL中的join,group by

SQL中的join,group by

1.组合俩个表:

输入: 
Person表:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1        | Wang     | Allen     |
| 2        | Alice    | Bob       |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city          | state      |
+-----------+----------+---------------+------------+
| 1         | 2        | New York City | New York   |
| 2         | 3        | Leetcode      | California |
+-----------+----------+---------------+------------+
输出: 
+-----------+----------+---------------+----------+
| firstName | lastName | city          | state    |
+-----------+----------+---------------+----------+
| Allen     | Wang     | Null          | Null     |
| Bob       | Alice    | New York City | New York |
+-----------+----------+---------------+----------+
解释: 
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。
select firstName, lastName, city, state
from Person left join Address
on Person.PersonId = Address.PersonId
;

考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join

inner join:2表值都存在

outer join:附表中值可能存在null的情况。

总结:

①A inner join B:取交集

②A left join B:取A全部,B没有对应的值,则为null

③A right join B:取B全部,A没有对应的值,则为null

④A full outer join B:取并集,彼此没有对应的值为null

超过经理收入的员工

输入: 
Employee 表:
+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+
输出: 
+----------+
| Employee |
+----------+
| Joe      |
+----------+
解释: Joe 是唯一挣得比经理多的雇员。

使用join进行连接

SELECT a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;

3.group by的分组方法(利于使用聚合函数):

当你在 SQL 查询中使用 GROUP BY 子句时,结果集会形成一个新的表视图,其中的行是根据指定列的不同值组合进行分组的。每个组代表了原始表中在分组列上具有相同值的所有行的聚合视图。这个“新表”不是物理存在的表,而是查询结果的逻辑展示。

结构和内容

这个通过 GROUP BY 生成的表通常包含:

分组列

GROUP BY 子句中指定的每个列都将作为结果集的一部分出现。每个组的这些列的值是相同的,即这些值是该组中所有行共有的。

聚合列

在 SELECT 子句中包含的任何聚合函数(如 SUM(), AVG(), COUNT(), MIN(), MAX() 等)的结果。这些列显示了对分组后的行执行聚合计算的结果。

在使用 SQL 的 GROUP BY 子句时,你不一定必须使用聚合函数,但通常来说,GROUP BY 是为了配合聚合函数(如 COUNT(), SUM(), AVG(), MIN(), MAX() 等)来使用的,因为它的主要功能是对分组后的数据进行聚合计算。单独使用GROUP BY可以去重。

示例

假设有一个 Orders 表,结构如下:

+---------+----------+-------+
| OrderID | Customer | Total |
+---------+----------+-------+
|       1 | Alice    |   100 |
|       2 | Bob      |    50 |
|       3 | Alice    |   150 |
|       4 | Alice    |   200 |
|       5 | Bob      |   100 |
+---------+----------+-------+

如果执行以下 SQL 查询:

SELECT Customer, COUNT(OrderID) AS NumberOfOrders, SUM(Total) AS TotalSpent
FROM Orders
GROUP BY Customer;

结果将是一个由 GROUP BY 子句生成的表,大致如下:

+----------+---------------+-----------+
| Customer | NumberOfOrders| TotalSpent|
+----------+---------------+-----------+
| Alice    |             3 |       450 |
| Bob      |             2 |       150 |
+----------+---------------+-----------+
Activity 表:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+

Result 表:
+-----------+-------------+
| player_id | first_login |
+-----------+-------------+
| 1         | 2016-03-01  |
| 2         | 2017-06-25  |
| 3         | 2016-03-02  |
+-----------+-------------+
select a.player_id,min(event_date) as first_login
from activity a
group by a.player_id;
count结合group by,where和having使用
SELECT column_name, COUNT(*)
FROM tableName
WHERE another_column > 10
GROUP BY column_name
HAVING COUNT(*) > 5;

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值