MySQl表的增删查改(聚合查询+联合查询)

目录

1. 数据库约束

1.1 null约束

1.2 upique:唯一约束

1.3 default:默认值约束

1.4 primary key:主键约束 

1.5 foreign key:外键约束

1.6 check约束(了解)

2. 表的设计

3. 新增(查询结果,插入另一个表)

4. 查询

4.1 聚合查询

4.1.1 聚合函数 

4.1.2 group by 子句

4.1.3 having

4.2 联合查询

4.2.1 内连接(常用)

4.2.2 外连接(左外+右外+全外)

4.2.3 自连接

4.2.4 子查询

4.2.5 合并查询(union)


1. 数据库约束

约束:对于数据库中的记录做出更详细的检查

(1)not null:指示某列不能存储null值

(2)unique:唯一约束

保证某列的每行必须有唯一值

(3)default:默认值约束

规定没有给列赋值时的默认值

(4)primary key:主键约束

确保某列(或多个列的结合)有唯一的标识

有助于更容易快速找到表中的一个特定的记录

(5)foreign key:外键约束

保证一个表中的数据匹配另一表中的值的参照完整性

(6)check:保证列中的值符合指定的条件

1.1 null约束

not null 要求指定列,非空

创建表时如果约束这列非空,那么新增时,这列就不可以为空

MySQl表的增删查改(聚合查询+联合查询)_第1张图片

1.2 upique:唯一约束

unique 值唯一,每次插入、修改数据,都会针对当前数据在表里进行查找,看这个值是否能查到,如果能查到,那么不是唯一的,就会导致插入或修改失败

如果使用unique后,先查询,再插入!!!   所以效率比较低

MySQl表的增删查改(聚合查询+联合查询)_第2张图片

entry 在数据结构出现过,Map时entry叫做入口、条目

Map没有实现Iterable接口,没法直接遍历,所以把键值对转换成一个Set ,entrySet 

1.3 default:默认值约束

default:作用是修改默认值

本来表的默认值是null,可以使用 default 把默认值修改成其他值

MySQl表的增删查改(聚合查询+联合查询)_第3张图片

1.4 primary key:主键约束 

primary key 主键 针对每一天记录,作为身份标识

主键要保证唯一性,主键也不能为空

MySQl表的增删查改(聚合查询+联合查询)_第4张图片

MySQl表的增删查改(聚合查询+联合查询)_第5张图片

  使用主键,需要给这个列设置一个唯一的值,我们自己进行分配值的工作,并且还要保证值不会重复,这样会比较麻烦,MySQL提供了一个机制,叫自增主键,来方便分配值

自增主键 跟在primary key 后面  (primary key auto_increment) ,

通过这样的机制,来给主键设置值

MySQl表的增删查改(聚合查询+联合查询)_第6张图片

 自增主键,都是从最大值之后进行增加的

(虽然这样可能会有空间上的浪费,但从大量数据看,这点浪费不影响)

MySQl表的增删查改(聚合查询+联合查询)_第7张图片

1.5 foreign key:外键约束

外键 foreign key:将两种表联系起来

........foreign key (当前表的那一列) references 另外一张表(那一列);

MySQl表的增删查改(聚合查询+联合查询)_第8张图片

约束别的表的表,叫父表(parent,例子中的班级表)

被约束的表,叫子表(child,例子中的学生表)

(1)创建班级表,创建外键约束的学生表 

(2)给学生表插入数据,失败 

(3)给班级表插入数据,然后再给学生表插入数据,成功

MySQl表的增删查改(聚合查询+联合查询)_第9张图片

 这里也要求,子表中引用父表的这一列,必须是primary key 或者 unique

(4)删除或修改父表的数据,失败

修改或删除记录也要看当前记录是否被子表引用,如果引用不能随便修改删除,

如果没有引用就可以修改或删除

1.6 check约束(了解)

check 不支持mysql

通过check中的表达式,对某些要求可以更加灵活实现


2. 表的设计

(1)一对一

比如网上银行系统  ,一个客户,只有一个账号;一个账号也对应一个账号

设计方式可以有多种

1)把所有信息放入一个表中

customer-account(身份证号,姓名,手机号,密码,用户名)

2)在客户表中,加上一个账号id

customer(customerId,姓名,手机号,身份证号,accountId

account(accountId,用户名,密码)

3)反之,也可以在账号表中加客户id

customer(customerId,姓名,手机号,身份证号)

account(accountId,用户名,密码,customerId

(2)一对多

一个银行经理,可以专属多个客户

一个客户,只能属于一个银行经理

 1)设计一个客户表,一个银行经理表,客户表加银行经理id进行联系

MySQl表的增删查改(聚合查询+联合查询)_第10张图片

 2)设计一个客户表,一个银行经理表,银行经理表加客户id进行联系(此方法行不通

MySQl表的增删查改(聚合查询+联合查询)_第11张图片

但是需要注意的是第二中这样的写法是不行的,因为customerld这里每行放多个,

在MySQL中是没有数组类型的,所以不能这样写

(3)多对多

 比如 一个客户,可以购买多个理财产品

一个理财产品,也可以由多个客户购买

1)创建一个客户表,一个理财产品表,一个关联表

MySQl表的增删查改(聚合查询+联合查询)_第12张图片


3. 新增(查询结果,插入另一个表)

可以把查询的结果,插入到另一个另一个表中

create table 表2 第一个表查询结果;

(也可以插入部分,通过条件筛选,但是注意列的个数和类型要匹配)

MySQl表的增删查改(聚合查询+联合查询)_第13张图片


4. 查询

4.1 聚合查询

聚合查询,是把行和行放在一起进行计算

4.1.1 聚合函数 

函数 说明
count() 返回查询到的数据的  数量(单查行不计空值,查全部*计空值)
sum() 返回查询到的数据的 总和,不是数字没有意义
avg() 返回查询到的数据的 平均值
max() 返回查询到的数据的 最大值

min()

返回查询到的数据的 最小值

 下面看两个例子MySQl表的增删查改(聚合查询+联合查询)_第14张图片

4.1.2 group by 子句

group by子句:可以对指定列进行分组查询,指定的字段必须是‘’分组依据字段‘’,其他字段若想出现必须包含在聚合函数中

创建建一个emp表 

MySQl表的增删查改(聚合查询+联合查询)_第15张图片

 (1)查询每个岗位的人数

思路 先查询都有什么岗位,也就是对岗位role进行分组,然后查询每个岗位的人数

MySQl表的增删查改(聚合查询+联合查询)_第16张图片

 (2)查询每个岗位的平均薪资

思路 先查有哪些岗位,也就是对岗位进行分组,然后再对每种岗位求平均工资

求最高工资,和最低工资

MySQl表的增删查改(聚合查询+联合查询)_第17张图片

MySQl表的增删查改(聚合查询+联合查询)_第18张图片


4.1.3 having

group by 子句进行分组后,如果要对分组结果进行条件筛选时,不可以使用where语句,而要使用having

分组查询,还可以指定条件,需要区别的是

分组之前,使用条件筛选;   使用where

分组之后,进行条件筛选;   使用having

(1)查询每个岗位的平均薪资(除去 张三 这个记录)

思路 先除去张三,再进行分组(也就是分组之前,进行条件筛选)

MySQl表的增删查改(聚合查询+联合查询)_第19张图片

(2)查询平均薪资 > 10000的岗位

先分组,计算平均薪资,然后再找到平均薪资大于10000的岗位

(也就是先分组,再进行条件筛选)

MySQl表的增删查改(聚合查询+联合查询)_第20张图片

(3)求除去张三之外,每个岗位的平均薪资,并且保留平均薪资 > 10000的岗位

MySQl表的增删查改(聚合查询+联合查询)_第21张图片


4.2 联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

笛卡尔积,是两个表记录,排列组合的结果

笛卡尔的行数是一个相乘的关系,如果原来行数很多,相乘后行数就会更多

在进行联合查询的过程,就是在进行计算笛卡尔积的过程

当表比较大时,如果多表查询,机会比较低效,很可能会是危险操作

笛卡尔积的列数,是两个表的列数之和

笛卡尔积的行数,是两个表的行数之积

联合查询/多表查询 = 笛卡尔积 +  连接条件 + 其他条件(根据其他的需求)

联合查询:相当于把数据先变多,再变少的过程

创建四张表

MySQl表的增删查改(聚合查询+联合查询)_第22张图片

4.2.1 内连接(常用)

select 字段 from 表1 join 表2 on 连接条件 and 其他条件;

select 字段 from 表1,表2 where 连接条件 and 其他条件

内连接,方法四步走

(1)进行笛卡尔积

select * from 表1,表2;

(2)添加连接条件,去除无用信息

select * form 表1,表2 where 连接条件

(3)添加其他条件,进行信息筛选

 select * form 表1,表2 where 连接条件 and 其他条件;

(4)精简列,去除无用列

 select 字段 form 表1,表2 where 连接条件 and 其他条件;

(1)查询“许仙”同学的成绩

学生表中查名字,分数表中查成绩

思路1:根据许仙同学的名字,找到学号,再根据学号找到对应的分数

思路2:学生表和分数表笛卡尔积,根据条件进行筛选

使用where做 

MySQl表的增删查改(聚合查询+联合查询)_第23张图片

 使用join...on...做

MySQl表的增删查改(聚合查询+联合查询)_第24张图片

(2)查询所有同学的总成绩,及同学的个人信息
思路 按照同学身份进行分组,然后依次每次求和
MySQl表的增删查改(聚合查询+联合查询)_第25张图片
(3)查询所有同学的成绩,及同学的个人信息
查询出每个同学的成绩,带有课程信息
同学名在学生表,课程名在课程表,分数在分数表中
此时就要三张表的笛卡尔积
使用where
MySQl表的增删查改(聚合查询+联合查询)_第26张图片

使用 join...on... 

MySQl表的增删查改(聚合查询+联合查询)_第27张图片


4.2.2 外连接(左外+右外+全外)

外连接反为左外连接和右外连接

(1) 左外连接,表1完全显示

select 字段  from 表名1 left join 表名2 on 连接条件;

(2)右外连接,表2完全显示

select 字段 from 表名1 right join 表名2 on 连接条件;

MySQl表的增删查改(聚合查询+联合查询)_第28张图片下面创建下面这两个信息不一一对应的两个表

MySQl表的增删查改(聚合查询+联合查询)_第29张图片 看一下内外连接的区别

MySQl表的增删查改(聚合查询+联合查询)_第30张图片

如果两张表,完全重合,内外连接没有区别

如果两张表,只有一部分重合,内连接就是获取到‘交集’;

MySQl表的增删查改(聚合查询+联合查询)_第31张图片

 MySQl表的增删查改(聚合查询+联合查询)_第32张图片

 左外连接和右外连接,主要是看表的先后顺序

在join左侧还是右侧

select * from student left join score;    左外连接 student

select * from score right join student;  右外连接 student


4.2.3 自连接

自连接是指在同一张表连接自身进行查询(自己和自己进行笛卡尔积)

思路 ‘‘行’’转为‘’列‘’

显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

MySQl表的增删查改(聚合查询+联合查询)_第33张图片

 下面写一下,自连接的过程分析

MySQl表的增删查改(聚合查询+联合查询)_第34张图片

自连接的代价

1.运行的开销

2.可读性的成本 


4.2.4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

本质就是把多个查询语句,给组合成一个查询语句

用一个查询的结果的临时表,基于这个临时表再发起另一组查询

(1)单行子查询 返回一行记录的子查询

查询与“不想毕业”同学的同班同学

MySQl表的增删查改(聚合查询+联合查询)_第35张图片

子查询可以理解为套娃,一层套一层,但如果套娃太复杂,就会非常影响理解 

 (2)多行子查询 返回多行记录的子查询

如果子查询,返回的结构是多条记录,就可以使用in来进行子查询

查询“语文”或“英文”课程的成绩信息

MySQl表的增删查改(聚合查询+联合查询)_第36张图片

 多行子查询  除了可以使用in之外,

也可以使用exists ,exists写法,执行效率和可读性都远低于in写法

但是在特殊情况下,exists可以带头in

in的子查询结构是保存在内存中,

如果子查询结果集特别大,内存放不下,就需要使用exists


4.2.5 合并查询(union)

使用union或者union all 来完成把多个查询的结果集合,合并到一起 

  union   在合并时,如果合并时有重复数据,去重

  union all 在合并时,如果合并时有重复的数据,不去重

 查询id小于3,或者名字为“英文”的课程

MySQl表的增删查改(聚合查询+联合查询)_第37张图片

union 可以 将不同的表合并在一块查询

or 只能在同一张表中查询 


你可能感兴趣的:(MySQL,mysql,数据库,sql)