MySQL(3)

约束

  • 概述

  • 约束演示

  • 外键约束

概念:约束是作用在表中字段上的规则,用于限制存储在表中的数据

目的:保证数据库中数据的正确,有效性和完整性

  • not null 非空约束

  • unique 唯一约束

  • primary key 主键约束

    • 主键是一行数据的唯一标识,要求非空且唯一
  • default 默认约束

    • 默认约束,保存数据时,如果为指定该字段的值,则采用默认值
  • check 检查约束(8.0.16之后)

    • 保证字段值满足某一个条件
  • foreing key 外键约束

    • 用来让两张表的数据之间建立联系,保证数据的一致性和完整性

注意:约束是作用在表中字段上的,可以在创建表/修改表的时候添加约束

注:图形化界面可以直接手动添加表

外键约束

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

语法:

复制代码
# 第一种在创建表的时候,添加外键
create table 表名(
    字段名 数据类型,
    ....
    constraint 外键名 foreign key 外键字段名 references 主表(主表列名)
)


# 第二种


alter table 表名 add constraint 外键名 foreign key (外键字段名) references 主表(主表列名);

注:黄色钥匙代表主键,蓝色小钥匙代表外键

语法

复制代码
# 删除外键

alter table 表名 drop foreign 外键名;

外键删除更新行为

  • no action

    • 有外键,不允许删除
  • restrict

    • 有外键,不允许删除
  • cascade

    • 有外键,则也删除/更新 外键在子表中的记录
  • set null

    • 有外键,则将子表中的外键值改为null
  • set default

    • 父表更变时,子表设置为一个默认的值(Innodb不支持)

      语法

      alter table 表名 add constraint 外键名 foreign (外键字段) references 主表名(主表字段名) on update (上面的参数) on delete (上面的参数)

多表查询

  • 多表关系

  • 多表查询概述

  • 内连接

  • 外连接

  • 自连接

  • 子查询

  • 多表查询案例

多表关系

概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系。

  • 一对多,多对一

  • 多对多

    • 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
  • 一对一

    • 多用于单表的拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

    • 实现:在任意一方加入外键,关联另外一方的主键,并且外键为唯一的unique

多表查询概述

概述:指从多张表中查询数据

笛卡尔积:两个集合,集合A和集合B 的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

复制代码
select * from emp,dept where emp.dept_id = dept.id;

多表查询分类

  • 连接查询

    • 内连接:交集部分的数据

    • 外连接

      • 左外连接:左表的所有数据,以及两种表交集部分数据

      • 右外连接:右表的所有数据,以及两种表交集部分数据

    • 自连接:当前表与自身的连接查询,自连接必须使用表别名

  • 子查询

内连接

  • 隐式内连接

  • 显示内连接

    语法

    1. 隐式内连接

    select 字段列表 from 表1,表2 where 条件...;

    2.显示内连接

    select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

外连接

  • 左外连接:表1的所有数据,表1和表2交集部分的数据

    左外连接

    select 字段列表 from 表1 left [outer] join 表2 on 条件...;

注:右外连接和上述语法格式一样,左外会用的更多一些

个人理解:是将左表全部打印的基础上,将左表的扩展信息也打出来(这里可能部分左表没有)

自连接

复制代码
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;

个人理解:表中某一个栏目存储了与自身相关的信息,需要这个信息来查询进一步的信息

注:自连接可以用左连接来实现

联合查询 -union ,union all

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

复制代码
select 字段列表 from 表A... union [all] select 字段列表 from 表B....;

注:all删除后,会对合并后的结果进行去重

注:多张表的列数必须保持一致,字段类型也需要保持一致

子查询

概念:SQL语句中嵌套select语句,称为嵌套查询,又称子查询

分类:

  • 标量子查询(子查询结果为单个值)

  • 列子查询(子查询结果为一列)

  • 行子查询(子查询结果为一行)

  • 表子查询(子查询结果为多行多列)

根据子查询位置,分为: Where之后,from 之后,select 之后

标量子查询

子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式。

常见的操作符:= > < >= <=

注:内层的查询需要带小括号

列子查询

常用操作符:in,not in, any , some ,all

  • in :在指定的集合范围之内,多选一

  • not in:不再指定的集合范围之内

  • any :子查询返回列表中,有任意一个满足即可

  • some:与any等同,使用some的地方都可以使用any

  • all:子查询返回列表的所有值都必须满足

行子查询

常用的操作符:=,<,>,in,not in

相关推荐
Bryce学亮9 小时前
股票数据成本分析工具
数据库
思麟呀9 小时前
MySQL表的约束
数据库·mysql
步十人9 小时前
【FastAPI】ORM-02.使用 ORM 高效处理数据库逻辑
服务器·数据库·fastapi
Apache IoTDB9 小时前
时序数据库 IoTDB + 时序智能服务平台 TimechoAI 亮相中国核电信息技术高峰论坛
数据库·时序数据库·iotdb
未若君雅裁9 小时前
Redis 和 MySQL 双写一致性:延迟双删、读写锁、MQ、Canal 怎么选?
数据库·redis·面试
罗超驿9 小时前
9.深度剖析MySQL约束的工程设计:自增主键的分布式局限、外键约束的权衡,与CHECK的版本适配实践
数据库·mysql
Kiyra9 小时前
Agent 的记忆不是存数据库就行:上下文预算与轻量记忆的设计实战
数据库·人工智能·后端·面试·职场和发展·哈希算法
jiayong2310 小时前
MySQL 8.0 数据库恢复问题完整解决方案
数据库·mysql
czlczl2002092510 小时前
普通索引和唯一索引 查询性能差异
数据库
@小柯555m10 小时前
MySql(正则表达式--电话号码格式校验)
数据库·sql·mysql·正则表达式