DQL查询表中的数据
查询不会对数据库中的数据进行修改.只是一种显示数据的方式。
-- 查询语句
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
简单查询
- 查询表所有行和列的数据
- 使用*表示所有列(一般不建议使用)
SELECT * FROM 表名; --查询所有的学生 select * from student;
- 查询指定列
- 查询指定列的数据,多个列之间以逗号分隔
SELECT 字段名1, 字段名2, 字段名3, ... FROM 表名; -- 查询student表中的name 和 age 列 select name,age from student;
- 指定列的别名进行查询
- 使用关键字
使用别名的好处: 显示的时候使用新的名字,并不修改表的结构。 - 对列指定别名(as也可以省略)
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名; -- 使用别名 select name as 姓名,age as 年龄 from student;
- 对列和表同时指定别名
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名; -- 表使用别名(表使用别名的原因:用于多表查询操作) select st.name as 姓名,age as 年龄 from student as st
- 使用关键字
- 清除重复值
- 查询指定列并且结果不出现重复数据
SELECT DISTINCT 字段名 FROM 表名; -- 查询学生来至于哪些地方 select address from student; -- 去掉重复的记录 select distinct address from student;
- 查询结果参与运算(参与运算的必须是
数值类型
)- 某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
- 某列数据和其他列数据参与运算
SELECT 列名1 + 列名2 FROM 表名;
- ifnull(表达式1,表达式2)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null * 表达式1:哪个字段需要判断是否为null * 如果该字段为null后的替换值。
/*demo:添加数学,英语成绩列,给每条记录添加对应的数学和英语成绩, 查询的时候将数学和英语的成绩相加 */ -- 给所有的数学加5分 select math+5 from student; -- 查询math + english的和 select *,(math+english) as 总成绩 from student;
条件查询
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
- 条件查询的语法
SELECT 字段名 FROM 表名 WHERE 条件;
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
- 运算符
较运算符 说明 >、<、<=、>=、=、<> <>在SQL中表示不等于,在mysql中也可以使用!=,没有== ETWEEN…AND 在一个范围之内,如:between 100 and 200相当于条件在100到200之间,包头又包尾 IN(集合) 集合表示多个值,使用逗号分隔 LIKE ‘张%’ 模糊查询 IS NULL 查询某一列为NULL的值,注:不能写=NULL
示例表:
CREATE TABLE student ( id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math int, -- 数学
english int -- 英语
);
INSERT INTO student(id,NAME,age,sex,address,math,english) 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);
-- 查询math分数大于80分的学生
select * from student where math>80;
-- 查询english分数小于或等于80分的学生
select * from student where english <=80;
-- 查询age等于20岁的学生
select * from student where age = 20;
-- 查询age不等于20岁的学生,注:不等于有两种写法
select * from student where age <> 20;
select * from student where age != 20;
- 逻辑运算符
比较运算符 | 说明 |
---|---|
and 或 && | 与,SQL中建议使用前者,后者并不通用 |
or 或|| | 或 |
not 或 ! | 非 |
-- 查询age大于35且性别为男的学生(两个条件同时满足)
select * from student where age>35 and sex='男';
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
select * from student where age>35 or sex='男';
-- 查询id是1或3或5的学生
select * from student where id=1 or id=3 or id=5;
- in关键字
SELECT 字段名 FROM 表名 WHERE 字段 in (数据1, 数据2...);
in里面的每个数据都会作为一次条件,只要满足条件的就会显示
-- 查询id是1或3或5的学生
select * from student3 where id in(1,3,5);
-- 查询id不是1或3或5的学生
select * from student3 where id not in(1,3,5);
- 范围查询(between and)
BETWEEN 值1 AND 值2
表示从值1到值2范围,包头又包尾
比如:age BETWEEN 80 AND 100 相当于: age>=80 && age<=100
查询english成绩大于等于75,且小于等于90的学生
select * from student where english between 75 and 90;
- like关键字
LIKE表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';
- MySQL通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配一个字符 |
-- 查询姓马的学生
select * from student where name like '马%';
select * from student where name like '马';
-- 查询姓名中包含'德'字的学生
select * from student where name like '%德%';
-- 查询姓马,且姓名有两个字的学生
select * from student where name like '马_';
排序
通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
ASC: 升序,(默认值)
DESC: 降序
- 单列排序
什么是单列排序:
只按某一个字段进行排序,单列排序
-- 查询所有数据,使用年龄降序排序
select * from student order by age desc;
- 组合排序
什么是组合排序?
同时对多个字段进行排序,如果第1个字段相等
,则按第2个字段排序,依次类推。
组合排序的语法:
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
select * from student order by age desc, math asc;
聚合函数
使用聚合函数查询是纵向查询
,它是对一列的值进行计算
,然后返回一个结果值
。聚合函数会忽略空值NULL
。
聚合函数的计算,排除null值。
解决方案:
- 选择不包含非空的列进行计算
- IFNULL函数
- 五个聚合函数
SQL中的聚合函数 | 作用 |
---|---|
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
sum(列名) | 对这一列求总和 |
SELECT 聚合函数(列名) FROM 表名;
IFNULL(列名,默认值)
如果列名不为空,返回这列的值。如果为NULL,则返回默认值。
-- 查询学生总数
select count(id) as 总人数 from student;
select count(*) as 总人数 from student;
-- 查询id字段,如果为null,则使用0代替
select ifnull(id,0) from student;
--利用IFNULL()函数,如果记录为NULL,给个默认值,这样统计的数据就不会遗漏
select count(ifnull(id,0)) from student;
-- 查询年龄大于20的总数
select count(*) from student where age>20;
-- 查询数学成绩总分
select sum(math) 总分 from student;
-- 查询数学成绩平均分
select avg(math) 平均分 from student;
-- 查询数学成绩最高分
select max(math) 最高分 from student;
-- 查询数学成绩最低分
select min(math) 最低分 from student;
分组
分组查询是指使用 GROUP BY语句对查询信息进行分组,相同数据作为一组
SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处
。分组的目的
就是为了统计
,一般分组会跟聚合函数一起使用。
注意:当我们使用某个字段分组,
在查询的时候也需要将这个字段查询出来,否则看不到数据属于哪组的
-- 按性别进行分组,求男生和女生数学的平均分
select sex, avg(math) from student3 group by sex;
--查询年龄大于25岁的人,按性别分组,统计每组的人数
/*1.先过滤掉年龄小于25岁的人。
2.再分组。
3.最后统计每组的人数*/
select sex, count(*) from student3 where age > 25 group by sex ;
查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex having COUNT(*) >2;
- having与where的区别
子名 | 作用 |
---|---|
where 子句 | 1)对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据 ,即先过滤再分组。2)where后面不可以使用聚合函数 |
having子句 | 1)having 子句的作用是筛选满足条件的组,即在分组之后过滤数据 ,即先分组再过滤。2)having后面可以使用聚合函数 |
limit的作用:
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数
。
SELECT *|字段列表 [as 别名]
FROM 表名 [WHERE子句] [GROUP BY子句][HAVING子句][ORDER BY子句][LIMIT子句];
LIMIT语法格式:
LIMIT offset,length;
offset:起始行数,从0开始计数,如果省略,默认就是0
length: 返回的行数
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
-- 每页显示3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页
LIMIT的使用场景:
分页:比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。
limit 是一个MySQL"方言"