总结一下常用的查询SQL语法,不考虑表连接。
先上一个表,说明一下 select 语句 中常用关键词的 顺序:
子句 |
说明 |
是否必须使用 |
select |
要返回的列或表示式, * 代表全部列 |
是 |
form |
从中检索数据的表 |
仅在从表选择数据时使用 |
where |
行级过滤 |
否 |
group by |
分组说明 |
仅在按组计算聚集时使用 |
having |
组级过滤 |
否 |
order by |
输出排序顺序 |
否 |
limit |
要检索的行数 |
否 |
然后用一个简单的表,说明各 关键词 的用法。
user 表:
id name age status cost
1 Allen 16 1 22.11
2 June 18 1 36
3 Jhon 28 2 71
4 Amy 45 4 39
5 Jack 67 5 55.24
6 Ashley 43 2 49
7 Jessica 34 3 87
8 Mark 44 3 61.22
9 Vincent 21 4 13.11
10 William 28 5 1
11 Gary 41 3 56.44
12 Clinton 38 4 45.11
1. 简单条件查询 ( where )
SELECT * FROM `user` WHERE age > 22;
返回 行中 age > 22的所有行,行中的每一个列都显示。
id name age status cost
3 Jhon 28 2 71
4 Amy 45 4 39
5 Jack 67 5 55.24
6 Ashley 43 2 49
7 Jessica 34 3 87
8 Mark 44 3 61.22
10 William 28 5 1
11 Gary 41 3 56.44
12 Clinton 38 4 45.11
2. 按顺序排列 (order by)
SELECT * FROM `user` WHERE age > 22 ORDER BY `status`;
结果是根据 status 字段 升序 排列。 默认为升序 asc , 降序为 desc 。
id name age status cost
3 Jhon 28 2 71
6 Ashley 43 2 49
7 Jessica 34 3 87
8 Mark 44 3 61.22
11 Gary 41 3 56.44
4 Amy 45 4 39
12 Clinton 38 4 45.11
5 Jack 67 5 55.24
10 William 28 5 1
order by 后面可以跟多个字段,用 "," 隔开。排列机制是先根据第一个字段顺序排列,如果第一个字段有多个重复的行,则根据第二个字段顺序排列,依次类推。
SELECT * FROM `user` WHERE age > 22 ORDER BY `status`, cost DESC;
id name age status cost
3 Jhon 28 2 71
6 Ashley 43 2 49
7 Jessica 34 3 87
8 Mark 44 3 61.22
11 Gary 41 3 56.44
12 Clinton 38 4 45.11
4 Amy 45 4 39
5 Jack 67 5 55.24
10 William 28 5 1
3. 截取行数(limit)
SELECT * FROM `user` WHERE age > 22 LIMIT 1, 2;
limit 后面可以跟两个参数,用“,”隔开。第一个参数是起始行号,第二个参数是截取行数。
id name age status cost
4 Amy 45 4 39
5 Jack 67 5 55.24
limit后面也可以只跟1个参数,这个参数代表截取行数。这种情况是省略了起始行号,默认为0。
我们可以用 order by 列名 asc limit 1 获取该列的最小值的那一行;order by 列名 desc limit 1 获取最大值的那一行。
SELECT * FROM `user` WHERE age > 22 ORDER BY cost DESC LIMIT 1;
id name age status cost
7 Jessica 34 3 87
4. 分组(group by)
group by 是按某一列的值进行分组,返回的结果行数与组的个数一致。因此,只有在使用聚合函数时使用。
虽然group by 和 order by 在特殊情况下返回的结果是一样的,但是千万不要这么用。
group by 重在分组,且对每一组的数据进行聚合操作(求总和,平均等), 而 order by 重在排序,不进行聚合,结果行数是源行数。
统计不同 status 组的用户的总花费:
SELECT `status`, SUM(cost) AS cost FROM `user` GROUP BY `status`;
status cost
1 58.11
2 120.00
3 204.66
4 97.22
5 56.24
同样可以加一下条件,只统计 age > 22 的用户
SELECT `status`, SUM(cost) AS cost FROM `user` WHERE age > 22 GROUP BY `status`;
status cost
2 120.00
3 204.66
4 84.11
5 56.24
还可以再次基础上增加 顺序 和 行截取,将上面的结果按 cost 升序排序,截取前3个结果。
SELECT `status`, SUM(cost) AS cost FROM `user` WHERE age > 22 GROUP BY `status` ORDER BY cost LIMIT 3;
status cost
5 56.24
4 84.11
2 120.00
5. 过滤分组(having)
这个是什么意思呢?其实他跟 where 的用途是一样的,只不过 where 是用来条件过滤表, having 是过滤 group by 后的分组。因为 where 不能过滤分组。
SELECT `status`, SUM(cost) AS cost FROM `user` GROUP BY `status` HAVING SUM(cost) > 100;
status分组后,过滤出分组中 cost > 100的组
status cost
2 120.00
3 204.66
写一个比较完整的SQL语句:
SELECT `status`, SUM(cost) AS cost FROM `user` WHERE age > 22 GROUP BY `status` HAVING SUM(cost) > 80 ORDER BY cost LIMIT 2;
status cost
4 84.11
2 120.00
6. 去重复 (DISTINCT)
这个关键词可以查询表中某一列的所有值。使用DISTINCT时,select 只能跟一个列。
SELECT DISTINCT(`status`) FROM `user`;
status
1
2
4
5
3
7. 选取介于两个值之间的数据范围 (between value1 and value2)
where 子句中的关键词,选取介于两个值之间的数据范围, 这些值可以是数值、文本或者日期。
SELECT * FROM `user` WHERE age BETWEEN 24 AND 45;
id name age status cost
3 Jhon 28 2 71
4 Amy 45 4 39
6 Ashley 43 2 49
7 Jessica 34 3 87
8 Mark 44 3 61.22
10 William 28 5 1
11 Gary 41 3 56.44
12 Clinton 38 4 45.11
8. 选取规定的多个值(in (value1,value2,...))
where 子句中的关键词,选取规定的多个值。
SELECT * FROM `user` WHERE age in (28, 43, 45,66 );
id name age status cost
3 Jhon 28 2 71
4 Amy 45 4 39
6 Ashley 43 2 49
10 William 28 5 1
下面在介绍一些常用的函数:
1. 行数统计(count())
聚合成一行,值为整形。
SELECT count(cost) FROM `user` WHERE age BETWEEN 24 AND 45;
count(cost)
8
2. 求平均、总和、最大、最小(avg(), sum(), max(), min())
这4个聚合函数的用法都是一样的。
SELECT SUM(cost) FROM `user`;
SUM(cost)
536.23
未完待续。。。