一、💛
自连接:自己和自己笛卡尔积(奇淫巧技,特殊场景很牛逼)
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服务器换上就好了