mysql高級 視圖,觸發器,存儲過程

視圖View


作用:簡化查詢語句

創建視圖
create view 視圖名
as
select語句;


修改視圖
alter view 視圖名
as
select語句子



刪除視圖
drop view 視圖名;


使用視圖:把視圖當表用
select * from 視圖名;
select 字段,字段... from 視圖名;
select * from 視圖名 where 條件 order by 字段 limit 起始值,條數;




查看視圖
1、查看現存的所有表
   show tables;
2、查看information_schema庫->views表
   select table_schema,table_name from information_schema.views 
     where table_schema='庫名';


視圖注意:
1、簡化查詢語句(視圖中只能存放select查詢語句)
2、把視圖當表用(建議只對視圖執行查詢操作)


視圖知識點
1、創建視圖
2、修改視圖
3、查看視圖
4、刪除視圖
5、使用視圖


視圖使用的場合
一個多表查詢語句,頻繁的使用,那麼就要考慮是否創建一個視圖
-----------------------------------------------------------
觸發器Trigger:數據庫中的事件


作用:當用戶對錶進行增刪改操作的同時,是否要執行其他操作


觸發器執行時間
before:當用戶對錶進行增刪改時,先調用觸發器,後執行增刪改操作
after:當用戶對錶進行增刪改時,先執行增刪改操作,後調用觸發器


觸發器的類型
insert:當用戶對錶進行insert操作時,系統將自動調用觸發器
update:當用戶對錶進行update操作時,系統將自動調用觸發器
delete:當用戶對錶進行delete操作時,系統將自動調用觸發器


創建觸發器
delimiter //
drop trigger if exists 觸發器名//
create trigger 觸發器名
before|after  insert|update|delete
on 表名
for each row
begin
  sql語句;
  sql語句;
  sql語句;
end//
delimiter ;



刪除觸發器
drop trigger 觸發器名;
drop trigger updateBbs;


查看觸發器
1、查看information_schema庫->triggers表
   select trigger_schema,trigger_name from information_schema.triggers
     where trigger_schema='庫名';


例一:修改bbsInfo表中的記錄,同時向userInfo表添加一條記錄
delimiter //
drop trigger if exists updateBbs//
create trigger updateBbs
after update
on bbsInfo
for each row
begin
  insert into userInfo(userName,password)values('張三','123');
end//
delimiter ;



例二:向新聞表添加記錄的同時,將分類表中指定分類下的數量加一
newsTypes:typeId、typeName、articleNums
newsArticles:articleId、title、content...
注意:該功能無法用觸發器實現(原因:觸發器無法傳參)



例三:統計功能
員工表
create table employee
(
  empId     int         auto_increment primary key,
  userName  varchar(20) unique not null,
  sex       char(3)     default '男',
  age       int         default 20
);
部門表
create table bumen
(
  bmId      int         auto_increment primary key,
  bmName    varchar(50)  not null
);
統計表
create table tongji
(
  empCount   int   default 0,#員工總數
  bmCount    int   default 0 #部門總數
);
insert into tongji values(0,0);
題目:向員工表添加記錄時,員工數量加一,相返的減一
      向部門表添加記錄時,部門數量加一,相返的減一
添加員工的觸發器
delimiter //
drop trigger if exists addEmp//
create trigger addEmp
after insert
on employee
for each row
begin
  update tongji set empCount=empCount+1;
end//
delimiter ;
刪除員的觸發器
delimiter //
drop trigger if exists delEmp//
create trigger delEmp
after delete
on employee
for each row
begin
  update tongji set empCount=empCount-1;
end//
delimiter ;
添加部門的觸發器
delimiter //
drop trigger if exists addBm//
create trigger addBm
after insert
on bumen
for each row
begin
  update tongji set bmCount=bmCount+1;
end//
delimiter ;
刪除部門的觸發器
delimiter //
drop trigger if exists delBm//
create trigger delBm
after delete
on bumen
for each row
begin
  update tongji set bmCount=bmCount-1;
end//
delimiter ;
測試
insert into employee(userName,sex,age)values('張三','男',25);
insert into employee(userName,sex,age)values('李四','女',25);
insert into employee(userName,sex,age)values('王五','女',27);
insert into employee(userName,sex,age)values('趙六','男',30);
insert into employee(userName,sex,age)values('田七','男',50);
insert into bumen(bmName)values('開發部');
insert into bumen(bmName)values('就業部');


觸發器的知識點
1、創建觸發器
2、刪除觸發器
3、查看觸發器


觸發器注意
1、一個觸發器最多隻能有一個類型
2、一個表最多隻能添加三個觸發器
3、一個觸發器最多隻能監聽一個表的動作
4、觸發器是由系自動調用(觸發器是由用戶隱式調用)
5、觸發器沒有參數、觸發器沒有返回值




觸發器的使用場合
當用戶對錶進行增刪改的同時,是否要執行其他操作
----------------------------------------------------------
存儲過程Procedure:相當於數據庫中的自定義函數


作用:解決了代碼重用(省代碼)




創建存儲過程
delimiter //
drop procedure if exists 存儲過程名//
create procedure 存儲過程名(參數...)
begin
  sql語句;
  sql語句;
  sql語句;
end//
delimiter ;




調用存儲過程
call 存儲過程名();
call 存儲過程名(值,值,值...);




刪除存儲過程
drop procedure 存儲過程名;




查看存儲過程
1、查看mysql庫->proc表
   select db,name from mysql.proc where db='庫名';




例一:利用存儲過程查詢bbsInfo表的記錄
delimiter //
drop procedure if exists getBbs//
create procedure getBbs()
begin
  select * from bbsInfo;
end//
delimiter ;
調用上邊的存儲過程
call getBbs();


php語言:弱語言、腳本語言




例二:利用存儲過程查詢bbsInfo表的記錄
delimiter //
drop procedure if exists getBbsById//
create procedure getBbsById(bid int)#參數名不能和表的字段名相同
begin
  select * from bbsInfo where bbsId=bid;
end//
delimiter ;
調用上邊的存儲過程
call getBbsById(7);




外鍵約束名詞:
主表:包含主鍵的那個表
從表(外表):包含外鍵的那個表


外鍵限制
1、建表 先建主表,後建從表
2、刪表 先刪從表,後刪主表
3、添加記錄 先給主表添加記錄,後給從表添加記錄
4、刪除記錄 先刪除從表記錄,後刪除主表的記錄


用戶表(主表)
userId  userName...
1       張三
2       李四
3       王五
4       趙六
文章表(從表)
id  userId  title  content...
1   2       xxxxxx xxxxxxxxxxxxxxxxxx
2   4       xxxxxx xxxxxxxxxxxxxxxxxx




例三:利用刪除過程,刪除指定的分類$typeId=3
newsTypes: 分類表(typeId,typeName...)
newsArticles: 新聞表(articleId,typeId,title...)
reviews: 評論表(id,articleId,body...)








delimiter //
drop procedure if exists deleteBbs//
create procedure deleteBbs(tid int)
begin
  delete from reviews where articleId in (select articleId from newsArticles where typeId=tid);
  delete from newsArticles where typeId=(tid);
  delete from newsTypes where typeId=(tid);
 
end//
delimiter ;
調用上邊的存儲過程
call deleteBbs(1);



























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章