数据库中的约束,聚合函数以及联合查询

news2024/12/24 8:29:54

目录

数据库中的约束

not null

unique

default

primary key

foreign key

表的设计

聚合函数(查询)

分组

联表查询(多表查询)

内连接

外连接

左外连接

右外连接

自连接

子查询

合并查询


数据库中的约束

为了保证我们存入数据库中的数据得靠谱,mysql就提供了一些机制,对数据进行检查。这个机制也就是约束。约束一旦被确定好后,后续在进行增删改的时候,就会判断要操作的是否符合约束从,符合就会执行操作,不符合则就报错。

我们需要在创建表的时候就对字段设置好约束。下面价绍一下各约束,check这个约束几乎不怎么使用,我这里就不介绍了。

not null

设置该列约束为非空,也就是该列的值必须有,不可以设置为null更改的话也不可以更为空

#使用的时候直接把not null 跟在字段后面,可以看下面例子:

create table student(id int, name varchar(20) not null);

设置完以后,我们查看表结构发现name字段的null列变成no,也就是不允许为空

这时候我们进行插入更新操作时,如果name的值为null,就报错了

unique

这个关键字用来保证数据的唯一性,也是加在字段名后面。不允许指定列的不同行有相同的内容。

create table student(id int unique, name varchar(20));

为什么我们添加了unique约束后,就知道有没有重复的呢?带有unique的字段,在执行更新插入操作的时候会先自己进行一次查询,看表中对应字段是否存在与要插入的内容一致,如果不存在就插入(更改),存在就无法插入(更改),直接报错。

default

这个关键字是设置字段的默认值的,插入的时候我们可以指定字段插入,对于某些字段我们并没有插入值,服务器会给这样的字段设置的默认值为null,我们如果不想用他设置的默认值,我们可以自己设置默认值。这个也是直接跟在字段后面。

create table student(id int, name varchar(20) default '管理员');

primary key

这个关键字表示主键约束,主键也就是一条记录的身份标识。一个表中只可以有一个主键。这个主键的功能等同于非空和unique的结合体(也就是主键的功能是非空和防止重复)。

create table student(id int primary key, name varchar(20));

一般我们会将主键设置为整型,并且将整型的主键设置为自增形式,用户可以不用再传入主键的值。(自增只针对主键为整型的时候)

#直接在primary key后面加上auto_increment就行
create table student(id int primary key auto_increment, name varchar(20));

1.当主键设置为了自增的时候,对于这个字段,我们如果传入Null或者不传入值的时候,数据库会按照自增直接给我们分配一个数据。

2.我们也可以自己传入值,数据库会记录主键字段的已有内容的最大值,再次自动分配的时候从最大值后面开始。

foreign key

这个关键字是涉及外键的,涉及到两个表之间的约束,父表约束子表,子表被父表约束。

#先创建父类
create table classes(classId int primary key auto_increment, name varchar(20));

#再创建子类
 create table student(id int primary key, name varchar(20), classId int, foreign key(classId) references classes(classId));

1.插入或删除子表中受约束的这一列中的数据时,要保证插入或删除的元素在父表中能查到。(这种有外键约束的也会触发查询操作,会去在父表中查询一下看存不存在这个元素)

2.删除/修改父表中的元素时,要去看在子表中有没有被使用,如果被使用了也不可以进行删除,修改。(也会触发查询操作,会去查父表要删除的元素在子表中有没有被使用,如果被使用,就不可以执行删除或者更改操作)。

3.primary key 和unique这两个自带索引,因为执行操作的时候可能会进场查询父表或者子表,很费时,所以,有索引就会大大提升速度。因此也就规定没有索引,就不可以建立这样的外键。

表的设计

数据库中的关系分为四种:一对一,一对多,多对多和没关系。

一对一:例如一个人只能有一个身份证号,一个身份证号也只能对应一个人。

一对多:一个人只可以在一个班级中,一个班级中却可以包括很多人。

多对多:一个人可以选修不同的课程,而一门课程可以被很多人选用。

聚合函数(查询)

sql中涉及到的聚合函数如下:(这个聚合函数是针对行和行之间的计算)

分组

通过group by来进行分组,通过指定列进行分组,值相同的放到一组。

1.select后面的字段要么在group by后面,要不就在聚合函数里面,否则无任何意义。

2.group by也可以结合条件进行查询操作。

3.group by可以结合条件的关键字不仅有where还有having。where条件用在分组前,在分组前,对结果集进行过滤,然后再进行分组。having用于分组完成后,对分组后的结果集进行过滤。

select name,avg(salary) from emp where name != '张三' group by name having avg(salary) > 5000;

联表查询(多表查询)

联表操作,我们必须要清楚笛卡尔积!笛卡尔积:将两个表的记录通过排列组合的方式结合起来构成一个更大的表。笛卡尔积后的列数就是原来两个表的列数之和,笛卡尔积后的行数就是原来两个表的行数之积。

内连接

我们通过笛卡尔积后可以得到一个很大的组合表,这里是两个表的所有组合,我们再根据两个表的连接关系,对表进行筛选。

#此时就是两个表进行了笛卡尔积
slect * from stu1,stu2;

#我们要筛选出我们想要的内容,就得增加条件
#注意!!!在条件中会用到字段名,我们需要通过表名.字段名来进行调用
select * from stu1,stu2 where stu1.name = stu2.name and 其他条件;



#上面是我们内连接的一种方式,我们还可以通过下面这种方式进行内连接。
select * from stu1 (inner) join stu2 on 条件; 

外连接

如果我们有两个表A,B,当B表中每一条记录都能在A表中找到对应的,A表中每一个记录也都能在B表中找到对应的,此时内外连接结果一样。否则如果不能一一对应,则内外连接就有区别了,外连接分为左连接和右连接。

左外连接

select 字段名  from 表名1 left join 表名2 on 连接条件;

左外连接:以左侧表为主,左侧表的每个记录都会在最后的临时结果集中,如果遇到了左表存在右表不存在的数据,就会把对应的列值置为空。

右外连接

select 字段 from 表名 1 right join 表名 2 on 连接条件 ;

右外连接:以右侧表为主,右侧表的每个记录都会存在在最后的结果集里面,如果遇到了右侧表中存在,左侧表中不存在的,会把对应列置为null。

自连接

本质上就是自己和自己进行笛卡尔积,把行之间的关系转为列之间的关系。

我们查询的时候不可以,多个表的时候名字不可以相同,所以我们需要起别名。

select * from score as s1, score as s2 where 条件;

子查询

指嵌入到其他sql语句中的select语句,也可以称为嵌套查询。说白了就是将多条sql语句合成一个sql语句

#例:
select name from student where id = 1;#假设输出的为'张三'
select math,chinese from score where name = '张三';


#下面这个就是嵌套查询(将上面两个合起来了)

select math,chinese from score where name = (select name from student where id = 1);

合并查询

把多个select后的结果集合并成一个结果集。使用关键字union(会自动去掉结果集中重复行)或者union all(这个不会将结果集中重复行去掉)使用这个合并的前提是:每个 SELECT 语句必须具有相同数量的列,且对应列的数据类型必须相似

select ... from ... where 条件
union(all)
select ... from ... where 条件
SQL 查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having >
select > distinct > order by > limit

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

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

相关文章

用python获取系统的硬件信息(python实例二十九)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.获取系统信息 3.1 代码构思 3.2 代码示例 3.3 运行部分结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

计算机组成原理面试-核心概念-问题理解

目录 1.怎么理解计算机组成原理中存储器、控制器、运算器、输入输出设备之间的协作关系和工作流程 2.比、比特等类似几种表示信息存储的单位具体换算 3.介绍计算机的五大功能-数据传送功能、数据存储功能、数据处理功能、操作控制功能、操作判断功能 4.计算机的工作过程/指令…

【Linux基础】Linux基本指令(一)

目录 前言1, ls指令2,pwd指令三,cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四,创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五,删除目录或文件5.1 rmdir指令5.2 rm 指令 六,…

华大基因阿尔茨海默病风险基因检测,助力阿尔茨海默病早预防

中国正面临日益加剧的老龄化挑战。据统计,2020年我国60岁以上的老年人口已达2.6亿,其中轻度认知障碍患者超过3800万,而阿尔茨海默病患者近千万。随着这一趋势的延续,如何早期发现和预防阿尔茨海默病已成为公共卫生领域的重要议题。…

为什么建议从二维向三维GIS开发方向拓展?

GIS开发是地理信息系统领域中一个薪资待遇较高的职业方向,吸引了众多来自测绘、遥感和城市规划等相关专业的学生转型投身于WebGIS开发工作。 那么,今天从技术角度出发,探讨为何鼓励大家超越WebGIS的范畴,继续深入学习三维GIS开发…

el-date-picker 限制开始时间和结束时间

el-date-picker 限制开始时间和结束时间 需求&#xff1a;el-date-picker 月份限制开始时间和结束时间 开始时间&#xff1a;202307 结束时间&#xff1a;202407 代码实现 vue 页面 <el-form-item label"月份" prop"monthList"><el-date-picker …

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…

测试概论之系统测试

系统测试 文章目录 系统测试一、系统测试定义二、系统测试的对象三、系统测试类型1、功能测试2、性能测试3、压力测试4、容量测试5、GUI 测试6、可以性测试7、安装性测试8、配置测试9、异常测试10、备份测试11、健壮性测试12、文档测试13、在线帮助测试14、网络测试 四、系统测…

为什么奥运会采用通义而不是 OpenAI,现在中国的 AI 技术是世界领先了吗?

奥运会作为全球最盛大的体育赛事之一&#xff0c;一直在不断地引入和利用最新的科技来提升赛事的组织效率、观众体验以及运动员的表现。在2024年巴黎奥运会上&#xff0c;人工智能&#xff08;AI&#xff09;技术的应用尤为引人注目。 首先&#xff0c;关于奥运会采用的技术选…

数字噪音计(声级计)【AR814数字噪音计】

系统介绍 声级计&#xff0c;又叫噪音计&#xff0c;是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是&#xff1a;由传声器将声音转换成电信号&#xff0c;再由前置放大器放大…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…

Typora v1.9.5解锁版下载、安装教程 (轻便简洁的Markdown编辑器)

前言 Typora是一款轻便简洁的Markdown编辑器&#xff0c;支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就想是写Word文档一样流畅自如&#xff0c;不像其他编辑器的有编辑栏和显示栏。 一、下载地址 下载链接&#xff1a;…

软件测试---Fiddler抓包

一、初识Fiddler ①BS架构简介和请求过程理解 ②Fiddler原理 Fiddler是一个代理服务器。代理地址:127.0.0.1&#xff0c;端口:8888。浏览器可以通过设置查看代理服务器&#xff1a;设置->高级->打开您计算机的代理设置->连接->局域网设置->代理服务器->在高级…

Vulnhub靶场-FRISTILEAKS: 1.3

1.环境准备 下载地址&#xff1a;https://www.vulnhub.com/entry/fristileaks-13,133/ 攻击机&#xff1a;kali&#xff08;192.168.26.128&#xff09; 靶机&#xff1a;FRISTILEAKS: 1.3 将靶机和kali的网络连接模式设置为同一种模式&#xff08;Nat模式&#xff09; 注…

【linux】linux中特殊权限管理--FACL详细用法教程与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

MM 14 -采购- 固定资产采购

思维导图 说明 特点&#xff1a; 价值大于2000就算固定资产采购。 不做料号管理 不做库存管理 但是财务做资产卡片管理 流程&#xff1a; 01采购申请意向表---02资产评估表--03财务创建资产卡片AS01--04创建采购申请&#xff08;科目分配类别A&#xff09;--05采购订单--06…

不学函数式设计的3大损失

讲动人的故事&#xff0c;写懂人的代码 可能很多程序员和我一样&#xff0c;一直在一次次地重新入门函数式编程&#xff08;和设计&#xff09;。因为我们总是学了就忘。 鲍叔去年出版了他的大作《函数式设计》&#xff0c;里面有大量Clojure代码示例。如果不懂Clojure&#x…

【工具推荐】四千个厂商默认帐号密码

一、下载地址 WX关注公众号“光剑安全”&#xff0c;发送“20240808厂商”即可获得文档 二、 文档介绍 里面包括多个web产品&#xff0c;多个数据库&#xff1a;mysql、redis、MSSQL (mssql)等 多个服务协议&#xff1a;telnt、ssh、ftp、rdp等 无偿分享技术文章&#xff0c…

Elsevier 旗下又一宝藏SCI!国人发文超五成,8天上线,硕博圈的“易投易中”首选刊!

【SciencePub学术】本期&#xff0c;小编给大家介绍的是1本计算机类的SCI&#xff0c;位于JCR2区中科院4区&#xff0c;影响因子2.6分。 众所周知&#xff0c;顶刊的普遍毛病就是“速度慢&#xff0c;要求严”&#xff0c;这也是让大多数人望而却步的主要原因。虽然此刊影响因子…

栈和队列(数据结构)

1. 栈(Stack) 1.1 概念 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO &#xff08; Last In First Out &#xff09;的原…