SQL - 查询常用语法

总结一下常用的查询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
未完待续。。。











猜你喜欢

转载自blog.csdn.net/maihilton/article/details/80910983