目录
DQL查询表中的数据
简单查询
查询表所有行和列的数据
查询指定列
指定列的别名进行查询
使用关键字AS
对列指定别名
具体操作:
清除重复值
查询指定列并且结果不出现重复数据
具体操作:
查询结果参与运算
某列数据和固定值运算
某列数据和其他列数据参与运算
具体操作
DQL条件查询
条件查询
为什么要条件查询
条件查询的语法
准备数据
比较运算符
具体操作:
逻辑运算符
具体操作:
in关键字
具体操作:
范围查询
like关键字
MySQL通配符
查询为空的列IS NULL
条件查询小结
DQL查询语句
排序
单列排序
组合排序
聚合函数
五个聚合函数
语法:
分组
having与where的区别
limit语句
给student3添加新的数据:
limit的作用:
LIMIT的使用场景:
查询不会对数据库中的数据进行修改.只是一种显示数据的方式
使用*表示所有列
查询指定列的数据,多个列之间以逗号分隔
-- 查询student表中的id 和name 列
select id,name from student;
-- 查询student表中id 和name 列,id的别名为编号,name的别名为"姓名"
select id as 编号,name as 姓名 from student;
select id 编号,name 姓名 from student s;
-- 查询学生来至于哪些地方
select * from student;
-- 去掉重复行
select distinct city from student;
-- 修改表结构,添加1列city varchar(20)
alter table student add city varchar(20);
-- 更新city
update student set city='广州' where id=1 or id=3;
-- 修改student表结构,添加数学和英语成绩列
alter table student add math int, add english int;
select * from student;
-- 查询姓名、数学,将数学每个减10分
select name, math from student;
select name, math-10 数学 from student;
-- 查询所有列与math + english的和并使用别名”总成绩”
select *, math+english 总成绩 from student;
如果不指定条件,默认是返回表中所有的行。指定条件后,只返回符合条件的记录
创建一个学生表,包含如下列:
CREATE TABLE student3 (
id int, -- 编号
name varchar(20), -- 姓名
age int, -- 年龄
sex varchar(5), -- 性别
address varchar(100), -- 地址
math int, -- 数学
english int -- 英语
);
INSERT INTO student3(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 student3 where math > 80;
-- 查询english分数小于或等于80分的学生
select * from student3 where english <= 80;
-- 查询age等于20岁的学生
select * from student3 where age = 20;
-- 查询age不等于20岁的学生,注:不等于有两种写法
select * from student3 where age != 20;
select * from student3 where age <> 20;
-- 查询age大于35且性别为男的学生(两个条件同时满足)
select * from student3 where age >35 and sex='男';
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
select * from student3 where age >35 or sex='男';
-- 查询id是1或3或5的学生
select * from student3 where id=1 or id=3 or id=5;
-- 查询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);
-- 查询english成绩大于等于77,且小于等于87的学生
select * from student3 where english between 77 and 87;
select * from student3 where english >=77 and english <=87;
-- 查询姓马的学生
select * from student3 where name like '马%';
-- 查询姓名中包含'德'字的学生
select * from student3 where name like '%德%';
-- 查询姓马,且姓名有2个字的学生
select * from student3 where name like '马_';
-- 查询英文成绩为NULL的学生
select * from student3 where english is null;
-- 查询英语成绩不为NULL的学生
select * from student3 where english is not null;
CREATE TABLE student3 (
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math int,
english int
);
INSERT INTO student3(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);
-- 按姓名排序,默认是utf8字符集先后顺序排序
select * from student3 order by name;
-- 如果按拼音,要指定为GBK的排序编码,只指定这一列临时按GBK编码排序
select * from student3 order by convert(name using gbk) asc;
-- 查询所有数据,使用年龄降序排序
select * from student3 order by age desc;
-- 查询所有数据大于20岁的学生,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序
select * from student3 where age>20 order by age desc, math asc;
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。聚合函数会忽略空值。
-- 查询学生总数
select count(id) from student3;
select count(english) from student3;
select count(*) from student3;
-- 查询年龄大于40的总数
select count(*) from student3 where age > 40;
-- 查询数学成绩总分
select sum(math) 数学总分 from student3;
-- 查询数学成绩平均分
select avg(math) 数学平均分 from student3;
-- 查询数学成绩最高分
select max(math) 数学最高分 from student3;
-- 查询数学成绩最低分
select min(math) 数学最低分 from student3;
将分组字段结果中相同内容作为一组,如按性别将学生分成2组。
GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用。
-- 按性别进行分组,求男生和女生数学的总成绩
select sum(math) 数学总成绩, sex from student3 group by sex;
-- 查询男女各多少人
-- 1) 查询所有数据,按性别分组。
select * from student3 group by sex;
-- 2) 统计每组人数
select count(*) 人数, sex from student3 group by sex;
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
-- 1) 先过滤掉年龄小于等于25岁的人。
select * from student3 where age > 25;
-- 2) 再分组。
select * from student3 where age > 25 group by sex;
-- 3) 最后统计每组的人数
select count(*) , sex from student3 where age > 25 group by sex;
以下代码是否正确?
SELECT sex, COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;
select count(*) , sex from student3 where age > 25 group by sex having count(*) > 2;
只有分组后人数大于2的`男`这组数据显示出来
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,88);
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数。
-- 查询学生表中数据,从第3条开始显示,显示6条。
select * from student3 limit 2, 6; -- 跳过2条,返回6条
分页:比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。 假设我们一每页显示5条记录的方式来分页。
-- 第一页:跳过0条,显示5条。如果跳过0条记录,0可以省略
select * from student3 limit 0, 5;
select * from student3 limit 5;
-- 第二页:跳过5条,显示5条
select * from student3 limit 5, 5;
-- 第三页:跳过10条,显示5条。如果最后一页没有这么多记录,有多少条显示多少条
select * from student3 limit 10, 5;