数据库增删改查(CRUD)进阶版

目录

数据库约束

约束类型

表的设计

1.一对一

2.一对多

3.多对多

增删查改进阶操作

1. 插入查询结果

2.查询

聚合查询

聚合函数

group by

having

联合查询

内连接

外连接

自连接

子查询

合并查询


数据库约束

创建表的时候制定的一些规则,在后续插入/删除/查询/修改都要遵循这个规则。

可以帮助校验数据,让数据正确性得到保证

约束类型

not null:

unique:

插入张三的数据后还能再插入张三的数据,在某些情况下是不允许的

加上unique就可以避免重复插入

 

default:

默认情况下默认值是null,对于指定列插入时,其他未被插入数据的列就会被设置为默认值

primary key:

主键,相当于给某列数据赋一个身份证号

注意:一个表只能有一个主键

主键不允许重复,那当我插入了很多个数据之后,想插入一个新数据,怎么保证它能不重复呢

MySQL为我们提供了一种机制:自增主键

这样的自增有什么用呢?

我们在插入id的时候可以设置成null,数据库可以帮我们自动转成1插入,后面再插入名字就依次递增(当然,自增的前提是这个数据类型是整型)

如果程序员手动指定了id插入数据,在下一次用null插入时会继续上一个id进行自增

而且这里的自增是不会重复利用之前的值的,当我们把id = 100和id = 101的行删掉之后,下一次插入id依旧在101的基础上自增到102

foreign key:

描述两个表之间的关系

 

从上面两张表我们发现王五同学不在班级表钟存在,所以这是一个不太科学的数据。如果希望学生表中的classId都要在班级表里面存在,就可以用外键约束来校验

前面的约束都是在定义表的时候,哪一列需要约束,就创建到哪一列的后面;

外键约束是写到最后的,把所有的列定义之后在最后面通过foreign key创建外键约束

这种情况下可以认为班级表约束了学生表,此时班级表被称为父表,而学生表被称为子表

1. 如果父表是空的,那么子表的插入操作会被认为错误

2. 通过外键约束之后,刚刚王五同学classId = 100 会被认为错误,无法插入 

3. 受外键约束后,不仅插入不科学数据不行,错误修改也不被允许

4. 不仅父表约束子表,子表也在约束父表

当我们想删除父表的一行数据的时候,如果子表有父表对应的数据就可能出现问题

5. 创建表时要给需要被引用的列后面加上索引,常见的方式就是加上主键,有了主键就会自动创建处索引


表的设计

根据需求,把需要的表设计出来的过程

(1)先根据需求,找到实体

(2)梳理清楚实体之间的关系

1.一对一

图书馆借阅系统,需要表示(概念)学生实体和账户,就要搞学生表和账户表来描述这些实体

一个学生可以有一个账户(学生不能注册小号,相当于游戏里防止你开小号炸鱼是一样的)

一个账户,也只能给一个学生使用(相当于游戏里禁止你代练一样)

这种关系就是1对1

方案1:两个表搞成一个表,学生账户表(accountId, accountName, password, ...)

方案2:分两个表,使用id建立练习

student(studentId, studentName,..., accountId)

account(accountId,username, password, ...)

2.一对多

一个班级可以包含多个学生,但一个学生只能从属于一个班级。这种关系就是1对多

方案1(不支持):

student(studentId, name,... )

class(classId, name, studentList)

因为MySQL不支持数组类型,所以方案1不支持

方案2:

class(classId, name)

student(studentId, name, classId)

3.多对多

一个学生,可以选择多门课程

一个课程,也可以被多个学生选择

student(studentId, name...)

course(courseId, name...)   

student-course(studentId, courseId)


增删查改进阶操作

1. 插入查询结果

insert into 表名 select * from 表2名

注意这里student查询出来的结果结合,列数/类型要和student2表结构匹配


2.查询

聚合查询

查询带表达式:只能拿着某几个来查询

聚合查询:进行“和行”之间的运算,但是只能通过聚合函数来操作

聚合函数

我们客户端里面出现的这个行数不是由聚合函数得来的,如果是编程操作还是得使用聚合操作比较方便,因为聚合函数可以进行一些条件的判断

count操作

上面这个操作先执行select * from student2,再用count进行计数

⚠使用count(*)与使用count(列名)大部分情况没啥区别

⚠使用count(*)的时候即使全是null的行也会记录下来

sum操作

我们试试看sum(name)会怎么样

会报警告:代码有问题但是不影响程序能跑

sql很多时候会把字符串转成数字来进行算术运算,但是上面这些名字sql转不了数字

其他的聚合函数例子

使用聚合函数的时候,列和列之间的顺序已经被打散了,所以大部分情况聚合的列和非聚合的列不能在一起使用,除非下面的操作

group by

把所有的行分成若干组,每个组分别进行聚合

这里的role就是没有使用聚合函数的列 

having

分组之前的条件使用where

现在统计每个岗位的平均薪资,但是刨除“李四”

这种情况属于先刨除再分组

分组之后的条件使用having

统计每个岗位的平均薪资,抛出平均薪资>20000的情况(这个时候就一定得先分组计算平均薪资后,才能按条件刨除)


联合查询

多张有关系的表一块查询,核心是笛卡尔积的计算方法

笛卡尔积得到的是一张更大的表

该表的列数是之前两张表列数之和

该表的行数是之前两张表行数之积

如果是三张或者以上的,就得两两进行笛卡尔积

这样制造出笛卡尔积之后就方便我们比较哪个同学属于哪个班

但是怎么筛选出正确的数据呢?

这里的"."可以理解成“的”,where带的条件称为连接条件

一般多表联合查询的步骤:

(1)笛卡尔积

(2)指定连接条件

(3)指定其他条件

(4)针对列进行精简/表达式运算/聚合查询


内连接

现在有下面的四张表

学生表

 

班级表

 

课程表

分数表

(1)查询许仙同学成绩

先笛卡尔积,把学生表和分数表联合起来

发现足足有160行

接着指定连接条件,精简结果

再根据需求(找许仙同学)指定其他条件

最后针对上面的列进行精简

另一种联合方法

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

(2)查询所有同学的总成绩,及同学的个人信息

省略步骤了直接跳到最后一步

(3)查询出每个同学,每个课程的成绩

需要三个进行笛卡尔积,可以理解成

student和score先进行笛卡尔积,连接条件student.id = score.student_id

上述结果再和course表计算笛卡尔积,连接条件score.course_id = course.id

其实用join on来写更清楚


外连接

多数情况,内外连接查询结果没区别

外连接分为左外连接,右外连接

现在重新创建学生表和分数表

外连接写法

现在修改这两个表的数据,使其不再一一对应

对于内连接,得到的结果是两个表共有的数据

左外连接以左表为主,会保证左侧表的数据都体现在最终结果里,如果这个记录右表里面没有匹配的,以null代替 

右外连接和左外连接相反,保证右表的数据

 

⚠MySQL不支持全外连接


自连接

同一张表,自己和自己进行笛卡尔积。

条件查询只能在列和列之间查询,但是我们在特定情况下要针对行进行查询,我们就可以用自连接把行关系转成列关系

这里需要进行二者的比较需要把行转成列才方便比较

 

我们不能直接用score自己给自己笛卡尔积,而是要给他起个别名

指定连接条件

筛选出左表为3,右表为1的所有记录

最后调整


子查询

就是套娃,把多个简单的sql语句合并成一个复杂的sql语句

太套娃了就不演示


合并查询

把两个查询的结果集合合并成一个集合

使用union关键字

select 1 union select 2;

这里其实使用or就行,但是在查询两张不同的表时就只能用union

而且union有去重的功能,但union all不会去重

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

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

相关文章

在Windows 10或11中,复制和粘贴不起作用,不一定是键盘的问题

以下建议将帮助你解决复制和粘贴无法正常工作的问题。 以下提示主要适用于Windows 10和Windows 11,但也可能解决旧版本Windows上的复制和粘贴问题。 为什么我的复制粘贴不起作用 复制和粘贴不起作用的问题可能以以下方式之一出现。 其他正在运行的应用程序或进程可能会使用…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

生成式人工智能笔记-AIGC笔记

生成式人工智能笔记-AIGC笔记 十多年前,人工智能还只是一个不被人看好的小众领域,但是现在,它却已经成了街头巷尾的热点谈资,几乎任何事情都可以和人工智能联系在一起。 人工智能包括基础层、技术层和应用层。 基础层是人工智能…

收藏!当今最流行的10 种人工智能算法

人工智能的概念始于1956年的达特茅斯会议,由于受到数据、计算力、智能算法等多方面因素的影响,人工智能技术和应用发展经历了多次高潮和低谷。 2022年以来,以ChatGPT为代表的大模型一夜爆火,它能够基于在预训练阶段所见的模式和统…

Python中如何判断List中是否包含某个元素

更多资料获取 📚 个人网站:ipengtao.com 在Python中,判断一个列表(List)是否包含某个特定元素是常见的任务之一。在本文中,将深入探讨多种判断List成员包含性的方法,并提供丰富的示例代码&…

二、C#笔记

/// <summary> /// 第三章&#xff1a;方法和作用域 /// </summary> namespace Chapter3 { class Program { public static void Main(string[] args) { //3.1创建方法 Console.WriteLine($"{addValues(1, 2…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列&#xff08;day 13&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

UVa133救济金发放题解

题目 题目描述 n(n<20)个人站成一圈&#xff0c;逆时针编号为 1~n。有两个官员&#xff0c;A从1开始逆时针数&#xff0c;B从n开始顺时针数。在每一轮中&#xff0c;官员A数k个就停下来&#xff0c;官员B数m个就停下来&#xff08;两个官员有可能能停在同一个人上&#xff…

solidity案例详解(六)服务评价合约

有服务提供商和用户两类实体&#xff0c;其中服务提供商部署合约&#xff0c;默认诚信为true&#xff0c;用户负责使用智能合约接受服务及评价&#xff0c;服务提供商的评价信息存储在一个映射中&#xff0c;可以根据服务提 供商的地址来查找评价信息。用户评价信息&#xff0c…

添加新公司代码的配置步骤-Part1

原文地址&#xff1a;配置公司代码 概述 我们生活在一个充满活力的时代&#xff0c;公司经常买卖子公司。对于已经使用 SAP 的公司来说&#xff0c;增加收购就成为一个项目。我开发了一个电子表格&#xff0c;其中包含向您的结构添加新公司代码所需的所有配置更改。当然&…

c++算术生成算法二

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<functional> #include<vector> #include<algorithm> #include<numeric>//算术生成算法头文件 #include<string> #include<ctime> using namespace std; set_intersec…

虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO创建VDO设备以节约硬盘空间 了解什么是VDO VDO全称是Virtual Data Optimize&#xff08;虚拟数据优化)&#xff0c;主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2&#xff0c;大小都是10G。file1和 f…

第63天-django学习(十二)

补充模块importlib 介绍 importlib模块是Python中用于动态加载和导入模块的内置模块。它提供了一组函数和类&#xff0c;使得我们可以在运行时根据需要加载模块&#xff0c;并且可以对已导入的模块进行操作和管理。 动态加载模块 # 导入模块 &#xff1a; 动态加载一个模块 i…

java学习part40collections工具类

162-集合框架-Collections工具类的使用_哔哩哔哩_bilibili 1.collections工具类 感觉类似c的algorithm包&#xff0c;提供了很多集合的操作方法 2.排序 3.查找 4.复制替换 5.添加&#xff0c;同步

Dockerfile详解#如何编写自己的Dockerfile

文章目录 前言编写规则指令详解FROM&#xff1a;基础镜像LABEL&#xff1a;镜像描述信息MAINTAINER&#xff1a;添加作者信息COPY&#xff1a;从宿主机复制文件到镜像中ADD&#xff1a;从宿主机复制文件到镜像中WORKDIR&#xff1a;设置工作目录 前言 Dockerfile是编写docker镜…

TensorRT之getBindingIndex

在使用 TensorRT&#xff08;NVIDIA 的推理引擎&#xff09;时&#xff0c;getBindingIndex 是一个用于获取绑定索引的函数。TensorRT 将输入和输出张量绑定到引擎的输入和输出索引上。getBindingIndex 函数用于检索给定名称的输入或输出张量在引擎中的索引。 int getBindingI…

【Python百宝箱】极客之选:掌握Python内外库的进程管理技巧

Python系统编程大揭秘&#xff1a;掌握操作系统接口、进程管理与系统信息 前言 在当今软件开发领域&#xff0c;系统编程是一项至关重要的技能&#xff0c;尤其是在涉及到操作系统接口、进程管理以及系统信息的处理时。Python作为一门强大而灵活的编程语言&#xff0c;提供了…

马克思主义原理期末复习大题

导论: 1.什么是马克思主义?马克思主义具有哪些基本特征? 马克思主义是由马克思和恩格斯创立并为后继者所不断发展的科学理论体系,是关于自然,社会和人类思维发展一般规律的学说,是关于社会主义必然代替资本主义,最终实现共产主义的学说,是关于无产阶级解放,全人类解…

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步&#xff0c;slow依然指向head&#xff1b;然后fa…