MySQL基础学习6

子查询

子查询是一种嵌套在其他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

  • in:代表集合,为存在于这个集合里面。
  • any:<any代表小于里面的一个数值,<any代表大于里面的一个数值,=any和in的效果一样(有一个就行)
  • all:<all代表小于里面的所有数值,<all代表大于里面的所有数值,=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(数据库管理系统),索引都是进行优化的主要因素。
数据量小时,效果不明显,数据量大时,效果就明显了。
通俗来说:数据库索引就好比一本字典,如果没有索引,想要找的话就得一页页的翻找,如果有了索引,就如同有了目录,加快了查找的速度。

聚簇索引

以字典为例,你想找第八课,你如若翻到了第五课,则需要继续往后翻,如果翻到了第十一课,则需要往回翻。

  • “聚簇索引”默认为主键,如果没有主键,则会选择一个唯一的非空的索引代替,如若还是没有,则会隐式定义一个主键来作为“聚簇索引”。
  • “聚簇索引”是不能选择的,他的索引号(第八课)和对应的记录(内容)是存在一起的。

优缺点

  • 优势:为主键为自增时,做按主键的范围查询
  • 缺点:通常按主键,主键如果是uuid

非聚簇索引

还是以字典为例,你想找一个为green的单词,你翻到了字典的目录,是按照单词首字母排序的,需要先找到G,任何再找到green。对应就会有页数。

索引的数据结构分类

B+TREE

特点:

  • 普通索引
  • 唯一性索引:普通索引+字段取值必须唯一
  • 主键自带索引
  • 联合索引(多列)

索引用的数据结构是b+tree,b是balance成为平衡树,是二叉树基础上衍生出的结构。

可以图像化理解的网站---->图像化理解二叉自平衡二叉查找树(AVL 树)
图像化理解自平衡二叉查找树(AVL 树)

HASH索引

特点

  • 很快,占内存,不适合做范围查找其他。

可以图像化理解的网站---->图像化理解哈希表)
图像化理解哈希表

其他类型
  • r-tree:针对几何图形
  • 全文索引:针对大文本,比%模糊

索引的建立

create index 语句创建索引

格式:

CREATE [unique|fulltext|spatial] 
INDEX 
	索引名 [using btree|hash] 
ON 
	表名(字段名[(length)] [asc|desc] );

其中的可选为:

  • [unique|fulltext|spatial] :索引类型
  • [using btree|hash]:索引的数据类型
  • length:表示使用索引列的前多少个字符创建索引
  • [asc|desc]:表示索引字段值的排序顺序,省略时默认为 asc 升序排列

例:
给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)两个字段名建立索引,则:

  1. 按字段名1单列查的问题。
  2. 按字段名1,字段名2双列一起查的问题。
  3. 不能解决按字段名2单列查的问题。

建立索引已经学会了,也学会了如何检查有没有索引,接下来该查看查询的时候是否使用索引了。

直接在select前面添加explain

对,就是这么简单,记住explain关键字就可以了。
例:
explain关键字
从图中我们可以看出来,查询时没有使用索引,这是为什么呢?
因为用模糊搜索,前面带%的不使用索引。这个得记住,不然如果面试有咋办。

alter table语句创建索引

格式:

ALTER TABLE 
	表名 
ADD INDEX [索引名] [索引类型](索引字段);

在其中有着多种形式,比如主键,唯一性,外键等,格式如下:

主键:
ADD [constraint 约束名] PRIMARY KEY [索引类型](主键字段) 
唯一性
ADD [constraint 约束名] UNIQUE [索引名] [索引类型](唯一键字段)
外键
ADD [constraint 约束名] FOREIGN KEY [索引名] (外键字段) REFERENCE...


部分笔记来自老师授课的教案:番茄发烧了

尾记:编程我也是初学者,难免有写错的地方,希望大家看完之后,发现错误可以评论出来,谢谢大家

发布了12 篇原创文章 · 获赞 101 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lolly1023/article/details/105282863