mysql关键字group by_MySQL的常用关键字:WHERE/GROUP BY/JOIN&TopN问题

本文详细讲解了SQL中的WHERE子句用法,包括查找特定条件的数据、IN和NOT IN操作,以及如何结合GROUP BY进行分组统计。同时介绍了JOIN操作,如LEFT JOIN, RIGHT JOIN和INNER JOIN,并通过实例演示了如何创建视图和使用聚合函数。涵盖了SQL基本操作和数据处理的高级技巧。

2ff34e647e2e3cdfd8dca593e17d9b0a.png

SQL - WHERE

MySQL WHERE 子句的作用是有条件地从表中选取数据,常见于SELECT语句中,另外也可用于DELETE或UPDATE命令。

WHERE在SELECT语句中

假设表中有如下数据:1mysql> select * from `orders-detail`;

2+

3| customer | product | count |

4+

5| zhangsan | product01 | 2 |

6| lisi | product02 | 4 |

7| wangwu | product03 | 1 |

8| zhangsan | product04 | 2 |

9| lisi | product04 | 5 |

10+

115 rows in set (0.00 sec)找出customer是zhangsan的数据:1mysql> select * from `orders-detail` where customer='zhangsan';

2

3-- 搭配in

4mysql> select * from `orders-detail` where customer in('zhangsan');

5+

6| customer | product | count |

7+

8| zhangsan | product01 | 2 |

9| zhangsan | product04 | 2 |

10+

112 rows in set (0.00 sec)

找出customer不是zhangsan的数据:1mysql> select * from `orders-detail` where customer!='zhangsan';

2

3-- 搭配not in

4mysql> select * from `orders-detail` where customer not in('zhangsan');

5+

6| customer | product | count |

7+

8| lisi | product02 | 4 |

9| wangwu | product03 | 1 |

10| lisi | product04 | 5 |

11+

123 rows in set (0.01 sec)

给出所有购入商品为两种或两种以上的购物人的购物记录:1mysql> select * from `orders-detail` where customer in (select customer from `orders-detail` group by customer having count(*) >= 2);

2+

3| customer | product | count |

4+----------+-----------+-------+

5| zhangsan | product01 | 2 |

6| lisi | product02 | 4 |

7| zhangsan | product04 | 2 |

8| lisi | product04 | 5 |

9+----------+-----------+-------+

104 rows in set (0.01 sec)

11

12-- SQL拆分

13SELECT

14*

15FROM

16`orders-detail`

17WHERE

18customer IN ( SELECT customer FROM `orders-detail` GROUP BY customer HAVING count(*) >= 2 );

WHERE在UPDATE语句中

更新customer=lisi,且product=product04的count数量为6:1mysql> update `orders-detail` set count=6 where customer='lisi' and product='product04';

2Query OK, 1 row affected (0.03 sec)

3Rows matched: 1 Changed: 1 Warnings: 0

4

5mysql> select * from `orders-detail`;

6+----------+-----------+-------+

7| customer | product | count |

8+----------+-----------+-------+

9| zhangsan | product01 | 2 |

10| lisi | product02 | 4 |

11| wangwu | product03 | 1 |

12| zhangsan | product04 | 2 |

13| lisi | product04 | 6 |

14+----------+-----------+-------+

155 rows in set (0.00 sec)

16

17-- SQL拆分

18UPDATE `orders-detail`

19SET count = 6

20WHERE

21customer = 'lisi' AND product = 'product04';

WHERE在DELETE语句中删除customer为wangwu的记录:1mysql> delete from `orders-detail` where customer='wangwu';

2Query OK, 1 row affected (0.02 sec)

3

4mysql> select * from `orders-detail`;

5+----------+-----------+-------+

6| customer | product | count |

7+----------+-----------+-------+

8| zhangsan | product01 | 2 |

9| lisi | product02 | 4 |

10| zhangsan | product04 | 2 |

11| lisi | product04 | 6 |

12+----------+-----------+-------+

134 rows in set (0.00 sec)

14

15-- 等价于如下SQL,搭配in

16delete from `orders-detail` where customer in ('wangwu');

删除count大于4的记录:1mysql> delete from `orders-detail` where count > 4;

2Query OK, 1 row affected (0.10 sec)

3

4mysql> select * from `orders-detail`;

5+----------+-----------+-------+

6| customer | product | count |

7+----------+-----------+-------+

8| zhangsan | product01 | 2 |

9| lisi | product02 | 4 |

10| zhangsan | product04 | 2 |

11+----------+-----------+-------+

123 rows in set (0.00 sec)

SQL - GROUP BY

GROUP BY子句根据一个或者多个类对结果集进行分组。

在分组的列上我们可以使用COUNT, SUM, AVG等聚合函数。

表数据如下:1-- date: 当日首次登录时间

2-- login: 当日登录次数

3mysql> select * from `employee_tbl`;

4+----+--------+---------------------+--------+

5| id | name | date | login |

6+----+--------+---------------------+--------+

7| 1 | 小明 | 2016-04-22 15:25:33 | 1 |

8| 2 | 小王 | 2016-04-20 15:25:47 | 3 |

9| 3 | 小丽 | 2016-04-19 15:26:02 | 2 |

10| 4 | 小王 | 2016-04-07 15:26:14 | 4 |

11| 5 | 小明 | 2016-04-11 15:26:40 | 4 |

12| 6 | 小明 | 2016-04-04 15:26:54 | 2 |

13+----+--------+---------------------+--------+

146 rows in set (0.00 sec)按名字分组,并统计每人的记录数:1mysql> select name,count(*) from `employee_tbl` group by name;

2+--------+----------+

3| name | count(*) |

4+--------+----------+

5| 小明 | 3 |

6| 小王 | 2 |

7| 小丽 | 1 |

8+--------+----------+

93 rows in set (0.00 sec)

按名字分组,并统计每个人登录的次数:1-- WITH ROLLUP可以实现在分组统计基础上,再进行相同的统计(SUM,AVG,COUNT...)

2mysql> select name,sum(login) as login_count from `employee_tbl` group by name with rollup;

3+--------+--------------+

4| name | login_count |

5+--------+--------------+

6| 小丽 | 2 |

7| 小明 | 7 |

8| 小王 | 7 |

9| NULL | 16 |

10+--------+--------------+

114 rows in set (0.01 sec)

12-- NULL表示所有人的登录次数

13

14-- 可以使用 coalesce 来设置一个可以取代NUll的名称,coalesce 语法:

15select coalesce(a,b,c);

16-- 说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果abc都为null,则返回null

17

18-- 如下:

19mysql> select coalesce(name, '总数'),sum(login) as login_count from `employee_tbl` group by name with rollup;

20+--------------------------+--------------+

21| coalesce(name, '总数') | login_count |

22+--------------------------+--------------+

23| 小丽 | 2 |

24| 小明 | 7 |

25| 小王 | 7 |

26| 总数 | 16 |

27+--------------------------+--------------+

284 rows in set (0.00 sec)

SQL - JOIN

MySQL中常用的JOIN有三种:left join, right join, inner join。

left join: 左连接,以左表为主,显示左表的全部记录;右表是匹配的,匹配不到就以NULL显示。

right join: 右连接,以右表为主,显示其全部记录;左表是匹配的,匹配不到就以NULL显示,正好与left join相反。

inner join: 内连接,根据某个字段关联,只显示左右表中都存在的记录。

具体见我的另一篇博客:

MySQL的TopN问题

需要创建视图,将查询结果保存为视图,后续在视图中继续执行SQL查询。

可以参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值