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

【数据库增删查改进阶版】保姆级教程带大家去学习更加复杂的sql语句,各种各样的约束以及各种各样的查询

前言:
大家好,我是良辰丫🍅🍅🍅,上一篇数据库我们一起学习了基础版本的增删查改,今天我们将接触更高级的增删查改,主要是学习一些约束条件,你们准备好了嘛?开始发车了。👒👒👒

🧑个人主页:良辰针不戳
📖所属专栏:数据库
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述


目录

  • 1、数据库约束
    • 1.1 NULL约束
    • 1.2 unique约束
    • 1.3 default设置默认值
    • 1.4 主键约束
    • 1.5 自增主键
    • 1.6 外键
  • 2、表的设计
  • 3、查询结果作为新增数据
  • 4、进阶版查询
    • 4.1 聚合查询
      • 4.1.1 聚合函数
      • 4.1.2 group by子句
      • 4.1.3 having
    • 4.2 联合查询(多表查询)
      • 4.2.1 了解联合查询
      • 4.2.2 内连接
      • 4.2.3 外连接
      • 4.2.4 自连接
      • 4.2.5 子查询
      • 4.2.6 合并查询


1、数据库约束

所谓约束就是在使用数据库的时候对数据库中存储的数据提出一定的要求和限制。下面是一个约束条件表,先简单看一下,后面会有详细解释。

约束条件解释
NOT NULL指示某列不能存储 NULL 值
UNIQUE保证某列的每行必须有唯一的值
DEFAULT规定没有给列赋值时的默认值
PRIMARY KEY主键,就像身份证一样,唯一标识
FOREIGN KEY外键,保证一个表中的数据匹配另一个表中的值的参照完整性
CHECK保证列中的值符合指定的条件

1.1 NULL约束

创建表时,指定某个属性的性质,表名该属性不可以为空。下面我们来举一个简单的例子.

create table stu(id varchar(10) not null,name varchar(20));

上面的代码中我们创建了一个表,表的属性具有了约束条件,不能为空,如果我们填入的属性为null时就会报错.

在这里插入图片描述

我们来看一下我们创建的表结构.

在这里插入图片描述

1.2 unique约束

保证每列的每行具有唯一属性.

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

此时stu2的id属性只能唯一,当我们创建相同的id时,就会报错.
在这里插入图片描述

1.3 default设置默认值

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

 create table stu3 (id int,name varchar(20) default '未知');insert into(id) stu3 values(5);

在这里插入图片描述

1.4 主键约束

唯一标识,象征你的唯一性,比如你的身份证,在学校你的学号…这些都是唯一标识

create table stu4 (id int primary key,name varchar(20));
insert into stu4 values(1,'叶良辰');
insert into stu4 values(1,'张三');

在这里插入图片描述

插入一条id为1的数据时候,它会正常插入,然而呢,第二次,插入id仍然为1的数据时,就会报错,这下大家明白主键的基本作用了吧.这时就引入了自增主键的概念.

1.5 自增主键

给自增主键插入数据的时候,我们可以自己指定一个主键,也可以插入一个空值,让他自己分配.

 create table stu5 (id int primary key auto_increment,name varchar(20));insert into stu5 values(null,'叶良辰'),(null,'李四');

在这里插入图片描述

我们指定的id为null,但是它默认给我们赋值,这就是自增主键.

1.6 外键

保证一个表中的数据匹配另一个表中的值的参照完整性,简而言之,就是父表与子表的约束关系.我们需要创建两张表来说明其中的联系.

create table class (classID varchar(20) primary key);
create table student(id int primary key auto_increment,classID varchar(20),foreign key(classID) references class(classID));

在这里插入图片描述

需要注意的是,父表中被依赖的属性必须是主键

insert into class values('一班');

在这里插入图片描述

在拥有一班的情况下会正常插入数据.

在这里插入图片描述

上述插入的数据是1班,class中没有1班的数据,所以会报错
注意
一班和1班不一样,一个是汉字一,一个是数字1哦.

父表在约束子表的同时,子表也在约束父表.

drop table class;

在这里插入图片描述

因为子表约束父表,因此上面的删除父表操作会失败.

在这里插入图片描述

删除一班这一行的数据也会报错.

2、表的设计

所谓表的设计,简单粗暴的理解就是如何去弄一个数据库,各个表进行联系等.数据库中,有几个表,每个表有怎样的属性,每个表的作用是什么等.
实体:在java中面向对象是找对象,在数据库中,面向对象是找实体,比如一个学生是一个实体,一个老师也是一个实体.

明确三种关系

  • 一对一:在学校中,一个学生只能有一个学号.
  • 一对多:一个班级中可以包含多个学生.
  • 多对多:一个学生可以选择多个课程,一个课程也可以提供给多个学生.

友情提示:
在设计表之前,一般需要画简图,去描述各个表的功能以及联系.

3、查询结果作为新增数据

insert into stu select * from stu;

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

4、进阶版查询

4.1 聚合查询

查询过程中,表的行与行进行一定的运算,聚合查询依赖于聚合函数.

4.1.1 聚合函数

函数说明
count数据的数量
sum数据总和(非数据没有意义)
avg平均值(非数据没有意义)
max最大值(非数据没有意义)
min最小值(非数据没有意义)
create table stu (id int,name varchar(20));
insert into stu values(1,'张三'),(2,'李四');
select count(id) from stu;

在这里插入图片描述

由于聚合函数方法比较简单,我只列举了一个例子,大家可以自己尝试写一下,熟能生巧,不能眼高手低哦.

聚合函数可以与表达式进行连接哦!!!

select sum(chinese + math) from student;

4.1.2 group by子句

  • 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT中则必须包含在聚合函数中.
  • group by指定一个列,就会把相同的属性放到一个组中.

下面创建了一个工资表

create table salary(id int,name varchar(20),role varchar(20),salary numeric(10,2));
insert into salary values(1,'张三','老板',50000),
(2,'李四','员工',3000),
(3,'王五','员工',3500),
(4,'赵六','厨师',8000),
(5,'刘大宝','厨师',7000);

查询该公司各个职业的平均工资

在这里插入图片描述

4.1.3 having

接下来,我们需要搞清楚,分组的条件是分组前还是分组后.

  • where是分组之前的
  • having是分组之后的

使用having进行条件判定

在这里插入图片描述

同时使用having和where进行条件判定

在这里插入图片描述

4.2 联合查询(多表查询)

把多个表联合在一起进行查询,在学习联合查询之前,我们需要了解笛卡尔积,联合查询就行基于笛卡尔积.(其实就是所谓的组合)

4.2.1 了解联合查询

1. 商品编号表

nameid
钢笔1
圆珠笔2

2. 商品价格表

idprice
115
28

3. 两表进行笛卡尔积

nameididprice
钢笔1115
钢笔128
圆珠笔2115
圆珠笔228

大家可以清楚的看到,笛卡尔积之后会产生大量无效数据,那么,什么是无效数据呢?比如上面钢笔,第三张表中,第二个钢笔的id不同,这时它就是无效数据,下图红色圈住的都是无效数据.

在这里插入图片描述

因此呢,我们使用联合查询将多表联系在一起的时候需要使用一定的条件去掉无效数据.
笛卡尔积 + 条件 = 联合查询

 create table goods(name varchar(20),id int);create table price(id int,price int);insert into goods values('钢笔',1),('圆珠笔',2);insert into price values(1,15),(2,8);

笛卡尔积的结果

在这里插入图片描述

联合查询的结果

在这里插入图片描述

join…on也可以进行笛卡尔积运算

在这里插入图片描述

4.2.2 内连接

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
其实上述的普通笛卡尔积运算就是内连接
如果是三张表,两两合并,前两个合并在与第三张表合并.

4.2.3 外连接

左外连接,以左边表作为参考,如果左边表没有的属性,连接后将不再显示.

在这里插入图片描述

右外连接,以右边表作为参考,如果右边表没有的属性,连接后将不再显示.

在这里插入图片描述

4.2.4 自连接

自己和自己做笛卡尔积,把行转成列进行一系列的操作.

下面会报错,因为自连接需要指定一下表的别名(规定)

在这里插入图片描述

指定别名后就可以正常输出

在这里插入图片描述

在这里插入图片描述

4.2.5 子查询

其实就是套娃操作,把多个查询语句合在一起.

1. 单行子查询

select name from goods where id = (select id from price where price = 8);

在这里插入图片描述
2. 多行子查询

select * from goods where id in (select id from price where price = 8 or price = 15);

下面查找id为1和2的商品
在这里插入图片描述
下面为多行子查询

在这里插入图片描述

需要注意的是,多行子查询需要关键词in,in后面加条件.

exists关键字也可以多行子查询(了解一下)

在这里插入图片描述

4.2.6 合并查询

所谓合并查询,就是把两个查询的语句合并在一起,通过关键字union来实现.

1. 通过or查询两条语句

在这里插入图片描述

2. 通过union来合并查询两条语句

在这里插入图片描述

注意:
union不会去重,union all会自动去重

后序:
今天的数据库学习就到这里了,期待大家的三连,希望小小的文章可以帮助到大家,我会不断努力,去更新内容,真诚希望与大家一起进步.💞💞💞

在这里插入图片描述

相关文章:

【数据库增删查改进阶版】保姆级教程带大家去学习更加复杂的sql语句,各种各样的约束以及各种各样的查询

前言: 大家好,我是良辰丫🍅🍅🍅,上一篇数据库我们一起学习了基础版本的增删查改,今天我们将接触更高级的增删查改,主要是学习一些约束条件,你们准备好了嘛?开…...

【C#基础】C# 正则表达式

序号系列文章7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程9【C# 基础】C# 异常处理操作文章目录前言1,Regex 的概念2,Regex 的创建3,Regex 常用操作4,Regex 类的使用5,学习资源推荐结语前言 🌼 h…...

企业活动直播如何设置VIP观看席?

阿酷tony / 2023-2-28 / 长沙 / 多图内容企业活动直播如何设置VIP观看席?有意思吧,直播也能设vip席位。在直播间可以分设尊享嘉宾席、特邀VIP以及观众席三个区域,为企业提供多种用户接待模式,不仅能为嘉宾营造尊享VIP体验&#xf…...

线性代数学习-2

线性代数学习-2矩阵消元消元回代消元矩阵置换矩阵逆矩阵本文转载于https://herosunly.blog.csdn.net/article/details/88713747 该文章本人认为十分有用,便自己敲一遍笔记加固印象原文链接 原文这个笔记感觉比我老师讲的更加透彻,清晰。很好的展示了线性…...

Java 类

Java类是Java编程语言中的基本概念之一,用于描述对象的属性和方法。本文将详细介绍Java类的作用、定义和使用,以及在实际工作中的应用。 什么是Java类? Java类是一种用于描述对象的模板或蓝图。它定义了一个对象的属性和方法,以…...

GO中sync 包的 RWMutex 读写互斥锁

文章目录背景RWMutex 简介代码验证多个协程请求读锁 RLock() 和 RLock()读写交错 RLock() 和 Lock()写入的时候读取读取的时候写入请求多个写Lock() 和 Lock()背景 Mutex 互斥锁是严格锁定读和写,如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex 针对读…...

糖化学试剂55520-67-7,5-vinyl-2-deoxyuridine,5-乙烯基-2-脱氧尿苷特点分析说明

5-vinyl-2-deoxyuridine(5-VdU),5-vinyl-2-deoxyuridine,5-Vinyldeoxyuridine5-乙烯基-2-脱氧尿苷 | CAS:55520-67-7 | 纯度:95%试剂信息:CAS:55520-67-7所属类别:糖化学分子量:C11H…...

五年携手共话,FISCO BCOS为数实相生注入新动能

2月24日,作为深圳国际金融科技节系列活动之一,由深圳市地方金融监督管理局指导,微众银行、金链盟主办的“2022产业区块链年度峰会暨FISCO BCOS五周年生态大会”(下称“大会”)在深圳顺利召开。本次大会以“数实相生&am…...

特征可视化技术t-SNE

特征可视化技术t-SNE 一、理论介绍 想要了解t-SNE的数学原理可以参考t-SNE完整笔记 关于t-SNE的使用过程中有以下几点需要注意: t-SNE算法并不是每次都能产生相似结果。 t-SNE算法使得距离的概念适应于数据集中的区域密度变化。因此,它自然而然地扩大…...

.NET 导入导出Project(mpp)以及发布后遇到的Com组件问题

最近公司项目有一个对Project导入导出的操作,现在市面上能同时对Project进行导入导出的除了微软自带的Microsoft.Office.Interop.MSProject,还有就是Aspose.Tasks for .NET。但因为后者是收费软件且破解版的现阶段只到18.11,只支持.net Frame…...

centos 8安装配置 yum/dnf镜像源 以及 docker相关操作

Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 Docker组成部分: 镜…...

java基础之线程池

线程池1.线程池1.1 线程状态介绍1.2 线程池-基本原理1.3 线程池-Executors默认线程池1.4 线程池-Executors创建指定上限的线程池1.5 线程池-ThreadPoolExecutor1.6 线程池-参数详解1.7 线程池-非默认任务拒绝策略2. 原子性2.1 volatile-问题2.2 volatile解决2.3 synchronized解…...

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器(blockchain builders)和parachain 项目团队的概念、过程和参考信息。…...

一个线程两次调用start()方法会出现什么情况?

第17讲 | 一个线程两次调用start()方法会出现什么情况? 今天我们来深入聊聊线程,相信大家对于线程这个概念都不陌生,它是 Java 并发的基础元素,理解、操纵、诊断线程是 Java 工程师的必修课,但是你真的掌握线程了吗&am…...

看完再拿五分,软考高项时政提分必备

时事政治题作为软考信息系统项目管理师当中的必考题,每年都让不少考生头疼,主要吧,它一不在教材里,二考的又很随意,如果不是平时积累,专门注意去看,有时候很难答得对,弄得这几分就完…...

界面开发(1) --- PyQt5环境配置

PyQt5环境配置 第一步:首先安装社区版Pycharm 下载地址:https://www.jetbrains.com/pycharm/download/#sectionwindows 第二步:安装Anaconda3,配置虚拟环境 下载地址:https://www.anaconda.com/ 第三步&#xff1…...

shield分析

本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信! 熟练打开Fiddler设置好手机代理,摆弄半天一直抓不到包,应该是小红书监测到了F…...

Javaweb增删改查之【查】

Javaweb增删改查之【查】1.前端页面2.java链接数据库——集成mybatis2.1 建立层2.2 实体层entity2.3 mapper(dao层)2.4 mybatis配置文件2.5工具层util3.后台功能3.1servlet前几天跟着b站up主学javaweb登录,突然还是觉得这几年学了c是真的挺好…...

C++ STL:迭代器 Iterator

文章目录1、迭代器的类型2、traitsiterator_traitstype_traits泛化的指针,容器与算法的桥梁。提供一种方法,按照一定顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。既能对容器进行遍历,又可以对外隐藏容器的底层实…...

【C++】泛型编程——模板初阶

文章目录1. 泛型编程2. 函数模板2.1 函数模板的概念2.2 函数模板的使用2.3 函数模板的原理2.4 函数模板的实例化隐式实例化显式实例化2.5 模板参数的匹配原则3. 类模板1. 泛型编程 首先我们来思考一个问题:如何实现一个通用的交换函数呢? 即我们想交换两…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...