数据库的基本操作(5)

news2024/12/23 13:32:30

先回顾一下在上一篇中的内容:

聚合查询:行和行之间的数据的加工。

聚合函数:count,avg,sum......

group..by...进行分组,将指定列的值进行分组,将相同的记录合并到一个组中。每个组还可以进行聚合查询。

分组还可以指定条件进行筛选,如果是分组之前指定条件可以使用where,分组之后指定条件可以使用having。

联合查询(多表查询)和前面的单表查询相对应,主要操作是笛卡尔积。

昨天提到看了联合查询中的内连接和外连接,下面开始今天的新的内容。

一.自连接

自连接,是把自己和自己进行笛卡尔积,属于是一种比较特殊的方法,回忆一下以前的操作都是列和列之间进行的操作,但是自连接的本质是把行和行之间的比较条件转换成列和列之间。

下面我就用一个具体的例子来描述一下自连接。

先看一看数据:

 

数据跟上一次的数据是一致的,就不具体展示各个table的类型了。

题目为:显示所有“计算机原理”成绩比“Java”成绩高的成绩信息 

在这个问题中,可以看到,在这里的条件是按照行的方式来排列的,为了解决这个问题就需要把行给转换成列。

 不确定是否可以看清楚我将代码打在下面:

select * from score as s1,score as s2 where s1.student_id=s2.student_id and s1.course_id=1 and s2.course_id=3 and s1.score<s2.score

讲一下我的思路,首先是通过自连接来使得行变成列,为了防止重名,所以将score表变成了s1和s2,之后根据数据发现我们需要把留下来的数据需要满足以来几个条件:

1.是同一个学生,所以就有了s1.student_id=s2.student_id

2.我们需要比较的是计算机原理”成绩比“Java”成绩高,所以只要保留计算机原理这门课以及java这门课,通过查询可以知道java的课程id为1,计算机原理的id为3,所以就有了s1.course_id=1 and s2.course_id=3这行代码。

3.为了满足计算机原理”成绩比“Java”成绩高,所以有了s1.score<s2.score。

4.为了精简表,之后将原代码中的*改成了s1.student_id,s1.score,s2.score。

之后修改的代码为:select s1.student_id,s1.score,s2.score from score as s1,score as s2 where s1.student_id=s2.student_id and s1.course_id=1 and s2.course_id=3 and s1.score<s2.score

二.子查询

我理解的子查询就相当于是一个套娃,子查询就是将拆分好的代码再合并到一起。

下面我们就用几个例子来简单的认识一下什么是子查询。

2.1.单行子查询

查询与“不想毕业” 同学的同班同学

一般来说我们做这个题目的思路如下:

 首先我们需要知道这个同学的班级是哪个,之后需要了解这个班级里面有谁。

但是子查询的代码如下:

 直接将两个步骤转换成了一行代码来进行编写。

这个看起来不复杂,是因为这个只是两个sql合在一起,但是当个数多了之后会发现这个是一个很复杂的工程,所以一般来说不推荐使用该操作。

2.2.多行子查询

有的时候子查询可能会查询出多条记录,就不能直接使用=,需要使用到in这样的一些操作。

下面用一个具体的例子来演示一下:

案例:查询“语文”或“英文”课程的成绩信息

按照题目要求,我们的思路应该是先找到语文和英文的课程id,之后根据课程id来找到相应的成绩信息。

下面先用简单的方法来解决一下这条题目

之后用子查询的的方法为:

 三.合并查询

 合并查询就是将多个查询语句的结果合并到一起,通过union把两个sql的查询结果合并到一起,合并的前提是两个sql查询的列是向对应的。

下面用一个例子来演示一下:

案例:查询id小于3,或者名字为“英文”的课程:

 当然,这一题也可以用其他的方法来实现:

但是使用or的时候你需要保证是再通用一个表中,但是用union的时候可以不是同一个表,只要使得sql查询的列是向对应的就可以了。

 当然,除了union还有一个union all,这两者的区别在于union会自动去重,但是union all不会进行自动去重。

四.MySQL的索引和事务

前面讲的sql的这些东西都是属于操作层面的,mysql的索引和事务是属于mysql原理层面的东西,面试容易考

4.1.索引

4.1.1.索引的介绍

mysql的索引其实就相当于一本书的目录当我们需要再数据库中进行查找的时候,比如说id=100,查找可以通过遍历表来实现,但是当表里面的数据特别多的时候,遍历表的操作就会比较低效。就需要尽可能的想办法避免遍历,可以通过一些特殊的数据结构,来表示一些记录的特性,通过这些特性来减少比较的次数,增加比较的效率。

索引的主要意义解释进行查找,要提高效率,但是再提高的同时,也会付出一些代价。

索引的好处:

数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
索引所起的作用类似书籍目录,可用于快速定位、检索数据。
索引对于提高数据库的性能有很大的帮助。

索引的坏处:

占用了更多的空间

拖慢了增删改的速度

4.1.2.索引的使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
数据量较大,且经常对这些列进行条件查询。
该数据库表的插入操作,及对这些列的修改操作频率较低。
索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

4.1.3.索引的使用

1.查看索引

show index from 表名;

 直接查看student表我们会发现,里面其实已经自带了一个索引,这个自带的索引其实就是primary key 这个主键约束带来的。

所以当我们进行查询的时候,如果查询条件指定了根据主键查询,这个时候的查询速度就会很快。

unique也是带索引的。

2.创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引

create index 索引名 on 表名(列名);

创建索引这件事是一个非常抵消的事情,尤其是当表里面已经有很多数据的时候,在以后的工作中,如果一个表中没有索引,你不要贸然去创建索引。

通过上述操作之后我们在通过查看索引会发现,我们新创建的索引已经被添加进入了。 

3. 删除索引

drop index 索引名 on 表名;

 4.2.“索引背后的数据结构”

面试的时候主要考的就是索引背后的数据结构。

索引,数据结构需要的是能够加快查找的速度。

下面来简单回顾一下我学习的一些数据结构,并且进行一些简单的分析:

首先先排除顺序表还有链表:因为对于这两个表来说,他们的查找其实就是遍历,我们这边的查找是按照值去进行查找,但是在顺序表还有链表中是根据下标来进行查找的,按照下标来访问元素不叫查找。

之后我们就会想到二叉树(搜索树)一般来说二叉树的时间复杂度是logn,最坏情况下是O(N),也就是单枝树,也就是链表,而我们要做的就是不让二叉搜索树变成单枝树。

AVL:要求任意节点左右子树高度不超过1;

红黑树:要求更宽松的平衡二叉树;

但是二叉树也不太适合,二叉树最大的问题就是当元素多了之后,高度就会增加,而高度就对应着比较次数,对于数据库来说,每次比较就意味着磁盘IO

哈希表也不是很适合,虽然哈希表的搜索速度很快O(1),但是只能针对”相等“进行判定,不能对”大于小于“,以及范围查找进行判定。

堆就更不适合作为索引了,因为堆只能找最大值或者最小值。

最适合做索引的。还得是树形结构,只不过不再是二叉树,当我们使用”多叉搜索树”,高度自然也就下降了。

在数据库中使用的这个多叉搜索树又不太一样,是一个很特殊的B+树(这个是数据库索引中最常见的数据结构)

数据库有很多种,每个数据库的底层有支持多种存储引擎(实现了数据具体按照啥结构来存储的程序)每个存储引擎数据的结构可能都不一样,背后的索引结构可能也不同。

要想了解B+树,需要先理解它的前身,B树(有的资料上也写作B-树)

下面用图像来表示一下B树;

在B树里面,B树的每一个接待你,都会村粗N个key值,N个key值就划分除了N+1个区间,每个区间都对应到一个子树;在B树中查找元素,过程就和二叉搜索树非常相似,先从跟节点出发,根据待比较的元素,确定一个区间,在确定区间的时候,二叉搜索树是每个节点搜索比较一次,比较的次数和高度相关,但是B树,高度是少了,但是每个节点比较多次。相对于比较次数来说,IO次数更关键的,是以节点为单位进行磁盘IO的

B树只是B+树的前身,B+树是在B树的基础上进行了一些更改。

下面我用图来表达一下B+树是什么样子的。

 B+树也是一个N叉搜索树,每个节点上都包含多个key值,每个节点如果又N个key,就分成N个区间,父节点的值,都会在子节点中体现,非叶子节点的每个值,最后都会在叶子节点中体现出来。父节点中的值,会作为子节点中的最大值(最小值),咱们这个图画的是最大值的情况,最下面的叶子节点,就会使用链表进行按照顺序连接。

从B树和B+树的介绍可以看出,B+树就是为了数据库索引量身打造的。

1.使用B+树进行查找的时候,整体的IO次数也会比较小

2.所有的查询到最后都会落在叶子节点上面,每次查询的IO次数都是差不多的,查询速度稳定

3.叶子节点用链表连接之后,非常适合进行范围查找

4.所有的数据存储(载荷)都是放在叶子节点上的,非叶子节点中会保存key值即可,因此非叶子节点整体占用的空间较小,甚至可以缓存到内存中

 

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

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

相关文章

Golang入门笔记(10)—— 包

使用包的原因&#xff1a; 1.不可能把所有的不同业务功能的函数都放在一个源文件中&#xff0c;这样不便于管理。通常的做法是&#xff1a;我们会把具有相同一些功能和业务的维度的函数&#xff0c;分门别类的放在不同的源文件中。 2.不同的包名&#xff0c;可以解决两个函数…

【SQL 中级语法 3】三值逻辑和NULL

普通语言里的布尔型只有true和false两个值&#xff0c;这种逻辑体系被称为二值逻辑。而SQL语言里&#xff0c;除此之外还有第三个值unknown&#xff0c;因此这种逻辑体系被称为三值逻辑&#xff08;three-valued logic&#xff09;。 为什么SQL语言采用了三值逻辑呢&#xff1…

java项目-第139期ssm博客系统-ssm毕业设计_计算机毕业设计

java项目-第139期ssm博客系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm博客系统》 该项目分为前台和后台2个部分。 前台不需要登录&#xff0c;游客都可以访问&#xff0c;并发表评论 管理员登录后可以进行文章的发表&#xff0c;分类&…

德鲁克《卓有成效的管理者》学习读书-总结

有幸学习了管理大师德鲁克先生的《卓有成效的管理者》&#xff0c;帮助学习者理清了在理论和实践之间建立桥梁&#xff0c;使其生根落地&#xff0c;开花结果&#xff1b;管理不是常识&#xff0c;管理是个实践学科&#xff0c;要不断温习&#xff0c;不断与领导同事联接&#…

人肠道宏病毒与其宿主和环境因素的关联分析

近期《Nature Communications》期刊上(IF17.694)发表的“Extensive gut virome variation and its associations with host and environmental factors in a population-level cohort”研究论文中&#xff0c;对从4198个个体的肠道宏基因组中获得的人类肠道病毒进行分析&#x…

PCB设计时如何选择合适的叠层方案

大家在画多层PCB的时候都要进行层叠的设置&#xff0c;其中层数越多的板子层叠方案也越多&#xff0c;很多人对多层PCB的层叠不够了解&#xff0c;通常一个好的叠层方案可以降低板子产生的干扰&#xff0c;我们的层叠结构是影响PCB板EMC性能的重要因素,下面我们以四层板和六层板…

刨根问底 Redis, 面试过程真好使

充满寒气的互联网如何在面试中脱颖而出&#xff0c;平时积累很重要&#xff0c;八股文更不能少&#xff01;下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把&#x1f525;。 在 Web 应用发展的初期阶段&#xff0c;一个网站的访问量本身就不是很高&#xff0c;直接使…

SRM供应商关系管理系统解决方案

SRM供应商关系管理系统解决方案供应商关系管理(SRM)软件的采购指南 什么是供应商关系管理(SRM)软件? 供应商关系管理(SRM)软件是一个通讯解决方案制造商、分销商和零售商的供应链。供应商管理用于将所有有关组织的供应商通讯和颜色编码索引卡片。现在SRM管理的数字由一个国家…

OOM内存溢出分析

Mat内存溢出dump文件分析工具http://www.eclipse.org/mat/downloads.php 模拟OOM Java 程序 package org.cj.oom;import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit;/*** 创建内存分析* java启动参数指定内存 -Xms1m -Xmx1m* author…

没有上司的舞会 - 树形DP

目录题目描述前言C代码题目描述 Ural 大学有 NNN 名职员&#xff0c;编号为 1∼N1∼N1∼N。 他们的关系就像一棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。 每个职员有一个快乐指数&#xff0c;用整数 HiH_iHi​ 给出&#xff0c;其中 1≤i≤N1≤i≤N1≤i≤N。…

ElasticSearch分布式搜索引擎安装保姆级教程

ElasticSearch分布式搜索引擎安装教程 一.Hr&#xff1a;ElasticSearch是什么&#xff1f; 答&#xff1a;Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#…

后端API接口性能优化的10种方案,真有用!

后端API接口性能优化的10种方案&#xff0c;真有用&#xff01; 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); } 优化后&#xff1a; batchInsert(transDetailList); 打个比喻&…

docker-compose的安装与卸载

compose项目是docker官方的开源项目,负责实现对Docker容器的快速编排 定位 定位是定义与运行多个docker容器的应用,同时可以对多个容器进行编排Compose 中有两个重要的概念&#xff1a; 服务 (service)&#xff1a;一个应用的容器&#xff0c;实际上可以包括若干运行相同镜像的…

电压跌落检测

1.前言 根据国际上较为权威的 IEEE 制定的标准可知&#xff0c;电压跌落是指电力系统中某点工频电压方均根值突然降低至 0.1p.u. ~ 0.9p.u.&#xff0c;并在短暂持续10ms~1min 后恢复正常的现象。在对电压跌落进行检测时一般都需要检测起止时刻、相位跳变、跌落深度这三个特征…

小啊呜产品读书笔记001:《邱岳的产品手记-03》第04+05讲 如何当好AI时代的产品经理 06讲 产品案例分析·TheGuardian的文本之美

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-03》第0405讲 如何当好AI时代的产品经理 & 06讲 产品案例分析TheGuardian的文本之美一、今日阅读计划二、泛读&知识摘录1、04讲 如何当好AI时代的产品经理&#xff1f;&#xff08;学习篇&#xff09;2、05讲 如何当…

07-服务管理-02-yum常用命令和yum源

文章目录1. yum常用命令1.1 安装卸载服务- 安装- 升级- 卸载- 清空缓存- 只下载不安装1.2 查看- 查看yum库- 列出所有包- 查看包信息- 查看文件所在包1.3 包组的使用2. 指定yum源3. 常用yum源1&#xff09;epel源2&#xff09;163源3&#xff09;阿里源4&#xff09;清华源4. y…

盘点实验室的----FITC-透明质酸;FITC-HA不同透明质酸分子量修饰

FITC(异硫氰酸荧光素)是一种胺活性衍生物的荧光染料&#xff0c;FITC 具有广泛的应用&#xff0c;作为抗体和其他探针标记&#xff0c;用荧光显微镜&#xff0c;流式细胞仪、免疫荧光方法如 ELISA 和 Western印迹实验。异硫氰酸荧光素(FITC)具有永久性标记生物分子的独特检测性…

【C++】构造函数、析构函数、拷贝构造函数

目录 构造函数 析构函数 拷贝构造函数 C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;它包含了数据表示法和用于处理数据的方法。类中的数据和方…

Nginx下载安装以及简单使用

本文来说下Nginx的下载安装以及常用功能的简单使用 文章目录下载nginx启动nginx关闭nginx下载nginx 下载地址:http://nginx.org/en/download.html 直接下载 nginx-1.18.0.zip&#xff0c;下载后解压&#xff0c;解压后如下 启动nginx 有很多种方法启动nginx (1)直接双击nginx.…

浅谈深度学习中的概率

摘要&#xff1a;本次就和大家聊一聊深度学习中的概率。本文分享自华为云社区《【MindSpore易点通】深度学习中的概率》&#xff0c;作者&#xff1a; chengxiaoli。 为什么会用到概率呢&#xff1f;因为在深度学习中经常会需要处理随机的数据&#xff0c;或者包含随机性的任务…