第三章 数据库单表查询
1.简介
在购物网站中,后端的数据库存放着数以千计的商品信息。每当用户浏览商品时,数据库都会进行大量的SELECT操作来查询相关数据。另外,用户也可以通过在网站页面的搜索框中检索关键字来达到更快的搜索效果。在实际工作中,对数据查询的需求也比对数据增、删、改的需求更多。本章详细讲解数据查询的相关内容。

2.基础查询
MySQL数据库中通过SELECT语句查询数据,该语句支持添加多种条件与参数,语句的基础格式如下所示。
select 字段名1,字段名2,.... from 表名;
下面详细讲解 SELECT 语句的使用方法。

3.创建基本的数据表环境
在讲解查询语句前,首先创建4个数据表并插入数据,用于后面例题的演示。为了与前面章节中创建的表进行区分,这里将新建一个名为Chapter_Four的数据库,并在该库中分别创建学生表student、课程表 course、成绩表score和老师表teacher,其中学生表student的结构如表所示。
图片 13.png
创建数据库Chapter_Four,具体SQL语句如下所示。
MariaDB [(none)]> create database Chapter_Four;
Query OK, 1 row affected (0.003 sec)

MariaDB [(none)]> use Chapter_Four;
Database changed
MariaDB [Chapter_Four]>
根据表中提供的表结构在 Chapter_Four 库中创建学生表,具体的 SQL 语句如下所示。
MariaDB [Chapter_Four]> create table student(sid char(6) comment '学生学号',sname varchar(50) comment '学生姓名',age int comment '学生年龄',gender varchar(50) comment '学生性别');
Query OK, 0 rows affected (0.017 sec)

MariaDB [Chapter_Four]>
student 表创建完成后,接下来便可以将数据插入表。此处根据表所示的数据内容进行操作,读者也可以自定义表中的数据。
图片 14.png
根据表提供的信息将相关数据插入表,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> insert into student(sid,sname,age,gender) values('1001','liwei',22,'male'),('1002','zhaohang',23,'male'),('1003','liuyi',21,'female'),('1004','wangwu',24,'male'),('1005','sunrei',21,'female'),('1006','zhouyan',20,'female'),('1007','tianqiang',19,'male'),('1008','moyan',23,'female'),('1009','dinghao',19,'male'),('1010','ludashi',22,'male'),('1011','dongxiaojie',25,'female');
Query OK, 11 rows affected (0.003 sec)
Records: 11 Duplicates: 0 Warnings: 0

MariaDB [Chapter_Four]>
学生表创建完成后,接下来创建课程表 course,其结构如表所示。
图片 15.png
创建课程表course,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> create table course(cid int comment '课程编号',cname varchar(200) comment '课程名称',tid int comment '任课教师编号') engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.012 sec)

MariaDB [Chapter_Four]>
表中列出了课程表course的字段、字段类型和说明,接下来根据表所示的内容将数据插入课程表course。course表内容如表所示。
图片 16.png
接下来将相关数据插入课程表,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> insert into course (cid,cname,tid) values (1,'英语',5),(2,'高等数学',2),(3,'计算机网络原理',7),(4,'网络安全',1),(5,'云计算技术',3),(6,'音乐与艺术',9),(7,'电子信息技术',4),(8,'互联网管理',6),(9,'思想道德基础与法律修养',8);
Query OK, 9 rows affected (0.002 sec)
Records: 9 Duplicates: 0 Warnings: 0

MariaDB [Chapter_Four]>
课程表创建完成后,接下来创建成绩表score,表结构如表。
图片 17.png
表内容如表所示。
图片 18.png
根据表创建相关表,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> create table score(sid int comment '学生学号',cid int comment '课程编号',score int comment '成绩');
Query OK, 0 rows affected (0.010 sec)

MariaDB [Chapter_Four]>
根据表提供的内容将数据插入成绩表,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> insert into score(sid,cid,score) values(1002,2,82),(1003,5,74),(1003,3,92),(1004,6,73),(1005,8,91),(1006,9,73),(1008,7,62),(1008,2,81),(1009,1,77),(1010,4,69),(1011,7,62),(1001,6,71),(1007,3,66),(1003,4,92),(1003,9,86),(1005,5,70),(1009,7,80),(1010,3,87),(1009,8,59);
Query OK, 19 rows affected (0.005 sec)
Records: 19 Duplicates: 0 Warnings: 0

MariaDB [Chapter_Four]>
最后创建老师表teacher,表结构如表所示,表内容如表所示。
图片 1.png
图片 2.png
根据表提供的表结构创建teacher表,具体SQL语句如下所示。
MariaDB [Chapter_Four]> create table teacher(tid int comment '老师编号',tname varchar(200) comment '老师姓名')engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.011 sec)

MariaDB [Chapter_Four]>
根据表提供的表内容向teacher表中插入数据,具体SQL语句如下所示。
MariaDB [Chapter_Four]> insert into teacher(tid,tname) values (1,'周老师'),(2,'王老师'),(3,'董老师'),(4,'李老师'),(5,'黄老师'),(6,'闫老师'),(7,'刘老师'),(8,'杨老师'),(9,'田老师');
Query OK, 9 rows affected (0.002 sec)
Records: 9 Duplicates: 0 Warnings: 0

MariaDB [Chapter_Four]>
数据插入成功后使用SHOW命令查看创建完成的表。
MariaDB [Chapter_Four]> show tables;
+------------------------+
| Tables_in_Chapter_Four |
+------------------------+
| course |
| score |
| student |
| teacher |
+------------------------+
4 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
至此,4张表创建完成,下面将针对这些表进行相关的查询操作。

4.查询所有字段
查询表中所有字段对应的数据就相当于查询整个表,其语法有以下两种格式。
1.格式一
select 字段名1,字段名2,.....,字段名N from 表名;
在以上语法格式中,如果查询时指定的字段顺序与数据表中的字段顺序不一致,那么查询出来的结果集会按指定的字段顺序显示。
接下来通过具体实例演示这种情况。
查询student表中的数据,并将查询结果集按照与数据表中字段顺序相反的顺序显示。
MariaDB [Chapter_Four]> desc student;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| sid | char(6) | YES | | NULL | |
| sname | varchar(50) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| gender | varchar(50) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.004 sec)

MariaDB [Chapter_Four]>
从上方语句的执行结果可以看出,student表中字段的顺序为sid、sname、age、gender。
接下来将对字段进行相反的排序。
MariaDB [Chapter_Four]> select gender,age,sname,sid from student;
+--------+------+-------------+------+
| gender | age | sname | sid |
+--------+------+-------------+------+
| male | 22 | liwei | 1001 |
| male | 23 | zhaohang | 1002 |
| female | 21 | liuyi | 1003 |
| male | 24 | wangwu | 1004 |
| female | 21 | sunrei | 1005 |
| female | 20 | zhouyan | 1006 |
| male | 19 | tianqiang | 1007 |
| female | 23 | moyan | 1008 |
| male | 19 | dinghao | 1009 |
| male | 22 | ludashi | 1010 |
| female | 25 | dongxiaojie | 1011 |
+--------+------+-------------+------+
11 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,student表中的数据都被查询并显示出来,显示的字段顺序与数据表中字段顺序相反。
2.格式二
在格式一中,如果表中存在较多的字段,查询表内容时会比较烦琐,而且出错的概率也比较大。因此,MySQL提供了通配符“*”来代替所有的字段名,便于书写SQL语句。具体的语句格式如下所示。
select * from 表名;
接下来将通过具体实例演示SELECT语句中通配符的使用。
MariaDB [Chapter_Four]> select * from teacher;
+------+-----------+
| tid | tname |
+------+-----------+
| 1 | 周老师 |
| 2 | 王老师 |
| 3 | 董老师 |
| 4 | 李老师 |
| 5 | 黄老师 |
| 6 | 闫老师 |
| 7 | 刘老师 |
| 8 | 杨老师 |
| 9 | 田老师 |
+------+-----------+
9 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上结果可以看出使用通配符查询出了表中的数据。需要注意,这种查询方式虽然简单快捷,但是不能自定义字段的位置。
SELECT语句不仅可以查看所有字段值,而且还可以查询表中指定字段对应的值,语法格式如下所示。
select 字段名1,字段名2 from 表名;
下面通过具体实例演示使用SELECT语句查询指定字段。
MariaDB [Chapter_Four]> select sid,score from score;
+------+-------+
| sid | score |
+------+-------+
| 1002 | 82 |
| 1003 | 74 |
| 1003 | 92 |
| 1004 | 73 |
| 1005 | 91 |
| 1006 | 73 |
| 1008 | 62 |
| 1008 | 81 |
| 1009 | 77 |
| 1010 | 69 |
| 1011 | 62 |
| 1001 | 71 |
| 1007 | 66 |
| 1003 | 92 |
| 1003 | 86 |
| 1005 | 70 |
| 1009 | 80 |
| 1010 | 87 |
| 1009 | 59 |
+------+-------+
19 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,查询出的结果集中只存在sid和score两个字段,证明指定字段查询成功。

5.条件查询
MySQL支持通过在句中加入条件选项查询指定数据,如某个年龄段的学生、分数在某个区间的学生等。接下来详细介绍条件查询语句的使用方法。

6.关系运算符
在SELECT语句中可以使用WHERE子句指定查询条件,从而查询出筛选后的数据,语法格式如下所示。
select 字段名1,字段名2,..... from 表名 where 条件表达式;
语法格式中,“字段名 1,字段名 2,…”表示需要查询的字段名称,条件表达式表示过滤筛选数据的条件。MySQL中提供了一系列关系运算符,这些关系运算符可以用在条件表达式中过滤数据。常见的关系运算符如表所示。
图片 3.png
表中列出了常见的关系运算符,其中“!=”和“<>”都表示不等于,但由于有些关系型数据库不支持“!=”运算符,因此在MySQL中建议使用“<>”运算符。下面将通过具体实例演示关系运算符的基本使用方法。
MariaDB [Chapter_Four]> select * from student where gender='male';
+------+-----------+------+--------+
| sid | sname | age | gender |
+------+-----------+------+--------+
| 1001 | liwei | 22 | male |
| 1002 | zhaohang | 23 | male |
| 1004 | wangwu | 24 | male |
| 1007 | tianqiang | 19 | male |
| 1009 | dinghao | 19 | male |
| 1010 | ludashi | 22 | male |
+------+-----------+------+--------+
6 rows in set (0.004 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,表student中男性学生为6名。在例中,因为gender字段为字符串类型,为了保持输出一致,需在查询条件的字符串上使用单引号。

7.多条件查询
在查询数据时常常会遇到需要查询满足多个条件的数据,接下来将详细介绍多条件查询语句中的关键字和使用方法。
1.AND关键字
在MySQL中使用SELECT查询满足多种条件的数据时,可以用AND关键字连接查询条件,具体语法格式如下所示。
select 字段名1,字段名2,..... from 表名 where 条件表达式1 and 条件表达式2 .....;
上述语法格式中,WHERE子句后可以写多个条件表达式,表达式之间用AND连接。下面通过具体实例演示AND关键字的使用方法。
题目中存在3个条件,分别为年龄大于20、年龄小于23和学生性别为女性,所以需要在WHERE子句中使用两个AND关键字进行条件连接,具体SQL语句如下所示。
MariaDB [Chapter_Four]> select * from student where age<=23 and age>=20 and gender='female';
+------+---------+------+--------+
| sid | sname | age | gender |
+------+---------+------+--------+
| 1003 | liuyi | 21 | female |
| 1005 | sunrei | 21 | female |
| 1006 | zhouyan | 20 | female |
| 1008 | moyan | 23 | female |
+------+---------+------+--------+
4 rows in set (0.002 sec)

MariaDB [Chapter_Four]>
以上查询结果显示,student表中年龄在20~23岁且是女学生的有4位。
2.OR关键字
AND关键字表示“与”(&),即同时满足多个条件。MySQL还提供了OR关键字,表示“或”(||),也可以连接多个查询条件,但是过滤时只要满足其中一个查询条件即可,具体语法格式如下所示。
select 字段名1,字段名2,..... from 表名 where 条件表达式1 or 条件表达式2 .....;
下面将通过具体实例介绍 OR 关键字的使用方法。
MariaDB [Chapter_Four]> select * from student where age<20 or age>25;
+------+-----------+------+--------+
| sid | sname | age | gender |
+------+-----------+------+--------+
| 1007 | tianqiang | 19 | male |
| 1009 | dinghao | 19 | male |
+------+-----------+------+--------+
2 rows in set (0.000 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,因为在student表中不存在年龄大于25岁的学生,所以只查出了两条年龄小于20岁的学生信息。
3.IN和NOT IN关键字
MySQL提供了IN关键字和NOT IN关键字,用于判断某个字段是否在指定集合中,如果不满足条件,数据则会被过滤掉,具体语法格式如下所示。
select 字段名1,字段名2,..... from 表名 where 字段名 [NOT] IN(元素1,元素2,....);
语法格式中,WHERE子句中的字段名表示要过滤的字段。[NOT]为可选项,表示不在集合范围中。下面通过具体实例来演示IN关键字和NOT IN关键字的用法。
在student表中查询学号为1001、1002和1003的学生信息。
MariaDB [Chapter_Four]> select * from student where sid in(1001,1002,1003);
+------+----------+------+--------+
| sid | sname | age | gender |
+------+----------+------+--------+
| 1001 | liwei | 22 | male |
| 1002 | zhaohang | 23 | male |
| 1003 | liuyi | 21 | female |
+------+----------+------+--------+
3 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,使用IN关键字查出了学号为1001、1002和1003的学生信息。
在student表中查询学号不为1001、1002和1003的学生信息。
MariaDB [Chapter_Four]> select * from student where sid not in(1001,1002,1003);
+------+-------------+------+--------+
| sid | sname | age | gender |
+------+-------------+------+--------+
| 1004 | wangwu | 24 | male |
| 1005 | sunrei | 21 | female |
| 1006 | zhouyan | 20 | female |
| 1007 | tianqiang | 19 | male |
| 1008 | moyan | 23 | female |
| 1009 | dinghao | 19 | male |
| 1010 | ludashi | 22 | male |
| 1011 | dongxiaojie | 25 | remale |
+------+-------------+------+--------+
8 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,使用NOT IN关键字查出了学号不为1001、1002和1003的学生信息。
4.IS NULL和IS NOT NULL关键字
在数据表中可能存在空值NULL,空值NULL与0不同,也不同于空字符串。IS NULL关键字表示是空值,IS NOT NULL关键字表示不为空值。因与IN、 NOT IN使用方式类似,所以此处不再通过实例演示其用法,读者可以自行操作。
5.BETWEEN AND和NOT BETWEEN AND关键字
BETWEEN AND关键字用于判断某个字段的值是否在指定范围内,若不在指定范围内,则会被过滤掉。NOT BETWEEN AND则表示在指定范围内的数据会被过滤掉。具体语法格式如下所示。
select 字段名1,字段名2,..... 表名 where 字段名 [NOT] between 值1 and 值2;
下面通过具体实例来演示BETWEEN AND关键字的用法。
MariaDB [Chapter_Four]> select * from score where score between 80 and 100;
+------+------+-------+
| sid | cid | score |
+------+------+-------+
| 1002 | 2 | 82 |
| 1003 | 3 | 92 |
| 1005 | 8 | 91 |
| 1008 | 2 | 81 |
| 1003 | 4 | 92 |
| 1003 | 9 | 86 |
| 1009 | 7 | 80 |
| 1010 | 3 | 87 |
+------+------+-------+
8 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
6.LIKE关键字
在实际的应用场景中,查询数据往往需要使用模糊查询,例如,查询名字中带有某个字母的学生。MySQL提供了LIKE关键字来对数据进行模糊查询,其语法格式如下所示。
select 字段名1,字段名2,..... from 表名 where 字段名 [NOT] like '匹配字符串';
语法格式中,NOT为可选项,使用NOT时表示查询与字符串不匹配的值。“匹配字符串”用来指定要匹配的字符串,它可以是一个普通字符串,也可以是包含百分号(%)和下画线(_)的通配符字符串,其中百分号表示任意0~ n个字符,下画线表示任意一个字符。
接下来通过具体实例演示LIKE关键字的使用方法。
MariaDB [Chapter_Four]> select * from student where sname like '_____';
+------+-------+------+--------+
| sid | sname | age | gender |
+------+-------+------+--------+
| 1001 | liwei | 22 | male |
| 1003 | liuyi | 21 | female |
| 1008 | moyan | 23 | female |
+------+-------+------+--------+
3 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
在查询语句中使用5个下画线对字符进行了占位,从语句的执行结果可以看出,查询结果中的学生姓名都为5个字母。
接着查询姓名由五个字母构成,并且第三个字母为“w”的学生信息,SQL语句如下所示。
MariaDB [Chapter_Four]> select * from student where sname like 'w';
+------+-------+------+--------+
| sid | sname | age | gender |
+------+-------+------+--------+
| 1001 | liwei | 22 | male |
+------+-------+------+--------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]>
查询姓名中包含字母“m”的学生信息,SQL语句如下所示。
MariaDB [Chapter_Four]> select * from student where sname like '%m%';
+------+-------+------+--------+
| sid | sname | age | gender |
+------+-------+------+--------+
| 1008 | moyan | 23 | female |
+------+-------+------+--------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]>
上方的查询语句中,使用字母“m”代表名字中含有字母“m”,使用两个百分号表示字母“m”的前面和后面有任意个字符。从语句的执行结果可看出,名字中包含字母“m”的学生为moyan。
7.DISTINCT关键字
MySQL提供了DISTINCT关键字,用于去除重复数据,其具体语法格式如下所示
select distinct 字段名 from 表名;
下面通过具体的实例演示DISTINCT关键字的使用方法。
MariaDB [Chapter_Four]> select distinct score from score;
+-------+
| score |
+-------+
| 82 |
| 74 |
| 92 |
| 73 |
| 91 |
| 62 |
| 81 |
| 77 |
| 69 |
| 71 |
| 66 |
| 86 |
| 70 |
| 80 |
| 87 |
| 59 |
+-------+
16 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从上方语句的执行结果可以看出,score表中分数相同的字段已经被过滤。需要注意,DISTINCT关键字只可以在SELECT语句中使用,其主要作用就是对数据库表中一个或者多个字段的重复数据进行过滤,并返回其中的一条数据给用户。

8.高级查询
大多数情况下,基础查询和条件查询可以处理大部分业务需求。但当需要对查询结果进行排序、分组和分页时,用这两种查询方式很难处理,此时需要使用更加高级的语句来完成。

9.排序查询
数据查询完成后,查询结果会按默认的顺序进行排序。用户如果想自定义输出结果的顺序,就需要在语句中加入ORDER BY关键字,其具体的语法格式如下所示。
select 字段名1,字段名2,..... from 表名 order by 字段名1 [ASC|DESC], 字段名2 [ASC|DESC]......
语法格式中,“字段名1,字段名2,…”是要查询的字段,ORDER BY关键字后的字段名是指定排序的字段。ASC和DESC是可选参数,其中ASC表示按升序排序,DESC表示按降序排序,如果不写该参数,则默认按升序排序。
接下来将通过具体实例演示排序查询。将score表中的数据按照score字段从大到小的顺序进行排列。
MariaDB [Chapter_Four]> select * from score order by score desc;
+------+------+-------+
| sid | cid | score |
+------+------+-------+
| 1003 | 4 | 92 |
| 1003 | 3 | 92 |
| 1005 | 8 | 91 |
| 1010 | 3 | 87 |
| 1003 | 9 | 86 |
| 1002 | 2 | 82 |
| 1008 | 2 | 81 |
| 1009 | 7 | 80 |
| 1009 | 1 | 77 |
| 1003 | 5 | 74 |
| 1006 | 9 | 73 |
| 1004 | 6 | 73 |
| 1001 | 6 | 71 |
| 1005 | 5 | 70 |
| 1010 | 4 | 69 |
| 1007 | 3 | 66 |
| 1011 | 7 | 62 |
| 1008 | 7 | 62 |
| 1009 | 8 | 59 |
+------+------+-------+
19 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上语句的执行结果可以看出,查询结果中的学生成绩已经按照score字段的降序规则进行排列。另外,从查询结果可以看出存在分数相同的项,此时,可在规定按分数降序排列后,将分数相同的项按照课程编号(cid)升序排列,具体的SQL语句如下所示。
MariaDB [Chapter_Four]> select * from score order by score desc,cid asc;
+------+------+-------+
| sid | cid | score |
+------+------+-------+
| 1003 | 3 | 92 |
| 1003 | 4 | 92 |
| 1005 | 8 | 91 |
| 1010 | 3 | 87 |
| 1003 | 9 | 86 |
| 1002 | 2 | 82 |
| 1008 | 2 | 81 |
| 1009 | 7 | 80 |
| 1009 | 1 | 77 |
| 1003 | 5 | 74 |
| 1004 | 6 | 73 |
| 1006 | 9 | 73 |
| 1001 | 6 | 71 |
| 1005 | 5 | 70 |
| 1010 | 4 | 69 |
| 1007 | 3 | 66 |
| 1011 | 7 | 62 |
| 1008 | 7 | 62 |
| 1009 | 8 | 59 |
+------+------+-------+
19 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,查询出的学生成绩信息首先按分数进行了降序排列,如果出现分数相同的情况,则按照课程编号(cid)升序排列。这就是按多个字段进行排序的情况。

10.聚合函数
在查询出数据之后,可能需要对数据进行统计,求分数的总和、分数的最大值、分数的平均值等。MySQL提供了一系列函数来实现数据统计,称为聚合函数,如表所示。
图片 4.png
表中列出了聚合函数的名称和作用,接下来将详细讲解这些函数的用法。
1.COUNT()函数
COUNT()函数的语法格式如下所示。
select count(|1|列名) from 表名;
在以上语法格式中,COUNT()函数中有3个可选参数,其中“
”是返回行数,包含NULL;“列名”指定特定的列,不包含 NULL;COUNT(1)与COUNT()返回的结果是一样的,如果数据表没有主键,则COUNT(1)的执行效率会高一些。
接下来通过具体实例演示COUNT()函数的使用方法。
MariaDB [Chapter_Four]> select count(
) from score;
+----------+
| count(*) |
+----------+
| 19 |
+----------+
1 row in set (0.002 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看到,score表中一共有20条记录。另外,还可以在语句中使用AS参数为列起别名,SQL语句如下所示。
MariaDB [Chapter_Four]> select count(1) as test from score;
+------+
| test |
+------+
| 19 |
+------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,结果集中不仅统计出了成绩表的记录数,还将列名设置为了test。使用AS参数为统计结果设置别名,有利于后期数据的维护和管理。需要注意,在取别名时,AS是可以省略不写的,具体语句如下所示。
MariaDB [Chapter_Four]> select count(1) test from score;
+------+
| test |
+------+
| 19 |
+------+
1 row in set (0.000 sec)

MariaDB [Chapter_Four]>
从上方语句的执行结果可以看出,AS省略后并不影响为列定义别名。
2.SUM()函数
SUM()函数用于计算表中指定列的数值和,需要注意,如果指定列的类型不是数值类型,那么计算结果将为0。SUM()函数的具体语法格式如下所示。
select sum(字段名) from 表名;
接下来通过具体实例演示SUM()函数的使用。
MariaDB [Chapter_Four]> select sum(score) from score where cid=2;
+------------+
| sum(score) |
+------------+
| 163 |
+------------+
1 row in set (0.000 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,cid为2的分数总和为163分。
3.AVG()函数
AVG()函数用于计算指定列的平均值。需要注意,如果指定列类型不是数值类型,那么计算结果将为0。具体语法格式如下所示。
select avg(字段名) from 表名;
接下来通过具体实例演示AVG()函数的使用。
MariaDB [Chapter_Four]> select avg(score) from score where cid=7;
+------------+
| avg(score) |
+------------+
| 68.0000 |
+------------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出, “电子信息技术”这门课程的平均分为68分。
4.MAX()函数和 MIN()函数
MAX()函数用于计算指定列的最大值,MIN()函数用于计算指定列的最小值。需要注意,如果指定列的属性为字符串类型,系统将使用字符串排序规则。具体语法格式如下。
select max(字段名) from 表名;
select min(字段名) from 表名;
接下来通过具体实例演示 MAX()函数的使用。
MariaDB [Chapter_Four]> select max(score) from score where cid=3;
+------------+
| max(score) |
+------------+
| 92 |
+------------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]> select min(score) from score where cid=3;
+------------+
| min(score) |
+------------+
| 66 |
+------------+
1 row in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,“计算机网络原理”这门课程的最高分为92分,最低分为66分。

11.分组查询
在查询数据时,有时需要按照一定的类别进行统计,如查询某位老师所教学生的人数等。在MySQL中可以使用GROUP BY关键字进行分组查询,语法格式如下所示。
select 字段名1,字段名2,..... from 表名 group by 字段名1,字段名2,.....;
上面的语法格式中,GROUP BY后的字段名是对查询结果分组的依据,一般会和聚合函数一起使用。
接下来通过具体实例演示GROUP BY的使用。
MariaDB [Chapter_Four]> select gender,count() from student group by gender;
+--------+----------+
| gender | count(
) |
+--------+----------+
| female | 5 |
| male | 6 |
+--------+----------+
3 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出, student 表中男生的数量为 5 位,女生的数量为 6 位。

12.HAVING子句
在一些情况下,对复杂的数据进行分组查询后,还需要进行数据过滤。MySQL提供了HAVING关键字,用于在分组后对数据进行过滤。需要注意,HAVING 关键字后面可以使用聚合函数,其语法格式如下所示。
select 字段名1,字段名2,..... from 表名 group by 字段名1,字段名2,..... [having 条件表达式];
上面的语法格式中,HAVING子句为可选项。接下来通过具体实例演示HAVING子句的使用。
MariaDB [Chapter_Four]> select sid,count(score) from score group by sid having count(score) >2;
+------+--------------+
| sid | count(score) |
+------+--------------+
| 1003 | 4 |
| 1009 | 3 |
+------+--------------+
2 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可以看出,score表中课程数大于2的学生学号为1003和1009。

13.LIMIT分页
在查询数据表时,如果不指定显示数量,默认情况下会将全部结果显示出来,这种查询方式明显会影响程序性能。为了解决这一问题,MySQL提供了LIMIT关键字,用于限制查询结果的显示数量。LIMIT关键字可以实现数据的分页显示,例如,在购物网站浏览商品时,商品信息会分页显示,这样不仅满足了用户需求,而且也不影响系统的性能。LIMIT的语法格式如下所示。
select 字段名1,字段名2,..... from 表名 limit [m,]n;
上面的语法格式中,LIMIT关键字后的第一个参数m为可选项,代表起始索引,若不指定该值,则使用默认值0,代表第一条记录;第二个参数n为必选项,代表从第m+1条记录开始取n条记录。接下来通过具体实例演示LIMIT的使用。
MariaDB [Chapter_Four]> select * from score limit 0,5;
+------+------+-------+
| sid | cid | score |
+------+------+-------+
| 1002 | 2 | 82 |
| 1003 | 5 | 74 |
| 1003 | 3 | 92 |
| 1004 | 6 | 73 |
| 1005 | 8 | 91 |
+------+------+-------+
5 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
MariaDB [Chapter_Four]> select * from score limit 5;
+------+------+-------+
| sid | cid | score |
+------+------+-------+
| 1002 | 2 | 82 |
| 1003 | 5 | 74 |
| 1003 | 3 | 92 |
| 1004 | 6 | 73 |
| 1005 | 8 | 91 |
+------+------+-------+
5 rows in set (0.001 sec)

MariaDB [Chapter_Four]>
从以上执行结果可看出,LIMIT关键字后指定从索引0开始取5条记录,查出了前5条学生记录。当从索引0开始查询时,0也可以省略不写。

上一篇 下一篇