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

1772

被折叠的 条评论
为什么被折叠?



