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

news2024/11/25 11:45:19

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

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

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

在这里插入图片描述

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

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

相关文章

华为OD机试题,用 Java 解【流水线】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

LearnOpenGL-入门-8.坐标系统

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录坐标系统概述局部空间世界空…

干货收藏|医疗数据安全、临床业务容灾、智能运维及数字化转型方案集锦

数智赋能,助力医院高质量发展!历时三天的2022中华医院信息网络大会(CHINC)圆满落下帷幕,美创科技赴五年之约,与医疗行业用户朋友在深圳再聚交流,也带来关于“医疗行业数据安全、数字化转型”的新…

【再临数据结构】Day1. 稀疏数组

前言 这不单单是稀疏数组的开始,也是我重学数据结构的开始。因此,在开始说稀疏数组的具体内容之前,我想先说一下作为一个有着十余年“学龄”的学生,所一直沿用的一个学习方法:3W法。我认为,只有掌握了正确的…

react的严格模式 和 解决react useEffect执行两次

useEffect执行两次 这个问题,主要是刚接触react的时候发的问题,当时也没总结。现在回过头来再总结一次!!! 文章目录useEffect执行两次前言一、为什么useEffect执行两次1.React的严格模式(模版创建项目&…

Hadoop综合案例 - 聊天软件数据

目录1、聊天软件数据分析案例需求2、基于Hive数仓实现需求开发2.1 建库2.2 建表2.3 加载数据2.4 ETL数据清洗2.5 需求指标统计---都很简单3、FineBI实现可视化报表3.1 FineBI介绍3.2 FineBI配置数据3.3 构建可视化报表1、聊天软件数据分析案例需求 MR速度慢—引入hive 背景&a…

深度剖析指针(中)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容仍旧是深度剖析指针噢,在上一篇博客中,我已经写过了字符指针、数组指针、指针数组、数组传参和指针传参的知识点,那么这篇博客小雅兰会讲解一下函数指针、函数指针数组 、指向函数指针数组…

【Spark分布式内存计算框架——Spark Streaming】8. Direct 方式集成底层原理 集成Kafka 0.10.x

Direct 方式集成底层原理 SparkStreaming集成Kafka采用Direct方式消费数据,如下三个方面优势: 第一、简单的并行度(Simplified Parallelism) 读取topics的总的分区数目 每批次RDD中分区数目;topic中每个分区数据 被…

布局三八女王节,巧借小红书数据分析工具成功引爆618

对于小红书“她”经济来说,没有比三八节更好的阵地了。伴随三八女王节逐渐临近,各大品牌蓄势待发,这场开春后第一个S级大促活动,看看品牌方们可以做什么? 洞察流量,把握节点营销时机 搜索小红书2023年的三…

学员作品|微博“绿洲”APP产品分析

一产品架构1. 产品功能架构图绿洲的主要功能模块可以拆分为六部分:首页、发现、发布动态、个人中心、水滴、消息。整体功能架构图如下:2. 用户使用路径图用于浏览动态:用于发布动态:新用户引导路径:二市场分析1. 产品定…

【Linux】Linux中gcc/g++的使用

本期主题:程序的编译过程和gcc/g的使用博客主页:小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限,出现错误希望大家不吝赐🍁 1.背景知识 预处理(进行宏替换,去注释,头文件的…

索引、索引失效、索引的存储

文章目录1.索引种类2.创建索引注意点3.索引失效的情况4.为什么索引使用B树存储(1)如果使用数组来存储索引(2)如果使用二叉查找树来存储索引(3)如果使用平衡二叉查找树来存储索引(4)如…

同为(TOWE)防雷产品助力福建移动南平分公司防雷改造

01 公司简介中国移动通信集团福建有限公司南平分公司属于福建移动地级分公司,所属行业为电信、广播电视和卫星传输服务。现已建成覆盖范围广、业务品种多、通信质量高的综合通信网络,具备行业领先的经营管理制度。移动通信大楼的综合防雷及地接系统&…

第八节 构造器和this关键字、封装

构造器的作用 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。 构造器的注意事项 1.任何类定义出来,默认就自带了无参数构造器,写不写都有。 2.一旦定义了有参数构造器,那么无参数构造器就没有了&#xf…

互联网人看一看,这些神器你用过哪些?

很多小伙伴在剪辑视频的过程中经常可以看到一些语音素材,经常刷视频的小伙伴也可以看到很多视频中经常出现一些AI合成的声音或者音效,这些配音可以给视频增添很多亮点!那么大家都是怎么将文字转语音的呢?今天给大家分享5款非常专业…

【Git】Git常用命令及练习—Git环境配置

目录 一、Git环境配置 1.1基本配置 1.2为常用指令配置别名(可选) 1.3 解决GitBash乱码问题 二、Git命令详细操作 1.获取本地仓库 2.基础操作命令及练习 基础操作练习 3.分支命令及练习 开发中分支使用原则与流程 分支练习 💟 创作不…

Ubuntu20.04安装Cuckoo

参考链接: (1)【主要参考】http://www.wityx.com/post/134851_1_1.html (2)【主要参考】在Ubuntu18.04上搭建Cuckoo Sandbox2.0.7 https://www.jianshu.com/p/4dd6373fa206 (3)与Cuckoo的斗智斗…

Kafka入门(五)

下面聊聊Kafka常用命令 1、Topic管理命令 以topic:test_1为例 1.1、创建topic ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test_1参数说明: –bootstrap-server:…

【论文笔记】Decoupling Representation and Classifier for Long-Tailed Recognition

这一篇其实并不是提出什么新的东西,而且是做了点类似综述的技术调用实验。省流:T-normalization最好用 摘要 现状:Existing solutions usually involve class-balancing strategies, e.g. by loss re-weighting, data re-sampling, or tran…

【操作方法】windows防火墙添加出入站规则方法

【操作方法】windows防火墙添加出入站规则方法说明一、入站规则1.打开防火墙,点击“高级设置”2.点击“入站规则”后点击“新建规则”3.例3.1选择“端口”3.2添加需要放通的端口3.3选择操作动作为“允许连接”3.4选择应用区域,此处我选择所有区域二、出站…