Mysql之视图、索引【清风剑法第四式】

目录

一、视图

   1.什么是视图

   2.视图的作用

   3.基本语法

二、索引

   1.什么是索引

   2.索引的优缺点

   3.索引分类

导入导出

练习题


一、视图

   1.什么是视图

   1) 视图是一种虚拟的表,是从数据库中一个或多个表中导出来的表。    
   2) 数据库中存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
   3) 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。    


   2.视图的作用

   1) 使操作简便化。
   2) 增加数据的安全性。
   3) 提高表的逻辑独立性。

   3.基本语法

   CREATE VIEW 视图名 AS SELECT 语句;

二、索引

   1.什么是索引

   索引是由数据库表中一列或多列组合而成,其作用是提高对表中数据的查询速度。
类似于图书的目录,方便快速定位,寻找指定的内容。

   2.索引的优缺点

   优点:提高查询数据的速度。
   缺点:创建和维护索引的时间增加了,同时占用硬盘空间。

   3.索引分类

   1) 普通索引:是最基本的索引,它没有任何限制;

   2) 唯一索引:与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;

   3) 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;

   4) 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;

   5) 全文索引:使用FULLTEXT参数可以设置,全文索引只能创建在CHAR,VARCHAR,TEXT类型的字段上。主要作用是提高查询较大字符串类型的速度;只有MyISAM引擎支持该索引,MySQL默认引擎不支持;mysql5.7+

   4.创建索引

   CREATE [UNIQUE|FULLTEXT] INDEX 索引名 ON 表名(字段名[(长度)][ASC|DESC])

   5.修改索引

   ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT] INDEX 索引名(字段名[(长度)][ASC|DESC])

   6.删除索引

   DROP INDEX 索引名 ON 表名


案例:
1) 普通索引案例
create index 索引名 on 表名(字段名)
2) 唯一索引案例
create unique index 索引名 on 表名(字段名)
3) 主键索引案例
create table 表名(
   id int not null auto_increment primary key,
   ...
)
4) 组合索引案例
create index 索引名 on 表名(字段名1,字段名2,...)


补充说明:

批量导入:LOAD DATA INFILE(推荐)

   可先通过SELECT INTO OUTFILE方式,将数据导出到Mysql的C:\ProgramData\MySQL\MySQL Server 5.5\data目录下,再通过LOAD DATA INFILE方式导入。 

   1) select * from 表名 into outfile '/文件名.sql';
   2) load data infile '/文件名.sql' into table 表名(列名1,...); 

https://blog.csdn.net/weixin_44595372/article/details/88723191

导入导出

1.使用工具,类似Sqlyog、Navicat等导入导出数据。

2.使用mysqldump导入导出

  2.1 导出

    2.1.1 导出表数据和表结构
  
    mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql(这个名字随便叫)

    #/usr/local/mysql/bin mysqldump -uroot -pabc >abc.sql
    敲回车之后提示输出密码

    2.1.2 只导出表结构
  
    mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql

    #mysqldump -uroot -p -d abc > abc.sql

  
    注:导出的数据在mysql的bin目录下

  2.2 导入

    注意:首先建立空数据库

    mysql>create database abc;

    2.2.1 方法一

    mysql>use abc;                   #选择数据库
    mysql>set names utf8;            #设置数据库编码
    mysql>source /home/abc/abc.sql;  #导入数据

    2.2.2 方法二

    mysql -u用户名 -p密码 数据库名 < 数据库名.sql
    #mysql -uabc_f -p abc < abc.sql


3.LOAD DATA INFILE

  可先通过SELECT INTO OUTFILE方式,将数据导出到Mysql的C:\ProgramData\MySQL\MySQL Server 5.5\data目录下,再通过LOAD DATA INFILE方式导入。 

  1) select * from 表名 into outfile '/文件名.sql';
  2) load data infile '/文件名.sql' into table 表名(列名1,...); 

    

练习题

SELECT * from t_teacher;
SELECT * FROM t_course;
SELECT * FROM t_score;
SELECT * FROM t_student;
# 语法:CREATE VIEW 视图名 as SELECT 语句;
CREATE VIEW v_student_score as
SELECT
s.*,
sc.score,
c.*,
t.tname
FROM
t_teacher t,t_course c,t_score sc,t_student s
where
t.tid=c.tid and
c.cid=sc.cid and
sc.sid=s.sid;
SELECT * from v_student_score;


CREATE TABLE `t_log` (
  `id` varchar(32) NOT NULL COMMENT '唯一标识',
  `ip` varchar(15) NOT NULL COMMENT 'IP地址',
  `userid` varchar(32) NOT NULL COMMENT '用户ID',
  `moduleid` varchar(32) NOT NULL COMMENT '模块ID',
  `content` varchar(500) NOT NULL COMMENT '日志内容',
  `createdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
  `url` varchar(100) DEFAULT NULL COMMENT '请求URL地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * from `t_log`
--  1.什么是索引
-- 
--    索引是由数据库表中一列或多列组合而成,其作用是提高对表中数据的查询速度。
-- 类似于图书的目录,方便快速定位,寻找指定的内容。
-- 
--    2.索引的优缺点
-- 
--    优点:提高查询数据的速度。
--    缺点:创建和维护索引的时间增加了,同时占用硬盘空间。
-- 
--    3.索引分类
-- 
--    1) 普通索引:是最基本的索引,它没有任何限制;
-- 
--    2) 唯一索引:与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
CREATE UNIQUE index idx_moduleid on t_log(moduleid);
--    3) 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
SELECT * from t_log where id='00d3f9ffca154dd9aa280916ac538019';
--    4) 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;
CREATE INSERT idx_userid_moduleid_createdate on t_log(userid,moduleid,createdate);
SELECT * from t_log where userid='';
 EXPLAIN SELECT * from t_log where userid='00d3f9ffca154dd9aa280916ac538019' and moduleid='100301';
SELECT * from t_log where userid='' and moduleid='' and createdate='';

SELECT * from t_log where moduleid='';
-- 
--    5) 全文索引:使用FULLTEXT参数可以设置,全文索引只能创建在CHAR,VARCHAR,TEXT类型的字段上。主要作用是提高查询较大字符串类型的速度;只有MyISAM引擎支持该索引,MySQL默认引擎不支持;mysql5.7+
-- 
--    4.创建索引
-- 
--    CREATE [UNIQUE|FULLTEXT] INDEX 索引名 ON 表名(字段名[(长度)][ASC|DESC])
CREATE INDEX idx_moduleid on t_log(moduleid);

--    5.修改索引
-- 
--    ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT] INDEX 索引名(字段名[(长度)][ASC|DESC])
-- 
--    6.删除索引
DROP INDEX idx_moduleid on t_log;

--    DROP INDEX 索引名 ON 表名





-- t_user(userid,username,password,realname,rolename,createdate)
-- t_order(oid,total,phone,address,creator,auditor,person)
-- 
-- t_user
-- 1,zs,1234,张三,用户,2022-01-01
-- 2,ls,1234,李四,审批员,....
-- 3,ww,1234,王五,配送员,....
-- 
-- t_order
-- 1,90,1777777787,长沙,1,null,null
-- 2,120,1777777787,长沙,1,2,null
-- 3,190,1777777787,长沙,1,2,3
-- 
-- 结果:
-- 1,90,1777777787,长沙,张三,null,null
-- 2,120,1777777787,长沙,张三,李四,null
-- 3,190,1777777787,长沙,张三,李四,王五
-- 方法一:
SELECT 
sid,
sum(CASE WHEN cid='01' THEN score ELSE 0 END) '语文',
sum(CASE WHEN cid='02' THEN score ELSE 0 END) '数学',
sum(CASE WHEN cid='03' THEN score ELSE 0 END) '英语'
FROM t_score
GROUP BY sid;

select
oid,total,phone,address,
sum(CASE WHEN creator=1 THEN '张三' ELSE null END) 'creator',
sum(CASE WHEN auditor=2 THEN '李四' ELSE null END) 'auditor',
sum(CASE WHEN person=3 THEN '王五' ELSE null END) 'person'
from t_order
GROUP BY oid;

-- 方法二:
select oid,total,phone,
	(select realname from t_user where userid = creator),
	(select realname from t_user where userid = auditor),
	(select realname from t_user where userid = person)
 from t_order t1 left join t_user
-- 技术点:外连接
-- 
--   SELECT t_order from 
-- (SELECT sid,score from t_score where cid='01') t1 LEFT JOIN
-- (SELECT sid,score from t_score where cid='02') t2 on t1.sid=t2.sid
-- 
-- 方法三:
SELECT
oid,total,phone,
u1.realname as '创建人',
u1.realname as '审批人',
u1.realname as '配送员'
from
t_order o
left join t_user u1 on o.creator=u1.userid
left join t_user u1 on o.auditor=u1.userid
left join t_user u1 on o.person=u1.userid



版权声明:本文为weixin_67780833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。