视图( view )是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。
基表:用来创建视图的表叫做基表。
通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
视图主要用来做优化的。通常使用select来构建视图表,而很少使用update、delete、insert,因为限制特别多,容易出错。
一般,视图只做查询,不做更删改。
CREATE VIEW <视图名> AS <SELECT语句>
示例:
create view vt1 as select A.student_id from
(
(select student_id,num from score where course_id=(
select `cid` from `course` where cname='linux c/c++')) as A
left join
(select student_id,num from score where course_id=(
select `cid` from `course` where cname='mysql')) as B
on A.student_id=B.student_id
) WHERE A.num>if(isnull(B.num),0,B.num);
select * from vt1;
触发器是具备事务性的。
触发器(trigger)是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行 DML 操作( insert , delete ,update )时就会激活它执行。
(1)监视对象: table
(2)监视事件: insert 、update 、delete
(3)触发时间: before , after
(4)触发事件: insert 、update 、delete
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order]
trigger_body -- 此处写执行语句
trigger_body:可以一个语句,也可以是多个语句;多个语句写在 BEGIN … END 间。
trigger_time:{ BEFORE | AFTER }
trigger_event:{ INSERT | UPDATE | DELETE }
trigger_order:{ FOLLOWS | PRECEDES } other_trigger_name
示例:
CREATE TABLE `work` (
`id` INT PRIMARY KEY auto_increment,
`address` VARCHAR (32)
) DEFAULT charset = utf8 ENGINE = innoDB;
CREATE TABLE `time` (
`id` INT PRIMARY KEY auto_increment,
`time` DATETIME
) DEFAULT charset = utf8 ENGINE = innoDB;
CREATE TRIGGER trig_test1 AFTER INSERT
ON `work` FOR EACH ROW INSERT INTO `time` VALUES(NULL,NOW());
(1)在INSERT型触发器中,NEW 用来表示将要( BEFORE )或已经( AFTER )插入的新数据。
(2)在DELETE型触发器中,OLD 用来表示将要或已经被删除的原数据。
(3)在 UPDATE 型触发器中, OLD 用来表示将要或已经被修改的原数据, NEW 用来表示将要或已经修改为的新数据。
NEW.columnName (columnName为相应数据表某一列名)
OLD.columnName (columnName为相应数据表某一列名)
delimiter是mysql分隔符,在mysql客户端中分隔符默认是分号 ; 。如果一次输入的语句较多,并且语句中间有分号,这时需要重新指定一个特殊的分隔符。
通常指定 $$ 或 ||。
在下订单的时候,对应的商品的库存量要相应的减少,即买几个商品就减少多少个库存量。
准备表结构和表数据:
CREATE TABLE `goods` (
`id` INT PRIMARY KEY auto_increment,
`name` VARCHAR (32),
`num` SMALLINT DEFAULT 0
);
CREATE TABLE `order` (
`id` INT PRIMARY KEY auto_increment,
`goods_id` INT,
`quantity` SMALLINT COMMENT '下单数量'
);
INSERT INTO goods VALUES (NULL, 'C++', 40);
INSERT INTO goods VALUES (NULL, 'C', 63);
INSERT INTO goods VALUES (NULL, 'mysql', 87);
INSERT INTO goods VALUES (NULL, 'linux', 90);
INSERT INTO `order` VALUES (NULL, 1, 3);
INSERT INTO `order` VALUES (NULL, 2, 4);
(1)场景1:客户修改订单购买的数量,在原来购买数量的基础上减少2个。
delimiter //
CREATE TRIGGER trig_order_1 AFTER INSERT
ON `order` FOR EACH ROW
BEGIN
UPDATE goods SET num = num - 2 WHERE id = 1;
END//
delimiter ;
--测试
INSERT INTO `order` (`goods_id`,`quantity`) VALUES(1,2);
select * from goods where goods_id=1;
select * from `order`;
(2)场景2:客户修改订单购买的数量,商品表的库存数量自动改变。
delimiter //
CREATE TRIGGER trig_order_3 BEFORE UPDATE
ON `order` FOR EACH ROW
BEGIN
UPDATE goods SET num=num+old.quantity - new.quantity WHERE id = new.goods_id;
END
//
delimiter ;
-- 测试
UPDATE `order` SET quantity = quantity+2 WHERE id= 1;
语法:
CREATE USER username username@host IDENTIFIED BY password;
host 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost ,如果想让该用户可以从任意远程主机登陆,可以使用通配符 % 。
语法:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
privileges :用户的操作权限,如SELECT , INSERT ,UPDATE 等,如果要授予所的权限则使用ALL。
databasename.tablename 如果是 . 表示任意数据库以及任意表。
WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION 选项导致后来该用户不能使用 GRANT 命令创建用户或者给其它用户授权。
如果不想这个用户有这个 grant 的权限,则不要加该 WITH GRANT OPTION 选项。
GRANT select, SHOW VIEW ON `databasename`.`tablename` to 'username'@'host';
修改权限后需要刷新权限。
FLUSH PRIVILEGES;
步骤:
(1)注释 mysqld.cnf 中 bind-address 。
-- mysqld.cnf
# vi /etc/mysql/mysql.conf.d/mysqld.cnf
# bind-address=127.0.0.1
(2)修改 mysql.user 表。
-- 修改user表
select `user`, `host` from `mysql`.`user`;
update user set host='%' where user='root';
(3)然后重启 mysql。