【MySQL】MySQL基础知识复习(下)

news2024/12/22 19:53:58

前言

上一篇博客介绍了MySQL的库操作,表操作以及CRUD。

【MySQL】MySQL基础知识复习(上)-CSDN博客

本篇将进一步介绍CRUD操作,尤其是查找操作

目录

一.数据库约束

1.约束类型

1.1NULL约束

1.2UNIQUE:唯一约束

1.3DEFAULT:默认值约束

1.4PRIMARY KEY:主键约束

1.5FOREIGN KEY:外键约束

二.进阶查询

1.聚合查询

1.1 COUNT

1.2 SUM

1.3 AVG

1.4 MAX与MIN

2.分组查询:GROUP BY

  2.1 having

3.联合查询(多表查询)

3.1内连接(笛卡尔积)

3.2外连接

3.3自连接

3.4合并查询



一.数据库约束

数据库的约束是对于数据库储存的数据,做出一些“限制”。

为什么会有对数据库的约束??

那是因为数据库中的数据非常重要,我们希望数据库中的数据不要存在一些“错误”的数据,为减少错误的可能性,减少因“人”而产生的失误,用程序进行限制会更为可靠。

数据库的约束就是对保存的数据进行合法性检查,一旦发现问题能够及时给出反馈。

1.约束类型

NOT NULL - 指示某列不能存储 NULL 值。

UNIQUE - 保证某列的每行必须有唯一的值。

DEFAULT - 规定没有给列赋值时的默认值。

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。

FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性

1.1NULL约束

创建表时,如没有在类型后添加null约束,默认该类型可以为空,若是用not null约束,则该类型不能为null

如图:当not null限制时,添加null会报错

1.2UNIQUE:唯一约束

unique能确保该类型的数据不会有重复

如图,给id设定unique,若是后面设置的id与前面的重合,则会报错。

1.3DEFAULT:默认值约束

默认值默认为null,若是插入时选择某列插入,其他未选择的列则按照默认值插入。

如图,将name默认值设为无名,若在插入时未指定name,则默认未无名。

1.4PRIMARY KEY:主键约束

约定了这个表里的某个列为身份标识,是not null和unique的结合,一个表中只允许存在一个主键

MySQL提供了一个自动分配主键值的方式—“自增主键(auto_increment)”

在插入数据时可以不指定id的值,id会自动自增分配

1.5FOREIGN KEY:外键约束

外键约束需要有两个或两个以上的表时使用,当两个表相关联时,用一个表来约束另一个表的数据。

语法:

foreign key (字段名) references 主表(列) 

这种约束是双向的,删除时,如图先删除父表,则会报错。

删除时需先删除子表,再删除父表

二.进阶查询

1.聚合查询

针对行与行之间进行聚合查询

进行聚合查询,需搭配聚合函数

1.1 COUNT

count可查询数据的行数

如果有一行数据都是空,行数也会被count算进去,但如果只针对某个列,空值不会计入。

1.2 SUM

使用sum可以针对某一类的数据进行求和。

sum中也可以是表达式。

1.3 AVG

求某一列的平均值,要求列里是数字。

1.4 MAX与MIN

max为求某一列的最大值,min为求某一列的最小值。

2.分组查询:GROUP BY

使用group by指定一个列,就会把该列相等的行,归到一组里。

分完组后还可以针对每个组分别进行聚合查询。

例1:现有一张员工表

现在按职位进行分组,查询每个职业的人数

 例2:求每个职业的平均工资

  2.1 having

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

例如:统计平均工资低于10000的职业

3.联合查询(多表查询)

3.1内连接(笛卡尔积)

笛卡尔积是将多个集合/表的数据按照一定规律进行排列组合。

例如:假设有一张学生表和班级表

对这两张表进行笛卡尔积,会得到以下结果:

这就是两张表笛卡尔积后的结果。

通过观察,我们发现有些数据符合情况,有些数据不符合实际结果。

因此,笛卡尔积后的数据,我们还需进一步筛选。

我们发现,两张表中都存在着“班级编号”,当笛卡尔积后班级编号相同,则数据有意义,若不相同,则是无意义的数据。

例如:现有两张表student,class

对两张表进行笛卡尔积后得到:

未经过筛选,混杂着一些无意义的数据,通过where设置条件,进行判断后,排除无意义数据

此外,还可以通过join....on....来进行笛卡尔积

语法:

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

笛卡尔积多表联合查询时会产生大量的中间数据,对性能影响较大,数据量大时可能会把数据库搞挂,因此使用笛卡尔积时要慎重。

3.2外连接

当两张表数据为一一对应关系时,内连接和外连接查询的数据结果完全一致

可当上述数据不再一一对应时,内连接和外连接就会出现差别。

例如:

student表与score表不再一一对应,内连接查询结果为

外连接是使用join....on写法的(不支持from多个表)

给join面前加上left/right就是(左/右)外连接

左外连接:以左表为基准,确保左表中每个记录出现在最终结果里,如果左表中的记录在右表没有对应的记录,此时就会把右表相关字段填成NULL。

例:

右外连接:以右表为基准,确保左表中每个记录出现在最终结果里,如果右表中的记录在左表没有对应的记录,此时就会把左表相关字段填成NULL。

例:

3.3自连接

自己与自己进行笛卡尔积

自连接本质上是将行关系转化为列关系。

注意,不能直接自己与自己笛卡尔积,而是要使用别名进行笛卡尔积

3.4合并查询

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

例1:针对同一个表进行union

例2:针对不同表进行union

 

注:union自带有去重操作,若想查看去重前的数据,则使用union all。


以上便是全部内容,如有不对,欢迎指正。

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

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

相关文章

从0开始学docker (每日更新 24-11-6)

限制容器运行的资源 限制容器的内存使用 容器的内存包括两部分:物理内存和交换空间(swap) 用户内存限制 -m,--memory:容器可用的最大内存,该值最低为4MB --memory-swap:允许容器置入磁盘交换空间的内存…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

GIT的基本使用与进阶

GIT的简单入门 一.什么是git? Git 是一个开源的分布式版本控制系统,用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建,最初是为 Linux 内核开发而设计的。如今,Git 已经成为现代软件开发中…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04,为了提升大型语言模型在不同文化背景下的实用性,华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题,覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…

C语言中,“extern”关键字的含义与用法

在C语言中,extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器,某个变量或函数是在当前文件之外定义的,编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤,涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤,确保开发环境配置完成,为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…

Kubernetes网络揭秘:从DNS到核心概念,一站式综述

文章目录 一.overlay vs underlayL2 underlayL3 underlay 二、calico vs flannel2.1 calico架构2.2 flannel架构 三、iptables四、Vxlan五、kubernetes网络架构综述六、DNS七、Kubernetes域名解析策略 一.overlay vs underlay overlay网络是在传统网络上虚拟出一个虚拟网络&am…

飞凌嵌入式FET527N-C核心板现已适配Android 13

飞凌嵌入式FET527N-C核心板现已成功适配Android13,新系统的支持能够为用户提供更优质的使用体验。那么,运行Android13系统的FET527N-C核心板具有哪些突出的优势呢? 1、性能与兼容性提升 飞凌嵌入式FET527N-C核心板搭载了全志T527系列高性能处…

破解仓库管理难题!库存管理流程详解

随着市场竞争加剧和客户需求不断提升,企业的仓库管理在日益复杂的供应链环境中面临诸多挑战。许多企业在仓库管理上仍停留在传统手工操作或基础的数字化管理阶段,这种方式容易导致库存信息不准确、管理效率低下、数据滞后等问题。 企业现状 当前&#…

电缆管道高效智能化管理:智能电缆管道可视化机器人

电缆管道高效智能化管理:智能电缆管道可视化机器人 电缆管道作为城市“生命线”的重要组成部分,其安全性和可靠性日益受到重视。然而,传统的人工巡检方式存在诸多不足,如巡检效率低下、安全隐患大、难以发现隐蔽故障等。 很多电力…

tomcat启动失败和缓存清理办法

tomcat只在学校接触过并且是在window xp和win7的电脑上配置过(中途升级过电脑系统),只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了,学的知识早就不知道丢哪里了。这次为了修改一个07,08年的项目&a…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求,需要自行搭建SMB服务,**SMB(Server Message Block)**协议是一种常用的文件共享方式,它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

ubuntu18.04 配置安卓编译环境

目前有个项目,验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的,花了半天时间研究了一下,记录如下: 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…

英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换

前言 前几天,一在长沙的朋友李总发我一个英伟达HOVER的视频(自从我今年年初以来持续不断的解读各大顶级实验室的最前沿paper、以及分享我司七月在具身领域的探索与落地后,影响力便越来越大了,不断加油 ),该视频说的有点玄乎&…

C语言中“type”的含义

在C语言中,“type”是指数据类型,它定义了变量可以存储的数据种类以及可以对这些数据执行的操作。C语言提供了一系列基本的数据类型,它们包括但不限于: 整型(Integer Types): int:用…

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Golang | Leetcode Golang题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…