2020 -08-16 第四组 曹雨 数据库02 表的查询
DQL数据库查询语言
重点,每天都要接触,每天都要编写,最难,用来查询记录。
查询无法用可视化工具实现,不会修改数据库和表结构
单表查询
基本查询
语法:
查询所有记录(查询所有的列)
select* from 表名
查询指定的列
select id,`name`,age,gender…………from student
补充:在开发中,禁止使用select*。
如果表中有完全重复的记录,在查询的列前加上distinct,完全重复的记录只显示一次
列运算
select id,`name`,age*10…………from student
我们写的所有查询语句,最终执行结果,构建的一张虚拟表
注意空值和任何值做计算,结果都为空,需要用到函数ifnull()函数,如果你是空,我就认为你是0
select ifnull(exper1(如果不是空),exper2(如果是空))''
将字符串做加减乘除运算,会把字符串当作0处理。
别名
我们可以给列起别名,因为我们在查询过程中,列名很可能重复,名字不够简洁,或者名字不能满足我们的要求
select `id` `编号` ,`name` `姓名` ………… from student
select `id` as `编号` ,`name` as `姓名` ………… from student
条件控制,条件查询
添加where关键字,添加where条件
select * from student where `name` = 小刚
模糊查询(比如我想查询所有姓张的)
select * from student where `name` like '张%(%意思是张后面有几个字都要)'
select * from student where `name` like '张_(_意思是张后面带一个字的)'
排序
-
升序
select * from student order by age ASC; ----ASC可以省略
-
降序
select * from student order by age DESC;
-
设置多个排序规则,使用多个列作为排序条件(当第一个排序条件相同时,根据第二列排序条件进行排序)
select* from student order by age ASC,id DESC;
几乎所有的表都会有两个字段 create_time update_time
几乎所有的查询都会按照update_time降序排列
聚合函数
count
查询满足条件的记录行数,后面可以根where条件
如果满足条件的行数为空,不会进行统计。
如果我们要统计真实有效的记录数,最好不要用可以为空列。
-
count(*)
-
count(主键) 推荐
-
count(1) 不推荐
select count(列名) from 表名
max,min
查询满足条件记录中的最大值,后面可以跟where条件
查询满足条件记录中的最小值,后面可以跟where条件
select max(age) from student where gender = '女'
select min(age) from student where gender = '男'
sum
查询满足条件的记录的和,后买你可以跟where条件
select sum(age) from student where gender = '女'
select sum(age) from student where gender = '男'
avg
查询满足条件的记录的平均数,后买你可以跟where条件
select avg(age) from student where gender = '女'
分组查询:
将原有数据分组统计
selecet 分组列名 聚合函数1,聚合函数2 from 表名 group by 该分组列名
分组使用group by,后买你可以是一列,也可以是多个列,分组后查询的列只能是分组是列
一旦发生分组,得到的一定是一组的数据,而不是某一个数据
可以先通过where把满足条件的人分出来,再分组
selecet 分组列名 聚合函数1,聚合函数2 from 表名 group by 该分组列名
select c_id ,avg(score) where c_id in 1 group by c_id
通过having把组信息中满足条件的组再细分出来
select c_id ,avg(score) where c_id in 1 group by c_id
where 和having的区别
- where 写在group by 之前的筛选,在分组前筛选
- having写在group by 之后,分组后再筛选
- where只能使用分组的列作为筛选条件,having既可以使用分组的列,也可以使用聚合函数列作为筛选条件
分页查询(很难)
limit 用来限制查询结果的起始行,是MySQL独有的语法
select * form student limit(4);
--如果只有一条参数说明,从起始位置查找4条数据
select * form student limit(4,3);
如果有两条数据,从第4行的下一行,找3个记录
MySQL:limit
SqlServer:top
Oracle:rownum
分析:
student表中有10条数据,如果每页显示4条,分几页?3页
3页怎么来的?(int)(Math.ceil(10 / 4));
显示第一页的数据:select * from student limit 0,4;
第二页:select * from student limit 4,4;
第三页:select * from student limit 8,4;
注意:Limit子句永远是在整个的sql语句的最后。
多表查询
笛卡尔积
如果两个表没有任何关联关系,我们也不会连接这两张表。
在一个select * from 表名1,表名2;
,就会出现笛卡尔乘积,会生成一张虚拟表,这张虚拟表的数据就是表1和表2两张表数据的乘积。
注意:开发中,一定要避免出现笛卡尔积。
多表连接的方式有四种:
内连接
使用逗号分隔两张表进行查询,mysql进行优化默认就等效于内连接。使用【join】关键字,使用【on】来确定连接条件。【where】只做筛选条件。
SELECT
t.*,
c.* ,
sc.*
FROM
teacher t
INNER JOIN course c ON c.t_id = t.id
INNER JOIN scores sc ON sc.c_id = c.id;
外连接(常用)
内连接与外连接的区别:
对于【内连接】的两个表,如果【驱动表】在【被驱动表】找不到与之匹配的记录,则最终的记录不会出现在结果集中。
对于【外连接】中的两个表,即使【驱动表】中的记录在【被驱动表】中找不到与之匹配的记录,也要将该记录加入到最后的结果集中。针对不同的【驱动表】的位置,有分为【左外连接】和【右外连接】。
- 对于左连接,左边的表为主,左边的表的记录会完整的出现在结果集里。
- 对于右连接,右边的表为主,左边的表的记录会完整的出现在结果集里。
左连接
SELECT
t.*,
c.*
FROM
teacher t
LEFT JOIN course c ON t.id = c.t_id;
右连接
SELECT
t.*,
c.*
FROM
course c
RIGHT JOIN teacher t ON t.id = c.t_id;
- 全连接
- 子查询
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律