視圖的增刪改查 視圖相當於一張只能讀的表,不可以修改。當組成視圖的表發生數據變化的時候,視圖會相對應的進行改變。 存儲過程的練習 創建存儲過程: create [if not exists] procedure 名字 ([in | out | inout] 參數名稱 參數類型) begin # sq ...
視圖的增刪改查
視圖相當於一張只能讀的表,不可以修改。當組成視圖的表發生數據變化的時候,視圖會相對應的進行改變。
存儲過程的練習
創建存儲過程:
create [if not exists] procedure 名字 ([in | out | inout] 參數名稱 參數類型)
begin
# sql語句
end;
查詢存儲過程:
存儲過程存放於infomation_schema
資料庫,routines
表e
-- 使用sql查詢
SELECT *
from information_schema.ROUTINES
where information_schema.routines.routine_schema != 'sys'
運行結果:
刪除存儲過程:
drop PROCEDURE pr_test;
運行結果:
存儲過程的練習:
-- 存儲過程的練習 無參數
create PROCEDURE pr_test()
BEGIN
select * from dept;
END;
-- 使用存儲過程
call pr_test();
-- 存儲過程 帶有輸入參數
-- 如果只有一個輸入參數 關鍵字in 可以省略
create PROCEDURE pr_test1(_deptno int)
BEGIN
SELECT * from emp WHERE deptno = _deptno;
END;
call pr_test1(10);
call pr_test1(20);
call pr_test1(30);
-- 存儲過程 帶有輸出參數
-- 輸出參數的out關鍵字不可以省略
create PROCEDURE pr_test2(out _ename VARCHAR(50))
BEGIN
SELECT ename into _ename from emp;
END;
-- 測試
set @ename = '';
-- 測試 如果包含多條數據 是不能直接進行賦值的
call pr_test2(@ename) ;
SELECT @ename;
-- 測試存儲過程 單個輸出參數
CREATE PROCEDURE pr_test3(out _ename VARCHAR(50))
BEGIN
SELECT ename INTO _ename from emp WHERE emp.deptno = 10;
END;
-- 輸出參數
set @deptno = '';
-- 執行存儲過程
call pr_test3(@deptno);
-- 輸出結果
SELECT @deptno;
-- 測試存儲過程 有輸入參數 也有輸出參數
-- 關鍵字in 可以省略 out 不可以省略
create PROCEDURE pr_test5(_id int,out _ename varchar(20))
BEGIN
SELECT ename into _ename from emp WHERE deptno = _id;
END;
-- 測試數據
set @result = '';
--
call pr_test5(10,@result);
-- 查詢結果
SELECT @result;
-- 測試存儲過程 即使輸入參數 也是輸出參數
CREATE PROCEDURE pr_test6(INOUT res VARCHAR(20) )
BEGIN
SELECT emp.deptno into res from emp where emp.empno = res;
END;
SELECT * from emp;
--
set @res = '7876';
--
call pr_test6(@res);
--
SELECT @res;
函數的使用、查看、刪除
-- 函數的練習
-- 創建函數
create FUNCTION fun_show_detail() # 註意事項1: 這裡的括弧一定不能丟
returns varchar(30) # 註意事項2: 這裡是rerurns
BEGIN
declare _res VARCHAR(50); # 註意事項3: Delare 需要搭配存儲過程和函數使用 不能單獨使用
SELECT 1 INTO _res ;
return _res;
END;
-- 使用函數
SELECT fun_show_detail()
-- 刪除函數
drop FUNCTION fun_show_detail;
觸發器
查詢當前資料庫中所有的觸發器:
show TRIGGERS from emp;
刪除觸發器:
drop TRIGGER tr_emp_update
觸發器練習:
-- 創建觸發器
create trigger tr_emp_insert
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
insert into emp(empno,ename) values(1,'測試');
END;
-- 觸發觸發器
insert into emp(empno,ename) values(2,'外面測試');
執行結果:
因為這樣會迴圈的觸發觸發器,所以不能直接這樣進行數據的插入。可以通過set的方式進行賦值。
create trigger tr_emp_insert
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
-- insert into emp set empno = 1,ename ='測試';
set new.empno = 2,new.ename ='測試';
END;
執行sql:
insert into emp(empno,ename) values(2,'外面測試');
再次執行:
所以如果是before xxx
,不會直接進行增刪改,會執行觸發器裡面的代碼。
關於觸發器的new虛擬表格和old虛擬表格
當進行insert
的時候,new表格可以獲取插入的數據。
當進行delete
的時候,old表格可以獲取被刪除行的數據。
當進行update
的時候,new表格中是修改後的數據,old表格中是被修改行的數據。
定時任務event
定時任務 執行一次
語法:
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE AT timestamp [+ INTERVAL interval] ...
DO
begin
# 要執行的sql語句
end;
間隔任務 多次執行
語法:
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE EVERY quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
DO
begin
# 要執行的sql語句
end;
查詢定時任務
show EVENTS FROM emp;
刪除定時任務
drop event event_name
流程式控制制
case
給我整懵了,怎麼測試怎麼出錯。
出錯原因:
1.case語句不能直接使用,需要搭配存儲過程或者函數使用,或者搭配select語句使用。
2.搭配select語句,裡面每個語句結束後不能添加分號,結尾語句必須為end,不能為end case;
SELECT case 10 when 10 then '10' -- 這裡不能加分號 when 9 then '9' -- 這裡不能加分號 else '8' end; -- 這裡不能用end case;結尾
3.搭配存儲過程或者函數使用,結尾必須為end case,中間的比較語句也必須加分號,then 後面必須跟著語句使用。
create PROCEDURE test1111() begin case 10 when 10 then SELECT '10'; -- 這裡必須為sql語句,而且要加分號 when 9 then SELECT '9'; -- 這裡必須為sql語句,而且要加分號 else SELECT '8'; -- 這裡必須為sql語句,而且要加分號 end case; -- 這裡必須以end case;結尾 end;
語法1:
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
語法2:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
區別:
語法1:
匹配的是值,所以when
裡面不能是表達式。
語法2:
匹配的是表達式,when
裡面是表達式。
if
語法:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
突然發現這些流程式控制制語句好像大多數都得搭配函數/存儲過程使用。
create PROCEDURE test_if()
BEGIN
IF 3>2 THEN
SELECT '正確';
ELSE
SELECT '錯誤';
END IF;
end;
call test_if();
while
語法:
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
示例代碼:階乘
CREATE FUNCTION get_jc(num int)
RETURNS int
BEGIN
DECLARE i int DEFAULT 1;
DECLARE res int DEFAULT 1;
WHILE i <= num DO
set res = res * i;
set i = i + 1;
END WHILE;
RETURN res;
end;
SELECT get_jc(3);
運行結果:
loop
語法:
[begin_label:] LOOP
statement_list
END LOOP [end_label]
示例代碼:階乘
create FUNCTION test_jc(num int)
RETURNS int
BEGIN
DECLARE i int DEFAULT 1;
DECLARE res int DEFAULT 1;
lab: LOOP
IF i > num THEN
LEAVE lab;
END IF;
set res = res * i;
set i = i + 1;
END LOOP;
RETURN res;
END;
select test_jc(4);
運行結果:
[CURSOR]游標
這個東西,有點意思。
https://dev.mysql.com/doc/refman/8.0/en/cursors.html