【Mysql】Mysql常用(2)

1 表索引

索引类似图书的目录,方便快速定位,查找指定内容,提高查询速度。
索引是数据库的一个对象,数据库中的一列或者多列组成,它不能独立存在,必须对某个表对象进行依赖。
索引保存在information_schema数据库里的STATISTICS表中。

1.1 索引分类

查看数据库 db_book 内所有索引:

select * from mysql.`innodb_index_stats` a where a.`database_name` = 'db_book';

查看当前table的索引:

show index from tableName;

在这里插入图片描述

1.2 创建索引

创建的关键字 INDEX
一般主键在创建时默认就是唯一性索引。
方法1:最开始创建表的时候添加索引: 在这里插入图片描述

create table t_u1(id int ,
                     uName varchar(20),
                     password varchar(20),
                     INDEX (uName)
	             );		#普通 单列 索引
    	             
create table t_u2(id int ,
                     uName varchar(20),
                     password varchar(20),
                     UNIQUE INDEX index_uName(uName)
	             );		#带别名的唯一性索引  注意对应位置含义

create table t_u3(id int ,
                     uName varchar(20),
                     password varchar(20),
                     INDEX index_uName_password(uName,password)
	             );	
#多列索引,uName,password两列属性指向一个索引

方法2:为已经存在的表添加索引:
在这里插入图片描述

create 	INDEX index_uName ON t_u4(uName);		#普通索引
create 	UNIQUE INDEX index_uName ON t_u4(uName);	#唯一性
create  INDEX index_uName_password ON t_u4(uName,password);		#多列

方法3:使用alter方法创建索引:

在这里插入图片描述

alter TABLE t_u5 ADD INDEX index_uName(uName);
alter TABLE t_u5 ADD UNIQUE INDEX index_uName(uName);
alter TABLE t_u5 ADD INDEX index_uName_password(uName,password);

1.3 删除索引

DROP INDEX 索引名 ON 表名;

DROP INDEX index_userName ON t_u5;
DROP INDEX index_userName_password ON t_u5;	#删除多列索引

2 数据库视图(View)

  • 视图是从一个或几个基本表(或视图)中导出的虚拟的表。
  • 视图是从一个或多个实际表中获得的,那些用于产生视图的表叫做该视图的基表。在系统的数据字典中仅存放了视图的定义,不存放对应的数据,通过视图看到的数据存放在基表中。
  • 通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。
  • 由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能(仅仅能查询)。

2.1 视图的好处

  • 提高重用性,针对重复使用的属性字段;
  • 增强安全性,不同权限用户使用部分数据创建的对应视图;
  • 表的逻辑独立性。

可参考:博客

2.2 创建视图

在这里插入图片描述
ALGORITHM表示视图选择的算法(可选参数)

 - UNDEFINED:MySQL将自动选择所要使用的算法
 - MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
 - TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句

WITH CHECK OPTION表示更新视图时要保证在该试图的权限范围之内(可选参数)

2.2.1 单表视图

CREATE VIEW v1 AS SELECT * FROM t_book;
SELECT * FROM v1;		#所有的字段属性作为视图1
CREATE VIEW v2 AS SELECT bookName,price FROM t_book;
SELECT * FROM v2;		#仅取name和price作为创建视图

CREATE VIEW v3(b,p) AS SELECT bookName,price FROM t_book;
SELECT * FROM v3;		#将name和price字段重命名为 b 和 p

2.2.2 多表视图

同一个数据库下不同表:

create view v as (select * from table1) union all (select * from table2);	#合并查询
或:
CREATE VIEW v5 AS SELECT tb.bookName,tby.bookTypeName FROM t_book tb,t_booktype tby WHERE tb.bookTypeId=tby.id;
SELECT * FROM v5;		#从两张取了别名的表 里按指定条件创建视图

不同数据库下的不同表:

#在数据库1 目录下创建
create view 数据库1.v as (select * from 数据库1.table1) union all (select * from 数据库2.table2);

#在数据库2 目录下创建
create view 数据库2.v as (select * from 数据库1.table1) union all (select * from 数据库2.table2);

2.3 查看视图

通过指令或数据库图形管理工具查看。

DESC view1;
#基本的视图信息:字段名、类型等

SHOW TABLE STATUS LIKE 'view1';
SHOW TABLE STATUS LIKE 't_book';
# 查看状态信息:包含创建时间,一些虚拟状态值

SHOW CREATE VIEW view1;
#详细信息,包括编码,建表语句等

2.4 修改视图

方法1:
在这里插入图片描述

CREATE OR REPLACE VIEW v1(bookName,price) AS SELECT bookName,price FROM t_book;

方法2:
在这里插入图片描述

ALTER VIEW v1 AS SELECT * FROM t_book;

2.5 更新视图

  • 通过视图来插入、更新、删除表中的数据
  • 视图只是一个虚表,没有数据,操作的是识图来源的基表
  • 更新视图要在全县范围内。

2.5.1 插入视图(数据)

INSERT INTO v1 VALUES(NULL,'java good',120,'feng',1);

2.5.2 更新视图(数据)

UPDATE v1 SET bookName='java very good',price=200 WHERE id=5;

2.5.3 删除视图(数据)

DELETE FROM v1 WHERE id=5;

2.6 删除视图

删除数据库中已经存在的视图,删除视图并不会删除数据,只是删除视图定义。

DROP VIEW IF EXISTS view1;

3 触发器(TRIGGER)

执行某项操作(INSERT、UPDATE、DELETE)时候自动触发执行预设好的相对应操作。
如在表a添加数据时表b里的对应属性也进行一个变化。

相同的表相同的操作只能创建一个对应的触发器。

3.1 创建使用触发器

单个执行语句的触发器:
在这里插入图片描述
注意执行语句where 后面的部分old和new

  • old表示插入之前的值,old用在删除和修改

  • new表示新插入的值,new用在添加、更新和修改

     #在insert插入新数据操作  之后  更新书的数量
     CREATE TRIGGER trig_book AFTER INSERT 
          ON t_book FOR EACH ROW
             UPDATE t_bookType SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id;
         
     INSERT INTO t_book VALUES(NULL,'java好',100,'ke',1);
    

多条执行语句:

在这里插入图片描述
DELIMITER | 是告诉mysql解释器不要将多条程序体里面单条语句的分号 ;直接执行,是作为一个程序体的。也可以使用 $$ // 等表示
默认mysql是遇到一个分号 ; 执行一次的。
可参考:厚积_薄发博客

DELIMITER |
CREATE TRIGGER trig_book2 AFTER DELETE 
    ON t_book FOR EACH ROW
    BEGIN
       UPDATE t_bookType SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id;
       INSERT INTO t_log VALUES(NULL,NOW(),'在book表里删除了一条数据');
       #mysql里NOW()表示当前时间
       DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
    END 
|
DELIMITER ;

DELETE FROM t_book WHERE id=5;

上面函数的作用是:当删除 t_book 里面 id=5的数据时,触发在 t_bookType 表中 bookNum数量-1,在日志表 t_log 中加入一条记录,同时在测试表 t_test 里面删除了和之前记录id相等的数据 (old.bookTypeId=t_test.id)

3.2 查看触发器状态

查看触发器的状态:

SHOW TRIGGERS;
#列出来所有的

3.3 删除触发器

注意结束符号 ;之前是否有空格或者全半角区别,可能引起错误。

DROP TRIGGER trig_book  ;

触发器补充介绍:硕果累累的博客

4 函数(functions)

4.1 常用函数

4.1.1 日期和时间函数

获取当前时间的语句

select now();
select sysdate();

获取日期时间的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒

set @test='2019-03-26 23:08:12.123456';

select date(@test); 		#示例
+-------------+
| date(@test) |
+-------------+
| 2019-03-26  |
+-------------+

其他类似:time、year 、quarter、month、week、day、hour、minute、second

与时间相关函数

名称 作用
CURDATE() 返回当前日期
CURTIME() 返回当前时间
MONTH(d) 返回当前日期d中的月份值
SELECT CURDATE(),CURTIME(),MONTH(birthday) AS m FROM table;
select curdate(),curtime() from gongkuang limit 5;

4.1.2 字符串函数

名称 作用
CHAR_LENGTH(s) 计算字符串字符数
UPPER(s) 转为大写
LOWER(s) 转为小写
CONCAT(s1,s2…) 拼接多个字符串
LEFT(str,len) RIGHT(str,len): 返回字符串str 从左、右起len长的子串。
REVERSE(str) 把str倒序
SELECT uName,CHAR_LENGTH(uName),UPPER(uName) up,LOWER(uName) low,concat(uName,upper(uName)) FROM t_u1;

输出:
在这里插入图片描述

select uName,left(uName,2),right(uName,2) from t_u1;

其他嗨哟很多字符串函数可以需要的时候再查阅使用:

ASCII(str) BIN(N) CONV(str,from_base,to_base) ELT(N,str1,str2,str3,…)
FIELD(str,str1,str2,str3,…) FIND_IN_SET(str,strlist) FORMAT(X,D) INSERT(str,pos,len,newstr)
LOCATE(substr,str,pos) REPLACE(str,from_str,to_str) POSITION(substr IN str) INSTR(str,substr)

4.1.3 数学函数

名称 作用
ABS(x) 绝对值
SQRT(x) 平方根
MOD(x,y) 求余
ROUND(X,Y) X的Y位四舍五入小数
CEIL(x)、CEILING(x) 向上取整
FLOOR(x) 向下取整
POW(x,y)、POWER(x,y) 幂运算,求x的y次方幂

4.1.4 加密函数

名称 作用
PASSWORD(str) 对密码加密,不可逆
MD5(str)、SHA5() MD5校验、SHA5校验
ENCODE(str,pswd_str) 加密字符串,结果必须用BLOB类型保存
DECODE(crypt_str,pswd_str) 解密字符串

在插入数据的时候设置加密的格式、加密数据和加密解密的钥匙:

INSERT INTO t_t VALUES(NULL,'2018-11-11','a',1,MD5('123456'),ENCODE('abcd','aa'));
SELECT DECODE(passwords,'aa') FROM t_t WHERE id=1;

4.2 其他函数可以查阅mysql官方手册

5 存储过程

5.1

5.2

5.3

5.4

6 数据备份与还原

备份数据可以保证数据库中数据的安全,需要定期的进行数据库备份,可以备份数据表和整个数据库。

6.1 使用 mysqldump 备份(导出)

可以使用命令备份,也可以使用图形管理工具直接导出备份。

mysqldump -username -p dbname table1 table2 ... > BackupName.sql
  • dbname :表示数据库的名称;
  • table1 和 table2 :表示数据表的名称,没有指明时将备份整个数据库;
  • BackupName.sql :表示备份文件的名称,文件名前面可以加绝对路径,一般以sql做后缀

6.2 还原(导入sql数据)

使用命令或者图形界面导入还原数据。

mysql -u root -p [dbname] < backup.sql
  • dbname :表示导入后的数据库名称,参数可指定或不指定
  • 指定数据库名时,表示还原文件到这个表下
  • 不指定数据库名时,表示还原备份sql文件中默认的数据库和表属性。

猜你喜欢

转载自blog.csdn.net/dzg_chat/article/details/88652674