SQL基礎sql
標識符、註釋、數據類型、常量與變量、操做符、表達式數據庫
函數安全
系統函數服務器
存儲函數網絡
流程控制語句ide
遊標模塊化
存儲過程函數
@:以@開頭的標識符表示一個局部變量或者一個函數的參數性能
@@:以@@開頭的標識符表示一個全局變量fetch
單行註釋:##
多行註釋:/* */
在SQL中,表和視圖的列、局部變量、函數的參數和返回值、存儲過程的參數和返回值(具備返回代碼)和表達式等都具備相關的數據類型。
常量:常量也稱爲文字值或標量值,是指程序運行中值始終不改的量。
變量:變量就是在程序執行過程當中,其值是能夠改變的量。
系統定義和維護的全局變量:
系統全局變量是MySQL系統提供並賦值的變量。全局變量以兩個@符號開頭。
1 # 使用系統全局變量@@VERSION查看當前使用的MySQL的版本信息 2 select @@version;
用戶定義用來保存中間結果的局部變量:
局部變量是做用域侷限在必定範圍內的SQL對象。局部變量被引用時要在其名稱前加上標誌@。
局部變量的聲明和賦值
使用DECLAREA語句聲明局部變量,局部變量的做用範圍在它被聲明的BEGIN…END複合語句內。
DECLAREA語句的語法格式以下:
DECLARE 變量名[,…] 數據類型 [DEFAULT 默認值];
聲明局部變量後要給局部變量賦值,直接給變量賦值可使用SET語句。SET語句的語法格式以下:
SET 變量名=表達式[,變量名=表達式,…];
1 ## 將局部變量var1聲明爲char類型,長度值爲10,併爲其賦值爲「程菲」,SQL語句以下: 2 begin 3 declare var1 char(10); 4 set @var1='程菲'; 5 end 6 7 8 ##經過局部變量查看D_sample數據庫中的學生信息,條件是查看student表中「政治面貌」爲「中共黨員」的學生信息。SQL語句以下: 9 use D_sample; 10 set @政治面貌='中共黨員'; 11 select * from student 12 where 政治面貌=@政治面貌;
在MySQL中,還可使用SELECT…INTO語句把數據表中選定的字段值直接存儲到變量中。
其語法格式以下:
SELECT <字段名>[,...] INTO <變量名>[,...] FROM <表名>;
1 ## 經過局部變量查看D_sample數據庫中的學生信息,條件是查看student表中學號」爲「201507002」的學生姓名和性別信息。SQL語句以下: 2 use D_sample; 3 select 姓名,性別 into @name,@sex from student 4 where 學號='201507002'; 5 select @name,@sex;
注意:局部變量分爲存儲變量和會話變量。
存儲變量就是使用DECLAREA語句建立的變量,而且初值爲NULL的變量。
會話變量就是直接使用set 或者select into語句賦值,不進行定義的變量,這個變量在此次會話框中都有效,而且初值即爲賦的值。
SQL的操做符和其它高級語言的操做符相似,由變量、常量和函數鏈接起來並指定在一個或多個表達式中執行的操做。
在SQL語言中,表達式由變量、常量、操做符、函數等元素組成。
1 ## 在D_sample數據庫中,查詢一個按平均成績降序排列的結果集,包括學生「學號」、「平均成績」及「考生信息」3列,其中考生信息列又由學生「姓名」、「性別」這些來自student表的數據組成。 2 3 4 use D_sample; 5 -- concat是一個函數,鏈接函數。space是表示空格函數。產生參數個空格。 6 select a.學號,avg(成績) as '平均成績',concat(姓名,space(6),性別) as '考生信息' 7 from sc a inner join student b on a.學號=b.學號 8 group by a.學號 -- 分組後纔有平均成績那一項。 9 order by 平均成績 desc;
數學函數對數值表達式進行數學運算,並將運算結果返回給用戶。
ABS(數值表達式)函數用來得到一個數的絕對值。
1 select abs(-876),abs(-2.345);
FLOOR(數值表達式)函數用於得到小於一個數的最大整數值,CEILING(數值表達式)函數用於得到大於一個數的最小整數值。
1 select floor(-1.2), ceiling(-1.2), floor(9.9), ceiling(9.9);
ROUND(數值表達式)函數用於得到一個數的四捨五入的整數值。
1 select round(34.567,2), round(19.8,0);
SIGN(數值表達式)函數返回數字的符號,返回的結果是正數(1)、負數(-1)或者零(0)。
1 select sign(-2), sign(2), sign(0);
SQRT(數值表達式)函數返回一個數的平方根。
1 select sqrt(25), sqrt(15), sqrt(1);
字符串函數是對字符串(char 或varchar數據類型)輸入值執行操做,並返回一個字符串或數字值。
ASCII(字符表達式) 函數可返回字符表達式中最左側字符的ASCII碼值。
1 select ascii('A'), ascii('a'), ascii('中文');
CHAR(整型表達式)函數將整型的ASCII碼轉換爲字符。
1 select char(65),char(97);
LEFT(字符表達式,整型表達式)函數返回字符串中從左邊開始的指定個數的字符。RIGHT(字符表達式,整型表達式) 函數返回字符串從右邊開始的指定個數的字符。
1 select left('數據庫應用技術',3), right('數據庫應用技術',2);
LENGTH(字符表達式)函數返回某個指定字符串的長度,不計字符串後的空格。
1 select length('中華人民共和國'), length('Tsinghua University press');
LOWER(字符表達式)函數將字符表達式中的大寫字母轉換爲小寫字母。UPPER(字符表達式) 函數將字符表達式中的小寫字符轉換爲大寫字符。
1 select lower('WonDERful'), upper('Tsinghua University press');
LTRIM(字符表達式)函數返回刪除了前導空格字符後的字符表達式。RTRIM(字符表達式)函數截斷全部尾部空格後返回一個字符串。
1 select concat(rtrim('計算機應用技術專業 '),ltrim(' 數據庫應用技術'));
CONCAT(字符串1,字符串2,...)函數返回鏈接參數產生的字符串。
1 select concat(‘MySQL’,’數據庫管理系統’);
SUBSTRING(字符表達式,起始點,n)函數返回字符表達式中從「起始點」開始的n個字符。
1 use D_sample; 2 select substring(學號,5,2) as 專業大類代碼 3 from student;
日期時間函數對日期和時間輸入值執行操做,將返回一個字符串、數字或日期和時間值。
CURDATE()函數返回當前日期。YEAR(日期)、MONTH(日期)和DAY(日期)函數返回日期的年、月和日。
1 select curdate(),year('2016-1-12'), month('2016-1-12'),day('2016-1-12');
ADDDATE(日期,INTERVAL 數值 日期元素)函數可按照「日期元素」給定的日期單位,返回「日期」加上「數值」的新日期。
1 select adddate('2016-1-12',interval -2 year), adddate('2016-1-12',interval 3 month), adddate('2016-1-12',interval 60 day);
DAYNAME(日期)函數返回日期對應的工做日名稱。
1 select dayname('2015-03-01');
DATEDIFF(日期1,日期2)函數返回起始時間日期1和結束時間日期2之間的天數。
1 select datediff('2011-3-3', '2014-4-6');
數據類型轉換函數就是把一個值轉換爲指定的數據類型。
CAST(表達式 AS 數據類型)函數將表達式的類型轉換爲指定的數據類型。
1 select concat('考試成績是:',cast(90 as char(5)));
CONVERT(表達式,數據類型(長度))函數將表達式的類型轉換爲指定的數據類型。
1 select concat(‘考試成績是:’,convert(90,char(5)));
聚合函數經常使用於對一組值進行計算,而後返回單個值。聚合函數主要用於select 語句的group by子句、having子句。
count(字段):計算個數
max(字段):計算該字段的最大值
min(字段):計算字段的最小值
sum(字段):計算該字段的和
avg(字段):計算字段的平均值
控制流程函數的做用是進行條件判斷。根據判斷條件,執行不一樣的分支並將運算結果返回給用戶。
IF(表達式1,表達式2,表達式3)函數表達式1爲真將返回表達式2的值,不然返回表達式3的值。
1 select if(23%2=0,’是偶數’,’是奇數’);
CASE 輸入值 WHEN 匹配值1 THEN 結果1 [WHEN 匹配值2 THEN 結果2...] [ELSE 其它結果] END函數輸入值與哪一個匹配值匹配則返回相應的結果值。
1 SELECT 學號, 2 CASE FLOOR(成績/10) 3 WHEN 10 THEN '優秀' 4 WHEN 9 THEN '優秀' 5 WHEN 8 THEN '良好' 6 WHEN 7 THEN '中等' 7 WHEN 6 THEN '及格' 8 ELSE '不及格' 9 END AS '成績等級' 10 FROM sc;
1)加密函數
MD5(字符串)函數以32位十六進制數字的形式返回爲字符串算出一個 MD5 128比特校驗和。
1 select md5(‘MySQL’);
PASSWORD(字符串)函數從原文密碼字符串中計算並返回密碼字符串。
1 select password(‘newpwd’);
2)信息函數
USER()函數返回當前登陸的用戶名。
1 select user();
DATABASE()函數返回當前數據庫名。
1 select database();
在MySQL中,服務器處理語句的時候是以分號爲結束標誌的。使用DELIMITER語句將MySQL語句的結束標誌修改成其餘符號。
DELIMITER語法格式以下:
DELIMITER $$
要想恢復使用分號做爲結束符,執行下面語句便可:
DELIMITER ;
建立存儲函數語法格式以下:
1 CREATE FUNCTION 存儲函數名([參數名 參數的數據類型[,…]]) 2 RETURNS 函數返回值的數據類型 3 BEGIN 4 函數體; 5 RETURN 表達式; 6 END
建立一個存儲函數,返回兩個參數中的最大值。
1 delimiter $$ 2 create function max1(i int,j int) 3 returns int 4 begin 5 declare k int; 6 if i>j then 7 set k=i; 8 else 9 set k=j; 10 end if; 11 return k; 12 end$$ 13 delimiter ;
當調用建立的存儲函數時,能夠利用SELECT語句調用函數。
使用SELECT語句調用max1函數。
1 select max1(2,7);
BEGIN…END能夠定義SQL語句塊,其語法格式以下:
1 BEGIN 2 SQL語句|SQL語句塊; 3 END
在D_sample數據庫中建立一個存儲函數,返回指定學號的學生信息:
1 use D_sample; 2 delimiter $$ 3 create function search1(xh char(9)) 4 returns char(9) 5 begin 6 return (select * from student where 學號=xh); 7 end$$ 8 delimiter ;
用於指定 SQL 語句的執行條件。其語法格式以下:
1 IF <邏輯表達式> THEN 2 <SQL語句|SQL語句塊>; 3 [ELSE 4 < SQL語句|SQL語句塊>;] 5 END IF;
建立一個存儲函數f1,輸入一個數判斷其奇偶數。若是是偶數輸出0,不然輸出1。
1 delimiter $$ 2 create function f1(j int) 3 returns int 4 begin 5 declare i int; 6 if i%2=0 then 7 return 0; 8 else 9 return 1; 10 end if; 11 end$$ 12 delimiter ;
調用函數f1。SQL語句以下:
1 select f1(23);
CASE關鍵字可根據表達式的真假來肯定是否返回某個值,能夠容許使用表達式的任何位置使用這一關鍵字。使用CASE語句能夠進行多個分支的選擇。CASE語句具備以下兩種格式。
CASE表達式是將某個表達式與一組簡單表達式進行比較以肯定結果。其語法格式以下:
1 CASE <輸入表達式> 2 WHEN <表達式> THEN <語句>; 3 [WHEN <表達式> THEN <語句>[...]]; 4 [ELSE <語句>]; 5 END CASE;
第二種格式:
1 CASE 2 WHEN <表達式> THEN <語句>; 3 [WHEN <表達式> THEN <語句>[...]]; 4 [ELSE <語句>]; 5 END CASE;
輸入學生的考試成績,按照優秀、良好、中等、合格及不合格顯示成績。SQL語句以下:
1 delimiter $$ 2 create function score1(i int) 3 returns char(6) 4 begin 5 declare j int; 6 declare cj char(6); 7 case 8 when j>=90 then set cj='優秀'; 9 when j>=80 and j<90 then set cj='良好'; 10 when j>=70 and j<80 then set cj='中等'; 11 when j>=60 and j<70 then set cj='合格'; 12 else set cj='不合格'; 13 end case; 14 return cj; 15 end$$ 16 delimiter ;
WHILE語句是設置重複執行SQL語句或語句塊的條件。其語法格式以下:
1 WHILE <邏輯表達式> DO 2 <SQL語句|SQL語句塊>; 3 END WHILE;
使用WHILE語句計算1~100之和。
1 delimiter ## 2 create function sum1() 3 returns int 4 begin 5 declare s int default 0; 6 declare i int default 1; 7 while i<=100 do 8 set s=s+i; 9 set i=i+1; 10 end while; 11 return s; 12 end## 13 delimiter ;
遊標概念:遊標是相似於C語言指針同樣的結構,在MySQL中,它是一種數據訪問機制,容許用戶訪問單獨的數據行,而不是對整個行集進行操做。
遊標的使用步驟:
1.聲明遊標
聲明遊標的語法格式以下:
1 DECLARE <遊標名> CURSOR 2 FOR SELECT語句;
在D_sample數據庫中爲了student表建立一個普通的遊標,定義名稱爲stu_cursor。
1 use D_sample; 2 declare stu_cursor cursor 3 for select * from student;
2.打開遊標
打開遊標的語法格式以下:
1 OPEN <遊標名>;
打開前面建立的stu_cursor遊標。
1 open stu_cursor;
3.檢索遊標
其語法格式以下:
1 FETCH <遊標名> INTO <變量名>[,變量名]...;
在打開的stu_cursor遊標以後,使用FETCH語句來檢索遊標中的可用的數據。
1 fetch stu_cursor into xh; 2 while found do 3 set i=i+1; 4 fetch stu_cursor into xh; 5 end while;
4.關閉遊標
關閉遊標的語法格式以下:
1 CLOSE <遊標名>;
在檢索遊標stu_cursor後可用CLOSE語句來關閉它。
1 close stu_cursor;
存儲過程:存儲過程(Stored Procedure)是一組完成特定功能的SQL語句集,經編譯後存儲在數據庫中。
優勢:
(1)存儲過程在服務器端運行,執行速度快。
(2)存儲過程執行一次後,其執行規劃就駐留在高速緩衝存儲器,在之後的操做中,只需從高速緩衝存儲器中調用已編譯好的二進制代碼執行,提升了系統性能。
(3)存儲過程提供了安全機制。
(4)存儲過程容許模塊化程序設計。
(5)存儲過程能夠減小網絡通訊流量。
在MySQL系統中,可使用CREATE PROCEDURE語句建立存儲過程。其語法格式以下:
1 CREATE PROCEDURE <存儲過程名稱> ([IN|OUT|INOUT] 參數 數據類型[,...]) 2 BEGIN 3 過程體; 4 END
建立一個存儲過程,在數據庫D_sample的student表中查詢政治面貌爲「共青團員」的學生的學號、姓名、性別及政治面貌信息。
1 use D_sample; 2 delimiter $$ 3 create procedure cp_student(in zzmm char(8)) 4 begin 5 select 學號,姓名,性別,政治面貌 6 from student 7 where 政治面貌=zzmm 8 order by 學號; 9 end$$ 10 delimiter ;
能夠利用CALL語句調用存儲過程,其語法格式以下:
1 CALL [數據庫名.]<存儲過程名稱>([參數[,...]]);
執行上例「cp_student」存儲過程代碼:
1 call cp_student(‘共青團員’);
在D_sample數據庫的student表中建立一個存儲過程,經過創建一個性別參數爲同一存儲過程指定不一樣的性別,用於返回不一樣性別的學生信息,
1 # #創建存儲過程 2 use D_sample; 3 delimiter @@ 4 create procedure cp_sex(in xb char(2)) 5 begin 6 select * from student where 性別=xb; 7 end@@ 8 delimiter ; 9 10 ##執行帶有輸入參數的存儲過程「cp_sex」 11 call cp_sex('女');
建立了一個名爲「cp_score」的存儲過程。它使用兩個參數:「p_姓名」爲輸入參數,用於指定要查詢的學生姓名,「p_成績」爲輸出參數,用來返回學生的成績
1 ## 建立存儲過程 2 use D_sample; 3 delimiter $$ 4 create procedure cp_score(in p_name char(10),out p_score decimal(4,1)) 5 begin 6 select b.成績 into p_score from student a,sc b 7 where a.學號=b.學號 and 姓名=p_name; 8 end$$ 9 delimiter ; 10 11 12 ## 調用存儲過程 13 以上代碼爲了接收某一存儲過程的返回值,須要一個變量來存放返回參數的值。 14 call cp_score('高峯',@p_score); 15 select concat('高峯','的成績是:',@p_score) as 結果爲:;
注意:若是要使用帶參數的存儲過程,須要在執行過程當中提供存儲過程的參數值。可使用兩種方式來提供存儲過程的參數值。
(1)直接方式:該方式在CALL語句中直接爲存儲過程的參數提供數據值,而且這些數據值的數量和順序與定義存儲過程時參數的數據和順序相同。
(2)間接方式:該方式是指在執行CALL語句以前,聲明參數而且爲這些參數賦值,而後在CALL語句中引用這些已經獲取數據值的參數名稱。
使用ALTER PROCEDURE語句來修改現有存儲過程的特徵。修改存儲過程的基本語法格式以下:
1 ALTER PROCEDURE <存儲過程名稱> 2 [{{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} 3 |SQL SECURITY {DEFINER|INVOKER} 4 |COMMENT '註釋內容'}];
修改存儲過程「cp_student」的定義。具備寫數據權限,而且調用者能夠執行。
1 alter procedure cp_student 2 modifies sql data 3 sql security invoker;
可以使用DROP PROCEDURE語句從當前的數據庫中刪除用戶定義的存儲過程。刪除存儲過程的基本語法格式以下:
1 DROP PROCEDURE [IF EXISTS] <存儲過程名稱>
刪除「cp_student」存儲過程。
1 drop procedure if exists cp_student;
使用SHOW PROCEDURE STATUS語句。查看存儲過程的定義信息基本語法格式以下:
1 SHOW PROCEDURE STATUS [LIKE '參數'];
查看「cp_score」存儲過程的定義文本信息。
1 show procedure status like 'cp_score';
使用SHOW CREATE PROCEDURE語句。查看存儲過程的詳細信息基本語法格式以下:
1 SHOW CREATE PROCEDURE <存儲過程的名稱>;
查看「cp_score」存儲過程的詳細文本信息。
1 show create procedure cp_score;
-------------------------