Mysql——约束与多表查询
一、约束
1.1定义
约束是对表中的数据进行限制的一套规则,用于防止用户向数据库中输入无效数据。它可以保证表中的数据满足特定业务规则和逻辑,从而维护数据的准确性和可靠性。
1.2作用
-
数据完整性 :约束可以确保数据在插入、更新或删除时符合预定义的规则,从而避免数据不一致和错误。
-
数据质量 :通过约束,可以强制执行数据的格式、范围和相关性等要求,从而提高数据的质量。
-
优化查询 :约束可以提供有关数据结构和关系的信息,有助于优化数据库查询的性能,使数据库管理系统能够更有效地执行查询操作。
1.3常见的约束及其作用
| 约束 | 描述 | 关键字 |
| 非空约束 | 限制该字段的数据不能为null | NOT NULL |
| 唯一约束 | 保证该字段数据都是唯一的、不重复的 | UNIQUE |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
| 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
| 检查约束 | 保证字段值满足一个条件 | CHECK |
| 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
非空约束
CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(50) NOT NULL, -- 非空约束price DECIMAL(10, 2) NOT NULL, -- 非空约束description TEXT
);
唯一约束
CREATE TABLE users (user_id INT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE, -- 唯一约束email VARCHAR(100) UNIQUE -- 唯一约束
);
主键约束
CREATE TABLE employees (employee_id INT PRIMARY KEY, -- 主键约束name VARCHAR(50) NOT NULL,position VARCHAR(50),salary DECIMAL(10, 2)
);
默认约束
CREATE TABLE blog_posts (post_id INT PRIMARY KEY,title VARCHAR(100) NOT NULL,content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值约束
);
如果没有指定created_at,将自动使用当前时间戳。
检查约束
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT NOT NULL,order_date DATE NOT NULL,status VARCHAR(20) CHECK (status IN ('Processing', 'Shipped', 'Delivered')) -- 检查约束
);
外键约束
CREATE TABLE departments (department_id INT PRIMARY KEY, -- 主键department_name VARCHAR(50) NOT NULL
);CREATE TABLE employees (employee_id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,department_id INT,FOREIGN KEY (department_id) REFERENCES departments(department_id) -- 外键约束
);
添加外键
create table 表明{字段名 数据类型,...[constraint] [外键名称] foreign key [外键字段名] references 主表(主表列名)};
alter table 表名 add constraint 外键名称 foreign key [外键字段名] references 主表(主表列名);
删除外键
alter table 表名 drop foreign key 外键名称;
外键行为
| 行为 | 说明 |
| NO ACTION | 当在父表中删除或者更新对应记录时,若有外键则不允许删除或更新 |
| RESTRICT | 当在父表中删除或者更新对应记录时,若有外键则不允许删除或更新 |
| CASCADE | 当在父表中删除或者更新对应记录时,若有外键则删除或更新外键在子表中的记录 |
| SET NULL | 当在父表中删除对应记录时,若有外键则设置子表中该外键值为null(要求可以取null) |
| SET DEFAULT | 父表变更时,子表将外键列设置为一个默认的值 |
二、多表查询
2.1什么是多表查询
多表查询是指在同一个SQL语句中,从两个或多个表中检索数据。在数据库设计中,数据通常被存储在不同的表中,以避免数据冗余并提高数据完整性。通过多表查询,可以将这些表中的相关数据组合起来,以获取有意义的结果。
2.2单表查询与多表查询的区别
-
单表查询:只涉及一个表的数据,通过WHERE子句过滤条件来查找数据。
-
多表查询:涉及两个或多个表的数据,需要使用联接(JOIN)操作来指定表之间的关系,并通过WHERE子句过滤条件来查找数据。
2.3连接类型
1. 内联接(INNER JOIN)
内联接是默认的联接类型,它返回两个表中满足连接条件的记录。
- 隐式内联接:
select 字段列表 from 表1,表2 where 条件...;
- 显示内联接 :
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
2. 外联接(OUTER JOIN)
外联接可以分为以下三种类型:
-
左外联接(LEFT OUTER JOIN):返回左表中的所有记录,以及右表中满足条件的记录。如果右表中没有匹配的记录,则返回NULL。
select 字段列表 from 表1 left [outer] join 表二 on 条件...; -
右外联接(RIGHT OUTER JOIN):返回右表中的所有记录,以及左表中满足条件的记录。如果左表中没有匹配的记录,则返回NULL。
select 字段列表 from 表1 right [outer] join 表二 on 条件...; -
全外联接(FULL OUTER JOIN):返回两个表中的所有记录,如果另一个表中没有匹配的记录,则返回NULL。
3. 交叉联接(CROSS JOIN)
交叉联接返回两个表的笛卡尔积,即所有可能的组合。
4. 自联接(SELF JOIN)
自联接是指将一个表与其自身进行联接。通常用于层次结构数据,例如员工表中的上下级关系,必须使用别名。
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;
5.联接运算符
在SQL中,可以使用以下运算符来指定联接类型:
-
=:用于等值联接。 -
<、>、<=、>=、<>等用于不等值联接。
2.4实例
这里假设有三张表,一张订单表Orders,一张产品表Products,一张客户表Customers。
等值内联接
查询所有订单及其对应的产品信息:
SELECT Orders.OrderID, Orders.CustomerName, Products.ProductName
FROM Orders
INNER JOIN Products ON Orders.ProductID = Products.ProductID;
左外联接
查询所有客户及其订单信息,即使某些客户没有下过订单:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
全外联接
查询所有客户和所有订单,无论是客户是否有订单,还是订单是否有客户:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
三、子查询
3.1什么是子查询
子查询是指嵌套在另一个SQL语句中的查询。它通常出现在SELECT、FROM、WHERE等子句中,主要用于为外部查询提供数据或条件。
3.2子查询的功能
-
条件过滤:在外查询的WHERE子句中使用子查询,根据子查询返回的结果来过滤外部查询的数据。
-
数据集:在
FROM子句中使用子查询,将子查询的结果作为一个临时表来使用。 -
赋值:在SET和WHERE子句中使用子查询,将子查询的结果赋给变量或用于更新条件。
3.3子查询语法
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (SELECT column_name FROM table_name WHERE condition);
3.4子查询类型
-
单行子查询:子查询返回单个值。
-
多行子查询:子查询返回多个值,通常与IN、ANY、ALL等一起使用。
3.5示例
条件过滤
找到价格高于产品A的所有产品:
SELECT ProductName, Price
FROM Products
WHERE Price > (SELECT Price FROM Products WHERE ProductName = '产品A');
临时表
展示某个月份的销售数据:
SELECT s1.ProductID, s1.TotalSales
FROM (SELECT ProductID, SUM(SalesAmount) AS TotalSales FROM Sales WHERE MONTH(SaleDate) = 10 GROUP BY ProductID
) s1
WHERE s1.TotalSales > 1000;
赋值
根据子查询结果更新员工的津贴:
UPDATE Employees
SET Bonus = (SELECT AVG(PerformanceScore) FROM Department WHERE DepartmentID = Employees.DepartmentID
)
WHERE EmployeeID = 1001;
相关文章:
Mysql——约束与多表查询
一、约束 1.1定义 约束是对表中的数据进行限制的一套规则,用于防止用户向数据库中输入无效数据。它可以保证表中的数据满足特定业务规则和逻辑,从而维护数据的准确性和可靠性。 1.2作用 数据完整性 :约束可以确保数据在插入、更新或删除时符…...
DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順
DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ内でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…...
Unity 运用正则表达式保留字符串中的中文英文字母和数字
正则表达 正则表达式 – 语法 | 菜鸟教程 Regex 类 (System.Text.RegularExpressions) | Microsoft Learn 保留字符串中的中英数 中英数的正则表达。 patten "[\u4e00-\u9fa5A-Za-z0-9]"; 使用Regex 类匹配正则并保留。 matches Regex.Matches(str, patten)…...
vue el-table-column 单元表格的 省略号 实现
要对 el-table-column 的某一列中的每个单元格值进行处理,使其在文本内容超出指定宽度时显示省略号(…),可以通过以下方法实现: 使用 scoped slots:利用 Element UI 提供的 scoped slots 自定义单元格内容…...
企业微信里可以使用的企业内刊制作工具,FLBOOK
如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...
【数据挖掘】Pandas
Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一,提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用,帮助构建高效的数据挖掘流程。 📌 1. 读取数据 P…...
explore与explode词源故事
英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢?…...
CAM350_安装
版本:V14.5 一、安装 打开.exe文件 选择不重启,然后再打开这个.exe 再来一次类似的操作 二、配置 复制patch文件夹中的这三个 ,粘贴到掉安装目录中 设置ACT_INC_LICENSE_FILE用户环境变量来设置license管理 打开电脑的环境变量 破解完毕&am…...
51c自动驾驶~合集22
我自己的原文哦~ https://blog.51cto.com/whaosoft/11870502 #自动驾驶数据闭环最前沿论文 近几年,自动驾驶技术的发展日新月异。从ECCV 2020的NeRF问世再到SIGGRAPH 2023的3DGS,三维重建走上了快速发展的道路!再到自动驾驶端到端技术的…...
games101 作业5
题目 光线追踪的核心算法: 1.光线的生成 2.光线与三角的相交 题解 1.光线的生成 如课件中的图所示: image plane 就是 代码中的scene的FrameBuffer。 但是,FrameBuffer 是窗口坐标系中,而光线是世界坐标系中的。所以我们需要将scene中的屏…...
【高并发秒杀系统设计:从Guava到Redis的6级缓存架构演进】
一、瞬时十万QPS场景分析 1.1 典型秒杀场景特征 public class SpikeScenario {// 特征1:瞬时流量突增private static final int QPS 100000; // 正常流量100倍// 特征2:资源竞争激烈private int stock 1000; // 100万人抢1000件商品// 特征3&#…...
2-程序语言基础知识
本节内容不是很多,在考试中一般是2-3分,多看教材,考试中大概都是原话 本节主要考点 1、编译程序和解释程序 2、程序语言的数据成分和控制成分(多看教材) 3、编译程序的过程(多看教材) 4、中缀、前缀与后缀表达式(增加) 教材P42-52,54-58多看一下 1、程序语言概述 机器…...
【AIGC系列】4:Stable Diffusion应用实践和代码分析
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
小米火龙CPU和其他几代温度太高的CPU是由谁代工的
小米火龙CPU”并非小米自研芯片,而是指搭载在小米手机上的部分高通骁龙处理器因发热问题被调侃为“火龙”。以下是几款被称为“火龙”的高通CPU及其代工情况: 骁龙810 骁龙810是高通历史上最著名的“火龙”之一,采用台积电20nm工艺代工。由于…...
在 ASP.NET Core 中压缩并减少图像的文件大小
示例代码:https://download.csdn.net/download/hefeng_aspnet/90294127 在当今的数字时代,图像是 Web 应用程序和用户体验不可或缺的一部分。但是,处理大型图像文件可能会导致网页加载缓慢和更高的存储费用。为了解决这个问题,在…...
网络流算法: Dinic算法
图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…...
【Godot4.3】自定义简易菜单栏节点ETDMenuBar
概述 Godot中的菜单创建是一个复杂的灾难性工作,往往无从下手,我也是不止一次尝试简化菜单的创建。 从自己去年的发明“简易树形数据”用于简化Tree控件获得灵感,于是尝试编写了用于表示菜单数据的EasyMenuData类,以及对应的纯文…...
如何杀死僵尸进程?没有那个进程?
在题主跑代码的时候遇到了这样一种很奇怪的问题: 可以看到显卡0没有跑任何程序但是还是被占据着大量显存,这种进程称为“僵尸进程”,并且当我想kill它的时候,出现下面这种情况: 查过各种资料,最后我的解决…...
Solana 核心概念全解析:账户、交易、合约与租约,高流量区块链技术揭秘!
目录 1.Solana 核心概念简述 1.1. 账户(Account) 1.2. 交易(Transaction) 1.3. 交易指令(Instruction) 1.4. SPL 代币 1.5. 合约(Program) 1.6. 租约(Rent&#x…...
Leetcode-853. Car Fleet [C++][Java]
目录 一、题目描述 二、解题思路 Leetcode-853. Car Fleethttps://leetcode.com/problems/car-fleet/description/ 一、题目描述 There are n cars at given miles away from the starting mile 0, traveling to reach the mile target. You are given two integer array …...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
