数据库part3---表关联、索引、视图
表关联
表关联用来查询多个表的数据,关联的表之间必须有相同的字段,一般使用表的主键和外键来关联
表关联分为以下几种类型
内连接 | INNER JOIN | 只返回两个表都有的数据 |
左连接 | LEFT JOIN | 返回左表中所有的数据和右表中匹配的数据,右表中没有的数据使用NULL填充 |
右连接 | RIGHT JOIN | 返回右表中所有的数据和左表中匹配的数据,左表中没有的数据使用NULL填充 |
比如
游戏表中玩家应该装有装备
我们先来看看装备表的结构
分别是装备的ID、名称、所属玩家的ID
DESC equip
INNER JOIN - 内连接
是使用INNER JOIN来指定关联的表
然后ON 关键字后是两个表中关联的字段
SELECT * FROM player
INNER JOIN equip
ON player.id = equip.player_id
LEFT JOIN - 左连接
返回左表中所有的数据和右表中匹配的数据,右表中没有的数据使用NULL填充
SELECT * FROM player
LEFT JOIN equip
ON player.id = equip.player_id
结果包含了玩家表所有的信息并且这时候是附带上玩家的装备的信息的
有装备的话就会显示装备信息,没有装备的话就会显示NULL
RIGHT JOIN - 右连接
返回右表中所有的数据和左表中匹配的数据,左表中没有的数据使用NULL填充
SELECT * FROM player
RIGHT JOIN equip
ON player.id = equip.player_id
结果中包含了装备表的所有的数据,然后是附带上有对应装备的玩家的信息
然后我们也能看出有装备是有没有被装备上的
即没有对应关系的玩家信息部分会使用NULL来填充
除了join和on关键字我们还可以使用,以及where来进行关联表查询
我们可以看出两段语句返回的结果是一致的
而且我们可以在表明后面加上别名
后面我们就可以直接用别名来代替原来的表名
像这样
SELECT * FROM player p , equip e
WHERE p.id = e.player_id
索引
索引是一种用来提高查询效率的数据结构
它可以帮助我们快速地定位到我们想要的数据
如果没有索引的话,通常是从头开始遍历数据
CREATE INDEX - 创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_nameON tbl_name (index_col_name,...)-- UNIQUE 表示唯一索引
-- FULLTEXT 表示全文索引
-- SPATIAL 表示空间索引
创建索引的语法和格式
CREATE INDEX 索引名称 on 表名(要在哪张表上创建索引)(一个或多个字段名(我们要对哪些字段创建索引,通常对一张表的主键字段或者经常用来查询的字段来创建索引(相当于where后面的查询字段)))
随机生成了两张表一张是fast一张是slow,两张表的数据是一样的,都有2000万条数据
所以后面我会对fast表创建索引,而slow表不创建索引,两个表做查询效率比较
给fast表创建索引
create index email_index on fast(email)
SHOW INDEX FROM - 查看索引
show index from fast
对slow表进行查询
select * from slow where email like 'abcd%' ORDER BY id
用时5.195秒
对fast表进行同样的查询
瞬间就完成了,只用了0.001秒
这就是索引带来的查询效率的提升
DROP INDEX - 删除索引
drop index email_index on fast
再来查询以下还有没有索引
可以看到已经被删除了
而且我们还可以在修改表的结构时来创建索引
ALTER TABLE player add INDEX email_index (email)
也可以在建表语句中直接指定一个索引
CREATE TABLE player123(email VARCHAR(100),INDEX email_index (email)
)
视图
是一种虚拟存在的表,它本身并不包含数据,而是作为一个查询语句,保存在数据字典中,当我们查询视图的时候,它会根据查询语句的定义,来动态地生成数据。
CREATE VIEW - 创建视图
假如我们需要一个等级前十的玩家的排行榜
这时候我们就可以用视图来创建一个虚拟的表
如下
先来看看等级前十的玩家都有谁
SELECT * FROM player ORDER BY level desc LIMIT 10;
然后我们来创建视图
CREATE VIEW top10
AS
SELECT * FROM player ORDER BY level desc LIMIT 10;
SELECT - 查看视图
SELECT * FROM top10
这个是不是看起来跟普通查询一样,当我们表中数据变化的时候,视图中的数据也会自动跟着变更
比如我们更改第一名的等级
没执行之前
视图随着数据的变更而改变了
ALTER VIEW - 修改视图
ALTER VIEW 视图名称
as
新的语句
比如说我们刚刚是从大到小排序的
我现在要从小到大排序
那我们可以修改成这样
ALTER VIEW top10
AS
SELECT * FROM player ORDER BY level LIMIT 10;
这样就变成了玩家等级最低的前十名玩家了
DROP VIEW - 删除视图
DROP VIEW top10