MySQL高级—约束与关系

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL高级—约束与关系

🍎道阻且长,行则将至。🍓


目录

一、约束

1.约束的基本概念

2.分类

二、关系

1.一对多

2.多对多

3.一对一

三、多表查询

1.多查

2.连接查询

3.子查询


一、约束

1.约束的基本概念

数据库的表示用来存储数据的,为了保证表数据的正确性、有效性和完整性,我们设置一种列的规则用于限制加入表的数据,这称之为约束

image.png

例如对一张学生表如果不加以约束就会出现各种奇奇怪怪的数据。

2.分类

    • 非空约束: 关键字是 NOT NULL
      保证列中所有的数据不能有null值。

    用法:

    -- 创建表时添加非空约束
    CREATE TABLE 表名(
       列名 数据类型 NOT NULL,
    ); 
    -- 建完表后添加非空约束
    ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
    -- 删除约束
    ALTER TABLE 表名 MODIFY 字段名 数据类型;

    image.gif

      • 唯一约束:关键字是 UNIQUE
        保证列中所有数据各不相同。
      -- 创建表时添加唯一约束,两种方法
      CREATE TABLE 表名(
         列名 数据类型 UNIQUE [AUTO_INCREMENT],-- AUTO_INCREMENT: 值自动增长
      ); 
      CREATE TABLE 表名(
         列名 数据类型,
         [CONSTRAINT] [约束名称] UNIQUE(列名)
      ); 
      -- 建完表后添加唯一约束
      ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
      -- 删除约束
      ALTER TABLE 表名 DROP INDEX 字段名;

      image.gif

        • 主键约束: 关键字是 PRIMARY KEY
          主键是一行数据的唯一标识,非空且唯一。一个表只能有一个主键来唯一标识数据。例如:id作为主键,来标识每条数据。
        -- 创建表时添加主键约束
        CREATE TABLE 表名(
           列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
        ); 
        CREATE TABLE 表名(
           列名 数据类型,
           [CONSTRAINT] [约束名称] PRIMARY KEY(列名)
        ); 
        -- 建完表后添加主键约束
        ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
        -- 删除约束
        ALTER TABLE 表名 DROP PRIMARY KEY;

        image.gif

          • 检查约束: 关键字是 CHECK
            保证列中的值满足某条件。【MySQL不支持
            例如:我们可以给age列添加一个范围,1-200,这样增加的数据才更合理。
          • 默认约束: 关键字是 DEFAULT
            给表里加数据时,没有指定值则采用默认值。
            例如:我们在给成绩列添加约束默认值是0,这样在添加数据时没有指定具体值时就会采用默认给定的0。
          -- 创建表时添加默认约束
          CREATE TABLE 表名(
             列名 数据类型 DEFAULT 默认值,
          ); 
          -- 建完表后添加默认约束
          ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
          -- 删除约束
          ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

          image.gif

            • 外键约束: 关键字是 FOREIGN KEY
              外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。简单来说就是两个表之间存在一种对应或者匹配关系。

            例如如下两个表:员工表和部门表,

            image.png

            一个部门可以有多名员工,就是一种一对多关系。当这两个表建立外键约束之后,数据就不能任意修改了,例如删除部门表的第二条数据,或者修改员工张三的dep_id=3;在Navicat里面我们也可以通过逆向表到模型来直观看到这种关系,

            image.png

            image.png

            从模型可以看到两个表通过一个键链接起来了,并且连接线有不同的接头代表多和一。

            创建外键约束的时候谁是多就对应修改谁的表,外键名称可以随意起名,一般:fk_表名_主表名,设置表的一个匹配列为外键,目标的表就是主表,目标列就是主键

            例如前面的员工表和部门表中,员工表是多的一方就在员工表里面修改添加外键,并且设置dep_id为外键,匹配部门表的id为主键。

            -- 创建表时添加外键约束
            CREATE TABLE 表名(
               列名 数据类型,
               [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) 
            ); 
            -- 建完表后添加外键约束
            ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
            -- 删除外键约束
            ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

            image.gif

            p:在建表的时候添加外键约束的时候要注意先建立主表。

            二、关系

            前面的外键部分提到了表和表有个一对多的关系,这就是数据库表关系中的一种,还有多对多和一对一关系。

            1.一对多

            在多的一方建立外键,指向一的一方的主键。

            2.多对多

            建立第三张中间表,中间表至少包含两个外键,分别关联两方主键,就是说在中间表添加两个外键约束。

            image.png

            3.一对一

            一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,提升查询性能。

            在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)。

            三、多表查询

            上一节提到了表和表之间存在一些关系,所以查表的时候就需要考虑到这些存在关系的表。所以就有了多表查询,多表查询就是从多张表中一次性的查询出我们想要的数据。

            1.多查

            多表查询语句:select * from emp , dept;

            这样查询的结果是两个表的完全组合,对于m条数据的emp和n条数据的dept,最后查出来m*n条数据,这明显不是我们想要的。

            2.连接查询

            内连接查询 :相当于查询两个表交集数据;

            -- 隐式内连接
            SELECT 字段列表 FROM 表1,表2… WHERE 条件;
            -- 显示内连接
            SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;

            image.gif

            外连接查询:相当于查询两个表交集数据并且包括该表的所有数据

            -- 左外连接
            SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
            -- 右外连接
            SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;

            image.gif

                   在这个方法中两个表所写的位置是不变的,使用leftright来表示左边表全查询还是右表全查询

            例如前面的员工-部门表:

            我们查询是需要查出所有员工及其对应的部门,可能存在一些新员工还没有加入部门。如果使用内连接查询将查不到没加入部门的员工,这时候就使用外连接查询,并且使用左连接(员工表在左)。

            我们查询是需要查出所有部门及其对应的员工,可能存在一些新部门还没有员工。如果使用内连接查询将查不到新的部门,这时候就也使用外连接查询,并且使用右连接(部门表在右)。

            3.子查询

            查询中嵌套查询,称嵌套查询为子查询。

            例:查询工资高于张三的员工信息。

            来实现这个需求,我们就可以通过二步实现,第一步:先查询出来张三的工资,第二步:查询工资高于张三的员工信息;

            select * from emp where salary > (select salary from emp where name = '张三');

            image.gif

            子查询根据查询结果不同:

                   a.子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断。

                   b.子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断。

            例:查询'财务部' 和 '市场部' 所有的员工信息。

            -- 查询 '财务部' 或者 '市场部' 所有的员工的部门did
            select did from dept where dname = '财务部' or dname = '市场部';
            select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');

            image.gif

                   c.子查询语句结果是多行多列,子查询语句作为虚拟表

            例:查询入职日期是 '2011-11-11' 之后的员工信息和部门信息。

            -- 查询入职日期是 '2011-11-11' 之后的员工信息
            select * from emp where join_date > '2011-11-11' ;
            -- 将上面语句的结果作为虚拟表和dept表进行内连接查询
            select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;

            image.gif


            ad960baf951744798455c53cf821383b.gif

            ☕物有本末,事有终始,知所先后。🍭

            相关实践学习
            基于CentOS快速搭建LAMP环境
            本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
            全面了解阿里云能为你做什么
            阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
            相关文章
            |
            1月前
            |
            存储 关系型数据库 MySQL
            【MySQL】6. 表的约束
            【MySQL】6. 表的约束
            19 0
            |
            4月前
            |
            关系型数据库 MySQL 数据库
            MySQL数据库——约束
            MySQL数据库——约束
            |
            2月前
            |
            SQL 关系型数据库 MySQL
            【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
            【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
            33 0
            |
            4月前
            |
            关系型数据库 MySQL 数据库
            深入理解MySQL:从基础到高级数据库管理
            深入理解MySQL:从基础到高级数据库管理
            113 0
            |
            1月前
            |
            SQL 关系型数据库 MySQL
            轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
            轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)
            |
            1月前
            |
            存储 关系型数据库 MySQL
            MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
            MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
            |
            3天前
            |
            SQL 关系型数据库 MySQL
            MySQL数据库的约束+进阶版新增与查询-2
            MySQL数据库的约束+进阶版新增与查询
            12 1
            |
            3天前
            |
            关系型数据库 MySQL 测试技术
            MySQL数据库的约束+进阶版新增与查询-1
            MySQL数据库的约束+进阶版新增与查询
            13 1
            |
            13天前
            |
            关系型数据库 MySQL 数据库
            【MySQL】:约束全解析
            【MySQL】:约束全解析
            24 0
            |
            14天前
            |
            NoSQL 关系型数据库 MySQL
            【MySQL探索之旅】MySQL数据表的增删查改——约束
            【MySQL探索之旅】MySQL数据表的增删查改——约束