子查詢、儲存過程、檢視
阿新 • • 發佈:2018-12-21
子查詢:把內層的查詢結果供外層使用,先執行內層,再執行外層,先做內層,再做外層
例:查詢比Tom小的所有學生的資訊
SELECT * FROM student WHERE birthday>
(
SELECT birthday FROM student WHERE name='Tom' 找出Tom的出生日期
);
儲存過程:
CREATE PROCEDURE 儲存過程名字(引數) BEGIN BEGIN...END就類似於java方法的{} SQL語句 END 呼叫儲存過程:CALL 儲存過程名; 刪除儲存過程:DROP PROCEDURE 儲存過程名; 例: CREATE PROCEDURE usp_maxMysqlScore() BEGIN SELECT subname,MAX(socre) FROM score INNER JOIN `subject` ON score.subid=`subject`.subid WHERE subname='MySQL'; END CALL use_maxMysqlScore(); 例如:查詢某科考試沒有及格的學生姓名,並獲得參加考試的人數和未及格的人數。 -- 輸入引數:科目名;IN輸入引數 -- 輸出引數:參加考試人數 未及格人數OUT輸出引數:把執行結果返回給呼叫者 CREATE PROCEDURE usp_getCount(IN suname VARCHAR(20),OUT testCount INT,OUT notestCount INT) BEGIN -- 查詢某科考試沒有及格的學生姓名 SELECT name,socre FROM student INNER JOIN score ON student.stuid=score.stuid INNER JOIN `subject` ON score.subid=`subject`.subid WHERE subname=suname AND socre<60; -- 參加考試的人數 SELECT COUNT(*) FROM `subject` INNER JOIN score ON `subject`.subid=score.subid WHERE subname=suname INTO testCount; -- 未及格人數 SELECT COUNT(*) FROM score INNER JOIN `subject` ON `subject`.subid=score.subid WHERE subname=suname AND socre<60 INTO notestCount; END CALL usp_getCount('MySQL',@testCount,@notestCount); SELECT @testCount AS 參加考試人數,@notestCount AS 未及格人數; 流程控制 例如:一女生向你表白,如果她長的貌美如花,你說"咱倆結婚吧" 如果長的"還可以",你說"考慮一下",否則說"NO" CREATE PROCEDURE getGrad(IN text VARCHAR(20)) BEGIN DECLARE a VARCHAR(20); 判斷輸入的內容 IF text='貌美如花' THEN SET a='咱倆結婚吧'; ELSEIF text='還可以' THEN SET a='考慮一下'; ELSE SET a='NO'; END IF; SELECT A; END CALL getGrad('貌美如花'); CASE END 例如:年終發獎獎金了,年終獎的規定金額是:500,2000,10000,10000以上。當你的獎金是500時,你心裡想“真的很少啊”,獎金是2000時,想到 “能不能給點力”,當獎金是10000時,想到“夠嗨皮了”,更多時 “老闆真好。 CREATE PROCEDURE usp_getGrad2(IN grad INT) BEGIN DECLARE str VARCHAR(20); CASE gard WHEN 500 THEN SET str='真的很少啊'; WHEN 2000 THEN SET str='能不能給點力'; WHEN 10000 THEN SET str='夠嗨皮了'; ELSE SET str='老闆真好'; END CASE SELECT str; END CALL usp_getGrad2(12000); WHILE 使用迴圈顯示1-10之間的奇數 CREATE PROCEDURE even() BEGIN DECLARE i INT; SET i=1; WHILE i<=10 DO SELECT i; SET i=i+2; END WHILE; END CALL even();
檢視:檢視就是一個由查詢結果組成的虛擬表
建立一個檢視 CREATE VIEW 檢視名 AS 查詢語句 刪除一個檢視 DROP VIEW 檢視名; 修改一個檢視 ------這種方式不建議使用,建議先把原來的檢視刪掉,再重新建立一個檢視 ALTER VIEW vw_score AS SELECT `name`,student.stuid,socr,subname FROM student INNER JOIN score ON student.stuid=score.stuid INNER JOIN `subject` ON `subject`.subid=score.subid WHERE subname='MySQL'; 檢視是表的查詢結果,如果表的資料發生增刪改,那麼檢視的資料也會發生改變。檢視發生了增刪改操作,那麼表的資料也會發生改變,但是一般不會對檢視進行增刪改,比如新增,檢視只顯示了原表的幾個欄位,那麼做新增的話,原表可能有一些非空欄位,這時候用檢視做新增操作,肯定有問題。