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;
代码语言:javascript复制“注意: 并只显示性别人数>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的男这组数据显示出来
“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;