MySQL: 表的增删改查(进阶2)

数据库表的设计

1: 1对1

个人信息/身份证信息(个人id,个人姓名,…,身份证号);

MySQL: 表的增删改查(进阶2)_第1张图片
2: 1对多

学生与班级之间的关系;一个学生可以属于一个班级,而一个班级可以包含多名学生.

MySQL: 表的增删改查(进阶2)_第2张图片
方式一
MySQL: 表的增删改查(进阶2)_第3张图片
方式二:
MySQL: 表的增删改查(进阶2)_第4张图片

总结:方式一与方式二的组织方式,都很常见。但是就关系数据库的表设计来说。方式二要更加常用!
方式一,依赖了形如数组这样的数据类型,但是像mysql这样的数据库,并不支持数组这样的类型。如果非要表示,就需要把若干个id整理成一个字符串,id之间使用,来分割之类的。

注:其它非关系型数据库,比如redis这种,是支持数组这样的类型的。

**3:**多对多
MySQL: 表的增删改查(进阶2)_第5张图片
MySQL: 表的增删改查(进阶2)_第6张图片

聚合查询

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:
MySQL: 表的增删改查(进阶2)_第7张图片

聚合函数演示

创建学生表
create table student(id int primary key auto_increment,name varchar(20),chinese decimal(3,1),math decimal(3,1), english decimal(3,1));
Query OK, 0 rows affected (0.05 sec)
MySQL: 表的增删改查(进阶2)_第8张图片

count

查询math的个数
select count(math) from student;
MySQL: 表的增删改查(进阶2)_第9张图片

SUM

查询使用math的和
select sum(math) from student;
MySQL: 表的增删改查(进阶2)_第10张图片

AVG

查询math的平均值
select avg(math) from student;
MySQL: 表的增删改查(进阶2)_第11张图片

MAX

求math的最大值
select max(math) from student;
MySQL: 表的增删改查(进阶2)_第12张图片

MIN

求math的最小值
select min(math) from student;
MySQL: 表的增删改查(进阶2)_第13张图片

GROUP BY字句

  • SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

准备测试表及数据:职员表,有id(主键)、name(姓名)、role(角色)、salary(薪水)
MySQL: 表的增删改查(进阶2)_第14张图片
如图所示:
MySQL: 表的增删改查(进阶2)_第15张图片
查询每个角色的最高工资、最低工资和平均工资
MySQL: 表的增删改查(进阶2)_第16张图片

HAVING

  • GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING

以该表为例
MySQL: 表的增删改查(进阶2)_第17张图片
显示平均工资低于1500的角色和它的平均工资//这里进行条件筛选
MySQL: 表的增删改查(进阶2)_第18张图片

联合查询(多表查询)

多表查询是对多张表的数据取笛卡尔积

联合查询、多表查询的一般步骤
1.先分析题目中要求的信息来自于那个表
2.把这些表进行笛卡儿积
3.在结合这些表之间的关联关系,指定连接条件,过滤掉不合理的数据
4.在补充上题目中要求的其它条件~逐渐让最终查询结果接近预期结果
5.最后对查询的列进行精简

笛卡尔积

MySQL: 表的增删改查(进阶2)_第19张图片
当使用表来展示时:

笛卡尔积是针对两张表进行计算的
先取出第一张表的第一行,然后依次和第二张表的每一行进行组合,得到的结果作为笛卡尔积中的记录
再取出第一张表的第二行,然后依次和第二张表的每一行进行组合
MySQL: 表的增删改查(进阶2)_第20张图片
笛卡儿积得到的结果依然是一张表
这个表的列数,就是两张表的列数之和
这个表的行数,就是两张表的列数之积

注:笛卡儿积里面包含了一些不科学的记录,都不是说笛卡儿积不科学。只需要将不科学的记录给筛选掉就行了。

初始化测试数据:

班级表
MySQL: 表的增删改查(进阶2)_第21张图片
学生表
MySQL: 表的增删改查(进阶2)_第22张图片
课程表
MySQL: 表的增删改查(进阶2)_第23张图片
成绩表
MySQL: 表的增删改查(进阶2)_第24张图片
表关系
student和classes之间是一对多的关系
student和course之间是多对多的关系
score表就是student和course之间关系的这个中间表
MySQL: 表的增删改查(进阶2)_第25张图片

:当多表查询的时候,由于笛卡儿积中包含的列来自多个表,而且列名可能碰巧一样的,此时就可以通过表名.列名的方式显式指出当前的列是哪个表的的那个列。

内连接

select … from 表1,表2 where 条件

例如:查询许仙的成绩
MySQL: 表的增删改查(进阶2)_第26张图片

外连接:

  • 外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
  • 如果两个表里每一条数据都是一一对应的,那么此时的外连接和内连接就是等价的。

select … from 表1 left/right join 表2 on 条件 where 其他条件

查询所有同学的成绩,及同学的个人信息,如果该同学没有成绩,也需要显示
– “老外学中文”同学 没有考试成绩,也显示出来了
MySQL: 表的增删改查(进阶2)_第27张图片
– 对应的右外连接为:
MySQL: 表的增删改查(进阶2)_第28张图片

自连接:

  • 自连接是指在同一张表连接自身进行查询。

select … from 表1,表1 where 条件
select … from 表1 join 表1 on 条件

合并查询

合并查询,相当于是把多个结果集合合并成一个!
union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
查询id小于3,或者名字为“英文”的课程:
MySQL: 表的增删改查(进阶2)_第29张图片

总结:

  • 联合查询、多表查询,本质就是“先做加法,再做减法”
  • 先把所有的可能性通过笛卡儿积罗列出来,然后在设定条件筛选。设定条件的时候,一般至少要指定一个连接条件.(两个表之间得有一个带关联关系的id)

你可能感兴趣的:(MySQL数据库,java,数据结构,leetcode)