子查询是一种嵌套在其他SQL(增、删、改、查)里的查询
子查询返回单条单列,显而易见,单行单列即为一个值,这个值可以用来当筛选当中的值使用,只不过得加上括号。
例:
查询“计算机工程系”有哪些专业。
SELECT
MajorName
FROM
major
WHERE
DepartmentID = (SELECT
DepartmentID
FROM
department
WHERE
DepartmentName = '计算机工程系');
在where
里面,我们DepartmentID
判断等于的,不是直接的一个值,而是用department
筛选出来的一个值,从而进行再次的筛选。这就是我们所说的 子查询返回单条单列
其中
(SELECT
DepartmentID
FROM
department
WHERE
DepartmentName = '计算机工程系')
在这里,符合DepartmentName = '计算机工程系'
筛选出来,出来一个筛选出一个值,然后用于where
筛选。
子查询返回多条记录,和子查询返回单条单列用法本质上是一样的,都是筛选出数据,然后再供使用。
例:
查询CourseID10101,ExamScore为98分的学生的学生信息。
SELECT *
FROM
student
WHERE
StuID =
(SELECT
StuID
FROM
score
WHERE
ExamScore = 98 AND
CourseID = 10101);
**我们想要找到题目当中的数据,但是图中明显不是两个表,而且还需要筛选数据才能得到想要的表,所以我们就用到了 子查询返回多条记录 ,上面的代码,后面括号内的代码,是筛选过的StuID,从而再进行对studen表的筛选。CourseID10101,ExamScore为98分为筛选出来的数据,所以在表中,我们进行了ExamScore = 98 AND CourseID = 10101
。
在 子查询返回多条记录 中,我们会使用到以下运算符:IN,ANY | SOME,ALL
子查询返回多条记录多列查询 可以把筛选出来的数据当成表使用,也可以当成条件使用,可以根据具体情况而改变。
例:
查询周一有课的班级,班级编号,多少节课。
SELECT
a1.ClassName,
a2.ClassroomID,
a2.Weekday,
a2.Part
FROM
class a1,
(SELECT
ClassID,
ClassroomID,
Weekday,
Part
FROM
teachingcourse
WHERE Weekday = 'mon') a2
WHERE
a1.ClassID = a2.ClassID;
在这里a2是筛选完条件的表,筛选的条件是周一有课,然后和class表建立连接,查询出想要的数据。
如若对表与表的连接,不是很熟悉,看官可先参考---->>join多表查询
重要性:
信息查询,检索是软件系统中应用最广泛的操作,而查询速度的快慢将直接影响软件系统的型能和用户的体验。
可以利用索引和表分区提高查询性能。索引是提高数据检索的有效手段对于任何DBMS(数据库管理系统),索引都是进行优化的主要因素。
数据量小时,效果不明显,数据量大时,效果就明显了。
通俗来说:数据库索引就好比一本字典,如果没有索引,想要找的话就得一页页的翻找,如果有了索引,就如同有了目录,加快了查找的速度。
以字典为例,你想找第八课,你如若翻到了第五课,则需要继续往后翻,如果翻到了第十一课,则需要往回翻。
优缺点
还是以字典为例,你想找一个为green的单词,你翻到了字典的目录,是按照单词首字母排序的,需要先找到G,任何再找到green。对应就会有页数。
特点:
索引用的数据结构是b+tree,b是balance成为平衡树,是二叉树基础上衍生出的结构。
可以图像化理解的网站---->图像化理解二叉自平衡二叉查找树(AVL 树)
特点
格式:
CREATE [unique|fulltext|spatial]
INDEX
索引名 [using btree|hash]
ON
表名(字段名[(length)] [asc|desc] );
其中的可选为:
例:
给score表中的StuiID建立索引
CREATE INDEX idx_stuid ON score(StuID);
问题来了,建立完索引之后,如何查看自己的索引,或者如何检查自己建立没建立索引呢?
语法如下:
SHOW INDEX FROM 表名;
例如我们现在要查询studen表里面的索引:
这是一个字段名建立索引的方法,还有就是,两个字段名一起建立索引,这里我们需要格外的注意字段名的顺序,不然的话,就会造成无法查询等一系列问题。
语法格式如下:
CREATE [unique|fulltext|spatial]
INDEX
索引名 [using btree|hash]
ON
表名(字段名[(length)],字段名[(length)] [asc|desc] );
由于和单个创建索引一样,这里就不一样详述了,切记一定要记住顺序问题。
如若用(字段名1,字段名2)两个字段名建立索引,则:
建立索引已经学会了,也学会了如何检查有没有索引,接下来该查看查询的时候是否使用索引了。
直接在select前面添加explain
对,就是这么简单,记住explain关键字就可以了。
例:
从图中我们可以看出来,查询时没有使用索引,这是为什么呢?
因为用模糊搜索,前面带%的不使用索引。这个得记住,不然如果面试有咋办。
格式:
ALTER TABLE
表名
ADD INDEX [索引名] [索引类型](索引字段);
在其中有着多种形式,比如主键,唯一性,外键等,格式如下:
主键:
ADD [constraint 约束名] PRIMARY KEY [索引类型](主键字段)
唯一性
ADD [constraint 约束名] UNIQUE [索引名] [索引类型](唯一键字段)
外键
ADD [constraint 约束名] FOREIGN KEY [索引名] (外键字段) REFERENCE...
部分笔记来自老师授课的教案:番茄发烧了
尾记:编程我也是初学者,难免有写错的地方,希望大家看完之后,发现错误可以评论出来,谢谢大家