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

2022-01-17 14:14:37 浏览数 (1)

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

1. 条件查询

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

1.1 准备数据

代码语言:javascript复制
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 比较运算符

代码语言:javascript复制
 > 大于 
 < 小于 
 <= 小于等于   
 >= 大于等于   a=3,a>=1 true;  b = 4, b>=4, true
 = 等于 
 <>  != 不等于   

具体操作:

查询math分数大于80分的学生
代码语言:javascript复制
select * from stu3 where math > 80;

执行如下:

代码语言:javascript复制
-- 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分的学生
代码语言:javascript复制
select * from stu3 where english<=80;

执行如下:

代码语言:javascript复制
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岁的学生
代码语言:javascript复制
select * from stu3 where age=20;

执行如下:

代码语言:javascript复制
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岁的学生
代码语言:javascript复制
SELECT * FROM student3 WHERE age!=20;
SELECT * FROM student3 WHERE age<>20;

执行如下:

代码语言:javascript复制
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 逻辑运算符

代码语言:javascript复制
and(&&) 多个条件同时满足 

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

not(!) 不满足

具体操作:

查询age大于35且性别为男的学生(两个条件同时满足)
代码语言:javascript复制
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或性别为男的学生(两个条件其中一个满足)
代码语言:javascript复制
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的学生
代码语言:javascript复制
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的学生
代码语言:javascript复制
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的学生
代码语言:javascript复制
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

代码语言:javascript复制
between 值1 and 值2
值1一定要小于值2
比如: age BETWEEN 80 AND 100
相当于: age>=80 && age<=100

具体操作:

查询english成绩大于等于75,且小于等于90的学生
代码语言:javascript复制
-- 查询 [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 模糊查询:% 与 _ 占位符的使用

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

具体操作:

查询姓马的学生
代码语言:javascript复制
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> 
查询姓名中包含'德'字的学生
代码语言:javascript复制
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> 
查询姓马,且姓名有三个字的学生
代码语言:javascript复制
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> 

2. 排序

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

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

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

2.1 单列排序

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

具体操作:

查询所有数据,使用年龄降序排序
代码语言:javascript复制
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> 

2.2 组合排序

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

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

具体操作:

查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
代码语言:javascript复制
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> 

3. 聚合函数

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

五个聚合函数:

代码语言:javascript复制
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 值
代码语言:javascript复制
mysql> SELECT count(english) FROM stu3;
 ---------------- 
| count(english) |
 ---------------- 
|              7 |
 ---------------- 
1 row in set (0.00 sec)

mysql> 

我们发现对于NULL的记录不会统计

IFNULL(expr1, expr2)的用法:

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

代码语言:javascript复制
mysql> SELECT COUNT(IFNULL(english,0)) FROM stu3;
 -------------------------- 
| COUNT(IFNULL(english,0)) |
 -------------------------- 
|                        8 |
 -------------------------- 
1 row in set (0.00 sec)

mysql> 
使用 count(*) 可以统计所有条数
代码语言:javascript复制
mysql> SELECT COUNT(*) FROM stu3;
 ---------- 
| COUNT(*) |
 ---------- 
|        8 |
 ---------- 
1 row in set (0.00 sec)

mysql> 
使用 count(*) 查询年龄大于40的总数
代码语言:javascript复制
mysql> SELECT COUNT(*) FROM stu3 WHERE age>40;
 ---------- 
| COUNT(*) |
 ---------- 
|        4 |
 ---------- 
1 row in set (0.00 sec)

mysql> 
使用 sum(字段) 查询数学成绩总分
代码语言:javascript复制
mysql> SELECT SUM(math) FROM stu3;
 ----------- 
| SUM(math) |
 ----------- 
|       636 |
 ----------- 
1 row in set (0.00 sec)

mysql> 
使用 avg(字段) 查询数学成绩平均分
代码语言:javascript复制
mysql> SELECT AVG(math) FROM stu3;
 ----------- 
| AVG(math) |
 ----------- 
|   79.5000 |
 ----------- 
1 row in set (0.00 sec)

mysql> 
使用 max(字段) 查询数学成绩最高分
代码语言:javascript复制
mysql> SELECT MAX(math) FROM stu3;
 ----------- 
| MAX(math) |
 ----------- 
|        99 |
 ----------- 
1 row in set (0.00 sec)

mysql> 
使用 min(字段) 查询数学成绩最低分
代码语言:javascript复制
mysql> SELECT MIN(math) FROM stu3;
 ----------- 
| MIN(math) |
 ----------- 
|        56 |
 ----------- 
1 row in set (0.00 sec)

mysql> 

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

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

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

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

SELECT * FROM stu3 GROUP BY sex;

代码语言:javascript复制
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相同的数据作为一组

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

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

代码语言:javascript复制
mysql> select sum(math),sex from stu3 group by sex;
 ----------- ------ 
| sum(math) | sex  |
 ----------- ------ 
|       273 | 女   |
|       363 | 男   |
 ----------- ------ 
2 rows in set (0.00 sec)

mysql> 

实际上是将每组的math进行求和,返回每组统计的结果

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

  • 查询的时候没有查询出分组字段
  • 查询的时候查询出分组字段

具体操作:

按性别分组
代码语言:javascript复制
mysql> select sex from stu3 group by sex;
 ------ 
| sex  |
 ------ 
| 女   |
| 男   |
 ------ 
2 rows in set (0.00 sec)

mysql> 
查询男女各多少人
代码语言:javascript复制
-- 1.查询所有数据,按性别分组。2.统计每组人数
mysql> select sex,count(*) from stu3 group by sex;
 ------ ---------- 
| sex  | count(*) |
 ------ ---------- 
| 女   |        3 |
| 男   |        5 |
 ------ ---------- 
2 rows in set (0.00 sec)

mysql> 
查询年龄大于25岁的人,按性别分组,统计每组的人数
代码语言:javascript复制
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)
查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据

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

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

代码语言:javascript复制
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的男这组数据显示出来

“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条
代码语言:javascript复制
-- 我们可以认为跳过前面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> 
LIMIT的使用场景:分页

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

代码语言:javascript复制
-- 每页显示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> 

“注意:

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

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

代码语言:javascript复制
# 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;

0 人点赞