无论是基础查询还是条件查询,最终的结果都是显示了所有字段。即:包含了id, class_id, name, gender, score。如果我们只关心name字段,那么查询语句应该按照如下格式:
SELECT <字段列表> FROM <表名>;
下面是一个实例,展示了如何指定相关字段进行查询。
SELECT class_id, name FROM students WHERE class_id = 1;
查询结果显示了表中一班所有的同学。如果你不想显示class_id,那么查询语句可以改为如下。
SELECT name FROM students WHERE class_id = 1;
注意到,我们使用SELECT * FROM students;默认按照id升序来排列。其实我们可以指定排序的字段,使用ORDER BY关键字即可。语句格式如下:
SELECT * FROM students ORDER BY score;
这样的查询默认是按照升序排列的,如果需要按照降序排列,那么需要加上DESC。
SELECT * FROM students ORDER BY score DESC;
有时候,分数相同,你可能会进一步按照其他规则来排列,例如按照class_id来排列。那么就还需要加上class_id。下面展示的是score和class_id都是按照DESC(降序)来排列。
SELECT name,score,class_id FROM students ORDER BY score,classid DESC;
我们还可以指定score按照DESC排列,但是class_id按照升序排列。
SELECT name,score,class_id FROM students ORDER BY score DESC,class_id;
实际上,默认是升序是ASC。但是ASC可以省略,即:ORDER BY score ASC;和ORDER BY score;是一样的。下面,结合WHERE条件查询,给出一个例子,查询1班的成绩,按照降序输出。
SELECT class_id,name,score FROM students WHERE class_id = 1 ORDER BY score DESC;
将一列数据作为一个整体,进行纵向计算。
注意,聚合函数不会计算值是NULL的字段。
现在,我们的表中有15条数据。现在我们来计算math和english字段的数量。
可以看到,凡是字段值为NULL,count就不会去计算它。为了能够计算到值为NULL的字段,使用IFNULL()把NULL替换为0,保证计算正确。
SELECT SUM(english) 英语总分,AVG(IFNULL(english,0)) 英语平均分,SUM(math) 数学总分,AVG(IFNULL(math,0)) 数学平均分 FROM students;
SELECT SUM(english) 英语总分,AVG(english) 英语平均分,SUM(math) 学总分 ,AVG(math) 数学平均分 FROM students;
上面两条语句的查询结果如下所示:
分组就是按照某一个字段来进行分组。使用关键字GROUP BY。下面是一个例子:
SELECT gender,COUNT(gender) FROM students GROUP BY gender;
下面再来看一个例子,我想知道表中有几个班级,每个班级有几个人。
注意,分组之后,查询的字段只能是分组字段,聚合函数。其他字段没有意义。
WHERE和HAVING:
WHERE在分组之前进行限定,如果不满足条件,则不进行分组。HAVING在分组之后进行限定,如果不满足条件,则不会被查询出来。
WHERE后不能跟聚合函数,而HAVING可以跟聚合函数。
有时候数据量很大,很多,一页根本显示不下,但是你又必须看看数据库中的数据。那么这时候,你就需要分页显示。子句格式如下。
LIMIT <M> OFFSET <N>
LIMIT 3表示最多显示3个记录,OFFSET 0表示从0号记录开始显示。那么查询下一页的命令应该如下:
SELECT class_id,name,score FROM students ORDER BY score LIMIT 3 OFFSET 3;
以此类推,查询下下一页应该是LIMIT 3 OFFSET 6;一直到LIMIT 3 OFFSET 9;会把剩下的都显示出来,因为我们就只有10条信息。
OFFSET
是可选的,如果只写LIMIT 15
,那么相当于LIMIT 15 OFFSET 0
。在MySQL中,LIMIT 15 OFFSET 30
还可以简写成LIMIT 30, 15
。使用LIMIT <M> OFFSET <N>
分页时,随着N
越来越大,查询效率也会越来越低。
SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询。下面以使用SQL内置的COUNT()
函数查询为例进行说明。
COUNT(*)
表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:
SELECT COUNT(*) num FROM students;
实际上,COUNT(*)和COUNT(id)的效果是一致的。
除了COUNT()
函数外,SQL还提供了如下聚合函数:
函数 | 说明 |
---|---|
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值 |
MIN | 计算某一列的最小值 |
例如计算总分和平均分。
还可以加上条件限制,例如计算一班的平均分。