一、学习任务1:简单数据记录查询
在MySQL软件中关于数据的操作,包括插入数据记录操作(CREATE,INSERT)、查询数据记录操作(SELECT),更新数据记录棟作(UPDATE)和删除数据记录操作(DELETE)。第9章已经详细介绍了关于数据的操作,本章将详细介绍关于数据的操作,即查询数据记录操作。
为了便于讲解,本节所涉及的查询数据记录操作,都是针对于数据库company表示雇员信息的表t_employee,关于雇员表(t_employee)的结构如下图所示,关于雇员表(t_employee) 的所有数据记录如下图所示。
査询数据记录,是指从数据库对象表中获取所要求的数据记录。该操作不仅是MySQL软件中数据的基本操作之一,而且还是使用频率最高、最重要的数据操作。MySQL软件提供了各种不同方式的数据査询方法,以满足用户各种不同的需求。
在MySQL中数据査询通过SQL语句SELECT来实现,简单数据查询语法形式如下:
SELECT field1 field2 ...fieldn FROM table_name;
在上述语句中,参数fieldn表示所要查询的字段名字,参数table_name表示所要查询数据记录的表名。实现简单数据记录查询的SQL语句可以通过如下几种方式使用:
•简单数据查询。
•避免重复数据查询。
•实现数学四则运算数据查询。
•设置显示格式数据查询。
1.1 简单数据查询
在MySQL软件中可以通过SELECT语句来实现简单数据査询,该SQL语句可以通过如下几种方式使用:
•査询所有字段数据。
•查询指定字段数据。
1.查询所有字段数据
下面将通过一个具体的实例来说明如何实现査询所有字段数据。
【实例10-1】执行SQL语句SELECT,在数据库company中,查询雇员表(t_employee)中所有字段的数据,具体步骤如下:
(1)执行SQL语句USE,选择数据库,具体SQL语句如下:
USE company;
(2) 执行SQL语句SELECT,查询所有字段数据,具体SQL语句如下:
SELECT empno,ename,job,mgr, hiredate, sal, comm, deptno FROM t_employee;
【代码说明】在上述语句中,由于要查询所有字段的数据,所以关键字SELECT后面的字段列表包含了表中所有字段。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,实现了查询所有字段数据。这种方式比较灵活,如果需要改变字段显示的顺序, 只需调整SELECT关键字后面的字段列表顺序即可。
(3)调整SELECT关键字后面的字段顺序,使empno字段在最后一列显示,具体SQL语句 如下:
SELECT ename, job,mgr,hiredate,sal,comm,deptno,empno FROM t_employee;
【代码说明】在上述语句中,由于要设置字段显示顺序,所以需要调整SELECT关键字后面的字段列表顺序。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,不仅实现了査询所有字段数据,而且还调整empno字段在最后一列显示。
2.“*”符号的使用
査询所有字段数据,除了使用上面的方式外,还可以通过符号“*”来实现,具体语法形式如下:
SELECT * FROM table_name;
在上述语句中,符号“*”可以表示参数table_name表中所有字段。
【实例10-2】与实例10-1 一样,查询雇员表(t_employee)中所有字段的数据,具体步骤如下:
(1)执行SQL语句USE,选择数据库company,具体SQL语句如下:
USE company;
(2)执行SQL语句SELECT,査询所有字段数据,具体SQL语句如下:
SELECT* FROM t_employee;
【代码说明】在上述语句中,通过设置关键字SELECT后面的内容为“*”符号,以实现査询所有字段数据记录。
【运行效果】执行上面的SQL语句,其结果和上述效果一致
与上一种方式相比,“*”符号方式优势比较明显,即可以用该符号代替表中的所有字段。但是这种方式不够灵活,只能够按照表中字段的固定顺序进行显示,不能够随便改变字段的显示顺序。
3.査询指定字段数据
查询所有字段数据,需要在关键字SELECT后指定包含所有字段的列表或者符号“*”。如果需要查询指定字段数据,只需修改关键字SELECT后的字段列表为指定字段即可。 下面将通过一个具体的实例来说明如何实现査询指定字段数据。
【实例10-3】执行SQL语句SELECT,在数据库company中,查询雇员表(t_employee)中empno、 ename和sal字段的数据,具体步骤如下:
(1)执行SQL语句USE,选择数据库company,具体SQL语句如下:
USE company;
- 执行SQL语句SELECT,查询所指定字段数据,具体SQL语句如下
SELECT empno,ename,sal from t_employee;
【代码说明】在上述语句中,设置关键字SELECT后面的内容为部分字段列表,以实现査询指定字段数据记录。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,查询到指定empno、ename和sal字段的数据,显示数据的顺序与SELECT关键字后的字段顺序一致。
(3)调整SELECT关键字后面所指定字段顺序,使ename字段在最后一列显示,具体SQL语句如下:
SELECT empno,sal,ename FROM t_employee;
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,不仅实现了查询所有字段数据,而且还调整ename字段在最后一列显示。
(4)如果SELECT关键字后面的字段,不包含在所查询的表中时,MySQL软件则会报错。例如,在数据库MySQL中,查询雇员表(t_employee)中empno1、ename和sal字段的数据,具体 SQL语句如下:
SELECT empno1,sal,ename FROM t_employee;
【运行效果】执行上面的50^语句,其结果如下图所示。
执行结果显示,由于empno1字段不存在于表t_employee字段中,所以MySQL软件会出现ERROR 1054 (42S22): Unknown column 'empno1' in 'fleld list1’错误提示信息。
1.2 避免重复数据查询——DISTINCT
当在MySQL软件中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复的数据,MySQL软件提供了关键字——DISTINCT。
下面将通过一个具体的实例来说明如何实现査询不重复数据。
【实例10~4】执行SQL语句SELECT,在数据库company中査询雇员表(t_employee)中字段job的数据,同时实现去除重复数据,具体步骤如下:
(1)执行SQL语句口USE,选择数据库company,具体SQL语句如下:
USE conpany;
(2)执行5<51^语句8£1£<^,查询宇段』‘01>数据,具体50^语句如下:
SELECT job FROM t_employee;
【代码说明】在上述语句中,设置关键字SELECT后面的内容为字段job,以实现査询指定字段 job数据记录。
(3)执行结果显示,查询到数据里有许多重复的数据。为了避免查询到重复的数据,可以执行SQL语句关键字DlSTINCT,关于该关键字的语法如下:
SELECT DISTINCT fieldl1 field2 ……fieldn FROM table_name;
在上述语句中,关键字DISTINCT去除掉重复的数据。关于去除重复job字段数据的具体SQL语句如:SELECT DISTINCT job FROM t_employee;
【代码说明】在上述语句中,为了去除掉重复的数据,通过关键字DISTINCT修饰关键字SELECT后面的字段job内容,以避免查询到重复的数据记录。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,明显已经去除掉了重复的数据。
1.3 实现数学四则运算数据查询
当在MySQL软件中执行简单数据查询时,有时会需要实现数学四则运算(加+、减-、乘*和 除/),该软件所支持的四则运算符如下表所示。
表 MySQL支持的关系运算符
运算符 | 描述 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/(DIV) | 除法 |
%(MOD) | 求余 |
下面将通过一个具体的实例来说明如何实现查询实现四则运算数据。
【实例10-5】执行SQL语句SELECT,在数据库company中查询雇员表(t_employee)中每个雇员的年薪,具体步骤如下:
(1)执行SQL语句,査看数据库company中雇员表(t_employee)的信息,具体SQL语句如下:
DESC t_enployee;
(2)查询字段ename和sal数据,由于字段sal表示每月的工资,所以在具体查询字段sal的值时需要进行简单的四则运算,具体SQL语句如下:
SELECT ename, sal*12 FROM t_employee;
【代码说明】在上述语句中,通过表达式sal*12来查询年薪。
【运行效果】执行上面的语句,其结果如下图所示。
(3)执行结果显示,已经查询到每个雇员的年薪。但是显示的査询字段为“sal*12”,不方便用户浏览。在MySQL软件中,提供了一种机制来实现修改字段名,具体语法形式如下:
SELECT field1 [AS] otherfield1, field2 [AS] otherfield2,……fieldn [AS] otherfieldn FROM table_name;
在上述语句中,参数field为字段原来的名字,参数otherfield为字段新的名字。之所以要为字段设置新的名字,是为了让显示结果更加直观,更加人性化。
为了便于用户浏览所查询到数据,设置“sal*12”字段为yearsalary,,具体SQL语句如下:
SELECT ename, sal*12 yearsalary FROM t_employee;
或者为
SELECT ename,sal*12 AS yearsalary FROM t_employee;
【运行效果】执行上面的语句,其结果如下图。
1.4 设置显示格式数据查询
在MySQL软件中执行简单数据査询时,有时需要设置显示格式,以方便用户浏览所查询到的数据。下面将通过一个具体的实例来演示如何实现设置数据的显示格式。
【实例10-6】执行 SQL 语句SELECT,在数据库company中査询雇员表(t_employee)中每个雇员的年薪,同时以固定的格式(ename雇员的年薪为:sal)显示査询到数据,具体步骤如下:
(1)执行SQL语句DESC,查看数据库company中雇员表(t_employee)的信息,具体SQL语句如下:
DESC t_employee;
(2)在MySQL软件中提供函数CONCAT()来连接字符串,从而实现设置显示数据的格式,设置数据显示格式的语句如下:
SELECT concat(ename,’雇员的年薪为:’,sal*12) yearsalary FROM t_employee;
【代码说明】在上述语句中,通过函数concat()合并字符串和字段值,以设置字段的显示格式。
注意:本节主要介绍数据查询语法,对于函数concat()只是简单介绍。
【运行效果】执行上述语句,其结果如下图所示。
执行结果显示,己经设置所查询到数据用固定的格式显示,并同时为字段设置名字为yearsalary, 以方便用户浏览数据。
二、学习任务2:条件数据记录查询
在简单査询中可以查询所有记录相关字段数据,但是在具体应用中,用户并不需要查询所有数据记录,而只需根据限制条件来查询一部分数据记录。
在MySQL软件中数据査询通过SQL语句SELECT来实现,同时通过关键字WHERE对所查询到的数据记录进行过滤,条件数据查询语法形式如下:
Select field1 field2 ……fieldn from table_name where CONDITION;
在上述语句中通过参数CONDITION对数据进行条件查询。关于条件数据查询语句可以包含如下功能:
•带关系运算符和逻辑运算符的条件数据査询。
•带BETWEEN AND关键字的条件数据査询。
•带is null关键字的条件数据查询。
•带IN关键字的条件数据查询。
•带LIKE关键字的条件数据査询。
2.1 带关系运算符和逻辑运算符的条件数据查询
在MySQL软件中,可以通过关系运算符和逻辑运算符来编写“条件表达式”,该软件所支持的关系运算符如表1所示,该软件所支持的逻辑运算符如表2所示。
表1 MySQL支持的比较运算符
运算符 | 描述 |
> | 大于 |
< | 小于 |
= | 等于 |
!= ( <>) | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
表2 MySQL支持的逻辑运算符
运算符 | 描述 |
AND (&&) | 逻辑与 |
OR (II) | 逻辑或 |
XOR | 逻辑异或 |
NOT ( ! ) | 逻辑非 |
1、单条件数据查询
下面将通过一个具体的实例来说明如何实现查询实现“多条件表达式”条件数据查询。
【实例10-7】执行SQL语句,在数据库company中查询雇员表(t_employee)中从事“CLERK”的雇员,
(1)执行SQL语句SELECT,通过设置条件“job='CLERK’”来查询从事CLERK工作的雇员姓名,具体语句如:Select ename FROM t_employee where job=’clerk’;
【代码说明】在上述语句中,设置査询条件为job=’CLERK’表达式。
【运行效果】执行上面的语句,其结果如下图所示。
2、多条件数据查询
在上述具体应用中,WHERE关键字后面的条件表达式是一个字段的=比较表达式,除了该运算符外,还可以 使用“>”、“<”、“>=”、“<=”和“ !=”符号来创建该条件表达式.不过在具体应用中,有时候所查询的数据需要符合多个条件,在MySQL软件中通过逻辑运算符来进行多条件联合查询。
下面将通过一个具体的实例来说明如何实现查询实现“多条件表达式”条件数据查询。
【实例10-8】执行SQL语句SELECT,在数据库company中查询雇员表(t_employee)中从事 “CLERK”工作并且工资大于800的雇员,具体步骤如下:
(1)执行SQL语句SELECT,通过设置条件为job=’clerk’和sal>800来査询从事CLERK 工作并且工资大于800的雇员姓名,具体SQL语句如下:
SELECT ename FROM t_employee WHERE job=‘clerk’&& sal>800;
【代码说明】在上述语句中,通过“&&”符号连接查询条件“job=’CLERK’”表达式和“sal>800” 表达式。
【运行效果】执行上面的语句,其结果如下图所示。
在上述具体应用中,where关键字后面为两个条件表达式,这两个表达式分别为=表达式和> 表达式,这两个表达式通过逻辑运算符&&来进行连接。由于逻辑&&符号作用相同,上述SQL语句可以修改成如下:
SELECT ename FROM t_employee WHERE job='CLERK' AND sal>800;
在MySQL软件中所支持的逻辑运算符除了符号“&&”外,还可以通过“||”或者XOR符号连接多个条件表达式进行联合查询。
2.2 带BETWEEN AND关键字的范围查询
MySQL软件提供了关键字BETWEEN AND,用来实现判断字段的数值是否在指定范围内的条件査询。关于该关键字的具体语法形式如下:
SELECT field1 field2 ...fieldn FROM table_name WHERE field BETWEEN VALUE1 AND VALUE2;
在上述语句中,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,则满足査询条件,该记录就会被查询出来;否则不会被查询出来。
BETWEEN minvalueAND maxvalue,表示的是一个范围间的判断过程。这些关键字操作符只针对数字类型。
1、符合范围的数据记录查询
下面将通过一个具体的实例来说明如何实现査询符合范围的数据记录。
【实例10-9】执行SQL语句SELECT,在数据库company中査询雇员表(t_employee)中工资在1000到2000的雇员,具体步骤如下:
(1)执行 SELECT语句, 通过关键字BETWEEN和AND设置查询范围,以实现查询工资值1000和2000之间的雇员,具体SQL语句如下:
SELECT ename FROM t_employee WHERE sal BETWEEN 1000 AND 2000;
【代码说明】在上述语句中,通过关键字BETWEEN和AND实现范围的查找。
【运行效果】执行上面的SQL语句,其结果如图所示。
2、不符合范围的数据记录查询
下面将通过一个具体的实例来说明如何实现査询不符合范围的数据记录。
【实例10-10】执行SQL语句SELECT,在数据库company中査询雇员表(t_employee)中工资不在1000到2000的雇员,具体步骤如下:
(1)执行SQL语句select,通过关键宇NOT设置非查询范围条件,具体语句如下:
SELECT ename FROM t_employee WHERE sal NOT BETWEEN 1000 AND 2000;
【代码说明】在上述语句中,通过关键字NOT BETWEEN和AND实现非范围的查找。
【运行效果】执行上面的语句,其结果如图所示。
2.3 带IS NULL关键字的空值查询
MySQL软件提供了关键字IS NULL,用来实现判断字段的数值是否为空的条件査询。关于该关键字的具体语法形式如下:
SELECT field1 field2 ……fieldn FROM table_name WHERE field IS NULL;
在上述语句中,通过关键字IS NULL来判断字段field的值是否为空,如果字段field的值为NULL,则满足查询条件,该记录就会被查询出来;否则不会被查询出来。在具体实现该应用时,一定要注意空值与空字符串和0的区别。
1.空值数据记录查询
下面将通过一个具体的实例来说明如何实现査询空值的数据记录。
【实例10-11】执行SQL语句SELECT,在数据库company中查询雇员表(t_employee)中所有不领取奖金的雇员,具体步骤如下:
(1)执行SQL语句SELECT,通过关键字IS NULL设置空值条件,以实现查询不领取奖金的雇员,具体语句如下:
SELECT ename FROM t_employee WHERE comm IS NUll;
【代码说明】在上述语句中,通过关键字IS NULL设置空值判断。
【运行效果】执行上面的语句,其结果如图所示。
2.不是空值数据记录查询
下面将通过一个具体的实例来说明如何实现査询不是空值的数据记录。
【实例10-12】执行语句SELECT,在数据库company中査询雇员表(t_employee)中所有领取奖金的雇员,具体步骤如下:
(1)执行SQL语句SELECT,通过关键字IS NOT NULL设置非空值査询条件,以实现查询领取奖金的雇员,具体语句如下:
SELECT ename FROM t_employee WHERE comm IS NOT NULL;
【代码说明】在上述语句中,通过关键字IS NOT NULL设置非空值判断。
【运行效果】执行上面的SQL语句,其结果如图所示。
(2) 执行SQL语句SELECT,通过“非逻辑运算” 设置非空值査询条件,以实现查询领取奖金的雇员,具体语句如下:
SELECT ename FROM t_employee WHERE NOT comm IS NULL;
【代码说明】在上述语句中,通过非逻辑运算符设置非空值判断
【运行效果】执行上面的语句,其结果和上图一致。
2.4 带IN关键字的集合查询
MySQL软件提供了关键字IN,用来实现判断字段的数值是否在指定集合中的条件查询。关于该关键字的具体语法形式如下:
SELECT field1 field2 ...fieldn FROM table_name WHERE field IN (value1, value2, value3,……valuen);
在上述语句中,参数valuen表示集合中的值,通过关键字取来判断字段field的值是否在集合 (value1, value2, value3,……valuen)中,如果字段field的值在集合中,则满足查询条件,该记录就会被查询出来;否则不会被查询出来。
1.在集合中数据记录査询
下面将通过一个具体的实例来说明如何实现在集合中数据记录查询。
【实例10-13】执行语句SELECT,在数据库company的雇员表(t_employee)中,査询雇员编号为7521、7782、7566和7788的雇员,具体步骤如下:
(1)执行语句select,通过“或逻辑运算”连接各个等值表达式,以实现查询雇员编号为7521、7782、7566和7788的雇员,具体语句如下:
SELECT ename FROM t_employee WHERE empno=7521 or empno=7782 or empno=7566 or empno=7788;
【代码说明】在上述语句中,通过or逻辑运算符设置条件。
【运行效果】执行上面的语句,其结果如图所示。
(3)执行SQL语句SELECT,通过关键宇取设置集合査询条件,以实现査询雇员编号为7521、7782、7566和7788的雇员,具体SQL语句如下:
SELECT ename FROM t_employee WHERE empno IN (7521,7782,7566,7788);
【代码说明】在上述语句中,通过IN关键字设置条件。
【运行效果】执行上面的SQL语句,其结果和上图一致。
2.不在集合中数据记录査询
下面将通过一个具体的实例来说明如何实现查询不是空值的数据记录。
【实例10-14】执行语句select,在数据库company的雇员表(t_employee)中,查询雇员编号不为7521、7782、7566和7788的雇员,具体步骤如下:
(1)执行SQL语句SELECT,通过关键字NOT IN设置集合査询条件,以实现查询雇员编号不为7521、7782、7566和7788的雇员,具体SQL语句如下:
SELECT ename FROM t_employee WHERE empno NOT IN (7521,7782,7566,7788);
【代码说明】在上述语句中,通过关键字段NOT IN设置条件。
【运行效果】执行上面的语句,其结果如下图所示。
(2)通过“非逻辑运算”设置集合査询条件,以实现査询雇员编号不为 7521、7782、7566 和 7788 的雇员,具体 SQL 语句如下:
SELECT ename FROM t_employee WHERE NOT empno IN (7521,7782,7566,7788);
【代码说明】在上述语句中,通过非逻辑运算符设置条件。
【运行效果】执行上面的语句,其结果和上图一致。
3.关于集合査询注意点
在具体使用关键字IN时,查询的集合中如果存在Null,则不会影响查询;如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会有任何的查询结果。
【实例10-15】执行语句select,在数据库company的雇员表(t_employee)中,查询雇员编号为7521、7782、7566和7788以及NULL的雇员,具体步骤如下:
(1)执行SQL语句SELECT,通过关键字NOT IN设置集合査询条件,以实现查询雇员编号不为7521、7782、7566和7788的雇员,具体SQL语句如下:
SELECT ename FROM t_employee WHERE empno IN (7521,7782,7566,7788,NULL);
【代码说明】在上述语句中,通过关键字段IN设置条件。
【运行效果】执行上面的语句,其结果如下图所示。
(2)执行语句,与实例10-14相比,关键字NOT IN所操作的集合中包含了NULL值,具体语句如下:
SELECT ename FROM t_employee WHERE empno NOT IN (7521,7782,7566,7788,NULL);
【代码说明】在上述语句中,关键字NOT IN 所操作的集合中包含了 NULL值。
【运行效果】执行上面的语句,其结果如图所示。可以发现对于关键字NOT IN,当查询的集合中如果存在NULL,不会査询到任何结果。
2.5 带LIKE关键字的模糊查询
上面所介绍的条件数据査询中,WHERE关键字后面的表达式都是针对已经知道数据值进行査询操作,但是这种查询操作并不适合任何情况。例如,査询雇员名字中包含文本“cjgon”的所有雇员,此时利用比较操作符(=)肯定不行,这时就需要通过通配符来实现模糊査询。
注意:所谓通配符,主要用来实现匹配部分值的特殊字符。
MySQL软件提供了关键字LIKE,用来实现判断字段的值是否与指定的值相匹配。关于该关键字的具体语法形式如下:
SELECT field1 field2 ...fieldn FROM table_name WHERE field LIKE value;
在上述语句中,参数value表示所匹配的字符串值,通过关键字LIKE判断字段field的值是否与value此字符串相匹配,如果字段field的值与value此相匹配,则满足查询条件,该记录就会被查询出来;否则不会被查询出来。
对于字符串在MySQL软件当中,必须加上单引号(”)或者双引号(“”)。由于关键字LIKE可以实现模糊查询,所以该关键字后面的字符串参数除了可以是一个完整的字符串外,还可以包含通配符。LIKE以关键字支持的通配符如下:
- “_”通配符,该通配符值能匹配单个字符。
- “%”通配符,该通配符值可以匹配任意长度的字符串,既可以是0个字符,1个字符,也可以是很多个字符。
三、学习任务3:排序数据记录查询
通过条件数据査询,虽然可以査询到符合用户需求的数据记录,但是査询到的数据记录在默认
情况下都是按照数据记录最初添加到表中的顺序来显示。默认的查询结果顺序并不能满足用户的需
求,于是MySQL软件提供了关键字ORDER BY来设置查询结果的顺序。
在MySQL软件中排序数据査询结果通过SQL语句ORDER BY来实现,
其具体语法形式如下:SELECT field1 field2 ...fieldn FROM table_name WHERE CONDITION ORDER BY fileldm1 [ASC|DESC] [,fileldm2 [ASC|DESC];
在上述语句中,通过参数fieldm表示按照该字段进行排序,参数ASC表示按升序的顺序进行排序,参数DESC表示按照降序的顺序进行排序。默认情况下按照ASC (升序)进行排序,还可以在关键字ORDER BY后面设置多个不同的字段进行排序。关于排序数据查询结果语句包含如下功能:
- 按照单字段排序。
- 按照多字段排序。
四、学习任务4:限制数据记录查询数量
通过条件数据査询,虽然可以査询到符合用户需求的数据记录,但是有时所査询到的数据记录太多。对于这么多数据记录,如果全部显示则不符合实际需求,这时可以通过MySQL软件提供的关键字LIMIT来限制查询结果的数量。
在MySQL软件中限制数据査询结果数量通过SQL语句LIMIT来实现,其具体语法形式如下:
SELECT field1 field2 ……fieldn FROM table_name WHERE CONDITION
LIMIT OFFSET_START,ROW_COUNT;
在上述语句中,通过关键字LIMIT来限制数据查询结果数量,其中参数OFFSET_START表示数据记录的起始偏移量,参数ROW_COUNT表示显示的行数。
根据是否指定初始位置(起始偏移量),关于限制数据查询结果数量语句可以分成如下两类:
•不指定初始位置方式。
•指定初始位置方式。
LIMIT关键字经常被应用在分页系统中,对于第一页的数据记录,可以通过不指定初始位置来实现,但是对于第二页等其他页面则必须指定初始位置(OFFSET_START),否则将无法实现分页功能。除此之外,LIMIT关键字还经常与order by关键字一起使用,即先对査询结果进行排序, 然后显示其中部分数据记录。
五、学习任务5:统计函数和分组数据记录查询
在MySQL软件中,很多情况下都需要进行一些统计汇总操作,比如,统计整个公司的人数或者统计整个部门的人数,这时候就会用到该软件所支持的统计函数,它们分别为:
- COUNT函数:该统计函数实现统计表中记录的条数。
- AVG函数:该统计函数实现计算字段值的平均值。
- SUM函数:该统计函数实现计算字段值的总和。
- MAX函数:该统计函数实现査询字段值的最大值。
- MIN函数:该统计函数实现査询字段值的最小值。
在具体应用中,统计函数经常与分组一起使用。在具体讲解分组之前,先了解什么情况下才能分组,例如如下需求。
•对于公司里的所有雇员,首先分成两组:男性和女性,然后分别统计各组中的人数,即统计男雇员和女雇员的数量。
•对于公司里的所有雇员,首先分成两组:18岁以下和18岁以上,然后分别统计各组中的人数,即统计小于18岁雇员和大于18岁雇员的数量。
•对于公司里的所有雇员,首先分成两组:东北地区和西北地区,然后分别统计各组中的人数,即统计东北地区雇员和西北地区雇员的数量。
上述要求之所以能够分组,是因为表中关于这些字段上的值会存在重复的内容,例如,按照性别分组时,宇段性别的值肯定要有重复(男和女):按照年龄分组,字段年龄的值肯定在一定数值范围内有重复(小于18和大于18),例如按照地区分组,字段地区的值也肯定会有重复。根据上述内容,可以发现当数据值有重复才可以进行分组。
注意:虽然数据值没有重复也可以进行分组,但是不建议使用,因为一条数据记录也可以分成 一组,但是没有任何实际意义.
5.1 MySQL支持的统计函数
在MySQL软件中,为了实现统计功能专门提供了5个统计函数,査看帮助文档可以发现,利用统计函数的查询语法形式如下:
SELECT function(field) FROM table_name WHERE CONDITION;
在上述语句中利用统计函数function来统计关于字段field的值。
1.统计数据记录条数
统计函数COUNT()用来实现统计数据记录条数,可以用来确定表中记录的条数或符合特定条件的记录的条数。可以通过以下两种方式来实现该统计函数。
- COUNT(*)使用方式:该种方式可以实现对表中记录进行统计,不管表字段中包含的是NULL值还是非NULL值。
- COUNT(field) 使用方式:该种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NUll值。
下面将通过一个具体的实例来说明统计函数COUNT()的使用方法,
【实例10-16】在数据库company的雇员表(t_employee)中,统计雇员人数。具体步骤如下:
(1)利用统计函数COUNT()对雇员记录进行统计,具体SQL语句如下:
SELECT COUNT(*) number FROM t_employee;
【代码说明】在上述语句中,通过统计函数COUNT()获取雇员的人数。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,数据库company的表t_employee中一共有14条记录,即表示有14个雇员。
(2)在具体使用统计函COUNT()时,除了可以操作符号“*”外,而且还可以操作相应宇段。 例如,如果想实现统计领奖金的雇员人数,可通过如下SQL语句来实现:
SELECT COUNT(comm) number FROM t_employee;
【代码说明】在上述语句中,设置统计函数COUNT()的参数为字段comm,统计领取奖金的雇员人数。
【运行效果】执行上面的语句,其结果如下图所示。
执行结果显示,数据库company的表t_employee中字段comm的值除了 NULL外,只有4条记录有值。虽然COUNT()在具体运行时,忽略了值为NULL的数据记录,但是却没有忽略值为0的数据记录,不符合实际需求。
(3)为了实现统计领奖金的雇员人数,需要统计特定条件的记录的条数,具体SQL语句如下:
SELECT COUNT(comm) number FROM t_employee WHERE NOT comm=0;
【代码说明】在上述语句中,由于奖金数(字段comm)有的为0值,也算是没有领取奖金,所以设置查询条件为“NOT comm=0”。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,数据库company的表t_employee中领取奖金的人数为3,领取奖金数分别为。
2.统计计算平均值
统计函数AVG()首先用来实现统计计算特定字段值之和,然后求得该字段的平均值。该函数可以用来计算指定字段的平均值或符合特定条件的指定字段的平均值,与COUNT()统计函数相比,该统计函数只有一种使用方式:
AVG(field)使用方式:该种方式可以实现对指定字段的平均值进行计算,在具体统计时将忽略 NULL。
下面将通过一个具体的实例来说明统计函数AVG()的使用方法。
【实例10-17】在数据库company的雇员表(t_employee)中,计算领取奖金雇员的平均奖金数。具体步骤如下:
(1)利用统计函数AVG()计算雇员领取奖金的平均值,具体SQL语句如下:
SELECT AVG (comm) average FROM t_employee;
【代码说明】在上述语句中,通过统计函数AVG()获取雇员领取奖金的平均值。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,获取到的平均值为550,表t_employee中字段comm的值除了 NULL外,只有4条记录有值,分别为300.00、500.00、1400.00和0.00。虽然COUNT(comm) 在具体运行时,忽略了值为NULL的数据记录,但是却没有忽略值为0的数据记录,不符合实际需求。
(2)为了计算关于奖金的平均值,需要计算特定条件记录的奖金平均值,具体SQL语句如下:
SELECT AVG(comm) average FROM t_employee WHERE NOT comm=0;
【代码说明】在上述语句中,由于奖金数(字段comm)有的为0值,也算是没有领取奖金,所以设置査询条件为“NOT comm=0”。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,数据库company的表t_employee 中领取奖金的人数为3,领取奖金数分别为300.00、
500.00、1400.00,因此平均值为 733.333333。
3.统计计算求和
统计函数SUM()用来实现统计数据计算求和,该函数可以用来计算指定字段值之和或符合特定条件的指定字段值之和,与COUNT()统计函数相比,该统计函数也只有一种使用方式:
SUM(field)使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽略NUll值。
下面将通过一个具体的实例来说明统计函数SUN()的使用方法。
【实例10-18】执行SQL语句SELECT,在数据库company的雇员表(t_employee)中,计算雇员的工资(字段sal)总和。具体步骤如下:
(1)利用统计函数SUM()计算雇员领取工资的总和,具体SQL语句如下:
SELECT SUM(sal) sumvalue FROM t_employee;
【代码说明】在上述语句中,通过指定统计函数SUM()的参数为sal获取雇员领取工资的总和。
【运行效果】执行上面的SQL语句,其结果如下图所示。
执行结果显示,领取工资总和为29025。数据库company的表t_employee中一共有14条记录, 关于字段sal的每一条记录的值都计算入总和。
(2)在具体运行SUM()统计函数时,会忽略NULL值,因此也可以统计雇员领取奖金总和,具体SQL语句如下:
SELECT SUM(comm) sumvalue FROM t_employee;
【代码说明】在上述语句中,通过指定统计函数SUM()的参数为comm获取雇员领取奖金的总和。 【运行效果】执行上面的语句,其结果如下图所示。
执行结果显示,计算到的总和为2200.00。表t_employee中字段comm的值除了NULL外,只 有 4条记录有值,分别为300.00、500.00、1400_00和0.00。虽然SUM(comm)在具体运行时,忽略了值为NULL的数据记录,但是却没有忽略值为0的数据记录,虽然运行结果没有错,但是具体运行过程不符合实际需求。
(3)为了计算领取奖金的总和,需要计算特定条件记录的奖金总和,具体语句如下:
SELECT SUM(conm) sumvalue FROM t_employee WHERE NOT comm=0;
【代码说明】在上述语句中,由于奖金数(字段comm)有的为0值,也算是没有领取奖金,所以设置査询条件为“NOT comm=0”。
【运行效果】执行上面的SQL语句,其结果和上图一致。
4.统计计算最大值和最小值
统计函数MAX()和MIN()用来实现统计数据计算求最人值和最小值,这些函数可以用来计算指定字段值中的最大值和最小值或符合特定条件的指定字段值中的最大值和最小值,与COUNT()统计函数相比,这些统计函数也只有一种使用方式。
MAX(field)使用方式:该种方式可以实现计算指定字段值中的最大值,在具体统计时将忽略 NULL。
MIN(field)使用方式:该种方式可以实现计算指定字段值中的最小值,在具体统计时将忽略 NULL。
下面将通过一个具体的实例来说明统计函数MAX()和MIN()使用方法。
【实例10-19】在数据库company的雇员表(t_employee)中,计算雇员领取工资(字段sal)的最大值和最小值。具体步骤如下:
(1)利用统计函数MAX()和MIN()获取雇员领取工资的最大值和最小值,具体语句如下:
SELECT MAX(sal) maxval,MIN(sal) minval FROM t_employee;
【代码说明】在上述语句中,通过统计函数MAX()获取雇员领取工资的最大值,通过统计函数MIN()获取雇员领取工资的最小值。
【运行效果】执行上面的SQL语句,其结果如图所示。
执行结果显示,领取工资中最多的值为5000.00,领取工资中最少的值为800.00。
(2)在具体运行MAX()和MIN()统计函数时,会忽略NULL值,因此也可以统计雇员领取奖金的最大值和最小值,具体语句如下:
SELECT MAX(comm) maxval,MIN (comm) minval FROM t_employee;
【代码说明】在上述语句中,通过统计函数MAX()获取雇员领取奖金的最大值,通过统计函数MIN()获取雇员领取奖金的最小值。
【运行效果】执行结果显示,计算到的领取奖金最多值为1400.00,领取奖金最少值为0.00。数据库company 的表t_employee中字段comm的值除了 NULL外,只有4条记录有值,分别为300.00、500.00、1400.00 和0.00。即MAX()和MIN()统计函数在具体运行过程中,忽略了值为NULL的数据记录,但是却没有忽略值为0的数据记录,虽然运行结果没有错,但是具体运行过程不符合实际需求。
(3)当在计算领取奖金的最大值和最小值时,值为0的不参与运行,这时就需要计算特定条件记录的最大值和最小值,具体SQL语句如下:
SELECT MAX(comm) maxval,MIN (comm) minval FROM t_employee WHERE NOT comm=0;
【代码说明】在上述语句中,由于奖金数(字段comm)有的为0值,也算是没有领取奖金,所以设置査询条件为“NOT comm=0”。
【运行效果】执行上面的SQL语句,其结果如图所示
5.2 关于统计函数注意点
对于MySQL软件所支持的统计函数,如果所操作的表中没有任何数据记录,则COUNT()函数返回数据0,而其他函数则返回NULL,
【实例10-20】在数据库company的雇员表(t_employee)中,按照部门号(字段deptno对所有雇员进行分组。具体步骤如下:
(1)执行相应SQL语句,创建一个空表,显示表t_dept的结构和该表的数据记录,具体SQL语句如下: create table t_dept (deptno int(11),dname varchar(20),loc varchar(40));
DESC t_dept;
SELECT * FROM t_dept;
【运行效果】执行上面的SQL语句,其结果如图所示。
(2)利用统计函数COUNT()统计部门数,具体SQL语句如下:
SELECT COUNT (deptno) number FROM t_dept;
【运行效果】执行上面的语句,其结果如图所示。
由于表t_dept中没有任何数据记录,所以执行结果显示的值为0。
(3)利用统计函数从AVG()、SUM()、MAX()、MIN()统计部门数据记录,具体语句如下:
SELECT AVG(deptno) average,SUM(deptno) summer,MAX(deptno)maxval,MIN(deptno) minval FROM t_dept;
【运行效果】执行上面的SQL语句,其结果如图所示。
由于表t_dept中没有任何数据记录,所以执行结果显示的值为NULL
5.3 分组数据查询——简单分组查询
MySQL软件提供了 5个统计函数来帮助用户统计数据,使用户很方便地实现对记录进行统计数、计算和、计算平均数、计算最大值和计算最小值,而不需要査询所有数据。
在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE)的数据记录进行统计计算。但是在现实应用中,经常会把所有数据记录进行分组,然后才对这些分组后的数据记录进行统计计算。
在MySQL软件中分组通过SQL语句GROUP BY来实现,分组数据査询语法形式如下:
SELECT function() FROM table_name WHERE CONDITION GROUP BY field;
在上述语句中,通过参数field对数据记录进行分组。
注意:在具体进行分组查询时,分组所依据的字段上的值一定要具有重复值,否則将没有任何意义。
下面将通过一个具体的实例来演示关键字GROUP BY的使用方法。
【实例10-21】在数据库company的雇员表(t_employee)中,按照部门号(字段的deptno)对所有雇员进行分组,具体步骤如下:
(1)执行SQL语句GROUP BY,对所有数据记录进行分组,具体语句如下:
SELECT * FROM t_employee GROUP BY deptno;
【代码说明】在上述语句中,设置关键字GROUP BY的字段为deptno,即表示通过字段deptno的值进行分组。
【运行效果】执行上面的SQL语句,其结果如图所示。
执行结果只显示了三条记录,由于数据库company的表t_employee中字段deptno的值分别为 10、20和30,所以首先将所有数据记录按照这三个值分成三组,然后再显示每组中的一条记录。
5.4 分组数据查询——实现统计功能分组查询
MySQL软件如果只实现简单的分组查询,是没有任何实际意义的。因为关键字GROUP BY单独使用时,默认査询出每个分组中随机一条记录,具有很大的不确定性。分组关键字建议与统计函数一起使用。
如果想显示每个分组中的字段,可以通过函数GROUP_CONCAT()该函数可以实现显示每个分组中的指定字段值,函数的具体语法形式如下:
SELECT GROUP_CONCAT(field) FROM table_name WHERE CONDITION GROUP BY field;
在上述语句中会显示出每个数组中的字段值。
下面将通过一个具体的实例来说明函数GROUP_CONCAT()和统计函数的使用方法。
【实例10-22】在数据库company的雇员表(t_employee)中,按照部门号(字段deptno)对所有雇员进行分组,同时显示出每组中的雇员名(字段ename)和每组中雇员的个数。具体步骤如下:
(1)执行SQL语句GROUP_CONCAT(),显示每个分组中所指定的字段值,具体SQL语句如下:
SELECT deptno,GROUP_CONCAT(ename) enames FROM t_employee GROUP BY deptno;
【代码说明】在上述语句中,设置关键字GROUP BY的字段为deptno,同时通过函数GROUP_CONCAT()获取每组中所指定参数的记录元素。
【运行效果】执行上面的SQL语句,其结果如图所示。
执行结果分为三组,字段deptno取值为10的记录为一组、取值为20的记录为一组和取值为30 的记录为一组。同时通过函数GROUP_CONCAT()显示出每组中的雇员名字(字段ename)。
(2)执行统计函数COUNT(),显示每个分组中雇员的个数,具体SQL语句如下:
SELECT deptno,GROUP_CONCAT(ename) enames ,COUNT(ename) number FROM t_employee GROUP BY deptno;
【代码说明】在上述语句中,设置关键字GROUP BY的字段为depto,通过统计函数COUNT() 统计每组中的记录数。
【运行效果】执行上面的50匕语句,其结果如图丨0.97所示。
5.5 分组数据查询——实现多个字段分组查询
在MySQL软件中使用关键字GROUP BY时,其子句除了可以是一个字段外,还可以是多个字段,即可以按多个字段进行分组。多字段分组数据查询语法形式如下:
SELECT GROUP_CONCAT (field) , function (field) FROM table_name WHERE CONDITION
GROUP BY fieldl,field2,……fileldn;
在上述语句中,首先会按照字段field1进行分组,然后针对每组按照字段field2进行分组,以此类推。
5.6 分组数据查询——实现HAVING子句分组查询
在MySQL软件中如果想实现对分组进行条件限制,决不能通过关键字WHERE来实现,因为该关键字主要用来实现条件限制数据记录。为了解决上述问题,MySQL软件专门提供了关键字 HAVING来实现条件限制分组数据记录。关于HAVING关键字査询语法形式如下:
SELECT function(field) FROM table_name WHERE CONDITION GROUP BY field1, field2, ...fileldn HAVING CONTITION;
在上述语句中,通过关键字HAVING来指定分组后的条件。
下面将通过一个具体的实例来说明关键宇HAVING的使用方法。
【实例10-23】在数据库company取的雇员表(t_employee)中,首先按照部门号(字段deptno)对所有雇员进行分组,然后显示平均工资高于2000的雇员名字,具体步骤如下:
(1)执行SQL语句GROUP BY,按照字段deptno进行分组,具体SQL语句如下:
SELECT deptno FROM t_employee GROUP BY deptno;
【代码说明】在上述语句中,设置关键字GROUP BY的字段为deptno即,通过部门编号进行分组。
【运行效果】执行上面的语句,其结果如图所示。
执行结果分为三组,字段deptno取值为10的记录为一组、取值为20的记录为一组和取值为30 的记录为一组。
(2)执行统计函数AVG(),显示每组中的平均工资,具体语句如下:
SELECT deptno,AVG(sal) average FROM t_employee GROUP BY deptno;
【代码说明】在上述语句中,通过统计函数AVG()获取每个部门的平均工资。
【运行效果】执行上面的SQL语句,其结果如图所示。
执行结果显示,不仅按照字段deptno组,而且还显示出每组的平均工资。
(3)执行SQL语句HAVING、GROUP_CONCAT()和统计函数COUNT(),显示出平均工资大于 2000的每个分组中雇员名称和雇员个数,具体SQL语句如下:
SELECT deptno,AVG(sal) average, GROUP_CONCAT(ename) enames,COUNT(ename) nmnber FROM t_employee GROUP BY deptno HAVING AVG(sal)>2000;
【代码说明】在上述语句中,不仅通过统计函数AVG()获取每个部门的平均工资,而且还通过函数GROUP_CONCAT()显示出每个部门的雇员名和通过函数COUNT()统计出每个部门雇员人数。最后通过关键字HAVING进行条件的限制。
【运行效果】执行上面的SQL语句,其结果如图所示。
执行结果显示出平均工资大于2000的两组,同时通过语句GROUP_CONCAT()和统计函数COUNT()显示每组中雇员(字段ename)的名字和人数。