当前位置: 首页 > news >正文

【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 时,两个查询的列数和数据类型必须相匹配。

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

相关文章:

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

数据库约束 约束类型 数据库的约束类型主要包括以下几种: 主键约束(Primary Key Constraint):确保表中的每一行都有唯一的标识,且不能为NULL。 外键约束(Foreign Key Constraint)&#xff1a…...

bug积累

1.只写 int p[len1 len2]; 时,实际上是在使用 C99 标准中引入的变长数组(VLA, Variable Length Array)的特性。变长数组允许在栈上分配其大小在运行时确定的数组。这意味着 len1 和 len2 的值可以在程序运行时确定,但仍然可以用来…...

版本控制案例:全球虚拟制片领导者Dimension借助Perforce Helix Core简化多供应商协作,控制访问权限,确保数据资产安全(下)

创建虚拟世界和人物角色需要一系列的软件工具。但最终愿景很少是由单一工作室独立完成的。对于大型项目,工作室需要通力合作,将全球的团队成员和数字资产联合起来。 Dimension Studio——体积内容捕捉和虚拟制片领域的领导者——不断将新技术和新方法融…...

Anaconda配置envs和pcks路径

问题 原先Anaconda安装在C盘,安装很多包后只剩几个G了,为了给C盘腾空间,卸载后重新安装在了D盘,但是创建了新环境后发现环境位置依旧在C盘,安装新的包仍然会占用C盘空间。 解决办法 查看conda的配置信息 执行如下命…...

推荐10个在线搭建框架平台

前言 在开发项目的时候,首先就是要搭建一个框架。这个框架可以是纯技术框架,也可以具备一定功能的开源框架。但是在搭建框架的时候,版本的冲突,环境的配置等是新手们一直头痛的问题,在构建开源框架的时候,…...

Linux Shell--函数

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、简介 Shell 函数是一段可以重复使用的代码块,通过定义函数可以避免代码重复,提高脚本的可读性和可维护性。 二、定义函数…...

漏洞复现-CVE-2023-42442:JumpServer未授权访问漏洞

概述 JumpServer存在一个未授权访问漏洞。具体来说,/api/v1/terminal/sessions/ API端点的权限控制存在逻辑错误,允许攻击者匿名访问。未经身份验证的远程攻击者可以利用此漏洞下载SSH日志,并可能借此远程窃取敏感信息。值得注意的是&#x…...

【数据结构之带头双向循环链表的实现】

1.链表的分类 链表的结构有多种多样,以下情况组合起来就有8种(2x2x2)链表结构: 虽然有这么多的链表结构,但是我们实际中最常用的还是两种结构:单链表和双向带头循环链表。 无头单向非循环链表:结…...

【docker】docker数据卷与网络部署服务

Docker 网络模式 选择网络模式 Host Mode (主机模式) 特点: 容器与宿主机共享网络命名空间操作: docker run --nethost ... Container Mode (容器模式) 特点: 容器与指定容器共享网络命名空间操作: docker run --netcontainer:<container-id-or-name> ... None Mode (无…...

Spring MVC框架学习笔记

学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录 1.概述 Java EE三层架构 Spring MVC在三层架构中的位置 ​编辑 Spring MVC在表现层的作用 Spring MVC的特点 2.Spring MVC入门程序 代码实现 Spring MVC工作原理 Spring …...

LeetCode 100道题目和答案(面试必备)(一)

1.两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…...

OpenGL投影矩阵

OpenGL Projection Matrix OpenGL投影矩阵...

Linux中的`make`与`Makefile`:项目自动化构建工具

Linux中的make与Makefile&#xff1a;项目自动化构建工具 在Linux及类Unix系统中&#xff0c;make是一种广泛使用的自动化构建工具&#xff0c;它通过读取和执行Makefile&#xff08;或makefile&#xff0c;文件名不区分大小写&#xff09;中的指令来自动化编译和构建程序。Ma…...

GitHub开源项目精选:轻量级预约/预订日历组件,用React和TypeScript构建

在日常开发中&#xff0c;我们经常需要在项目中添加预约或预订功能。今天给大家推荐一个超级轻量级的预约/预订日历组件&#xff0c;它是用React和TypeScript构建的&#xff0c;非常适合那些需要简单易用的日历解决方案的开发者。 安装方法&#xff1a; 你可以选择使用npm或者y…...

闲钱放在哪里?收益稳定且又高!

家庭理财&#xff0c;最大的问题就是&#xff0c;手里这点闲钱&#xff0c;说多不多&#xff0c;但打理起来&#xff0c;还真的很”挠头“。 放银行&#xff0c;存款利率接二连三下调&#xff0c;利息又又又要变少了&#xff01; 投资出去&#xff0c;看着到处的雷声隆隆&…...

【Linux】简易线程池项目

线程池是一个可以巩固一些线程相关接口 && 加强理解的一个小项目。 注意&#xff1a;这里的线程池使用的线程并不是Linux原生接口&#xff0c;而是经过封装的&#xff0c;具体请看线程封装&#xff0c;为什么不使用原生接口&#xff1f; 因为原生接口一旦进行pthread…...

基于vue框架的NBA球星管理系统1878g(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,球员,球员数据,榜单类型,联盟榜单,重要比赛回放,精彩时刻视频,视频专栏,本赛季赛程,十佳球,投票信息,投票结果 开题报告内容 基于Vue框架的NBA球星管理系统 开题报告 一、选题背景 随着互联网的普及和体育产业的蓬勃发展&#x…...

【docker】Dockerfile练习

1、overlay文件系统原理测试 cd /mnt mkdir A B C worker merged echo "From A">./A/a.txt echo "From A">./A/b.txt echo "From A">./A/c.txt echo "From B">./B/a.txt echo "From B">./B/d.txt echo &quo…...

数据可视化的魔法:Python Matplotlib库的奇妙之旅

标题&#xff1a;数据可视化的魔法&#xff1a;Python Matplotlib库的奇妙之旅 在数据科学和分析领域&#xff0c;数据可视化是一种将复杂数据转换为图形表示的强有力工具&#xff0c;它可以帮助我们更直观地理解数据。Python中的Matplotlib库是进行数据可视化的瑞士军刀&…...

Python数据科学的秘密武器:Pandas库的深度解析

标题&#xff1a;Python数据科学的秘密武器&#xff1a;Pandas库的深度解析 Python作为数据科学领域的宠儿&#xff0c;其强大的数据处理能力离不开Pandas库的加持。Pandas是一个开源的数据分析和操作库&#xff0c;它提供了快速、灵活和表达力强的数据结构&#xff0c;旨在使…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...