MySQL五种约束类型(普通 /自增主键,外键等) + 进阶查询(聚合查询,内 /外连接查询,自连接查询,子查询,合并查询)

文章目录

  • 前言
  • 一、五种约束
    • NOT NULL 约束
    • UNIQUE 约束
    • DEFAULT 约束
    • PRIMARY KEY 主键约束(重点)
      • 普通主键
      • 自增主键
    • FOREIGN KEY 外键约束(重点)
  • 二、进阶查询
    • 聚合查询
      • 聚合函数
      • GROUP BY子句
      • HAVING
    • 联合查询
      • 笛卡尔积
      • 内连接
      • 外连接
      • 自连接
      • 子查询
        • 单行子查询:返回一行记录的子查询
        • 多行子查询:返回多行记录的子查询
      • 合并查询
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!


一、五种约束

约束类型说明
NOT NULL指示某列不能存储 NULL 值
UNIQUE保证某列的每行必须有唯一的值
DEFAULT规定没有给列赋值时的默认值
PRIMARY KEYNOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
FOREIGN KEY保证一个表中的数据匹配另一个表中的值的参照完整性

NOT NULL 约束

  • NOT NULL 约束,在创建表时,指定某个字段不能为NULL。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段不能为NULL。

create table student (id int NOT NULL,name varchar(10),age int);

表结构
在这里插入图片描述
插入示例
在这里插入图片描述


UNIQUE 约束

  • UNIQUE 约束,在创建表时,指定某个字段数据是唯一的,不能重复。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段是唯一的,不能重复。

create table student (id int UNIQUE,name varchar(10),age int);

表结构
在这里插入图片描述

插入示例
在这里插入图片描述


DEFAULT 约束

  • DEFAULT 约束,在创建表时,设置某个字段插入数据时为空的默认值。
    (默认值是insert语句指定字段插入时,其他未被指定到的字段就是按照默认值来填充)

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定name字段为空时,给定一个 “无名氏” 默认值。

create table student(id int,name varchar(10) DEFAULT "无名氏",age int);

表结构
在这里插入图片描述

插入示例
在这里插入图片描述


PRIMARY KEY 主键约束(重点)

普通主键

每个表中只能有一个主键

  • PRIMARY KEY 主键约束,在创建表时,指定 某个字段或几个字段综合起来 插入数据不能为NULL,不能重复。

主键类似于NOT NULL + UNIQUE;此时这个主键就等同于这条数据独一无二的身份标识。
独一无二的身份标识,就类似于咱们的身份证号码,即使重名,出生日期也是同一天,依旧可以凭借身份证号码,找到那个独一无二的你。

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段为主键。

create table student (id int PRIMARY KEY,name varchar(10),age int);

表结构

在这里插入图片描述

插入示例
在这里插入图片描述
当然,此处MySQL只是实现了检查校验的工作,当插入数据粗心时,仍会报错。
但是对于字段类型为int的主键,MySQL贴心的提供了自增主键,来帮你解决。


自增主键

只有int类型的字段可以设置为自增主键

  • 自增主键与普通主键的区别是当你插入数据时, 自增主键的字段为NULL或没有为这个字段插入数据时 ,会 自动给定一个值:当前该列最大值+1(如该列没有数据时,默认是0)

创建一个学生表,有三个字段,id(学号),name(名字),age(年龄);指定id字段为自增主键。

create table student (id int PRIMARY KEY auto_increment,name varchar(10),age int);

表结构

在这里插入图片描述

插入示例
在这里插入图片描述


FOREIGN KEY 外键约束(重点)

  • 外键用于关联其他表的主键或唯一键。

说明
假设:每个班级有一个班级表(class),每个学生有一个学生表(student)

class表中的学号字段是主键,每个同学都有唯一不重复的学号。
student表当中的学号必须在对应的班级表中的学号字段中存在。

此时,student表当中的学号字段就可以当成外键来处理,关联的是class表中的学号字段。
如果插入数据时, 外键关联的表中的对应字段中没有匹配到相同数据,则插入失败报错 在。

class是student的父表
student是class的子表

创建一个班级表,有两个字段,class_id(班级表中的学号),name(名字);指定class_id字段为自增主键。

create table class(class_id int PRIMARY KEY auto_increment,name varchar(10));

创建一个学生表,有三个字段,student_id(学生表中的学号),name(名字),score(成绩),class_id(班级表中的学号);指定class_id字段为外键,关联class表中的class_id字段。

create table student(student_id int PRIMARY KEY auto_increment,name varchar(10),score int,class_id int,FOREIGN KEY(class_id) REFERENCES class(class_id));

表结构
class表
在这里插入图片描述

student表
在这里插入图片描述

插入示例

在这里插入图片描述
向子表插入数据时,MySQL会拿着你要插入的外键字段数据,去绑定的父表中的字段去匹配,匹配成功,才能完成后续插入,匹配失败,插入失败。

子表约束父表
以上都是父表在约束子表,但是同时,子表也在约束父表。

如果父表中被关联的字段,已经被匹配成功过,那么这个字段就不可修改删除
在这里插入图片描述

同样, 一旦父表被关联,那么只有子表被删除后,才能删除父表 (无论父表中的字段有没有被匹配成功过)。
在这里插入图片描述

因此如果在某场景下要删除父表中的某条数据,没办法直接删除,建议在建表时,添加一个字段,来标记这个字段是否被删除。


二、进阶查询

更高阶的MySQL查询语句。

聚合查询

聚合函数

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

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义

创建一个学生成绩表,有三个字段,id(学号),name(名字),score(成绩);并插入了四条数据。

在这里插入图片描述

使用示例

COUNT(*): 代表查询出来的数据的个数 。 COUNT(字段): 代表查询出来的数据中该字段不为NULL的个数
在这里插入图片描述

下面的示例中的字段必须是数字

SUM(字段): 返回所有符合条件的字段的总和 在这里插入图片描述
AVG(字段): 返回所有符合条件的字段的平均值 在这里插入图片描述

MAX(字段): 返回所有符合条件的字段中的最大值 在这里插入图片描述

MIN(字段): 返回所有符合条件的字段中的最小值 在这里插入图片描述

GROUP BY子句

  • SELECT 中使用 GROUP BY 子句可以对某个字段进行分组查询或多个字段综合起来进行分组查询。

注意!

SELECT 中使用 GROUP BY 子句对“分组依据字段”重复的数据,只显示一次。
SELECT指定查询的字段最好是GROUP BY 子句的“分组依据字段”,如果想查询其他字段最好包含在聚合函数中。

创建一个学生成绩表,有四个字段,id(学号),name(名字),course(课程名),score(成绩);并插入了五条数据。

在这里插入图片描述

如果查询字段中包含非“分组依据字段”,那么他就只会返回查询到的第一条,不会返回所有条可以理解为他针对“分组依据字段”去重了。如下 在这里插入图片描述

查询张三的总成绩 在这里插入图片描述


HAVING

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

还拿上面的student_score表举例。

查询张三哪科的成绩最高
在这里插入图片描述


联合查询

下面不同的联合查询均用以下两表为例

创建一个student表(本校学生表),有三个字段,id(学号),name(名字),age(年龄)。
创建一个score表(多校联考成绩表),有四个字段,id(学号),name(名字),course(课程名),score(成绩)。
并插入了一些数据。


此处建表一切从简,没有考虑任何实际场景,在实际应用中,要根据不同的场景需求,建立不同的表及约束。
在这里插入图片描述
在这里插入图片描述


笛卡尔积

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

对多张表的数据取笛卡尔积:就是 对多张表的字段进行拼接,将所有的数据可能组合都拼接出来 即A表中的每条数据都要和其他表的所有数据进行拼接。
在这里插入图片描述

对student表,score表取笛卡尔积,共查出72条数据
在这里插入图片描述


内连接

共有两种语法:

select 字段... from1 别名1 join2 别名2 on 连接条件 and 其他条件;
select 字段... from1 别名1,2 别名2 where 连接条件 and 其他条件;

不同表中相同名称字段的表示,格式: 表名.字段

内连接是公平的查询,不会偏袒任何一方,当两张表拼接出来的数据符合条件才会返回。

如下图,只会取两表拼接数据符合条件的部分。
在这里插入图片描述

使用内连接查询本校学生参加考试的科目成绩为例:

 select student.id,student.name,student.age,score.course,score.score from student,score where student.name = score.name;

在这里插入图片描述


外连接

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

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

左外连接: 如下图,左边表的全部都会显示,右边表只显示符合条件部分,不符合条件部分显示为:NULL
在这里插入图片描述

右外连接: 如下图,右边表的全部都会显示,左边表只显示符合条件部分,不符合条件部分显示为:NULL
在这里插入图片描述

左外连接查询本校学生的所有科目成绩

select student.id,student.name,student.age,score.course,score.score from student left join score on student.name = score.name;

孙七和周八没参加任何考试,但是也显示出来了。
在这里插入图片描述

右外连接查询联考所有科目成绩的本校学生信息

select student.id,student.name,student.age,score.course,score.score from student right join score on student.name = score.name;

有四门科目的考生不是本校学生,也显示出来了。
在这里插入图片描述


自连接

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

找到英语I的成绩比高等数学I的成绩高的同学。

select s1.id,s1.name,s1.course,s1.score,s2.course,s2.score from score as s1,score as s2 where s1.name = s2.name and s1.course = "英语I" and s2.course = "高等数学I" and s1.score > s2.score;

在这里插入图片描述


子查询


子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
子查询就是把()中select语句返回的信息当作条件使用。


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


查询本校学生张三的各科成绩。
子查询,把()中select语句返回的信息当作条件使用。

select * from score where id = (select id from student where name = "张三");

此时()中的select语句至多有一条结果,超过一条会报错。
在这里插入图片描述


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

使用 IN关键字,就可以 在多条信息中进行检索

使用 NOT IN关键字,就可以 排除这多条信息

查询本校学生单科成绩大于等于80的学生信息。

select * from student where id in (select id from score where score >= 80);

在这里插入图片描述


查询本校学生单科成绩小于80的学生信息。

select * from student where id not in (select id from score where score >= 80);

在这里插入图片描述


合并查询


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


查询联考中单科成绩小于80,与参加高等数学I科目的同学信息。

select id,name from score where score <= 80 
union
select id,name from score where course = "高等数学I";

union关键字自动进行去重
在这里插入图片描述

select id,name from score where score <= 80 
union all
select id,name from score where course = "高等数学I";

union all 关键字不进行去重
在这里插入图片描述


总结

以上就是今天要讲的内容,本篇文章还是比较繁重的,希望大家可以静下心来认真阅读。本篇文章所建的表都是没有适配任何应用场景的,只是为了体现要讲的知识点,实际场景建表时要考虑许多因素。

路漫漫不止修身,也养性。

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

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

相关文章

乔云监控tf卡格式化后数据恢复方法

您有没有使用过乔云牌监控设备呢&#xff1f;它通常里面会放置一个TF卡以存储录像&#xff0c;而TF卡长期高温高速运行&#xff0c;容易产生碎片&#xff0c;因此很多商家会建议大家一个月进行一次格式化。但是格式化后您有没有后悔过呢&#xff1f;在这个篇文章中&#xff0c;…

【Python】类型注解 ③ ( 使用 # type: 类型 注释方式设置类型注解 | 类型注解是提示性而非强制性 )

文章目录 一、使用 注释语法 设置 类型注解1、使用 注释语法 设置 类型注解语法介绍2、为 基础类型变量 设置 " 类型注解 "3、为 类 的 对象类型 设置 " 类型注解 "4、为 基础容器类型变量 设置 简易 " 类型注解 "5、为 基础容器类型变量 设置 详…

基于深度学习的高精度工人安全帽检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度工人安全帽检测识别系统可用于日常生活中或野外来检测与定位工人安全帽目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的工人安全帽目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用…

Windows与Linux取证分析

目录 一、电子数据取证基本概念 1.电子取证学 2.常规取证 3.洛卡德物质交换原理 4.电子数据范围 5.电子数据取证的概念和目的 6.电子数据取证过程 二、Linux系统取证 1.基本信息获取 &#xff08;1&#xff09;获取系统基础信息 &#xff08;2&#xff09;用户/用户…

共筑开源新长城 龙蜥社区走进开放原子校源行-清华大学站

6 月 28 日&#xff0c;以“聚缘于校&#xff0c;开源共行”为主题的 2023 年开放原子校源行活动在清华大学成功举行。本次活动由开放原子开源基金会和清华大学共同主办&#xff0c;来自各行业的 22 位大咖共聚校园共话开源。龙蜥社区技术专家边子政受邀进行技术分享&#xff0…

UWB天线设计之一种优化扁平超宽带单极的新方法

文章亮点 一种新颖的方法提出了扁平超宽带单极天线。 通过应用收缩,可以设计具有相同性能的更小的天线作为平面单极天线。 优化结果表明该方法能够设计非常小的天线。 在这项研究中,提出了一种优化扁平超宽带单极天线的新方法。在该方法中,一般性地描述了天线的形状。这种一…

LeetCode141.环形链表

141.环形链表 目录 141.环形链表一、哈希表二、双指针 一、哈希表 最容易想到的方法就是遍历所有节点&#xff0c;每次遍历到一个节点的时候&#xff0c;判断该节点此前是否被访问过 我们可以使用哈希表来存储所有已经访问过的节点 每次到达一个节点&#xff0c;如果该节点已…

Web3时代来临:你准备好了吗?

如果你正在浏览本文&#xff0c;那么很可能你已经是Web3时代的一部分了&#xff0c;或者至少是将要成为其中的一员。因为Web3时代即将来临&#xff0c;它将彻底改变我们对互联网的认识和使用方式。 那么&#xff0c;什么是Web3时代呢&#xff1f;简单来说&#xff0c;它是指基于…

JPA实现多对多关系

本文已收录于专栏 《Java》 目录 概念说明优势利弊实现方式通过两个ManyToMany注解实现类图代码 通过OneToMany和ManyToOne注解实现类图代码 少走弯路总结提升 概念说明 多对多关系是指两个实体之间存在多对多的关联关系。在数据库中&#xff0c;多对多关系无法直接表示&#x…

【树链+EXGCD】杭电多校第一场 A

1001 Hide-And-Seek Game (hdu.edu.cn) 题意&#xff1a; 给定一棵树和两条路径&#xff0c;每条路径都有起点和终点&#xff0c;起始时起点有人&#xff0c;每隔一秒都会往终点走一步&#xff0c;会从起点走向终点再会起点这样不断地周期性地走&#xff0c;让你求一点&#…

UDP-组播,广播

转自&#xff1a;https://www.cnblogs.com/wangzhilei-src/p/15314315.html UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把数据报发给对方。UDP无需建立类如三次握手的连接&#xff0c;使得通信效率很高。因此UDP适用于一次传输数据量很少、对可…

STM32 HAL库定时器输入捕获SlaveMode脉宽测量

STM32 HAL库定时器输入捕获SlaveMode脉宽测量 SlaveMode模式简介 ✨SlaveMode复位模式&#xff1a;在发生一个触发输入事件时&#xff0c;计数器和它的预分频器能够重新被初始化&#xff1b;同时&#xff0c;如果TIMx_CR1寄存器的URS位为低&#xff0c;还会产生一个更新事件UEV…

Android TextView 在最后一行末尾加图标

当前有个需求.显示一段文本&#xff0c;文本最多显示两行&#xff0c;点击展开后才显示完全。当没有显示完全的时候&#xff0c;需要在文本的第二行末尾显示图标&#xff0c;点击图标和文本&#xff0c;文本展开。难点在于图标需要和第二行文本显示在同一行&#xff0c;高度和文…

windows10 搭建hadoop环境,并且使用hadoop命令

hadoop 环境创建 1. 八、window搭建spark IDEA开发环境 按照步骤安装完 2. windows下安装和配置hadoop 配置环境变量&#xff0c;注意JAVA_HOME路径&#xff0c;修改后&#xff0c;重启电脑&#xff0c;不重启容易报错&#xff01;&#xff01;&#xff01; ​ 新建dat…

【量化课程】02_1.宏观经济学基础概念

2.1_宏观经济学基础概念 文章目录 2.1_宏观经济学基础概念1. 宏观经济简单背景1.1 微观经济学时期1.2 宏观经济学开端1.3 宏观经济学研究的问题1.4 宏观经济与理财的联系 2. 宏观经济分析及关键指标2.1 教材中的宏观经济分析框架和指标2.1.1 国内生产总值GDP2.1.2 边际消费倾向…

Non-Local Video Denoising by CNN

摘要 Non-local patch based methods were until recently state-of-the-art for image denoising but are now outper formed by CNNs. Y et they are still the state-of-the-art for video denoising, as video redundancy is a key factor to attain high denoising perfor…

远程大文件传输工具该怎么选择?

随着网络技术的不断进步&#xff0c;越来越多的人需要在不同地点之间传输文件。这时候&#xff0c;我们便需要使用远程文件传输工具。 1、什么是远程文件传输工具呢&#xff1f; 简单来说&#xff0c;它是一种能够帮助我们在不同设备之间传输文件的工具。通常情况下&#xff0…

【云原生】k8s图形化管理工具之rancher

前言 在前面的k8s基础学习中&#xff0c;我们学习了各种资源的搭配运用&#xff0c;以及命令行&#xff0c;声明式文件创建。这些都是为了k8s管理员体会k8s的框架&#xff0c;内容基础。在真正的生产环境中&#xff0c;大部分的公司还是会选用图形化管理工具来管理k8s集群&…

第八十五天学习记录:C++核心:内存分区模型

内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理 2、全局区&#xff1a;存放全局变量和静态变量以及常量 3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数…

【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们讲解了 StatefulSet 的拓扑状态&#xff1b;我们发现&#xff0c;它的拓扑状态&#xff0c;就是顺序启动/删除、Pod 名称编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。 …