MySql基础知识-----单表数据记录查询

为便于讲解,本章内容针对表(t_employee)进行讲解,表的创建和数据如下:
mysql> create table t_employee(empno INT,ename VARCHAR(20),job VARCHAR(40),MGR INT,Hiredate VARCHAR(20),sal DOUBLE(10,2),comm DOUBLE(10,2),deptno INT);
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> desc t_employee;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| empno    | int(11)      | YES  |     | NULL    |       |
| ename    | varchar(20)  | YES  |     | NULL    |       |
| job      | varchar(40)  | YES  |     | NULL    |       |
| MGR      | int(11)      | YES  |     | NULL    |       |
| Hiredate | varchar(20)  | YES  |     | NULL    |       |
| sal      | double(10,2) | YES  |     | NULL    |       |
| comm     | double(10,2) | YES  |     | NULL    |       |
| deptno   | int(11)      | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
mysql> insert into t_employee values(7369,'smith','clerk',7902,'1981-03-12',800.00,NULL,20),(7499,'allen','saleman',7698,'1982-03-12',1600.00,300.00,30), (7521,'ward','salesman',7698,'1983-03-12',1250.00,500.00,30),(7566,'jones','manager',7839,'1981-03-12',2975.00,NULL,20), (7654,'martin','salesman',7698,'1981-03-12',1250.00,1400.00,30), (7698,'blake','manager',7893,'1981-03-12',2850.00,NULL,30),(7782,'clark','manager',7839,'1985-03-12',2450.00,NULL,10), (7788,'scott','analyst',7566,'1981-03-12',3000.00,NULL,20),(7839,'king','president',NULL,'1981-03-12',5000.00,NULL,10), (7844,'turner','salesman',7698,'1989-03-12',1500.00,0.00,10),(7876,'adams','clerk',7788,'1998-03-12',1100.00,NULL,20),
    -> (7900,'janes','clerk',7698,'1997-03-12',950.00,NULL,30),(7902,'ford','analyst',7566,'0000-00-00',3000.00,NULL,20),(7934,'miller','clerk',7782,'1981-03-12',1300.00,NULL,10);
Query OK, 14 rows affected (0.01 sec)
Records: 14  Duplicates: 0  Warnings: 0

mysql> select * from t_employee;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | smith  | clerk     | 7902 | 1981-03-12 |  800.00 |    NULL |     20 |
|  7499 | allen  | saleman   | 7698 | 1982-03-12 | 1600.00 |  300.00 |     30 |
|  7521 | ward   | salesman  | 7698 | 1983-03-12 | 1250.00 |  500.00 |     30 |
|  7566 | jones  | manager   | 7839 | 1981-03-12 | 2975.00 |    NULL |     20 |
|  7654 | martin | salesman  | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7698 | blake  | manager   | 7893 | 1981-03-12 | 2850.00 |    NULL |     30 |
|  7782 | clark  | manager   | 7839 | 1985-03-12 | 2450.00 |    NULL |     10 |
|  7788 | scott  | analyst   | 7566 | 1981-03-12 | 3000.00 |    NULL |     20 |
|  7839 | king   | president | NULL | 1981-03-12 | 5000.00 |    NULL |     10 |
|  7844 | turner | salesman  | 7698 | 1989-03-12 | 1500.00 |    0.00 |     10 |
|  7876 | adams  | clerk     | 7788 | 1998-03-12 | 1100.00 |    NULL |     20 |
|  7900 | janes  | clerk     | 7698 | 1997-03-12 |  950.00 |    NULL |     30 |
|  7902 | ford   | analyst   | 7566 | 0000-00-00 | 3000.00 |    NULL |     20 |
|  7934 | miller | clerk     | 7782 | 1981-03-12 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)


1 简单数据记录查询

实现简单数据记录查询的SQL语句可以通过如下几种方式使用:

(1)简单数据查询

(2)避免重复数据查询

(3)实现数学四则运算数据查询

(4)设置显示格式数据查询


1.1 简单数据查询

语法形式如下:

select filed1,filed2...fieldn from table_name;

其中filed1,field2...fieldn表示表中的所有字段。另外,也可以使用"*"号来代替所有字段,语法形式如下:

select * from table_name;

以上两种方式查询语句查询的结果都是好一样的。

如果在select后面添加的字段只是数据库表中的一部分字段,并不是全部字段,那么就代表查询的是指定字段的数据,并不是全部数据。

示例略。


1.2 避免重复数据查询----DISTINCT

当在MySQL中执行简单数据查询时,有时会显示出重复数据,为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,语法形式如下:

select distinct field1,field2...fieldn from table_name;
示例,查询t_employee中job字段数据,要求不显示重复数据:
mysql> select distinct job from t_employee;
+-----------+
| job       |
+-----------+
| clerk     |
| saleman   |
| salesman  |
| manager   |
| analyst   |
| president |
+-----------+
6 rows in set (0.00 sec)

1.3 实现数学四则运算数据查询

                                        MySQL支持的关系运算符

运算符 描述
+ 加法
- 减法
* 乘法
/ (DIV) 除法
% (MOD) 求余

语法形式不是唯一的,下面我们结合具体实例看一下。

示例:查询所有人的年薪:

mysql> select sal*12 from t_employee;
+----------+
| sal*12   |
+----------+
|  9600.00 |
| 19200.00 |
| 15000.00 |
| 35700.00 |
| 15000.00 |
| 34200.00 |
| 29400.00 |
| 36000.00 |
| 60000.00 |
| 18000.00 |
| 13200.00 |
| 11400.00 |
| 36000.00 |
| 15600.00 |
+----------+
14 rows in set (0.01 sec)
可以看出已经查询出所有人的年薪,但是字段名称显示为sal*12,不方便我们查看,在MySQL中有一种机制来修改字段名,与其说是修改,不如说是重命名或者时别名,具体语法形式如下:
select filed1 as otherfield1,field2 as otherfield2.....fieldn as otherfieldn from table_name;
修改查询年薪的示例,将年薪显示为yearsalary:
mysql> select sal*12 as yearsalary from t_employee;
+------------+
| yearsalary |
+------------+
|    9600.00 |
|   19200.00 |
|   15000.00 |
|   35700.00 |
|   15000.00 |
|   34200.00 |
|   29400.00 |
|   36000.00 |
|   60000.00 |
|   18000.00 |
|   13200.00 |
|   11400.00 |
|   36000.00 |
|   15600.00 |
+------------+
14 rows in set (0.01 sec)

1.4 设置显示格式数据查询

在MySQL中执行简单数据查询时,有时需要显示格式,以便用户浏览所查询到的数据。以下以一个具体示例演示如何实现格式化显示。

示例:查询t_employee表中雇员的年薪,并以固定格式(employee ename  year salary is:sal)显示到查询的数据。

mysql> select concat('employee ',ename,' year salary is ',sal*12) yearsalary from t_employee;
+-----------------------------------------+
| yearsalary                              |
+-----------------------------------------+
| employee smith year salary is 9600.00   |
| employee allen year salary is 19200.00  |
| employee ward year salary is 15000.00   |
| employee jones year salary is 35700.00  |
| employee martin year salary is 15000.00 |
| employee blake year salary is 34200.00  |
| employee clark year salary is 29400.00  |
| employee scott year salary is 36000.00  |
| employee king year salary is 60000.00   |
| employee turner year salary is 18000.00 |
| employee adams year salary is 13200.00  |
| employee janes year salary is 11400.00  |
| employee ford year salary is 36000.00   |
| employee miller year salary is 15600.00 |
+-----------------------------------------+
14 rows in set (0.00 sec)
如果需要显示中文的话,MySQL需要进行相关配置,可以自行查询配置方法。注意一点,数据库创建的时候已经默认了显示字符,如果配置之后不生效,那可能是因为当前数据库(database)在中文配置前已经创建,这时需要删除数据库重新创建或者创建一个新的数据库就可以了。


2 条件数据记录查询

条件数据查询语法如下:

select field1,field2...fieldn from table_name where condition;

上述语句中通过参数condition对数据进行条件查询,关于条件数据查询语句剋包含如下功能:

(1)带关系运算符和逻辑运算符的条件语句查询

(2)带between and关键字的条件数据查询

(3)带is null关键字的条件数据查询

(4)带in关键字的条件数据查询

(5)带like关键字的条件数据查询


2.1 带关系运算符和逻辑运算符的条件数据查询

MySQL支持的比较运算符
运算符 描述
> 大于
< 小于
>= 大于等于
<= 小于等于
!= (<>) 不等于
= 等于

MySQL支持的逻辑运算符
运算符 描述
AND(&&) 逻辑与
OR(||) 逻辑或
XOR 逻辑异或
NOT(!) 逻辑非


以下通过具体实例进行讲解。

2.1.1 单条件数据查询

查询t_employee表中工种为‘clerk’工作的雇员:

mysql> select * from t_employee where job='clerk';
+-------+--------+-------+------+------------+---------+------+--------+
| empno | ename  | job   | MGR  | Hiredate   | sal     | comm | deptno |
+-------+--------+-------+------+------------+---------+------+--------+
|  7369 | smith  | clerk | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7876 | adams  | clerk | 7788 | 1998-03-12 | 1100.00 | NULL |     20 |
|  7900 | janes  | clerk | 7698 | 1997-03-12 |  950.00 | NULL |     30 |
|  7934 | miller | clerk | 7782 | 1981-03-12 | 1300.00 | NULL |     10 |
+-------+--------+-------+------+------------+---------+------+--------+
4 rows in set (0.00 sec)


2.1.2 多条件数据查询

查询t_employee中从事‘clerk’工作,且工资大于800的雇员信息:
mysql> select * from t_employee where job='clerk'&&sal>=800;
+-------+--------+-------+------+------------+---------+------+--------+
| empno | ename  | job   | MGR  | Hiredate   | sal     | comm | deptno |
+-------+--------+-------+------+------------+---------+------+--------+
|  7369 | smith  | clerk | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7876 | adams  | clerk | 7788 | 1998-03-12 | 1100.00 | NULL |     20 |
|  7900 | janes  | clerk | 7698 | 1997-03-12 |  950.00 | NULL |     30 |
|  7934 | miller | clerk | 7782 | 1981-03-12 | 1300.00 | NULL |     10 |
+-------+--------+-------+------+------------+---------+------+--------+
4 rows in set (0.00 sec)


2.2 带between and关键字的范围查询

关键字between and用来实现判断字段的数值是否在指定范围内,具体语法形式如下:
select field1,field2...fieldn from table_name where filed between value1 and value2;

下面结合具体实例看一下具体用法。

2.2.1 符合范围的数据记录查询

示例:查询t_employee中工资在1000~2000之间的雇员信息:

mysql> select * from t_employee where sal between 1000 and 2000;
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | allen  | saleman  | 7698 | 1982-03-12 | 1600.00 |  300.00 |     30 |
|  7521 | ward   | salesman | 7698 | 1983-03-12 | 1250.00 |  500.00 |     30 |
|  7654 | martin | salesman | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7844 | turner | salesman | 7698 | 1989-03-12 | 1500.00 |    0.00 |     10 |
|  7876 | adams  | clerk    | 7788 | 1998-03-12 | 1100.00 |    NULL |     20 |
|  7934 | miller | clerk    | 7782 | 1981-03-12 | 1300.00 |    NULL |     10 |
+-------+--------+----------+------+------------+---------+---------+--------+
6 rows in set (0.00 sec)

2.2.2 不符合范围的数据记录查询

示例:查询t_employee中工资不在1000~2000之间的雇员信息:

mysql> select * from t_employee where sal not between 1000 and 2000;
+-------+-------+-----------+------+------------+---------+------+--------+
| empno | ename | job       | MGR  | Hiredate   | sal     | comm | deptno |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7369 | smith | clerk     | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7566 | jones | manager   | 7839 | 1981-03-12 | 2975.00 | NULL |     20 |
|  7698 | blake | manager   | 7893 | 1981-03-12 | 2850.00 | NULL |     30 |
|  7782 | clark | manager   | 7839 | 1985-03-12 | 2450.00 | NULL |     10 |
|  7788 | scott | analyst   | 7566 | 1981-03-12 | 3000.00 | NULL |     20 |
|  7839 | king  | president | NULL | 1981-03-12 | 5000.00 | NULL |     10 |
|  7900 | janes | clerk     | 7698 | 1997-03-12 |  950.00 | NULL |     30 |
|  7902 | ford  | analyst   | 7566 | 0000-00-00 | 3000.00 | NULL |     20 |
+-------+-------+-----------+------+------------+---------+------+--------+
8 rows in set (0.00 sec)


2.3 带IS NULL关键字的空值查询

MySQL提供了换剪子IS NULL,用来实现字段的数值是否为空的条件查询。具体语法形式如下:

select field1,field2....fieldn from table_name where filed is null;

2.3.1 空值数据记录查询

示例:查询t_employee中没有奖金雇员的信息:

mysql> select * from t_employee where comm is null;
+-------+--------+-----------+------+------------+---------+------+--------+
| empno | ename  | job       | MGR  | Hiredate   | sal     | comm | deptno |
+-------+--------+-----------+------+------------+---------+------+--------+
|  7369 | smith  | clerk     | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7566 | jones  | manager   | 7839 | 1981-03-12 | 2975.00 | NULL |     20 |
|  7698 | blake  | manager   | 7893 | 1981-03-12 | 2850.00 | NULL |     30 |
|  7782 | clark  | manager   | 7839 | 1985-03-12 | 2450.00 | NULL |     10 |
|  7788 | scott  | analyst   | 7566 | 1981-03-12 | 3000.00 | NULL |     20 |
|  7839 | king   | president | NULL | 1981-03-12 | 5000.00 | NULL |     10 |
|  7876 | adams  | clerk     | 7788 | 1998-03-12 | 1100.00 | NULL |     20 |
|  7900 | janes  | clerk     | 7698 | 1997-03-12 |  950.00 | NULL |     30 |
|  7902 | ford   | analyst   | 7566 | 0000-00-00 | 3000.00 | NULL |     20 |
|  7934 | miller | clerk     | 7782 | 1981-03-12 | 1300.00 | NULL |     10 |
+-------+--------+-----------+------+------------+---------+------+--------+


2.3.2 不是控制数据记录查询

示例:查询t_employee中所有进去奖金雇员的信息:
mysql> select * from t_employee where comm is not  null;
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | allen  | saleman  | 7698 | 1982-03-12 | 1600.00 |  300.00 |     30 |
|  7521 | ward   | salesman | 7698 | 1983-03-12 | 1250.00 |  500.00 |     30 |
|  7654 | martin | salesman | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7844 | turner | salesman | 7698 | 1989-03-12 | 1500.00 |    0.00 |     10 |
+-------+--------+----------+------+------------+---------+---------+--------+
4 rows in set (0.00 sec)


2.4 带IN关键字的集合查询

MySQL提供了关键字IN,用来实现判断字段的数值是否在指定集合的条件查询,具体语法形式如下:

select field1,field2..fieldn from table_name where filed in (value1,value2...valuen);

2.4.1 在集合中的数据查询

示例:查询t_employee中雇员编号为7521,7782,7756和7788的雇员信息:

mysql> select * from t_employee where empno in (7521,7782,7566,7788);
+-------+-------+----------+------+------------+---------+--------+--------+
| empno | ename | job      | MGR  | Hiredate   | sal     | comm   | deptno |
+-------+-------+----------+------+------------+---------+--------+--------+
|  7521 | ward  | salesman | 7698 | 1983-03-12 | 1250.00 | 500.00 |     30 |
|  7566 | jones | manager  | 7839 | 1981-03-12 | 2975.00 |   NULL |     20 |
|  7782 | clark | manager  | 7839 | 1985-03-12 | 2450.00 |   NULL |     10 |
|  7788 | scott | analyst  | 7566 | 1981-03-12 | 3000.00 |   NULL |     20 |
+-------+-------+----------+------+------------+---------+--------+--------+
4 rows in set (0.00 sec)

2.4.2 不在集合中的数据查询

示例:查询雇员编号不是7521,7782,7756和7788的雇员信息:
mysql> select * from t_employee where empno not in (7521,7782,7566,7788);
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | smith  | clerk     | 7902 | 1981-03-12 |  800.00 |    NULL |     20 |
|  7499 | allen  | saleman   | 7698 | 1982-03-12 | 1600.00 |  300.00 |     30 |
|  7654 | martin | salesman  | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7698 | blake  | manager   | 7893 | 1981-03-12 | 2850.00 |    NULL |     30 |
|  7839 | king   | president | NULL | 1981-03-12 | 5000.00 |    NULL |     10 |
|  7844 | turner | salesman  | 7698 | 1989-03-12 | 1500.00 |    0.00 |     10 |
|  7876 | adams  | clerk     | 7788 | 1998-03-12 | 1100.00 |    NULL |     20 |
|  7900 | janes  | clerk     | 7698 | 1997-03-12 |  950.00 |    NULL |     30 |
|  7902 | ford   | analyst   | 7566 | 0000-00-00 | 3000.00 |    NULL |     20 |
|  7934 | miller | clerk     | 7782 | 1981-03-12 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+

2.4.3 关于集合查询的注意点

在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会有任何查询结果。

示例略。


2.5 带LIKE关键字的模糊查询

MySQL提供了关键字LIKE,用来实现判断字段的值是否与指定的值相匹配,具体语法形式如下:

select field1,field2...fieldn from table_name where filed like value;

由于关键字like实现模糊查询,所以该关键字后面的字符串参数除了可以是一个完整的字符串外,还可以包含通配符,LIKE关键字支持的通配符如下:

(1)"_"通配符,该通配符值可以匹配单个字符

(2)"%"通配符,该通配符值可以匹配人意长度的字符串,既可以是0个字符,1个字符,也可以是很多个字符。


2.5.1 带有"%"通配符的查询

示例:查询t_employee表中雇员名以a开头的全部雇员的信息:

mysql> select * from t_employee where ename like 'a%';
+-------+-------+---------+------+------------+---------+--------+--------+
| empno | ename | job     | MGR  | Hiredate   | sal     | comm   | deptno |
+-------+-------+---------+------+------------+---------+--------+--------+
|  7499 | allen | saleman | 7698 | 1982-03-12 | 1600.00 | 300.00 |     30 |
|  7876 | adams | clerk   | 7788 | 1998-03-12 | 1100.00 |   NULL |     20 |
+-------+-------+---------+------+------------+---------+--------+--------+
2 rows in set (0.00 sec)

2.5.2 带有"_"通配符的查询

示例:查询t_employee表中第二个字母是‘a’的雇员信息:

mysql> select * from t_employee where ename like '_a%';
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7521 | ward   | salesman | 7698 | 1983-03-12 | 1250.00 |  500.00 |     30 |
|  7654 | martin | salesman | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7900 | janes  | clerk    | 7698 | 1997-03-12 |  950.00 |    NULL |     30 |
+-------+--------+----------+------+------------+---------+---------+--------+
3 rows in set (0.00 sec)

2.5.3 带LIKE关键字的模糊查询注意点

MySQL中,为了实现查找匹配字符串的数据记录,提供了关键字LIKE,同时为了查找不匹配字符串的数据记录,提供了NOT LIKE关键字,关于该关键字的具体语法形式如下:

select field1,field2...fieldn from table_name where file 【not】 like value;

示例略。



3 排序数据查询

通过条件语句查询出来的数据正常情况下是按照数据记录最初添加的到表中的顺序显示的,这种结果往往不能满足用户的需要,基于这个原因,MySQL提供了关键字ORDER BY来设置查询结果的顺序。

排序数据查询结果通过SQL语句ORDER BY来实现,具体语法形式如下:

select field1,field2...fieldn from table_name where condition order by fieldm1 [asc|desc][,fieldm2 [asc|desc]];

解释一下,上述语句中asc表示省序,desc表示降序,默认情况不写的情况是是按照asc排序的,还可以在order by后面设置多个不同的字段进行排序。

关于排序数据查询结果语句包含如下功能:

(1)按照但字段排序

(2)按照多字段排序


3.1 按照单字段排序

示例:查询t_employee表中雇员的月薪,并进行排序操作:

mysql> select ename,sal from t_employee order by sal desc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| king   | 5000.00 |
| scott  | 3000.00 |
| ford   | 3000.00 |
| jones  | 2975.00 |
| blake  | 2850.00 |
| clark  | 2450.00 |
| allen  | 1600.00 |
| turner | 1500.00 |
| miller | 1300.00 |
| ward   | 1250.00 |
| martin | 1250.00 |
| adams  | 1100.00 |
| janes  |  950.00 |
| smith  |  800.00 |
+--------+---------+
14 rows in set (0.00 sec)

mysql> select ename,sal from t_employee order by sal asc;
+--------+---------+
| ename  | sal     |
+--------+---------+
| smith  |  800.00 |
| janes  |  950.00 |
| adams  | 1100.00 |
| ward   | 1250.00 |
| martin | 1250.00 |
| miller | 1300.00 |
| turner | 1500.00 |
| allen  | 1600.00 |
| clark  | 2450.00 |
| blake  | 2850.00 |
| jones  | 2975.00 |
| scott  | 3000.00 |
| ford   | 3000.00 |
| king   | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)

第一个查询是按照降序进行排序,第二个查询是按照升序进行排序,由于排序操作默认是升序,所以第二个查询语句中的asc可以去掉。


3.2 按照多字段排序

示例:查询t_employee表中的所有雇员,首先按照sal对工资进行升序排序,然后按照字段Hiredate进行降序排序:

mysql> select * from t_employee order by sal asc,Hiredate desc;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | MGR  | Hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | smith  | clerk     | 7902 | 1981-03-12 |  800.00 |    NULL |     20 |
|  7900 | janes  | clerk     | 7698 | 1997-03-12 |  950.00 |    NULL |     30 |
|  7876 | adams  | clerk     | 7788 | 1998-03-12 | 1100.00 |    NULL |     20 |
|  7521 | ward   | salesman  | 7698 | 1983-03-12 | 1250.00 |  500.00 |     30 |
|  7654 | martin | salesman  | 7698 | 1981-03-12 | 1250.00 | 1400.00 |     30 |
|  7934 | miller | clerk     | 7782 | 1981-03-12 | 1300.00 |    NULL |     10 |
|  7844 | turner | salesman  | 7698 | 1989-03-12 | 1500.00 |    0.00 |     10 |
|  7499 | allen  | saleman   | 7698 | 1982-03-12 | 1600.00 |  300.00 |     30 |
|  7782 | clark  | manager   | 7839 | 1985-03-12 | 2450.00 |    NULL |     10 |
|  7698 | blake  | manager   | 7893 | 1981-03-12 | 2850.00 |    NULL |     30 |
|  7566 | jones  | manager   | 7839 | 1981-03-12 | 2975.00 |    NULL |     20 |
|  7788 | scott  | analyst   | 7566 | 1981-03-12 | 3000.00 |    NULL |     20 |
|  7902 | ford   | analyst   | 7566 | 0000-00-00 | 3000.00 |    NULL |     20 |
|  7839 | king   | president | NULL | 1981-03-12 | 5000.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)



4 限制数据记录查询数量

MySQL中限制数据查询结果数量通过SQL语句LIMIT来实现,语法形式如下:

select field1,field2....fieldn from table_name where condition limit offset_start,row_count;

上述语句中off_start表示数据记录的起始偏移量,row_count表示显示的行数。


4.1 不指定初始位置的限制数据查询

对于关键字LIMIT,如果不指定初始位置,默认值就为0,可以不用写,表示从第一条记录开始显示。

示例:查询t_employee表中comm字段为NULL的雇员信息,并只显示两条记录:

mysql> select * from t_employee where comm is NULL limit 2;
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | MGR  | Hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7369 | smith | clerk   | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7566 | jones | manager | 7839 | 1981-03-12 | 2975.00 | NULL |     20 |
+-------+-------+---------+------+------------+---------+------+--------+
2 rows in set (0.00 sec)


4.2 指定初始位置的限制数据查询

LIMIT关键字经常被用在分页系统中,对于第一页的数据记录,可以通过不指定初始位置来实现,但对第二页等其他页面则必须指定初始位置,否则将无法实现分页功能,除此之外,LIMIT关键字还经常与ORDER BY一起使用。

示例:查询t_employee表。查询comm字段为NULL的雇员信息,然后对查询结果根据Hiredate进行升序排列,从第一次从第一条记录开始显示,第二次从第6条激励开始显示:

mysql> select * from t_employee where comm is NULL order by Hiredate asc limit 0,5;
+-------+--------+---------+------+------------+---------+------+--------+
| empno | ename  | job     | MGR  | Hiredate   | sal     | comm | deptno |
+-------+--------+---------+------+------------+---------+------+--------+
|  7902 | ford   | analyst | 7566 | 0000-00-00 | 3000.00 | NULL |     20 |
|  7369 | smith  | clerk   | 7902 | 1981-03-12 |  800.00 | NULL |     20 |
|  7566 | jones  | manager | 7839 | 1981-03-12 | 2975.00 | NULL |     20 |
|  7698 | blake  | manager | 7893 | 1981-03-12 | 2850.00 | NULL |     30 |
|  7934 | miller | clerk   | 7782 | 1981-03-12 | 1300.00 | NULL |     10 |
+-------+--------+---------+------+------------+---------+------+--------+
5 rows in set (0.00 sec)

mysql> select * from t_employee where comm is NULL order by Hiredate asc limit 5,5;
+-------+--------+-----------+------+------------+---------+------+--------+
| empno | ename  | job       | MGR  | Hiredate   | sal     | comm | deptno |
+-------+--------+-----------+------+------------+---------+------+--------+
|  7839 | king   | president | NULL | 1981-03-12 | 5000.00 | NULL |     10 |
|  7934 | miller | clerk     | 7782 | 1981-03-12 | 1300.00 | NULL |     10 |
|  7782 | clark  | manager   | 7839 | 1985-03-12 | 2450.00 | NULL |     10 |
|  7900 | janes  | clerk     | 7698 | 1997-03-12 |  950.00 | NULL |     30 |
|  7876 | adams  | clerk     | 7788 | 1998-03-12 | 1100.00 | NULL |     20 |
+-------+--------+-----------+------+------------+---------+------+--------+
5 rows in set (0.00 sec)



5 统计函数和分组数据记录查询

MySQL中,有时需要对数据进行汇总操作,这时候就会用到统计函数,MySQL支持的统计函数分别为:

(1)COUNT():该统计函数实现统计表中记录的条数

(2)AVG():该统计函数实现计算字段值的平均值

(3)SUM():该统计函数实现计算字段值的总和

(4)MAX():该统计函数实现查询字段值的最大值

(5)MIN():该统计函数实现查询字段值的最小值


5.1 MySQL支持的统计函数

在MySQL中,为了实现统计功能专门提供了5个统计函数,利用统计函数查询的语法形式如下:

select function(field) from table_name where condition;


5.1.1 统计数据记录的条数

COUNT()统计函数用来确定表中记录的条数或者是符合特定条件的记录条数,可以通过以下两种方式实现:

(1)COUNT(*)使用方式:实现对表中数据进行统计,不管表中数据包含是NULL值还是非NULL值。

(2)COUNT(field)使用方式:实现对指定字段的记录进行统计,在具体统计时将忽略NULL值。

示例:查询t_employee表中雇员的人数,并统计comm字段不为NULL的人数:

mysql> select count(*) emplyoee_number,count(comm) has_comm from t_employee;
+-----------------+----------+
| emplyoee_number | has_comm |
+-----------------+----------+
|              14 |        4 |
+-----------------+----------+
1 row in set (0.00 sec)


5.1.2 统计计算平均值

统计函数AVG()首先用来实现统计计算特定字段之和,然后求的该字段的平均值,于COUNT()想比,该统计函数只有一种使用方式:

AVG(field)使用方式:该种方式可以实现对指定字段的平均值计算,在具体统计时将忽略NULL值。

示例:查询表t_emplyee,计算comm字段的平均值

mysql> select avg(comm) from t_employee;
+------------+
| avg(comm)  |
+------------+
| 550.000000 |
+------------+
1 row in set (0.00 sec)


5.1.3 统计计算求和

统计函数SUM()用来实现统计数据计算求和,与COUNT()函数相比,该函数也只有一种使用方式:

SUM(field)使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽略NULL值。

示例:查询表t_employee,计算sal字段的总和:

mysql> select sum(sal) from t_employee;
+----------+
| sum(sal) |
+----------+
| 29025.00 |
+----------+
1 row in set (0.00 sec)


5.1.4 统计计算最大值和最小值

统计函数MAX()和MIN()用来实现统计数据计算最大值和最小值,并且只有一种使用方式:

MAX(field)使用方式:计算指定统计数据中的最大值,具体统计时将忽略NULL值

MIN(field)使用方式:计算指定统计数据中的最小值,具体统计时将忽略NULL值

示例:查询表t_employee,计算表中sal字段的最大值和最小值:

mysql> select max(sal) maxval,min(sal) minval from t_employee;
+---------+--------+
| maxval  | minval |
+---------+--------+
| 5000.00 | 800.00 |
+---------+--------+
1 row in set (0.00 sec)



5.1.5 关于统计函数的注意点

MySQL所支持的统计函数,如果所操作的表中没有任何记录,则COUNT()函数返回数据0,其他函数返回NULL。示例略


5.1.6 分组数据查询-----简单分组查询

在具体使用统计函数,都是针对表中所有数据或指定特定条件的数据记录进行数据统计,但实际应用时经常会先把所有数据进行分组,然后对分组后的数据进行统计计算。

MySQL中通过SQKL语句GROUP BY实现分组,分组数据查询语法形式如下:

select function() from table_name where condition group by field;
示例:查询t_eployee表并使用deptno字段对表进行简单分组:
mysql> select * from t_employee group by deptno;
+-------+-------+---------+------+------------+---------+--------+--------+
| empno | ename | job     | MGR  | Hiredate   | sal     | comm   | deptno |
+-------+-------+---------+------+------------+---------+--------+--------+
|  7782 | clark | manager | 7839 | 1985-03-12 | 2450.00 |   NULL |     10 |
|  7369 | smith | clerk   | 7902 | 1981-03-12 |  800.00 |   NULL |     20 |
|  7499 | allen | saleman | 7698 | 1982-03-12 | 1600.00 | 300.00 |     30 |
+-------+-------+---------+------+------------+---------+--------+--------+
3 rows in set (0.00 sec)

执行结果只显示了三条记录,是因为数据表t_employee中字段deptno的值分别为10,20和30,所以首先将所有数据记录按照这三个值分为三组,然后在显示每组中的第一条数据。另外,对没有重复数据字段的分组是没有任何实际意义的。


5.1.7 分组数据查询-----实现统计功能分组查询

MySQL中简单分组只会显示每组数据中的第一条数据,具有很大不确定性,所以简单分组经常会配合统计函数一起使用。

如果想显示每个分组中的字段,可以通过函数GROUP_CONCAT()来实现,该函数可以实现显示每个分组中的指定字段值,函数的具体语法形式如下:

select group_concat(field1) from table_name where condition group by field2;

上述语句中,首先将表按照field2进行分组,之后在显示每组中所有field1的值,field1和field2可以想同。

示例:查询表t_employee,按照deptno字段进行分组,同时显示出每组中雇员名以及每组雇员的格式:

mysql> select deptno,group_concat(ename),count(ename) count from t_employee group by deptno;
+--------+-------------------------------+-------+
| deptno | group_concat(ename)           | count |
+--------+-------------------------------+-------+
|     10 | clark,king,turner,miller      |     4 |
|     20 | smith,jones,scott,adams,ford  |     5 |
|     30 | allen,ward,martin,blake,janes |     5 |
+--------+-------------------------------+-------+
3 rows in set (0.00 sec)


5.1.8 分组数据查询-----实现多个字段分组查询

MySQL中使用关键字GROUP BY时,其子句出克可以时一个字段之外,还可以是多个字段,即可以按照多个字段进行分组,具体的语法形式如下:
select group_concat(field),function(field) from table_name where condition group by field1,field2...fieldn;

在上述语句中,首先会按照字段field1进行分组,然后针对每组按照字段field2进行分组,依此类推。

示例:查询t_employee表,首先按照deptno进行分组,然后按照Hiredate再分组,同时显示每组中的雇员名及个数:

mysql> select deptno,Hiredate,group_concat(ename) enames,count(ename) number from t_employee group by deptno,Hiredate;
+--------+------------+-------------------+--------+
| deptno | Hiredate   | enames            | number |
+--------+------------+-------------------+--------+
|     10 | 1981-03-12 | king,miller       |      2 |
|     10 | 1985-03-12 | clark             |      1 |
|     10 | 1989-03-12 | turner            |      1 |
|     20 | 0000-00-00 | ford              |      1 |
|     20 | 1981-03-12 | smith,jones,scott |      3 |
|     20 | 1998-03-12 | adams             |      1 |
|     30 | 1981-03-12 | martin,blake      |      2 |
|     30 | 1982-03-12 | allen             |      1 |
|     30 | 1983-03-12 | ward              |      1 |
|     30 | 1997-03-12 | janes             |      1 |
+--------+------------+-------------------+--------+
10 rows in set (0.00 sec)


5.1.9 分组数据查询-----实现HAVING子句限定分组查询

在MySQL中如果想实现对分组数据进行条件限制,决不能通过关键字WHERE来实现,因为该关键字主要用来实现条件限制数据记录。为了解决上述问题,MySQL提供了专门的关键字HAVING来实现条件限制分组数据记录,具体语法形式如下:

select function(field) from table_name where condition group by field1,field2....fieldn having condition;

在上述语句中,通过关键字HAVING来指定分组后的条件。

示例:查询表t_employee,首先按照deptno对所有雇员进行分组,然后显示平均工资高于2000的雇员名:

mysql> select deptno,avg(sal) average,group_concat(ename) 'sal > 2000' ,count(ename) number from t_employee group by deptno having avg(sal)>2000;
+--------+-------------+------------------------------+--------+
| deptno | average     | sal > 2000                   | number |
+--------+-------------+------------------------------+--------+
|     10 | 2562.500000 | clark,king,turner,miller     |      4 |
|     20 | 2175.000000 | smith,jones,scott,adams,ford |      5 |
+--------+-------------+------------------------------+--------+
2 rows in set (0.01 sec)


猜你喜欢

转载自blog.csdn.net/purple7826/article/details/80426986