索引类似图书的目录,方便快速定位,查找指定内容,提高查询速度。
索引是数据库的一个对象,数据库中的一列或者多列组成,它不能独立存在,必须对某个表对象进行依赖。
索引保存在information_schema数据库里的STATISTICS表中。
查看数据库 db_book 内所有索引:
select * from mysql.`innodb_index_stats` a where a.`database_name` = 'db_book';
查看当前table的索引:
show index from tableName;
创建的关键字 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两列属性指向一个索引
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);
DROP INDEX 索引名 ON 表名;
DROP INDEX index_userName ON t_u5;
DROP INDEX index_userName_password ON t_u5; #删除多列索引
可参考:博客
- UNDEFINED:MySQL将自动选择所要使用的算法
- MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
- TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
WITH CHECK OPTION表示更新视图时要保证在该试图的权限范围之内(可选参数)
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
同一个数据库下不同表:
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);
通过指令或数据库图形管理工具查看。
DESC view1;
#基本的视图信息:字段名、类型等
SHOW TABLE STATUS LIKE 'view1';
SHOW TABLE STATUS LIKE 't_book';
# 查看状态信息:包含创建时间,一些虚拟状态值
SHOW CREATE VIEW view1;
#详细信息,包括编码,建表语句等
CREATE OR REPLACE VIEW v1(bookName,price) AS SELECT bookName,price FROM t_book;
ALTER VIEW v1 AS SELECT * FROM t_book;
INSERT INTO v1 VALUES(NULL,'java good',120,'feng',1);
UPDATE v1 SET bookName='java very good',price=200 WHERE id=5;
DELETE FROM v1 WHERE id=5;
删除数据库中已经存在的视图,删除视图并不会删除数据,只是删除视图定义。
DROP VIEW IF EXISTS view1;
执行某项操作(INSERT、UPDATE、DELETE)时候自动触发执行预设好的相对应操作。
如在表a添加数据时表b里的对应属性也进行一个变化。
相同的表相同的操作只能创建一个对应的触发器。
单个执行语句的触发器:
注意执行语句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)
查看触发器的状态:
SHOW TRIGGERS;
#列出来所有的
注意结束符号 ;之前是否有空格或者全半角区别,可能引起错误。
DROP TRIGGER trig_book ;
触发器补充介绍:硕果累累的博客
获取当前时间的语句:
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;
名称 | 作用 |
---|---|
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) |
名称 | 作用 |
---|---|
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次方幂 |
名称 | 作用 |
---|---|
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;
备份数据可以保证数据库中数据的安全,需要定期的进行数据库备份,可以备份数据表和整个数据库。
可以使用命令备份,也可以使用图形管理工具直接导出备份。
mysqldump -username -p dbname table1 table2 ... > BackupName.sql
使用命令或者图形界面导入还原数据。
mysql -u root -p [dbname] < backup.sql