【MySQL】详解数据库约束、聚合查询和联合查询

数据库约束

约束类型

数据库的约束类型主要包括以下几种:

  1. 主键约束(Primary Key Constraint):确保表中的每一行都有唯一的标识,且不能为NULL。

  2. 外键约束(Foreign Key Constraint):确保表中的数据与另一个表中的数据保持一致性,维护数据之间的关系。

  3. 唯一约束(Unique Constraint):确保字段中的所有值都是唯一的,不允许重复。

  4. 检查约束(Check Constraint):限制某一列中的值符合特定条件,如数值范围、字符串格式等。

  5. 非空约束(NOT NULL Constraint):确保某一列不能包含NULL值,必须有实际数据。

  6. 默认约束(Default Constraint):为字段设置默认值,在插入记录时若未提供该字段的值,则会使用默认值。

这些约束保证了数据库中的数据完整性和一致性,是设计数据库时的重要组成部分。

使用案例

主键约束(Primary Key Constraint)
主键约束用于唯一标识表中的每一行,并确保其值不为NULL。

CREATE TABLE Students (StudentID INT PRIMARY KEY,StudentName VARCHAR(20)
);

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。

StudentID INT PRIMARY KEY auto_increment,

外键约束(Foreign Key Constraint)
外键约束用于维护不同表之间的关系,确保引用的数据存在。

CREATE TABLE Courses (CourseID INT PRIMARY KEY,CourseName VARCHAR(100)
);CREATE TABLE Enrollments (EnrollmentID INT PRIMARY KEY,StudentID INT,CourseID INT,FOREIGN KEY (StudentID) REFERENCES Students(StudentID),FOREIGN KEY (CourseID) REFERENCES Courses(CourseID)
);

 唯一约束(Unique Constraint)
唯一约束确保字段值的唯一性,不能重复,但允许NULL值。

CREATE TABLE Users (UserID INT PRIMARY KEY,Email VARCHAR(100) UNIQUE
);

检查约束(Check Constraint)
检查约束用于确保字段值满足特定条件。

CREATE TABLE Products (ProductID INT PRIMARY KEY,Price DECIMAL(10, 2) CHECK (Price >= 0)
);

非空约束(NOT NULL Constraint)
非空约束确保某一列的值不能为空。

CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName VARCHAR(100) NOT NULL
);

默认约束(Default Constraint)
默认值约束在插入新记录时指定列的默认值。

CREATE TABLE Orders (OrderID INT PRIMARY KEY,OrderDate DATETIME DEFAULT CURRENT_TIMESTAMP
);

这些约束在创建和管理数据库表时非常重要,有助于维护数据的完整性和准确性。

聚合查询

聚合函数

常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有:

  1. COUNT():计算行数或非NULL值的数量。
  2. SUM():计算数值型列的总和。
  3. AVG():计算数值型列的平均值。
  4. MAX():返回指定列中的最大值。
  5. MIN():返回指定列中的最小值。
  6. GROUP_CONCAT()(某些数据库):将多行的值连接成一个字符串。
  7. VARIANCE():计算数值型列的方差。
  8. STDDEV():计算数值型列的标准差。

这些聚合函数用于对一组数据进行汇总和分析,是数据库查询的重要工具。

使用案例

COUNT()
COUNT() 函数用于计算表中的行数或特定列中非NULL值的数量。

  • 用法:
    • 计算总行数:SELECT COUNT(*) FROM 表名;
    • 计算某列非NULL值的数量:SELECT COUNT(列名) FROM 表名;

示例:

SELECT COUNT(*) FROM Employees;  -- 计算员工总数
SELECT COUNT(EmployeeID) FROM Employees;  -- 计算非NULL的员工ID数量

SUM()
SUM() 函数用于计算数值型列的总和。

  • 用法:SELECT SUM(列名) FROM 表名;

示例:

SELECT SUM(Salary) FROM Employees;  -- 计算所有员工的工资总和

AVG()
AVG() 函数用于计算数值型列的平均值。

  • 用法:SELECT AVG(列名) FROM 表名;

示例:

SELECT AVG(Salary) FROM Employees;  -- 计算所有员工的平均工资

MAX()
MAX() 函数用于返回指定列中的最大值。

  • 用法:SELECT MAX(列名) FROM 表名;

示例:

SELECT MAX(Salary) FROM Employees;  -- 找到最高的工资

MIN()
MIN() 函数用于返回指定列中的最小值。

  • 用法:SELECT MIN(列名) FROM 表名;

示例:

SELECT MIN(Salary) FROM Employees;  -- 找到最低的工资

这些聚合函数可以单独使用,也可以与 GROUP BY 子句结合使用,以对结果进行分组和汇总分析。

GROUP BY子句

SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中。

select column1, sum(column2), .. from table group by column1,column3;

HAVING 

GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用HAVING。

使用案例

下面是一个结合聚合函数、GROUP BY 和 HAVING 的使用案例。

假设我们有一个名为 Sales 的表,其中包含以下字段:

  • SalesID:销售记录的唯一标识
  • SalesAmount:销售金额
  • SalesPerson:销售人员的名称
  • SalesDate:销售日期

我们想要查询每个销售人员的总销售金额和平均销售金额,并且只返回那些总销售金额超过 10,000 的销售人员。

以下是相应的 SQL 查询示例:

SELECT SalesPerson,SUM(SalesAmount) AS TotalSales,AVG(SalesAmount) AS AverageSales
FROM Sales
GROUP BY SalesPerson
HAVING SUM(SalesAmount) > 10000;

在这个查询中:

  • GROUP BY SalesPerson 将结果按销售人员进行分组。
  • SUM(SalesAmount) 计算每个销售人员的总销售金额。
  • AVG(SalesAmount) 计算每个销售人员的平均销售金额。
  • HAVING SUM(SalesAmount) > 10000 筛选出总销售金额超过 10,000 的销售人员。

这个案例展示了如何结合聚合函数和 GROUP BY 与 HAVING 条件来分析数据。

联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积:

注意:关联查询可以对关联表使用别名。

内连接

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

外连接 

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

-- 左外连接,表1完全显示
select 字段名  from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;

自连接 

自连接是指在同一张表连接自身进行查询。

select 字段名 from 表1 as 别名 ,表1 as 别名 where 连接条件 and 其他条件;

联合查询使用案例

下面是一个关于数据库中联合查询(也称为联接查询)的案例,结合多个表进行数据检索。

假设我们有两个表:

  1. Customers 表

    • CustomerID:客户唯一标识
    • CustomerName:客户姓名
    • ContactNumber:联系方式
  2. Orders 表

    • OrderID:订单唯一标识
    • OrderDate:订单日期
    • CustomerID:关联的客户ID(外键)
    • TotalAmount:订单总金额

我们希望查询每个客户的订单信息,包括客户姓名和订单总金额。

以下是结合 INNER JOIN 的 SQL 查询示例:

SELECT Customers.CustomerName,Orders.TotalAmount
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

在这个查询中:

  • INNER JOIN 用于将 Customers 表和 Orders 表连接起来。
  • 连接条件是 ON Customers.CustomerID = Orders.CustomerID,即通过客户ID来匹配订单和客户信息。
  • 选择了 Customers.CustomerName 和 Orders.TotalAmount 来显示客户姓名和相应的订单总金额。

这个案例展示了如何在数据库中使用联合查询来获取来自多个表的相关数据。

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

1、单行子查询:返回一行记录的子查询

2、多行子查询:返回多行记录的子查询

  • [NOT] IN关键字
  • [NOT] EXISTS关键字

子查询案例

下面是一个关于数据库中子查询的案例,展示如何使用子查询来获取相关数据。

假设我们有两个表:

  1. Employees 表

    • EmployeeID:员工唯一标识
    • EmployeeName:员工姓名
    • DepartmentID:员工所在部门的ID
    • Salary:员工工资
  2. Departments 表

    • DepartmentID:部门唯一标识
    • DepartmentName:部门名称

现在,我们想要查询那些工资高于该部门平均工资的员工姓名和工资。我们可以通过子查询来实现这个目标。

以下是相应的 SQL 查询示例:

SELECT EmployeeName, Salary 
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = Employees.DepartmentID);

在这个查询中:

  • 外层查询从 Employees 表中选择 EmployeeName 和 Salary
  • 子查询 (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = Employees.DepartmentID) 计算每个部门的平均工资。
  • 外层查询的 WHERE 子句中,条件 Salary > (子查询) 用于过滤出工资高于该部门平均工资的员工。

这个案例展示了如何在数据库中使用子查询来进一步筛选和获取数据。

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。

  • union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

  • union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

合并查询案例

合并查询通常是指使用 UNION 运算符将多个 SELECT 查询的结果合并在一起。下面是一个关于数据库中合并查询的案例。

假设我们有两个表:

  1. Customers 表

    • CustomerID:客户唯一标识
    • CustomerName:客户姓名
    • ContactNumber:联系方式
  2. Suppliers 表

    • SupplierID:供应商唯一标识
    • SupplierName:供应商姓名
    • ContactNumber:联系方式

我们希望从这两个表中获取所有联系人姓名,无论是客户还是供应商。可以使用 UNION 查询来合并两个表中的联系人的姓名。

以下是相应的 SQL 查询示例:

SELECT CustomerName AS ContactName 
FROM Customers
UNION
SELECT SupplierName AS ContactName 
FROM Suppliers;

在这个查询中:

  • 第一个 SELECT 查询从 Customers 表中选取 CustomerName,并将其重命名为 ContactName
  • 第二个 SELECT 查询从 Suppliers 表中选取 SupplierName,同样将其重命名为 ContactName
  • UNION 将两个查询的结果合并在一起,自动去除重复的值。

请注意,使用 UNION 时,两个查询的列数和数据类型必须相匹配。

这个案例展示了如何在数据库中使用合并查询来获取来自多个表的相关数据。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.ADC(模拟信号转数字信号)

理论 3个ADC控制器 转换:单次转换模式、 连续转换模式 转换时间 采样时间 12.5周期 当ADCCLK(时钟) 14MHz,采样时间为1.5周期,TcoNv(转换时间) 1.5 12.5 14 周期 1us 采样精度:12位/16位(212 4096) 实际电压值 (通道采…

Java面试题--JVM大厂篇之破解 JVM 性能瓶颈:实战优化策略大全

目录 引言: 正文: 1. 常见的JVM性能问题 频繁的GC导致应用暂停 内存泄漏导致的内存不足 线程争用导致的CPU利用率过高 类加载问题导致的启动时间过长 2. 优化策略大全 2.1 代码层面的优化 2.1.1 避免不必要的对象创建 2.1.2 优化数据结构的选择 2.1.3 使用并发工具…

Python爬虫:下载4K壁纸

🎁🎁创作不易,关注作者不迷路🎀🎀 目录 🌸完整代码 🌸分析 🎁基本思路 🎁需要的库 🎁提取图片的链接和标题 👓寻找Cookie和User-Agent &…

突破•指针六

听说这是目录哦 数组和指针笔试题解析🫧一维数组1🍕🍕🍕🍕🍕🍕🍕 字符数组1🍔🍔🍔🍔🍔🍔🍔2&#…

PCL 采样一致性模型介绍

采样一致性可以简单高效的检测出一些具有数学表达式的目标模型。PCL中的sample consensus模块中不仅包含各种的采样一致性估计方法,也包含一些已经编写好的数学模型,下面主要介绍一下PCL中的采样一致性模型。 1. 二维圆模型 pcl::SampleConsensusModelCircle2D< PointT …

AI学习记录 - 自注意力机制的计算流程图

画图不易&#xff0c;如果你从这个图当中得到灵感&#xff0c;大佬赏个赞 过段时间解释一下&#xff0c;为啥这样子计算&#xff0c;研究这个自注意力花了不少时间&#xff0c;网上很多讲概念&#xff0c;但是没有具体的流程图和计算方式总结…

Win11表情符号输入详细教程,一学就会!

在Win11电脑操作中&#xff0c;用户可以根据自己的需求&#xff0c;点击输入想要的表情符合。但许多新手用户不知道怎么操作才能输入&#xff1f;这时候用户按下快捷键&#xff0c;快速打开表情符号选择界面&#xff0c;然后选择需要的表情符号点击输入即可。以下系统之家小编给…

Can GPT-3 Perform Statutory Reasoning?

文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗&#xff1f; 论文地址&#xff1a;https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务&#xff0c;法规是立法机…

Linux嵌入式学习——C++学习(2)

一、标识符的作用域和可见性 &#xff08;一&#xff09;作用域 1、全局作用域 在函数外部声明的变量和函数具有全局作用域。这些变量和函数在程序的任何地方都可以被访问。 2.局部作用域 在函数内部、循环体内部或条件语句内部声明的变量具有局部作用域。这些变量只能在其…

X射线物质质量衰减系数的查询计算方法

最近进行硕士毕业课题&#xff0c;需要各种各样物质的质量衰减系数&#xff08;线性衰减系数&#xff09;&#xff0c;包括高原子序数的金属物质还有一些复杂的化合物或者混合物&#xff0c;之前知道美国的XCOM &#xff1a;XCOM: Photon Cross Sections Database这个数据库可以…

仓颉语言运行时轻量化实践

杨勇勇 华为语言虚拟机实验室架构师&#xff0c;目前负责仓颉语言静态后端的开发工作 仓颉语言运行时轻量化实践 仓颉Native后端&#xff08;CJNative&#xff09;是仓颉语言的高性能、轻量化实现。这里的“轻量化”意指仓颉程序运行过程中占用系统资源&#xff08;内存、CPU等…

dll修复工具有没有免费的?排行榜Top8更新,一键修复所有dll缺失

DLL 错误是常见的系统问题&#xff0c;可能导致系统崩溃或 Windows 故障&#xff0c;这让每天使用电脑的人倍感烦恼。为了有效解决这些反复出现的问题&#xff0c;使用 DLL 修复工具显得尤为重要。对于喜欢尝试免费软件的用户&#xff0c;市面上有许多优秀的免费dll 修复工具可…

打开 Mac 触控板的三指拖移功能

对于支持力度触控的触控板&#xff0c;可以选择使用三指手势来拖移项目。 相应的设置名称会因你使用的 macOS 版本而有所不同&#xff1a; 选取苹果菜单  >“系统设置”&#xff08;或“系统偏好设置”&#xff09;。 点按“辅助功能”。 点按“指针控制”&#xff08;…

【vue3】【elementPlus】【国际化】

1.如需从0-1开始&#xff0c;请参考 https://blog.csdn.net/Timeguys/article/details/140995569 2.使用 vue-i18n 模块&#xff1a; npm i vue-i18n3.在 src 目录下创建 locales 目录&#xff0c;里面创建文件&#xff1a;en.js、zh-cn.js、index.js 语言js文件&#xff1a;…

html5宠物网站模板源码

文章目录 1.设计来源1.1 主界面1.2 主界面菜单1.3 关于我们界面1.4 宠物照片墙界面1.5 宠物博客界面1.6 宠物服务界面1.7 宠物团队界面1.8 联系我们界面 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 【博主推荐】&a…

【轻松掌握】使用Spring-AI轻松访问大模型本地化部署并搭建UI界面访问指南

文章目录 读前必看什么是Spring-AI目前已支持的对接模型本文使用Spring-AI版本构建项目选择必要的依赖配置系统变量 聊天模型API配置文件方式1-使用默认配置方式2-自定义配置配置其他参数使用示例 图像模型API配置文件方式1-使用默认配置方式2-自定义配置配置其他参数使用示例 …

开发效率翻倍攻略!大学生电脑小白管理秘籍,资料秒搜技巧大公开!C盘满了怎么办?如何快速安全的清理C盘?烦人的电脑问题?一键解决!

如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f; 文章目录 如何正确管理自己的第一台电脑&#xff1f;大一新生如何管理自己的电脑&#xff1f;老鸟如何追求快捷操作电脑&#xff1f;前言初级基础分区操…

2024年第八届计算生物学与生物信息学国际会议 (ICCBB 2024)即将召开!

2024 年第八届计算生物学和生物信息学国际会议&#xff08;ICCBB 2024&#xff09;将于2024年11月28 -30在日本京都召开&#xff0c;ICCBB 2024是展示理论、实验和应用计算生物学和生物信息学领域新进展和研究成果的主要论坛之一。我们相信&#xff0c;通过大家的共同努力&…

oled使用 f4软件iic 数字 汉字 小图片 HAL库

基于江科大的oled标准库进行移植 到Hal库上 本人参考了许多大佬的源码 进行更改 由于F4和F1主频不一样 由于F4主频太高 在进行软件iic时需要延时一下 才可驱动oled 本人在网上找了一个开源的us延时函数 已经添加进入 文件分享 通过百度网盘分享的文件&#xff1a;delay&#…

记一次 .NET某智慧出行系统 CPU爆高分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他们的系统出现了CPU 100%的情况&#xff0c;让你帮忙看一下怎么回事&#xff1f;dump也拿到了&#xff0c;本想着这种情况让他多抓几个&#xff0c;既然有了就拿现有的分析吧。 二&#xff1a;WinDbg 分析…