定义:视图是从数据库中一个或多个表中导出来的虚拟表,不在内存中。
语法:
create view 视图名 //(创建一张视图)
as
select 字段名1,字段名2,… from 表名
//(视图表头) (视图里的信息从哪张实体表来)
实例:
mysql> #制作一个视图提供给销售人员 他们需要知道商品名称 出售价格 商品的类型 产地等信息
mysql> create view view_sellSet as
-> select c.c_name as 商品名称 ,c.c_madein as 商品产地,ct.ct_name as 商品类型 , c.c_outprice as 商品售价
->from commodity as c inner join commoditytype as ct on c.c_type=ct.ct_id where c.c_outprice is not null;
Query OK, 0 rows affected (0.02 sec)
mysql> # 视图使用上就和正常的数据表一致
mysql> # 视图在MySQL中拥有和实体表一致的地位
mysql> show tables;
+------------------+
| Tables_in_ishop1 |
+------------------+
| commodity |
| commoditytype |
| customer |
| order |
| view_sellset |
+------------------+
5 rows in set (0.04 sec)
视图是否能够进行增删改?是否会影响实表数据?
因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。即视图的修改,会直接影响实表的数据
定义:触发器是由事件来触发的与表事件相关的特殊的存储过程。
触发器创建语法四要素:
1.监视地点(table)
2.监视事件(insert/update/delete)
3.触发时间(after/before)
4.触发事件(insert/update/delete)
语法:
create trigger tri_test1
after insert on 表名
for each row
begin
update 表名 set num=num-new.字段名 where 字段名=new.字段名;
end;
insert中通过new.调用表中数据
delete中通过old.调用表中数据
update中new.和old.可同时使用,调用的是不同时刻的表数据
实例:
mysql> #写一个触发器 当新增一条订单时 自动从商品表的库存中扣去相应的商品订单数量
mysql> delimiter $ //修改命令结束标识符,保证触发事件的语句能够执行到下一句end
mysql> create trigger tri_1
-> after insert on `order`
-> for each row
-> begin
-> update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
-> end$ //new.o_num表示新增订单中的商品数量
mysql> delimiter ; //写完触发器,要将命令结束标识符修改回来
mysql> #修改订单的触发器
mysql> create trigger tri_3
-> after update on `order`
-> for each row
-> begin
-> update commodity set c_num=c_num+old.o_num-new.o_num where c_id=new.o_cid;
-> end$ //old.o_num调用上一次订单中购买的商品数量
//new.o_num调用新增订单中购买的商品数量
Query OK, 0 rows affected (0.10 sec)
mysql> #删除订单的触发器
mysql> create trigger tri_4
-> after delete on `order`
-> for each row
-> begin
-> update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;
-> end$
Query OK, 0 rows affected (0.11 sec)
定义:存储过程是能完成一定操作的一组SQL语句。
作用:大大提高效率(存储过程本身执行速度非常快,调用存储过程大大减少数据库交互次数);提高代码重用性
语法:
create procedure sp_name(proc_parameter[…])
begin
[characteristic …] routine_body
end;
sp_name:存储过程名称
proc_parameter:存储过程的参数列表
characteristic:存储过程的特性
routine_body:SQL语句的内容,可以用begin…end来标志SQL语句的开始和结束
实例:
存储过程分为 无参存储过程 有参存储过程
有参存储过程具有 in / out / inout 三种参数形式
无参存储过程案例
mysql> #最简单的案例 查询商品表
mysql> delimiter $
mysql> create procedure pro_queryall()
-> begin
-> select * from commodity;
-> end$
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ;
传入参数in的存储过程
mysql> #第二个案例 动态查询客户购买的商品信息
mysql> delimiter $
mysql> create procedure pro_ask(in cu_id int(11))
-> begin
-> select c_name from commodity where c_id in (select o_cid from `order` where o_cuid=cu_id);
-> end$
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ;
mysql> call pro_ask(1); //调用存储过程使用call关键字
+-------------+
| c_name |
+-------------+
| 中华铅笔HB |
| 礼盒丝带-红 |
+-------------+
2 rows in set (0.01 sec)
Query OK, 0 rows affected (0.03 sec)
传出参数out的存储过程
mysql> # 简单的案例 动态查询某商品的库存
mysql> delimiter $
mysql> create procedure pro_askcnum(in cid int(11),out cnum int(11))
-> begin
-> select c_num into cnum from commodity where c_id=cid;
-> end$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
MySQL所有的变量都是字符串 当你进行运算的时候 MySQL会尝试进行数值的转换 如果转换不成功则抛出异常
SQL中 if 语句的使用
mysql> # if(sva=1,"男","女")
mysql> select cu_name,cu_gender,if(cu_gender=1,'男','女') //相当于Java中的三目运算
-> from customer;
+---------+-----------+---------------------------+
| cu_name | cu_gender | if(cu_gender=1,'男','女') |
+---------+-----------+---------------------------+
| 刘德华 | 1 | 男 |
| 张学友 | 1 | 男 |
| 林志玲 | 0 | 女 |
+---------+-----------+---------------------------+
3 rows in set (0.01 sec)
if(cu_gender=1,‘男’,‘女’)为派生字段即原表中没有的字段
SQL中 case 语句的使用
mysql> select c_name,c_num,case when c_num<=10
-> then '库存少' else '库存充足' end
-> from commodity limit 20;
+-----------------------+-------+--------------------------------------------------------+
| c_name | c_num | case when c_num<=10 then '库存少' else '库存充足' end |
+-----------------------+-------+--------------------------------------------------------+
| 变形金刚-擎天柱 | 60 | 库存充足 |
| 变形金刚-霸天虎 | 50 | 库存充足 |
| 变形金刚-威震天 | 15 | 库存充足 |
| 魔仙玩偶1 | 100 | 库存充足 |
| 超人玩偶 | 100 | 库存充足 |
| 小霸王游戏机 | 300 | 库存充足 |
| X-BOX游戏机 | 12 | 库存充足 |
| 任天堂游戏机 | 30 | 库存充足 |
| 乐高玩具-散装 | 100 | 库存充足 |
| 乐高玩具-快乐家庭 | 20 | 库存充足 |
| 乐高玩具-蝙蝠侠纪念版 | 6 | 库存少 |
| 夏日有人手办 | 10 | 库存少 |
| EVA模型玩具 | 10 | 库存少 |
| 平板电脑模型 | 120 | 库存充足 |
| 手机模型玩具 | 60 | 库存充足 |
| 手机模型玩具 | 10 | 库存少 |
| 手机模型玩具 | 8 | 库存少 |
| hellokitty手机链 | 40 | 库存充足 |
| 水枪-小 | 80 | 库存充足 |
| 水枪-大 | 80 | 库存充足 |
+-----------------------+-------+--------------------------------------------------------+
20 rows in set (0.01 sec)
派生字段:case when c_num<=10 then ‘库存少’ else ‘库存充足’ end