MySQL高级—约束与关系

news2024/11/15 3:43:34

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


目录

一、约束

1.约束的基本概念

2.分类

二、关系

1.一对多

2.多对多

3.一对一

三、多表查询

1.多查

2.连接查询

3.子查询


一、约束

1.约束的基本概念

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

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

2.分类

  • 非空约束: 关键字是 NOT NULL

    保证列中所有的数据不能有null值。

用法:

-- 创建表时添加非空约束
CREATE TABLE 表名(
   列名 数据类型 NOT NULL,
   …
); 
-- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
-- 删除约束
ALTER TABLE 表名 MODIFY 字段名 数据类型;
  • 唯一约束:关键字是 UNIQUE

    保证列中所有数据各不相同。

-- 创建表时添加唯一约束,两种方法
CREATE TABLE 表名(
   列名 数据类型 UNIQUE [AUTO_INCREMENT],-- AUTO_INCREMENT: 值自动增长
   …
); 
CREATE TABLE 表名(
   列名 数据类型,
   …
   [CONSTRAINT] [约束名称] UNIQUE(列名)
); 
-- 建完表后添加唯一约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
-- 删除约束
ALTER TABLE 表名 DROP INDEX 字段名;
  • 主键约束: 关键字是 PRIMARY KEY

    主键是一行数据的唯一标识,非空且唯一。一个表只能有一个主键来唯一标识数据。例如:id作为主键,来标识每条数据。

-- 创建表时添加主键约束
CREATE TABLE 表名(
   列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
   …
); 
CREATE TABLE 表名(
   列名 数据类型,
   [CONSTRAINT] [约束名称] PRIMARY KEY(列名)
); 
-- 建完表后添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
-- 删除约束
ALTER TABLE 表名 DROP PRIMARY KEY;
  • 检查约束: 关键字是 CHECK

    保证列中的值满足某条件。【MySQL不支持

    例如:我们可以给age列添加一个范围,1-200,这样增加的数据才更合理。

  • 默认约束: 关键字是 DEFAULT

    给表里加数据时,没有指定值则采用默认值。

    例如:我们在给成绩列添加约束默认值是0,这样在添加数据时没有指定具体值时就会采用默认给定的0。

-- 创建表时添加默认约束
CREATE TABLE 表名(
   列名 数据类型 DEFAULT 默认值,
   …
); 
-- 建完表后添加默认约束
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
-- 删除约束
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
  • 外键约束: 关键字是 FOREIGN KEY

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

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

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

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

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

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

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

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

二、关系

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

1.一对多

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

2.多对多

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

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 条件;

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

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

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

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

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

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

3.子查询

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

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

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

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

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

        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 = '市场部');

        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;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PID控制算法详解

1. 前言 PID 即 Proportional&#xff08;比例&#xff09;&#xff0c;Integral&#xff08;积分&#xff09;&#xff0c;Differential&#xff08;微分&#xff09;的英文缩写。顾名思义&#xff0c;PID 控制算法是结合比例&#xff0c;积分和微分三种环节于一体的自动控制…

cs231n计算机视觉课程-(数据驱动方法)

姿态、环境、遮挡这些问题算法都因该是robust 课程中提到具体写一个识别猫咪的算法是不稳定的&#xff0c;容易出错的。 所以提出了Data-Driven Approach的方法 一个是训练函数&#xff0c; 这函数接受图片和标签&#xff0c;然后输出标签 另一个则是预测函数&#xff0c;输…

团队管理的七个要点

要掌握团队管理的要点和做好团队管理工作&#xff0c;不是一件容易的事&#xff0c;但也远非想象中那么难。首先&#xff0c;我个人比较推荐所有团队管理者都能阅读下《经理人参阅&#xff1a;团队管理》&#xff08;注意该书仅可其官网获得&#xff09;这本佳作。相信会为你带…

vue ssr的hydration问题

我的网站百家饭OpenAPI平台是vuepress写的&#xff0c;前段时间我还写了个专栏讲了vuepress2.0教学。 最开始我们的网站是类似公司网站的情况&#xff0c;以介绍为主&#xff0c;后来又加了一个openapi编辑器&#xff0c;编辑器主要在一个页面里面&#xff0c;vuepress还勉强可…

【Springboot系列】Springboot接管所有Controller,magic-api源码阅读

系列文章地址&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 最近在项目中使用了一个第三方的包 magic-api&#xff0c;节省了很多的时间&#xff0c;整体来说就是只用写sql就好了&#xff0c;不用写service&#xff0c;controller那些&#xff0c;全…

Flink从入门到精通系列(二)

3、Flink 部署 Flink 是一个非常灵活的处理框架&#xff0c;它支持多种不同的部署场景&#xff0c;还可以和不同的资源管 理平台方便地集成。 3.1、快速启动一个 Flink 集群 3.1.1、环境配置 Flink 是一个分布式的流处理框架&#xff0c;所以实际应用一般都需要搭建集群环境…

IO与NIO区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。 二、NIO和IO的主要区别 下表总结了Java I…

GM8773C 是一款 1:2 DSI 桥接芯片,可实现 4 路进 8 路出转换器功能、视频分离器功能。

GM8773C 是一款 1&#xff1a;2 DSI 桥接芯片&#xff0c;可实现 4 路进 8 路出转换器功能、视频分离器功能。芯片内集成了一个 4 路单一链路的 MIPI DSI 接收器和 8 路双链路 MIPI DSI 发送器。 接 收 器 每 路 可 以 支 持 到 2.0Gbps/lane &#xff0c; 可 以 最 高 支 持 到…

平面设计软件Corel CDR2023又开始放大招啦,CorelDRAW Graphics Suite 2023有哪些新增功能?

CorelDRAW 2023中文版即将于2023年3月14日&#xff0c;在苏州举行线上直播的2023新品发布会&#xff0c;本次发布会主题为“设计新生力&#xff0c;矢量新未来”。 发布会邀请思杰马克丁公司领导、Corel 中国区总经理分享思杰与 Corel 的合作模式及在 CorelDRAW 产品上推动历程…

JavaEE简单示例——Bean管理

简单介绍&#xff1a; 在这一章节我们会比较详细的介绍我们在之前的测试类中以及Bean管理XML配置文件中所使用到的类和方法&#xff0c;以及XML中配置的属性所代表的详细含义。以及之前我们反复提到但是一直没有详细的讲解的一个东西&#xff1a;容器。我们可以大致的有一个概…

react+antdpro+ts实现企业级项目四:注册页面实现及useEmotionCss的介绍

创建文件路径并注册register路由 在pages/User下创建Register文件夹并创建index.tsx文件 然后在config/routes创建register注册路由。注册完后&#xff0c;当在登陆页面点击注册按钮时就可以跳转到此注册页面而不会报404了。 export default [{path: /user,layout: false,rou…

PaddleOCR关键信息抽取(KIE)的训练(SER训练和RE训练)错误汇总

1.SER训练报错: SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception 1.1.问题描述 在执行训练任务的时候报错 单卡训练 python3 tools/train.py -c train_data/my_data/ser_vi_layoutxlm_xfund_zh.yml错误信息如下&#xff1a; T…

初识C++需要了解的一些东西(1)

目录&#x1f947;命名空间&#x1f3c5;存在原因&#x1f3f5;命名空间定义&#x1f3a7;命名空间的3种使用方式&#x1f3c6;C输入和输出&#x1f31d;缺省参数&#x1f31c;缺省参数概念⭐️缺省参数分类☀️函数重载&#x1f525;引用&#x1f31a;引用概念&#x1f313;引…

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…

记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 网站效果演示&#xff1a;ashuai.work:8888/#/myLoad GitHub仓库地址代码&#xff1a;github.com/shuirongshu… 加载中思路分析 实现加载中效果&#xff0c;一般有两种方式: 第一种是&#xff1a;搞一…

双馈风力发电机-900V直流混合储能并网系统MATLAB仿真

MATLAB2016b主体模型&#xff1a;双馈感应风机模块、采用真实风速数据。混合储能模块、逆变器模块、转子过电流保护模块、整流器控制模块、逆变器控制模块。直流母线电压&#xff1a;有功、无功输出&#xff08;此处忘记乘负一信号输出&#xff09;&#xff0c;所以是负的。蓄电…

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出&#xff0c;他们因在模型检查领域的贡献而获得了2007年的…

无监督循环一致生成式对抗网络:PAN-Sharpening

Unsupervised Cycle-Consistent Generative Adversarial Networks for Pan Sharpening &#xff08;基于无监督循环一致生成式对抗网络的全色锐化&#xff09; 基于深度学习的全色锐化近年来受到了广泛的关注。现有方法大多属于监督学习框架&#xff0c;即对多光谱&#xff0…

【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建

【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建项目的逐步细分配置git环境创建项目后端前后端不分离写法-url访问路径解析资源安装vuevue文件后端解析数据发送到前端页面解析出来项目的逐步细分 匹配界面&#xff1a;需要用微服务实况直播&#xff1…

Lesson 9.1 集成学习的三大关键领域、Bagging 方法的基本思想和 RandomForestRegressor 的实现

文章目录一、 集成学习的三大关键领域二、Bagging 方法的基本思想三、RandomForestRegressor 的实现在开始学习之前&#xff0c;先导入我们需要的库&#xff0c;并查看库的版本。 import numpy as np import pandas as pd import sklearn import matplotlib as mlp import sea…