DQL---查询表中的记录

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)
BETWEEN1 AND2
表示从值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值。
解决方案:

  1. 选择不包含非空的列进行计算
  2. 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"方言"

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值