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 …...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...