视图
通俗理解就是给源表做分身,源表有些数据不想让人看到,但是别人又需要操作这张表就可以给源表做一个视图
视图也是表,对源表的增删改查也有效
SELECT cat_id,AVG(market_price) price
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 0,3;
CREATE VIEW v_top3_avg_by_cat AS
SELECT cat_id,AVG(market_price) price
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 0,3;
SELECT * FROM v_top3_avg_by_cat;
索引
索引是一个内置表,该表的数据是对某个真实表的某些个字段的数据做了“排序”之后的存储形式。数据库索引好比是书的目录,能加快数据库的查询速度,同时也会降低增删改的速度
索引类型
1.普通索引:只有索引的最基本功能–提速。
2.唯一索引:索引列中的值必须是唯一的,但是允许为空值。
3.主键索引:索引列中的值必须是唯一的,不允许有空值。
4.组合索引:组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则)。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。
CREATE TABLE product(
id INT PRIMARY KEY auto_increment,
`name` VARCHAR(10),
address VARCHAR(50),
KEY(`name`)
);
INSERT INTO product(name,address) VALUES('小米手机','北京');
INSERT INTO product(name,address) VALUES('华为手机','深圳');
INSERT INTO product(name,address) VALUES('三星手机','韩国');
INSERT INTO product(name,address) VALUES('苹果手机','美国');
INSERT INTO product(name,address) VALUES('锤子手机','北京');
INSERT INTO product(name,address) VALUES('OPP手机','北京');
INSERT INTO product(name,address) SELECT name,address FROM product;
SELECT * FROM product WHERE name='小米手机1';
存储过程
包含一系列SQL语句的集合,完成一个复杂的功能,存储过程可以被反复使用,执行效率高
存储功能上类似于JAVA里面封装的函数
delimiter $$ -- 将原来";"这个定界符替换为"$$"
CREATE PROCEDURE show_goods()
BEGIN
UPDATE goods SET goods_number=goods_number+1;
SELECT * FROM goods;
END $$
delimiter ; -- 存储过程定义完了之后恢复原来的定界符";"
CALL show_goods; -- 调用存储过程
触发器
是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发
触发器常用于加强数据的完整性约束和业务规则等
实现一个触发器:在student表里面插入一条记录的时候在student_total表里面的total字段加1。
CREATE TABLE student_total(
total INT
);
SELECT * FROM student_total;
DELIMITER $$
CREATE TRIGGER student_insert_trigeer
AFTER INSERT ON student FOR RACH ROW
BEGIN
UPDATE student_total SET total=total+1;
END $$
DELIMTER;
INSERT INTO student(`name`,age,gender) VALUES('xx',20,'男');
默认这个字段值什么都没有,所以要添加一个初始化的数据0;
student表每插入一条数据就加1。
删除触发器
DROP TRIGGER IF EXISTS student_insert_trigger;
MySql
char:定长,M个字符,如果存在小于M个字符,实占M个字符
varchar:M个字符,存的小于M个字符,实占N个字符,N<M(1-2个字节用于标志实存字符长度)
极端例子一个字段性别:男、女。