索引
可以提高查找速度
索引存放在索引文件中,对表中的数据进行操作,索引也要跟着变化。所以过多的索引反而会影响性能。
常见分类
主键索引 唯一的索引。主键自带索引
唯一索引 索引列的所有数据是unique的
普通索引 最常见的索引,只能提示对数据的访问速度
# 创建删除唯一索引 建议只记alter那种方法 CREATE UNIQUE INDEX ind_hobby ON demo01(hobby); /* 创建普通索引 create index 索引名 on 表名(列名[长度]) ALTER TABLE 表名 ADD INDEX 索引名 (列名) */ ALTER TABLE demo01 ADD INDEX idx_dname(dname); # 删除索引 ALTER TABLE demo01 DROP INDEX idx_dname;
视图
视图是一种虚拟表,由查询结果形成。
作用:
如果某个查询语句经常被执行,并且语法复杂。可以对这个查询语句建立一个视图。
语法:
create view 视图名 [column_list] as select语句; view: 表示视图 column_list: 可选参数,表示属性清单,指定视图中各个属性的名称,默认情况下,与SELECT语句中查询 的属性相同 as : 表示视图要执行的操作 select语句: 向视图提供数据内容 # 查询商品和商品对应的分类信息 SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`; # 创建视图 CREATE VIEW products_category_view AS SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`; # 操作视图就像操作read only table SELECT * FROM products_category_view;
SQL示例
# 1) 需求: 查询各个分类下的商品平均价格 SELECT pc.`cname`, AVG(pc.`price`) FROM products_category_view pc GROUP BY pc.`cname` # 2) 需求: 查询鞋服分类下最贵的商品的全部信息 SELECT * FROM products_category_view pc WHERE pc.`cname` = '鞋服' AND pc.`price` = (SELECT MAX(pc.price) FROM products_category_view pc WHERE pc.`cname` = '鞋服');
注意事项
不要在视图里改东西。它就是查询用的。
删除视图对表没有影响。但删除表视图就不再起作用了。
存储过程
可以理解为多条SQL语句的合并,其中有一些逻辑判断。
优缺点
优点:
存储过程一旦调试完成后,就可以稳定运行,(前提是,业务需求要相对稳定,没有变化)
存储过程减少业务系统与数据库的交互,降低耦合,数据库交互更加快捷(应用服务器,与
数据库服务器不在同一个地区)
缺点:
在互联网行业中,大量使用MySQL,MySQL的存储过程与Oracle的相比较弱,所以较少使
用,并且互联网行业需求变化较快也是原因之一
尽量在简单的逻辑中使用,存储过程移植十分困难,数据库集群环境,保证各个库之间存储过程变更一致也十分困难。
阿里的代码规范里也提出了禁止使用存储过程,存储过程维护起来的确麻烦;
语法
DELIMITER $$ -- 声明语句结束符,可以自定义 一般使用$$ CREATE PROCEDURE 过程名称() -- 声明存储过程 BEGIN -- 开始编写存储过程 -- 要执行的操作 END $$ -- 存储过程结束 赋值 SET @变量名 = 值 输出 OUT 变量名 数据类型
例子
# 需求: 编写存储过程, 查询所有商品数据 DELIMITER $$ CREATE PROCEDURE goods_proc(IN 参数名 参数类型) BEGIN SELECT * FROM goods; END $$ # 调用 CALL goods_proc; # 需求: 接收一个商品id, 根据id删除数据 DELIMITER $$ CREATE PROCEDURE goods_proc2(IN goods_id INT) BEGIN DELETE FROM goods WHERE gid = goods_id; END $$ CALL goods_proc2(1); # 需求: 向订单表 插入一条数据, 返回1,表示插入成功 DELIMITER $$ CREATE PROCEDURE orders_proc(IN o_oid INT,IN o_gid INT, IN o_price INT, OUT out_num INT) BEGIN INSERT INTO orders VALUES (o_oid, o_gid, o_price); SET @out_num = 1; SELECT @out_num; END $$ CALL orders_proc(1, 2, 50, @out_num);
触发器
当事件来临时会触发一些SQL的执行。
语法
delimiter $ -- 将Mysql的结束符号从 ; 改为 $,避免执行出现错误 CREATE TRIGGER Trigger_Name -- 触发器名,在一个数据库中触发器名是唯一的 before/after(insert/update/delete) -- 触发的时机 和 监视的事件 on table_Name -- 触发器所在的表 for each row -- 固定写法 叫做行触发器, 每一行受影响,触发事件都执行 begin -- begin和end之间写触发事件 end $ -- 结束标记
例子
# 需求: 在下订单的时候,对应的商品的库存量要相应的减少,卖出商品之后减少库存量。 DELIMITER $ CREATE TRIGGER t1 AFTER INSERT ON orders FOR EACH ROW BEGIN UPDATE goods SET num = num - 1 WHERE gid = 4; END $
DCL
创建
# 1) 创建 admin1 用户,只能在 localhost 这个服务器登录 mysql 服务器,密码为 123456 CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456'; # 2) 创建 admin2 用户可以在任何电脑上登录 mysql 服务器,密码为 123456 CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';
授权
# 1) 给 admin1 用户分配对 db3 数据库中 products 表的 操作权限:查询 GRANT SELECT ON db3.`products` TO 'admin1'@'localhost'; # 2) 给 admin2 用户分配所有权限,对所有数据库的所有表 GRANT ALL ON *.* TO 'admin2'@'%';
查看权限
SHOW GRANTS FOR 'root'@'localhost';
查询/删除用户
DROP USER 'admin1'@'localhost'; use mysql; SELECT * FROM USER;
数据库备份
mysqldump -u 用户名 -p 密码 数据库 > 文件路径 mysqldump -uroot -p123456 db2 > E:/db2.sql 在mysql client中 create database db2; use db2; source E:/db2.sql