7. 基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句

1. 条件查询

前面我们的查询都是将所有数据都查询出来,但是有时候我们只想获取到满足条件的数据 语法格式:SELECT 字段名 FROM 表名 WHERE 条件;流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回

1.1 准备数据

CREATE TABLE stu3 (
 id INT,
 NAME VARCHAR(20),
 age INT,
 sex VARCHAR(5),
 address VARCHAR(100),
 math INT,
 english INT
);

-- 批量插入
INSERT INTO stu3 VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);

1.2 比较运算符

 > 大于 
 < 小于 
 <= 小于等于   
 >= 大于等于   a=3,a>=1 true;  b = 4, b>=4, true
 = 等于 
 <>  != 不等于   

具体操作:

查询math分数大于80分的学生

select * from stu3 where math > 80;

执行如下:

-- stu3表的数据
mysql> select * from stu3;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

-- 查询math分数大于80分的学生
mysql> select * from stu3 where math > 80;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 刘德华    |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德      |   22 | 女   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 

查询english分数小于或等于80分的学生

select * from stu3 where english<=80;

执行如下:

mysql> select * from stu3 where english<=80;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 

查询age等于20岁的学生

select * from stu3 where age=20;

执行如下:

mysql> select * from stu3 where age=20;
+------+--------+------+------+---------+------+---------+
| id   | NAME   | age  | sex  | address | math | english |
+------+--------+------+------+---------+------+---------+
|    4 | 柳岩   |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青   |   20 | 男   | 湖南    |   86 |    NULL |
+------+--------+------+------+---------+------+---------+
2 rows in set (0.00 sec)

mysql> 

查询age不等于20岁的学生

SELECT * FROM student3 WHERE age!=20;
SELECT * FROM student3 WHERE age<>20;

执行如下:

mysql> SELECT * FROM stu3 WHERE age!=20;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 
mysql> SELECT * FROM stu3 WHERE age<>20;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 

1.3 逻辑运算符

and(&&) 多个条件同时满足 

or(||) 多个条件其中一个满足 

not(!) 不满足

具体操作:

查询age大于35且性别为男的学生(两个条件同时满足)

mysql> SELECT * FROM stu3 WHERE age>35 and sex='男';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
|    6 | 刘德华    |   57 | 男   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 

查询age大于35或性别为男的学生(两个条件其中一个满足)

mysql> SELECT * FROM stu3 WHERE age>35 or sex='男';
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

查询id是1或3或5的学生

mysql> SELECT * FROM stu3 WHERE id=1 OR id=3 OR id=5;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 

1.4 in关键字

语法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);

in里面的每个数据都会作为一次条件,只要满足条件的就会显示

具体操作:

查询id是1或3或5的学生

mysql> SELECT * FROM stu3 WHERE id in (1,3,5);
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.01 sec)

mysql> 

查询id不是1或3或5的学生

mysql> SELECT * FROM stu3 WHERE id not in (1,3,5);
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
5 rows in set (0.00 sec)

mysql> 

1.5 范围

语法格式:SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2

between 值1 and 值2
值1一定要小于值2
比如: age BETWEEN 80 AND 100
相当于: age>=80 && age<=100

具体操作:

查询english成绩大于等于75,且小于等于90的学生

-- 查询 [75,90]
mysql> SELECT * FROM stu3 WHERE english >= 75 and english <= 90;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

-- 查询 [75,90]
mysql> SELECT * FROM stu3 WHERE english BETWEEN 75 AND 90;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 

1.6 like 模糊查询:% 与 _  占位符的使用

select * from 表名 where 字段 like 条件;
   %   : 模糊所有
 _   : 模糊一位
例如:
 "马%"  匹配以"马"字开头
 "%马"  匹配以"马"字结尾
 "_马"  匹配第二个字是"马"字的 
 "__马%"  匹配第三个字是"马"字的
 "%马%" 匹配包含"马"字的

具体操作:

查询姓马的学生

mysql> SELECT * FROM stu3 WHERE name LIKE '马%';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
|    7 | 马德      |   22 | 女   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 

查询姓名中包含'德'字的学生

mysql> SELECT * FROM stu3 WHERE name LIKE '%德%';
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
3 rows in set (0.01 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享

查询姓马,且姓名有三个字的学生

mysql> SELECT * FROM stu3 WHERE name LIKE '马__';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
2 rows in set (0.01 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_02

2. 排序

通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

语法: select * from 表名 where 条件  order by 字段名称1 [desc | asc] , 字段名2 [desc | asc]... ;

asc(默认) : 升序   
desc : 降序
先根据字段1排序,若有第二排序字段,在第一排序字段的基础上进行第二次排序

2.1 单列排序

单列排序就是使用一个字段排序

具体操作:

查询所有数据,使用年龄降序排序

mysql> SELECT * FROM stu3 ORDER BY age DESC;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_03

2.2 组合排序

组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。上面的例子中,年龄是有相同的。当年龄相同再使用math进行排序

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];

具体操作:

查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序

mysql> SELECT * FROM stu3 ORDER BY age DESC, math DESC;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    1 | 马云         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    2 | 马化腾       |   45 | 女   | 深圳    |   98 |      87 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_04

3. 聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值

五个聚合函数:

count() : 计数
 IFNULL(字段名,0) : 如果指定字段的值为null,则使用0表示
sum() : 求和
max() : 求最大值
min() : 求最小值
avg() : 求平均值
 扩展-保留小数位
 cast(avg(字段名称) as decimal(5,2))
-------------------
聚合函数的使用:写在 SQL语句SELECT后查询结果的位置
SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;

具体操作:

使用 count(字段) 查询学生总数,不会统计 null 值

mysql> SELECT count(english) FROM stu3;
+----------------+
| count(english) |
+----------------+
|              7 |
+----------------+
1 row in set (0.00 sec)

mysql> 

基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_05我们发现对于NULL的记录不会统计

IFNULL(expr1, expr2)的用法:

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为expr2, 我们可以利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏

mysql> SELECT COUNT(IFNULL(english,0)) FROM stu3;
+--------------------------+
| COUNT(IFNULL(english,0)) |
+--------------------------+
|                        8 |
+--------------------------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_06

使用 count(*) 可以统计所有条数

mysql> SELECT COUNT(*) FROM stu3;
+----------+
| COUNT(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_07

使用 count(*) 查询年龄大于40的总数

mysql> SELECT COUNT(*) FROM stu3 WHERE age>40;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_08

使用 sum(字段) 查询数学成绩总分

mysql> SELECT SUM(math) FROM stu3;
+-----------+
| SUM(math) |
+-----------+
|       636 |
+-----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_09

使用 avg(字段) 查询数学成绩平均分

mysql> SELECT AVG(math) FROM stu3;
+-----------+
| AVG(math) |
+-----------+
|   79.5000 |
+-----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_10

使用 max(字段) 查询数学成绩最高分

mysql> SELECT MAX(math) FROM stu3;
+-----------+
| MAX(math) |
+-----------+
|        99 |
+-----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_11

使用 min(字段) 查询数学成绩最低分

mysql> SELECT MIN(math) FROM stu3;
+-----------+
| MIN(math) |
+-----------+
|        56 |
+-----------+
1 row in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_12

4. GROUP BY 分组 以及 HAVING 条件的使用

分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组

SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];

GROUP BY怎么分组的?将分组字段结果中相同内容作为一组

SELECT * FROM stu3 GROUP BY sex;

mysql> select * from stu3 group by sex;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
+------+-----------+------+------+---------+------+---------+
2 rows in set (0.00 sec)

mysql> 

这句话会将sex相同的数据作为一组基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_13

GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。

分组后聚合函数的作用?不是操作所有数据,而是操作一组数据。SELECT SUM(math), sex FROM stu3 GROUP BY sex;效果如下:

mysql> select sum(math),sex from stu3 group by sex;
+-----------+------+
| sum(math) | sex  |
+-----------+------+
|       273 | 女   |
|       363 | 男   |
+-----------+------+
2 rows in set (0.00 sec)

mysql> 

实际上是将每组的math进行求和,返回每组统计的结果基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_14

注意事项:当我们使用某个字段分组,在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的

  • 查询的时候没有查询出分组字段基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_15

  • 查询的时候查询出分组字段基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_16

具体操作:

按性别分组

mysql> select sex from stu3 group by sex;
+------+
| sex  |
+------+
| 女   |
| 男   |
+------+
2 rows in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_17

查询男女各多少人

-- 1.查询所有数据,按性别分组。2.统计每组人数
mysql> select sex,count(*) from stu3 group by sex;
+------+----------+
| sex  | count(*) |
+------+----------+
| 女   |        3 |
| 男   |        5 |
+------+----------+
2 rows in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_18

查询年龄大于25岁的人,按性别分组,统计每组的人数

1.先过滤掉年龄小于25岁的人。2.再分组。3.最后统计每组的人数
mysql> select sex,count(*) from stu3 where age > 25 group by sex;
+------+----------+
| sex  | count(*) |
+------+----------+
| 女   |        1 |
| 男   |        3 |
+------+----------+
2 rows in set (0.00 sec)
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_19

查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据

有很多同学可能会将SQL语句写出这样:SELECT sex, COUNT(*) FROM stu3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;

注意: 并只显示性别人数>2的数据属于分组后的条件,对于分组后的条件需要使用having子句

mysql> SELECT sex, COUNT(*) FROM stu3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| 男   |        3 |
+------+----------+
1 row in set (0.00 sec)

只有分组后人数大于2的男这组数据显示出来

基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_20

having与where的区别

  • having是在分组后对数据进行过滤.
  • where是在分组前对数据进行过滤
  • having后面可以使用聚合函数
  • where后面不可以使用聚合函数

5. limit语句

LIMIT限制的意思,所以LIMIT的作用就是限制查询记录的条数。SELECT *|字段列表 [as 别名] FROM 表名 [WHERE子句]  [GROUP BY子句]\ [HAVING子句] [ORDER BY子句] [LIMIT子句];

思考:limit子句为什么排在最后?因为前面所有的限制条件都处理完了,只剩下显示多少条记录的问题了!

LIMIT语法格式LIMIT offset,length;   或者limit length;

offset是指偏移量,可以认为是跳过的记录数量,默认为0

length是指需要显示的总记录数

具体操作:

查询学生表中数据,从第三条开始显示,显示6条

-- 我们可以认为跳过前面2条,取6条数据, LIMIT offset,length
mysql> SELECT * FROM stu3 LIMIT 2,6;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    3 | 马景涛       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_21

LIMIT的使用场景:分页

比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。假设我们一每页显示5条记录的方式来分页,SQL语句如下:

-- 每页显示5条
-- 第一页:LIMIT 0,5; 跳过0条,显示5条
mysql> SELECT * FROM stu3 LIMIT 0,5;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 马云      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 马化腾    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 马景涛    |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩      |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
5 rows in set (0.00 sec)

mysql> 


-- 第二页:LIMIT 5,5;  跳过5条,显示5条
mysql> SELECT * FROM stu3 LIMIT 5,5;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 刘德华       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 马德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德玛西亚     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 

-- 第三页:LIMIT 10,5; 跳过10条,显示5条
mysql> SELECT * FROM stu3 LIMIT 10,5;
Empty set (0.00 sec)

mysql> 
基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句_经验分享_22

注意

  • 如果第一个参数是0可以简写:SELECT * FROM student3 LIMIT 0,5;SELECT * FROM student3 LIMIT 5;
  • LIMIT 10,5; -- 不够5条,有多少显示多少

6. select 查询条件的执行顺序

# DQL查询语言书写顺序
select 字段
 from 表名   
  where 条件1
   group by 分组字段
    having 条件2(一般是分组条件)
     order by 排序字段 (desc/asc)
                     limit 索引,最大查询数量;
                     
# DQL查询语言执行顺序   
from ... where ... group by ... having...  select ... order by... limit ...


# from 后续内容
    1. 表名可以取别名 as (可以省略)

# where 后续内容
    1. 比较运算符: >  <  >=  <=   = <> != (都是不等于)
    2. 逻辑运算符: and or not
        a. in关键字:  id = 1 or id =2  -> id in(1,2)
        b. between关键字: age between 5 and 10; ->  age>=5 and age <=10
        c. like关键字(模糊查询) :  name like '%马%'
            1). _ 表示一个
            2). % 表示0或多个
    3. 注意: 不能跟聚合函数

# group by 后续内容
 1. 聚合函数
     a. 如果不在分组查询中,所有数据分为一组
     b. 如果在分组查询中, 分组之后执行聚合函数
     c. 常见聚合函数
      1). sum 求和
            2). avg 平均
            3). count 统计
            4). max/min 最大/最小
        d. 注意: null不参与聚合运算的
    2. select 后面只能跟 '被分组的列' 和 聚合函数
   3. having 可以用来过滤聚合函数的判断条件  
   
# select 后续内容
 1. 跟被查询的字段
 2. * 代表该表所有字段
 3. distinct 滤重: 只保存这个字段不同的值
 4. 字段可以取别名 as(也可以省略)

# order by 
 1. order by 字段 desc : 根据字段值降序排序(asc是升序,可以省略)
 2. order by 字段1 desc, 字段2 asc : 先根据字段1降序,如果字段1相等,根据字段2升序

# limit 索引,最大查询数量
 -- 规律: 用户 查询第x页,每页count条
 -- 当前页的sql如何编写
  -- index = (x-1) * count
  select * from student limit index,count;