单表数据记录查询,内容包含:
1. 简单数据记录查询
2. 条件数据记录查询
3. 排序数据记录查询
4. 限制数据记录查询数量
5. 统计函数和分组数据记录查询
本文中所有的查询操作都是基于如下这张表:
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 | date | YES | | NULL | |
| sal | double(10,2) | YES | | NULL | |
| comm | double(10,2) | YES | | NULL | |
| deptno | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.02 sec)
//插入数据
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7369,'SMITH','CLEAR',7902,'1981-03-12',800,20);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,comm,deptno) values (7499,'ALLEN','SALESMAN',7698,'1982-03-12',1600,300,30);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,comm,deptno) values (7521,'MARD','SALESMAN',7698,'1983-03-12',1250,500,30),
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7566,'JONES','MANAGER',7839,'1981-03-12',2975,20);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,comm,deptno) values (7654,'MARRTIN','SALESMAN',7698,'1981-03-12',2850,1400,30);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7698,'BLAKE','MANAGER',7839,'1981-03-12',2850,30);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7782,'CLARK','MANAGER',7839,'1985-03-12',2450,20);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7788,'SCOTT','ANALYST',7566,'1981-03-12',3000,10);
insert into t_employee (empno,ename,job,Hiredate,sal,deptno) values (7839,'KING','PRESIDENT','1981-03-12',5000,10);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,comm,deptno) values (7844,'TURNER','SALESMAN',7698,'1989-03-12',1500,0,30);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7876,'ADAMS','CLEAR',7788,'1998-03-12',1100,20);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7900,'JAMES','CLEAR',7698,'1987-03-12',950,30);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7902,'FORD','ANALYST',7566,'0000-00-00',3000,20);
insert into t_employee (empno,ename,job,MGR,Hiredate,sal,deptno) values (7934,'MILLER','CLEAR',7782,'1981-03-12',1300,10);
mysql> select * from t_employee;
+-------+---------+-----------+------+------------+---------+---------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+---------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 | 20 |
| 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 |
| 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 |
+-------+---------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
1.简单数据记录查询:
简单数据查询语法形式如下:
select field1, field2, ...fieldn from table_name;
//说明:filedn 表示所要查询的字段名字。
简单数据查询的SQL可以通过如下几种方式使用:
1. 简单数据查询。
2. 避免重复数据查询。
3. 实现数学四则运算数据查询。
4. 设置显示格式数据查询。
1.1 简单数据查询:
1.1.1 查询所有字段数据(2种方式):
方式一示例:
select empno,ename,job,MGR,Hiredate,sal,comm,deptno from t_employee;
方式二示例:
select * from t_employee;
//说明:比较而言,方式一可以调整select后的字段的顺序,而第二种方式则不可以,但是第二种方式在写法上更为快速。
1.1.2 查询指定字段的数据:
语法示例:
select empno,sal,ename from t_employee;
//只需要在select关键字后面跟上需要查询的字段即可。
1.2 避免重复数据查询—DISTINCT:
在执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复的数据,MySQL提供了关键字 DISTINCT
有关该关键字的语法为:
select distinct filed1,field2 ...fieldn from table_name;
示例:
mysql> select job from t_employee;
+-----------+
| job |
+-----------+
| CLEAR |
| SALESMAN |
| SALESMAN |
| MANAGER |
| SALESMAN |
| MANAGER |
| MANAGER |
| ANALYST |
| PRESIDENT |
| SALESMAN |
| CLEAR |
| CLEAR |
| ANALYST |
| CLEAR |
+-----------+
14 rows in set (0.00 sec)
mysql> select distinct job from t_employee;
+-----------+
| job |
+-----------+
| CLEAR |
| SALESMAN |
| MANAGER |
| ANALYST |
| PRESIDENT |
+-----------+
5 rows in set (0.00 sec)
1.3 实现数学四则运算数据查询:
在执行简单数据查询时,有时需要实现数学四则运算,MySQL支持的关系运算符为 + - * / %(求余)
示例(查询每个雇员的年薪):
mysql> select ename,sal*12 from t_employee;
+---------+----------+
| ename | sal*12 |
+---------+----------+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| MARD | 15000.00 |
| JONES | 35700.00 |
| MARRTIN | 34200.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+---------+----------+
14 rows in set (0.00 sec)
//修改字段的名字易读;
mysql> select ename,sal* 12 yearsalary from t_employee;
或者这样写:mysql> select ename,sal* 12 as yearsalary from t_employee;
+---------+------------+
| ename | yearsalary |
+---------+------------+
| SMITH | 9600.00 |
| ALLEN | 19200.00 |
| MARD | 15000.00 |
| JONES | 35700.00 |
| MARRTIN | 34200.00 |
| BLAKE | 34200.00 |
| CLARK | 29400.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
| TURNER | 18000.00 |
| ADAMS | 13200.00 |
| JAMES | 11400.00 |
| FORD | 36000.00 |
| MILLER | 15600.00 |
+---------+------------+
14 rows in set (0.00 sec)
1.4 设置显示格式数据查询:
在执行简单数据查询时,有时需要设置显示格式,以此方便用户浏览所查询到的数据。
示例(查询雇员的年薪,同时以固定的格式显示查询到的数据[ename雇员的年薪为:sal]):
mysql> select concat(ename,'的年薪为:',sal*12) yearsalary from t_employee;
+-------------------------------+
| yearsalary |
+-------------------------------+
| SMITH的年薪为:9600.00 |
| ALLEN的年薪为:19200.00 |
| MARD的年薪为:15000.00 |
| JONES的年薪为:35700.00 |
| MARRTIN的年薪为:34200.00 |
| BLAKE的年薪为:34200.00 |
| CLARK的年薪为:29400.00 |
| SCOTT的年薪为:36000.00 |
| KING的年薪为:60000.00 |
| TURNER的年薪为:18000.00 |
| ADAMS的年薪为:13200.00 |
| JAMES的年薪为:11400.00 |
| FORD的年薪为:36000.00 |
| MILLER的年薪为:15600.00 |
+-------------------------------+
14 rows in set, 1 warning (0.00 sec)
//说明:MySQL软件中提供了函数concat()来连接字符串,从而实现设置显示数据的格式。
2.条件数据记录查询:
在简单查询中可以查询所有记录相关的字段数据,但是在具体应用中,用户并不需要查询所有数据记录,而只是根据限制条件来查询一部分的数据。
语法为:
select field1,field2 ...filedn from table_name where condition;
//通过condition对数据进行条件查询,关于条件查询包含如下功能:
1.带关系运算符合逻辑运算符的条件数据查询。
2.带BETWEEN AND 关键字的条件数据查询。
3.带IS NULL关键字的条件数据查询。
4.带IN 关键字的条件数据查询。
5.带LIKE关键字的条件数据查询。
2.1 带关系运算符和逻辑运算符的条件数据查询:
可以通过关系运算符合逻辑运算符来编写“条件表达式”,MySQL支持的关系运算符为:> < = !=(<>) >= <= 逻辑运算符为:AND(&&) OR(||) XOR NOT(!)
2.1.1 单条件数据查询:
示例:
mysql> select ename from t_employee where job='clear';
+--------+
| ename |
+--------+
| SMITH |
| ADAMS |
| JAMES |
| MILLER |
+--------+
4 rows in set (0.00 sec)
2.1.2 多条件数据查询:
示例:
mysql> select ename from t_employee where job='clear' && sal > 800;
+--------+
| ename |
+--------+
| ADAMS |
| JAMES |
| MILLER |
+--------+
3 rows in set (0.00 sec)
//说明:sql语句中的&& 也可以写成and;
2.2 带BETWEEN AND关键字的范围查询:
语法:
select field1 field2 ...fieldn
from table_name
where field between value1 and value2;
//between and 针对的是数字类型
示例一(符合范围的数据记录查询):
mysql> select ename from t_employee where sal between 1000 and 2000;
+--------+
| ename |
+--------+
| ALLEN |
| MARD |
| TURNER |
| ADAMS |
| MILLER |
+--------+
5 rows in set (0.00 sec)
示例二(不符合范围的数据记录查询):
mysql> select ename from t_employee where sal not between 1000 and 2000;
+---------+
| ename |
+---------+
| SMITH |
| JONES |
| MARRTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| JAMES |
| FORD |
+---------+
9 rows in set (0.00 sec)
2.3 带IS NULL 关键字的空值查询:
语法为:
select field1, field2, ...fieldn from table_name where field is null;
示例一(空值数据记录查询):
mysql> select ename from t_employee where comm is null;
+--------+
| ename |
+--------+
| SMITH |
| JONES |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
+--------+
10 rows in set (0.00 sec)
示例二(不是空值数据记录查询):
mysql> select ename from t_employee where comm is not null;
+---------+
| ename |
+---------+
| ALLEN |
| MARD |
| MARRTIN |
| TURNER |
+---------+
4 rows in set (0.00 sec)
2.4 带IN关键字的集合查询:
语法为:
select field1, field2 ...fieldn from table_name where field in (value1,value2,...valuen);
//说明:in关键字用来判读字段的数值是否在指定集合中。
示例一(在集合中数据记录查询):
写法一:
mysql> select ename from t_employee where empno=7369 or empno=7499 or empno=7521 or empno=7566;
+-------+
| ename |
+-------+
| SMITH |
| ALLEN |
| MARD |
| JONES |
+-------+
4 rows in set (0.00 sec)
写法二:
mysql> select ename from t_employee where empno in(7369,7499,7521,7566);
+-------+
| ename |
+-------+
| SMITH |
| ALLEN |
| MARD |
| JONES |
+-------+
4 rows in set (0.00 sec)
示例二(不在集合中数据记录查询):
mysql> select ename from t_employee where empno not in(7369,7499,7521,7566);
+---------+
| ename |
+---------+
| MARRTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
+---------+
10 rows in set (0.00 sec)
//说明:关于集合查询的注意点:在使用in时如何查询的集合中存在null,则不会影响查询;如果使用关键字not in,查询的集合中如果存在null,则不会有任何的查询结果。
2.5 带LIKE关键字的模糊查询:
查找匹配字符串的语法为:
select field1, field2 ...fieldn from table_name whre field like value;
查找不匹配字符串的语法为:
select field1, field2 ...fieldn from table_name whre field [not] like value;
//说明: mysql中字符串必须加上''或者“”,like后面的字符串可以是一个完整的字符串外,还可以包含通配符。
1、“_”通配符,匹配单个字符。
2、“%”通配符,可以匹配任意长度的字符串,可以是0个或者1个字符,也可以是多个字符。
示例一(带有%通配符的查询):
mysql> select ename from t_employee where ename like 'A%';
+-------+
| ename |
+-------+
| ALLEN |
| ADAMS |
+-------+
2 rows in set (0.00 sec)
mysql> select ename from t_employee where not ename like 'a%';
+---------+
| ename |
+---------+
| SMITH |
| MARD |
| JONES |
| MARRTIN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| JAMES |
| FORD |
| MILLER |
+---------+
12 rows in set (0.00 sec)
示例二(带有_ 通配符的查询):
mysql> select ename from t_employee where ename like '_A%';
+---------+
| ename |
+---------+
| MARD |
| MARRTIN |
| JAMES |
+---------+
3 rows in set (0.00 sec)
mysql> select ename from t_employee where not ename like '_A%';
+--------+
| ename |
+--------+
| SMITH |
| ALLEN |
| JONES |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| FORD |
| MILLER |
+--------+
11 rows in set (0.00 sec)
//总结说明:实现不匹配可以用not like或者是逻辑运算not; like关键字除了可以操作字符串类型数据外,还可以操作其他任意的数据类型。like '%%' 表示查询所有数据记录。
3.排序数据记录查询:
通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是查询到的数据记录在默认情况下都是按照数据记录最初添加到表中的顺序来显示。
1. 按照单子段排序。
2. 按照多字段排序。
排序数据查询结果的语法为:
select field1, field2, ...filedn
from table_name where codition order by filed1 [asc|desc] [,filed2 [asc|desc] ];
//说明:默认情况下是ASC进行排序,可以在关键字order by后面设置多个不同的字段进行排序。
3.1 按照单子段排序:
示例(升序排序、默认情况):
mysql> select ename,sal from t_employee order by sal;
+---------+---------+
| ename | sal |
+---------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| MARD | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| MARRTIN | 2850.00 |
| JONES | 2975.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
+---------+---------+
14 rows in set (0.00 sec)
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 |
| MARRTIN | 2850.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARD | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+---------+---------+
14 rows in set (0.00 sec)
3.2 按照多子段排序:
示例:
mysql> select ename,Hiredate,sal from t_employee order by sal,Hiredate desc;
+---------+------------+---------+
| ename | Hiredate | sal |
+---------+------------+---------+
| SMITH | 1981-03-12 | 800.00 |
| JAMES | 1987-03-12 | 950.00 |
| ADAMS | 1998-03-12 | 1100.00 |
| MARD | 1983-03-12 | 1250.00 |
| MILLER | 1981-03-12 | 1300.00 |
| TURNER | 1989-03-12 | 1500.00 |
| ALLEN | 1982-03-12 | 1600.00 |
| CLARK | 1985-03-12 | 2450.00 |
| BLAKE | 1981-03-12 | 2850.00 |
| MARRTIN | 1981-03-12 | 2850.00 |
| JONES | 1981-03-12 | 2975.00 |
| SCOTT | 1981-03-12 | 3000.00 |
| FORD | 0000-00-00 | 3000.00 |
| KING | 1981-03-12 | 5000.00 |
+---------+------------+---------+
14 rows in set (0.00 sec)
4.限制数据记录查询数量:
通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是有时所查询到的数据记录太多。全部显示则不符合实际需求,这时可以通过关键字LIMIT来限制查询结果的数量。
语法为:
select field1, field2 ...filedn from table_name where condition limit offset_start,row_count;
//说明:offset 数据记录的起始偏移量;参数row_count表示显示的行数。
示例:
1、不指定初始位置;显示的记录数小于查询结果
mysql> select * from t_employee where comm is null limit 2;
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
| 7369 | SMITH | CLEAR | 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)
2、不指定初始位置;显示记录数大于查询结果
mysql> select * from t_employee where comm is null limit 12;
+-------+--------+-----------+------+------------+---------+------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+--------+-----------+------+------------+---------+------+--------+
| 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 |
| 7566 | JONES | MANAGER | 7839 | 1981-03-12 | 2975.00 | NULL | 20 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-03-12 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 |
| 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 0000-00-00 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLEAR | 7782 | 1981-03-12 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+------+--------+
10 rows in set (0.00 sec)
//说明:显示的记录数小于查询记录则根据limit关键字指定来显示,如果显示的记录数大于查询记录数,则会将所有的记录数都显示出来。
3、指定初始位置
mysql> select * from t_employee where comm is null order by hiredate desc limit 0,5;
+-------+-------+-----------+------+------------+---------+------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+-------+-----------+------+------------+---------+------+--------+
| 7876 | ADAMS | CLEAR | 7788 | 1998-03-12 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLEAR | 7698 | 1987-03-12 | 950.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1985-03-12 | 2450.00 | NULL | 20 |
| 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-03-12 | 5000.00 | NULL | 10 |
+-------+-------+-----------+------+------------+---------+------+--------+
5 rows in set (0.00 sec)
5.统计函数和分组数据记录查询:
MySQL中的统计函数:
1. COUNT():该统计函数实现统计表中记录的条数。
2. AVG():计算字段值的平均值。
3. SUM():计算字段值的总和。
4. MAX():查询字段值的最大值。
5. MIN():查询字段值的最小值。
具体应用中,统计函数经常与分组一起使用。分组通常需要满足的条件是,当数据值有重复才可以进行分组。虽然数据值没有重复也可以进行分组,但是不建议使用,因为一条数据记录也可以分成一组,但是没有任何的实际意义。
5.1 MySQL支持的统计函数:
5.1.1 统计数据记录条数:
统计函数count()用来实现统计数据记录条数,可以用来确定表中记录的条数或符合特定条件的记录的条数。
1. count(*):对表中记录进行统计,不管表字段中包含的是null值还是非null值。
2. count(1):同count(* )的作用,但有个说法是性能优于count(*)。
3. count(filed):对指定字段的记录进行统计,在具体统计时将忽略null值。
示例:
mysql> select count(1) from t_employee;
+----------+
| count(1) |
+----------+
| 14 |
+----------+
1 row in set (0.00 sec)
mysql> select count(comm) from t_employee;
+-------------+
| count(comm) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
5.1.2 统计计算平均值:
使用方式:avg(filed);计算指定字段的平均值。
示例:
mysql> select avg(comm) avarage from t_employee where comm!=0;
+------------+
| avarage |
+------------+
| 733.333333 |
+------------+
1 row in set (0.00 sec)
5.1.3 统计计算求和:
使用方式:avg(filed);计算指定字段的值的和。
示例:
mysql> select sum(sal) sumsal from t_employee;
+----------+
| sumsal |
+----------+
| 30625.00 |
+----------+
1 row in set (0.00 sec)
//说明:只要是函数指定了特定的字段都会忽略null值。
5.1.4 统计计算最大值和最小值:
使用方式:max(filed);min(filed);计算指定字段的最大值和最小值,在具体统计时将忽略null值。
示例:
mysql> select max(comm) maxval,min(comm) minval from t_employee;
+---------+--------+
| maxval | minval |
+---------+--------+
| 1400.00 | 0.00 |
+---------+--------+
1 row in set (0.00 sec)
5.2 统计函数的注意点:
如果操作的表中没有任何数据记录,则count(1)函数返回数据0,而其他函数返回null。
5.3 分组数据查询 — 简单分组查询:
分组数据查询的语法形式为:
select function() from table_name where condition group by field;
//通过参数field对数据记录进行分组。
示例:
mysql> select * from t_employee group by deptno;
+-------+-------+----------+------+------------+---------+--------+--------+
| empno | ename | job | MGR | Hiredate | sal | comm | deptno |
+-------+-------+----------+------+------------+---------+--------+--------+
| 7788 | SCOTT | ANALYST | 7566 | 1981-03-12 | 3000.00 | NULL | 10 |
| 7369 | SMITH | CLEAR | 7902 | 1981-03-12 | 800.00 | NULL | 20 |
| 7521 | MARD | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 | 30 |
+-------+-------+----------+------+------------+---------+--------+--------+
3 rows in set (0.00 sec)
//说明:因为deptno的值分别为 10、20、30,所以首先将所有数据记录按照这三个值进行分组,然后再显示每组中的一条记录。
//如果分组所针对的字段没有重复数据,那么执行结果也是显示所有数据记录,分组是没有任何实际意义的。
5.4 分组数据查询 — 实现统计功能分组查询:
只实现简单的分组查询,是没有任何实际意义的。因为关键字group by单独使用时,默认查询出每个分组中随机的一条记录。通常分组关键字建议和统计函数一起使用。
语法为:
select group_count(field) from table_name where condition group by field;
//group_concat();显示每个分组中所指定的字段值。
示例:
mysql> select deptno,group_concat(ename) enames from t_employee group by deptno;
+--------+------------------------------------+
| deptno | enames |
+--------+------------------------------------+
| 10 | MILLER,KING,SCOTT |
| 20 | JONES,FORD,ADAMS,ALLEN,CLARK,SMITH |
| 30 | MARD,TURNER,BLAKE,JAMES,MARRTIN |
+--------+------------------------------------+
3 rows in set (0.00 sec)
mysql> select deptno,group_concat(ename) enames,count(ename) number from t_employee group by deptno;
+--------+------------------------------------+--------+
| deptno | enames | number |
+--------+------------------------------------+--------+
| 10 | MILLER,KING,SCOTT | 3 |
| 20 | JONES,FORD,ADAMS,ALLEN,CLARK,SMITH | 6 |
| 30 | MARD,TURNER,BLAKE,JAMES,MARRTIN | 5 |
+--------+------------------------------------+--------+
3 rows in set (0.00 sec)
//count(ename);显示每组中雇员的个数。
5.5 分组数据查询 — 实现多个字段分组查询:
使用关键字group by时,其子句除了可以是一个字段外,还可以是多个字段,即可以按照多个字段进行分组。
语法为:
select group_concat(field),function(field) from table_name where condition group by field1, field2, ... fieldn;
//说明:首先会按照字段field1进行分组,然后针对每组按照字段field2进行分组,以此类推。
示例:
mysql> select deptno,hiredate,group_concat(ename) enames,count(ename) from t_employee group by deptno,hiredate;
+--------+------------+-------------------+--------------+
| deptno | hiredate | enames | count(ename) |
+--------+------------+-------------------+--------------+
| 10 | 1981-03-12 | MILLER,KING,SCOTT | 3 |
| 20 | 0000-00-00 | FORD | 1 |
| 20 | 1981-03-12 | JONES,SMITH | 2 |
| 20 | 1982-03-12 | ALLEN | 1 |
| 20 | 1985-03-12 | CLARK | 1 |
| 20 | 1998-03-12 | ADAMS | 1 |
| 30 | 1981-03-12 | BLAKE,MARRTIN | 2 |
| 30 | 1983-03-12 | MARD | 1 |
| 30 | 1987-03-12 | JAMES | 1 |
| 30 | 1989-03-12 | TURNER | 1 |
+--------+------------+-------------------+--------------+
10 rows in set (0.00 sec)
5.6 分组数据查询 — 实现HAVING子句限定分组查询:
如果想实现对分组进行条件限制,就要通过HAVING关键字了。
语法为:
select function(field) from table_name where condition group by field1,field2,...fieldn having condition;
示例:
mysql> select deptno,avg(sal) average,group_concat(ename) enames,count(ename) number from t_employee group by deptno hav
ing avg(sal) > 2000;
+--------+-------------+-------------------+--------+
| deptno | average | enames | number |
+--------+-------------+-------------------+--------+
| 10 | 3100.000000 | MILLER,KING,SCOTT | 3 |
+--------+-------------+-------------------+--------+
1 row in set (0.00 sec)