前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句

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

作者头像
Devops海洋的渔夫
发布2022-01-17 14:14:37
3.6K0
发布2022-01-17 14:14:37
举报
文章被收录于专栏:Devops专栏

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;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7. 基础SQL-DQL语句-条件查询-排序-聚合函数-分组-limit语句
    • 1. 条件查询
      • 1.1 准备数据
      • 1.2 比较运算符
      • 1.3 逻辑运算符
      • 1.4 in关键字
      • 1.5 范围
      • 1.6 like 模糊查询:% 与 _ 占位符的使用
    • 2. 排序
      • 2.1 单列排序
      • 2.2 组合排序
    • 3. 聚合函数
      • 4. GROUP BY 分组 以及 HAVING 条件的使用
        • 5. limit语句
          • 6. select 查询条件的执行顺序
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档