DQL—查询操作
一、查询语法
select 字段列表 from 表名列表 where 条件列表 group by 分组列表 having 分组后条件 order by 排序字段 limit 分页限定
(提供一个表来操作操作)
-- 删除 stu 表 drop table if exists stu; -- 创建stu表 create table stu( id int, -- 编号 name varchar(20), -- 姓名 age int, -- 年龄 sex varchar(5), -- 性别 address varchar(100), -- 地址 math double(5,2), -- 数学成绩 english double(5,2), -- 英语成绩 hire_date date -- 入学时间 ); -- 添加数据 insert into stu(id,name,age,sex,address,math,english,hire_date) VALUES (1,'马运',55,'男','杭州',66,78,'1995-09-01'), (2,'马花腾',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',56,77,'1999-09-02'), (4,'柳白',20,'女','湖南',76,65,'1997-09-05'), (5,'柳青',20,'女','湖南',86,NULL,'1998-09-01'), (6,'刘德花',57,'男','香港',99,99,'1998-09-01'), (7,'张雪有',22,'女','香港',99,99,'1998-09-01'), (8,'德玛西亚',18,'男','南京',65,56,'1998-09-02');
二、基础查询
1. 查询多个字段
select 字段列表 from 表名; select * from 表名; -- 查询所有数据
-- 查询 name age 两列 SELECT name, -- 姓名 age -- 年龄 FROM stu; -- 查询所有列的数据, 列名列表可以用 * 代替 select * from stu; -- (通常情况下 企业中是不允许使用 * 的 不便于理解 与 注释)
2、去除重复记录
select distinct 字段列表 from 表名;
-- 去除重复记录 select DISTINCT address from stu;
3. 起别名
as: (as 也可以省略)
-- 查询姓名,数学成绩 ,英语成绩 select name, math as 数学成绩, english as 英语成绩 from stu;
三、条件查询
1、 条件查询语法
select 字段列表 from 表名 where 条件列表;
2、条件
代码实例:
-- ====================条件查询================ -- 1. 查询年龄大于20岁的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age > 20; -- 2. 查询年龄大于等于20岁的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age >= 20; -- 3. 查询年龄大于等于20岁 并且 年龄小于等于30岁 的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age >= 20 && age <= 20; -- && 与 AND 含义一样 -- 4. 查询入学日期在’1998-09-01’到 ’1999-09-01’之间的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE hire_date BETWEEN '1998-09-01' AND '1999-09-01'; -- 5. 查询年龄等于18岁的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age = 18; -- 6. 查询年龄不等于18岁的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age != 18; -- 7. 查询年龄等于18岁 或者 年龄小于20岁 或者 年龄等于22岁的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE age = 18 OR age < 20 || age = 22; -- OR 与 || 含义一样 -- 8. 查询英语成绩为null 的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE english is NULL;
3、模糊查询(like)
通配符 (1)_: 代表单个任意字符 (2)%:代表任意个数字符
-- =============模糊查询 like ========== /* 通配符 (1)_: 代表单个任意字符 (2)%:代表任意个数字符 */ -- 1. 查询姓’马’的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE name LIKE '马%'; -- 2. 查询第二个字是’花’的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE name like '_花%'; -- 3. 查询名字中包含'德'的学员信息 select name 姓名, age 年龄, sex 性别, address 地址, math 数学成绩, english 英语成绩, hire_date 入学时间 FROM stu WHERE name like '%德%';
四、 排序查询
1、 排序查询语法(中括号表示可以省略)
select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2] ...;
2、 排序方式
·ASC :升序排列(默认值)
·DESC :降序排列
(当有多个排序条件时,当前边条件值一样时,才根据第二条件进行排序)
-- ================= 排序查询 -- 1. 按照年龄升序排序 select * from stu ORDER BY age asc; -- 2. 按照数学二成绩降序排序 select * from stu order by math desc; -- 3. 按照数学成绩降序排序,如果数学成绩一样则按照英语成绩排序 select * from stu order by math desc , english asc ;
五、分组查询
1、 聚合函数
概念:将一列数据作为一个整体,进行纵向计算
分类:(使用 count 统计数量时,通常使用 count(*) *号会统计到任意行不全为null值的行,且会选择统计速度最快的一列)
语法:(注意:null 值不参与所有聚合函数的运算)
select 聚合函数名(列名) from 表名;
代码演示:
-- ==============聚合函数========== -- 1. 统计班里有多少学生? select count(name) from stu; -- 2.查询数学成绩最高分 select max(math) from stu; -- 3.查询数学成绩最低分 select min(math) from stu; -- 4.查询数学成绩总分 select sum(math) from stu; -- 5.查询数学成绩平均分 select avg(math) from stu;
2、 分组查询
语法:(注意:分组之后,查询的字段列表为聚合函数和分组字段 ,查询其他字段无任何意义)
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having 分组后条件过滤];
where 和 having 的区别:
执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而 having 是分组之后对结果进行过滤
可判断的条件不一样: where 不能对聚合函数进行判断,having 可以
执行顺序:where > 聚合函数 > having
代码演示:
-- ===========分组查询 ======== -- 注意:分组之后,查询的字段列表为聚合函数和分组字段 ,查询其他字段无任何意义 -- 1. 查询男女同学各自的数学平均分 select sex,avg(math) from stu group by sex; -- 2. 查询男女同学各自的数学平均分,以及各自人数 select sex,avg(math),count(*) from stu group by sex; -- 3. 查询男女同学各自的数学平均分,以及各自人数,要求分数低于70分的不参与分组 select sex,avg(math),count(*) from stu where math >= 70 group by sex; -- 4. 查询男女同学各自的数学平均分,以及各自人数,要求分数低于70分的不参与分组,分组之后人数大于2个 select sex,avg(math),count(*) from stu where math >= 70 group by sex having count(*) > 2;
六、 分页查询
1、 语法:
select 字段列表 from 表名 limit 起始索引, 查询条目数;
起始索引: 从0开始
计算公式: 起始索引 = (当前页码 - 1)* 每页显示的条数
(分页查询 limit 是MySQL数据库的方言)
(Oracle 分页查询使用 rownumber)
(SQL Server 分页查询使用 top)
代码演示:
-- ==============分页查询 ============= -- 1. 从0开始查询,查询3条数据 select * from stu limit 0,3; -- 2. 每页显示3条数据,查询第1页数据 select * from stu limit 0,3; -- 3. 每页显示3条数据,查询第2页数据 select * from stu limit 3,3; -- 4. 每页显示3条数据,查询第3页数据 select * from stu limit 6,3; -- 公式总结 起始索引 = (要查询的页码数 - 1)* 每页要显示的数据条数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)