Mysql的连接、子查询
前几天我们介绍Django的数据操作,写完那篇文章之后我就开始想到我之前学的mysql操作了,感觉熟悉又陌生。是时候找个机会把它复习巩固一下了,不然就会忘了之前的所学内容了。但由于Mysql的内容有些多,今天就复习一下数据库的连接、子查询、索引吧。
1.连接
我在这里给大家举个例子:
我这里有两个表,一个是学生表,一个是班级表,要想使这两个表联合起来,就需要进行连接查询。
表结构如下:
class表;
student表;
内连接 inner join on
要想把两个表合并倒一块,就需要进行如下操作。
SELECT * FROM student INNER JOIN class ON student.id =student_id;
结果输出:
左连接:left join on
连接的两张表中以左侧的表为准,右侧的表匹配左侧的表,如果有左侧数据没有对应右表,则显示null.在这里的意思是,如果有学生还没加入班,那右侧班级数据显示Null.
右连接:
和左连接意思相近,我这里就不作赘述了。
全连接:
我在这里只举了左连接的例子,大家可以根据我的表去实践一下。或者自己创建表实际一下,我在这里就不作赘述了。
2.子查询
in 将一个查询语句嵌套到另一个查询语句中
在子查询中需要注意的是,嵌套的语句一般根据外键查询符合某种条件的id,外语句通过id查询需要的结果。要查询的字段一般都写在外语句。
这里我们查询:班主任是杨丽萍的学生的名字
1.先查询杨丽萍学生的id
SELECT student_id FROM class WHERE boss='杨丽萍'
2.再根据学生id去查询相应的名字。
SELECT `name` FROM student WHERE id
3.将两个条件用in 进行结合
SELECT `name` FROM student WHERE id IN (SELECT student_id FROM class WHERE boss='杨丽萍')
结果输出:
3.索引
- 概念
索引在MySQL中是一种“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的检索性能,非常关键,尤其是当表中的数据量越大,索引对于性能的提升越显得重要。
索引优化是对查询性能优化最有效的手段。索引能够轻易将查询性能提高好几个数量级。索引相当于书的目录,要查某一部分的内容,如果不使用目录,则需要从几百页中逐页去查,这个开销是巨大的。
2.索引方法
mysql的索引方法有两种,一种是BTREE,一种是HASH. B树索引是主流使用,一般都选择这个。hash索引有很多的约束,比如Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询,还有Hash 索引不能利用部分索引键查询。
3.索引类型
Normal 普通索引:这个是最基本的索引,大多数情况可以用这个。
创建方式: CREATE INDEX 索引名ON `表名`(`字段`);
Unique 唯一索引: 唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值。例如身份证号、学号等
创建方式:CREATE UNIQUE INDEX 索引名 ON `表名`(`字段`);
Full Text 全文索引:表示全文收索,在检索长文本的时候,效果最好,短文本建议使用Index,例如用于搜索很长一篇文章
创建方式:CREATE Full Text INDEX 索引名 ON `表名`(`字段`);
4.使用索引
一开始我也在找索引的使用方法,然后找不到。到最后才发现,索引对用户是透明的,它的使用方式就和咱们平常的方式一样。具体的执行过程由数据库内部的数据引擎来做。
例子:CREATE INDEX id_Index ON `student`(`id`);
select * from student where id= 1;
这里就用了索引,只是我们感觉不到。
:
(这是原始表)
(这是创建索引)
5. 索引优点
建立索引可以大大提高检索的数据,以及减少表的检索行数
查询中使用索引 可以提高性能
在表连接的连接条件 可以加速表与表直接的相连
6.索引缺点
索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
当数据进行增删改操作时,还需要对索引进行维护,这样就会降低了数据的维护速度。
7.索引注意事项
在经常需要搜索的列上,可以加快索引的速度
主键列上可以确保列的唯一性
不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
定义为text和image和bit数据类型的列不应该增加索引,