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

相关推荐
安当加密1 小时前
MySQL数据库透明加密(TDE)解决方案:基于国密SM4的合规与性能优化实践
数据库·mysql·性能优化
JH30732 小时前
第七篇:Buffer Pool 与 InnoDB 其他组件的协作
java·数据库·mysql·oracle
板凳坐着晒太阳2 小时前
ClickHouse 配置优化与问题解决
数据库·clickhouse
数据库生产实战2 小时前
解析Oracle 19C中并行INSERT SELECT的工作原理
数据库·oracle
AAA修煤气灶刘哥3 小时前
服务器指标多到“洪水泛滥”?试试InfluxDB?
数据库·后端·面试
阿沁QWQ3 小时前
MySQL服务器配置与管理
服务器·数据库·mysql
程序新视界4 小时前
MySQL“索引失效”的隐形杀手:隐式类型转换,你了解多少?
数据库·mysql·dba
Logintern095 小时前
windows如何设置mongodb的副本集
数据库·windows·mongodb
XYiFfang5 小时前
【MYSQL】SQL学习指南:从常见错误到高级函数与正则表达式
sql·mysql·正则表达式·regexp_like·group_concat
RestCloud6 小时前
在制造业数字化转型浪潮中,数据已成为核心生产要素。然而,系统割裂、数据滞后、开发运维成本高等问题,却像顽固的 “数据枷锁”,阻碍着企业发展。ETLCloud与
数据库·postgresql