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

相关推荐
lingllllove42 分钟前
ubuntu22.04防火墙策略
数据库·postgresql
程序猿小D4 小时前
第三百五十八节 JavaFX教程 - JavaFX滑块
java·前端·数据库
My LQS4 小时前
使用 EXISTS 解决 SQL 中 IN 查询数量过多的问题
数据库·sql
weixin_307779137 小时前
PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序
大数据·数据仓库·python·sql·spark
誰能久伴不乏9 小时前
从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析
数据库·qt·wps
40岁的系统架构师10 小时前
17 一个高并发的系统架构如何设计
数据库·分布式·系统架构
安的列斯凯奇10 小时前
Redis篇 Redis如何清理过期的key以及对应的解决方法
数据库·redis·缓存
小小虫码11 小时前
MySQL和Redis的区别
数据库·redis·mysql
飞翔的佩奇13 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的图书管理系统(含源码+数据库+答辩PPT+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·图书管理