语法:
CREATE TEMPORARY TABLE 表名
注:默认情况下,断开与数据库的连接后,临时表会自动被销毁
当然也可手动销毁,读取和删除表与普通表语句是一样的。如下:
# 查询临时表
select * from 表名;
#删除临时表
drop table if exists 表名;
临时表注意事项:
是指使用Memory引擎的表,这种表的结构在磁盘里,数据都保存在内存里,系统重启时候数据会被清空,但表结构还在。内存表也可以被看作是临时表的一种。
语法:需要将存储引擎设置为:ENGINE =MEMORY
CREATE TABLE IF NOT EXISTS tmp_table(...
....)
ENGINE = MEMORY;
• 当MySQL服务重启之后,内存表的数据会丢失,表结构依旧存。
• data目录下只有tmp_memory.frm,表结构放在磁盘上,数据放在内存中。
• 可以创建索引,删除索引,支持唯一索引。
• 不影响主备,主库上插入的数据,备库也可以查到。
• SHOW TABLES语句可以查看的到表。
• 内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据。
• 内存表不能包含BLOB或者TEXT列
视图是SELECT 语句组成的查询定义的虚拟表,它的定义存储在数据库中。但与表不同的是, 视图实际上不包含任何数据,不分配空间;
视图可以是 建立在一个或多个表上,也可以建立在视图上,但是对视图数据的操作最终都会转换为对基本表的操作。
➢ 创建和修改视图只需在SELECT语句之前添加CREATE OR REPLACE VIEW 视图名 AS…即可
#创建视图:统计每门课程的平均分,行为学号,列为每个课程id
CREATE OR REPLACE VIEW v_score AS
SELECT id,
AVG(CASE cid WHEN 'C001' THEN score ELSE 0 END) 'C001',
AVG(CASE cid WHEN 'C002' THEN score ELSE 0 END) 'C002',
AVG(CASE cid WHEN 'C003' THEN score ELSE 0 END) 'C003',
…
FROM scores GROUP BY id;
#查看存在的视图
SHOW TABLES LIKE 'v_%';
#查看视图
SELECT * FROM v_score where id<3;
#查看创建视图的命令
SHOW CREATE VIEW v_score;
#查看视图数据内容
DESC v_score;
SHOW FIELDS FROM v_score;
视图应用场景:
1、保密工作,例如有一个员工工资表,如果只希望财务看到员工工资这个字段,而其他人不能看到工资字段,建立视图的时候可以把工资这个敏感字段隐藏起来
2、有一个查询语句非常复杂,包含多个表、子查询等,有时还想把这个巨大无比的SELECT语句
和其他表关联起来得到结果,可以用一个视图来代替这个复杂的SELECT语句
➢ 派生表类似于临时表,但在SELECT语句中使用派生表比临时表简单,因为没有创建临时表的步骤。
➢ 派生表是 查询结果组成的虚拟表。是在外部查询的FROM子句中定义的,不需要手动创建。只要外部查询一结束,派生表也就消失。
➢ 派生表可以简化查询,避免使用临时表。相比手动生成临时表性能更优越,目的主要是为了缩小数据的查找范围,提高查询效率
#示例:
SELECT * FROM
(SELECT id, age, address, IF(sex='男',0,1) FROM student) T
WHERE T.age>40;
即,SELECT * FROM 加一个查询语句,命名T
WITH AS 短语的用法类似派生表,它将一个SELECT语句的结果另起一个别名,方便接下来的使用。
# 示例
WITH a AS(SELECT id, age, address, IF(sex='男',0,1) FROM student)
SELECT * FROM a
WHERE age>40;
1.加速查找
2.在使用order by、 group by 子句时,利用索引可以减少排序和分组的时间
3.MySQL中的primary key,unique等都是索引,实现表与表之间的完整性约束
4.防止重复数据产生
➢ 普通索引可以通过以下几种方式创建:
#创建示例:
CREATE INDEX index1 ON student(id); #添加普通索引
CREATE INDEX index2 ON student(id,sname); #添加联合索引
CREATE UNIQUE index3 ON student(id); #添加唯一索引
ALTER TABLE student ADD PRIMARY KEY(id); #添加主键索引
ALTER TABLE student ADD UNIQUE index4(id); #添加主键索引
#建表时指定索引
CREATE TABLE IF NOT EXISTS test(id INT ,sname VARCHAR(10),
PRIMARY KEY(id),UNIQUE indexid(id));
查看索引:
SHOW INDEX FROM test;
删除索引:
DROP INDEX <索引名>ON<表名>
如何正确使用索引:
➢ 创建了索引并不是时时都会生效,有些情况将导致索引失效,注意以下几种情况:
1. 最左前缀匹配原则,若有联合索引index(a,b,c) ,若WHERE子句中有a就会用到联合索引,若只用到b , c就会失去索引效果。
2. 在WHERE子句中进行NULL值 值判断的话会导致引擎放弃索引而产生全表扫描。
3. 避免在WHERE子句中使用!= , < >等 比较运算符和IN,否则会导致引擎放弃索引而产生全表扫描。
4. 避免在WHERE子句中使用OR来连接条件。
5. 索引列不能参与计算,避免在WHERE子句中=的左边使用表达式操作或者函数操作。
6. 避免在WHERE子句中使用LIKE 模糊查询