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;
  • 全连接
  • 子查询

posted on   figh466  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示