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

一、

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

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

如:显示所有java比计算机原理高的(就是偏爱java✨✨✨)MySQL第六七弹,自连接等复杂查询,索引部分知识_第1张图片

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 二、

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

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

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

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

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

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查询到的结果集合,合并成一个集合

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

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

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

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

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

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

五、 

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

聚合查询:多行进行运算,分组,聚合 :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 表名,下面的这个就没有索引 

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

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

​​​​​​​MySQL第六七弹,自连接等复杂查询,索引部分知识_第11张图片

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

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

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

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

插入或者修改自表中受约束来的数据,就必须保证,插入/修改后的结果,必须要在父表中存在。  
————————————————
版权声明:本文为CSDN博主「轮到我狗叫了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_72953218/article/details/132000951

!!

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

 

 2.创建索引:

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

如:create index idx_student_name on student(name);

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

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

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

3.删除表中的索引:

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

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

 

4.场景思考:

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

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

—— ✊

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

你可能感兴趣的:(mysql,数据库)