MySQL第六七弹,自连接等复杂查询,索引部分知识

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL第六七弹,自连接等复杂查询,索引部分知识

一、💛

自连接:自己和自己笛卡尔积(奇淫巧技,特殊场景很牛逼)

SQL:编写条件都是列和列之间的比较,但是SQL无法进行,行与行之间的比较。

如:显示所有java比计算机原理高的(就是偏爱java✨✨✨)

⚠️⚠️注意:自连接的多个表名不可以相同,所以需要给表名重命名

第一步是自连接(表太长的懒得截图,直接从第二步开始)

(select*from student as s1,student as s2;   重命名别忘啊)

第二步可以用学生id/课程id来精确范围(注意哈用学生的ID就相当于是一个学生针对课程的所有信息,👫👫肯定刚开撕有人和我有疑惑,为什么不是学生ID和课程ID同时筛选呢,因为我们的目的是把不同的科目放到不同的列,而不是把相同的科目放到不同列)

下图是错误的写法 ,把两个放到一起,正确的应该是第二个那个图片

第三步加上业务条件,让左侧表只保留course_id=2的记录同时,右侧表保留course_id=1

1-2 ,2-1 留一条就行,

现在是筛选出来了带java和计算机组成原理的,下一步就应该是去筛选哪个大,哪个小了

第四部筛选出java大于计算机组成原理成绩的人。

最后在对列进行精简,就完成了一次自连接

二、💚

子查询:属于是套娃操作(不常用,也不推荐用,了解即可)

正常推荐做法是分两步去完成:

假如说查找叫不想毕业的“同班同学”

首先找不想毕业,然后找他的同班同学,太过鸡肋了,就不拿代码实际操作具体说明了

正常情况:我么选择分两步完成

select classes_id from student where name!='不想毕业';

select name from student where class_id=1(和不想毕业这个同学同班的) and name!='不想毕业'

使用单行子查询:

select name from student where class_id=(select classes_id from student where name!='不想毕业')    and name!='不想毕业'

多行子查询:使用的是IN,EXIST(不介绍,一点用没有了解就好)

由此可见:使用子查询可读性低。

三、💜

化繁为简是我们的理念,'封装':当拆成多个小的模块之后,同一时刻只需要关注一个模块即可,不必考虑其他模块,让咱们的注意力能聚合在一个点上————模块之间的关系考虑的是高内聚,低耦合

四、💙

合并查询:把多个select查询到的结果集合,合并成一个集合

如下图是,把两个表相当于放一起了,还给他来了给类似于去重的操作

⚠️⚠️可以合并的前提,两个列的类型一定要对应

那我我么如何能够不去重,完整的显示全部捏?

只需要你在union后面写一个all即可

五、💖

⭐️ ⭐️ ⭐️(前面的总结非常重要)

聚合查询:多行进行运算,分组,聚合 :group by having

多表联合查询

(1).内连接:select *from 表1 join 表2 on连接条件

                    select*from 表1 ,表2 where连接条件

(2).外连接:select *from 表1 left join 表2 on 连接条件

                     select*from  表1 right join 表2 on 连接条件

(3).自连接:奇淫巧技

(4).子查询:不建议用(💩💩💩)


引言:数据库本身是很复杂的软件,mysql更是复杂里面的大哥,下面来说说面试的大哥之一。  ‘索引’

一、🌟🌟🌟

索引:如同你想的像是一本书的那种目录那样,是方便我们用于查找的

一个表里有很多数据,在查询表的时候,最基本的方式就是遍历表,一条一条的筛选。因此,给这个表来建立索引(以列为维度建立的)来提高查找速度

student  :id,name,qqmail classId

                 1  张三   ···省略

我们可以根据(id/name来进行筛选查找)

按照ID这一列建立索引:

在数据的情况下额外搞了一个空间,维护一些和ID相关的信息,这里就通过一些特定的数据结构,来去维护,表示ID相关的索引情况。

id:1->表中某个位置(id:2也是某个位置),后续再按照id查询就不需要直接遍历了,而是在索引中查询·根据索引就能初步锁定出数据所在的位置。(如果是id索引,那么你拿name也无法提高效率)

二、✨✨✨

索引的优缺点:

优点:(1).可以用来去提高查询的效率

缺点:(1).消耗额外空间

           (2).有可能拖慢增删改的速度(提升了查呗,新增这种往里面插入数据的还好一点,删除,修改,如果删除修改的是带索引的还可以快一点,但假如涉及到索引的删除和修改,同时也要维护索引

肯定是有代价,但也肯定是值的

这种带索引的就像是教务系统:多查,少改(期末之类的才去改东西)

三、💫💫💫

在SQL中如何使用索引呢

1.查看索引:show index from 表名,下面的这个就没有索引

那么什么是有索引的呢,我们之前说过(unique ,primary key,和具有外键约束的表是自己就带索引的)

primary key(再说一遍是非空,并且不可以重复的意思

外键约束会产生索引的原因:

父类的ID要+unique或者primary

(原因:索引!!

我们在设置外键的时候就会导致操作子表中,频繁查父表,这一个操作,非常耗时间,为了加快查询速度,如果父亲表中(ID这一列就索引就会非常香,primary,unique自带索引),因此约定:没有索引,不能建立这样的外键)

插入或者修改自表中受约束来的数据,就必须保证,插入/修改后的结果,必须要在父表中存在。  

————————————————

版权声明:本文为CSDN博主「轮到我狗叫了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_72953218/article/details/132000951

!!

👳😁

2.创建索引:

手动给指定的列创建索引:create index 索引名 on 表名(字段名)

如:create index idx_student_name on student(name);

⚠️注意: 只有下划线,没有英文的-这个横线,是不可以的。

补充:创建索引操作,可能十分危险,(设计表的时候尽量提前考虑好那些列要有索引,如果表是空的或者表里包含数据本身就不多,创建索引没事,但是如果表非空,并且里面包含非常多的数据,创建索引会引起大规模的硬盘IO操作,会导致数据库卡死。

👧😁

3.删除表中的索引:

drop index 索引名字 on 表名   创建的才可以删除,主键,unique,外部约束的不受删除影响,当然了删除索引也是很危险的操作

🐬🐟 🐳

4.场景思考:

如果实在是要给一个很多数据的表 创建/删除/索引,并且这个数据库还是生产环境的数据库,怎么办呢?

一般一架民用飞机有两个发动机,发动机A和B,那么我么如何更换B发动机呢(飞机正在飞的情况下)?(两个发动机有一个运作,就可以支持飞机的飞行)

——👊 👊 ✊

一般数据库服务器也往往不是单台服务器,为了整个系统的可靠性,通常搞多个mysql服务器节点,这些节点往往数据相同,能够提供相同服务(如果某个挂了,也不会影响大况),那么我们只要准备一个新的MySQL服务器,把表和索引都创建好,然后把数据导过来,再把替换的mysql服务器关闭,把新的mysql服务器换上就好了


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
40 9
|
7天前
|
安全 关系型数据库 MySQL
【赵渝强老师】MySQL的连接方式
本文介绍了MySQL数据库服务器启动后的三种连接方式:本地连接、远程连接和安全连接。详细步骤包括使用root用户登录、修改密码、创建新用户、授权及配置SSL等。并附有视频讲解,帮助读者更好地理解和操作。
|
11天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
37 3
|
17天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
81 1
|
21天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
18天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
38 1
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
18天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
30 0
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
23 4