1. 程式人生 > >子查詢、儲存過程、檢視

子查詢、儲存過程、檢視

子查詢:把內層的查詢結果供外層使用,先執行內層,再執行外層,先做內層,再做外層

例:查詢比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';

	檢視是表的查詢結果,如果表的資料發生增刪改,那麼檢視的資料也會發生改變。檢視發生了增刪改操作,那麼表的資料也會發生改變,但是一般不會對檢視進行增刪改,比如新增,檢視只顯示了原表的幾個欄位,那麼做新增的話,原表可能有一些非空欄位,這時候用檢視做新增操作,肯定有問題。