關於mysql的sql語句的彙總(學習筆記)03(mysql高級應用)

– 索引:

(在某種程度上可以把數據庫看做是一本書,吧索引看做是書的目錄,通過目錄查找書中的信息,比沒有目錄的書方便快捷)**
索引一旦創立,將由數據庫自動管理和維護;

須知:在sql中語法格式的一些約定符號:

  • 尖括號<>中的內容爲必選項;
  • 中括號[]中的內容爲任選項;
  • [,…]的意思是等等;
  • 大括號{}與豎線 | 表明此處爲選擇項,在所列出的各項中僅需選擇一項;
索引分爲:
 --普通索引和唯一索引;
 --單列索引和組合索引;
 --全文索引;
 --空間索引;
   組合索引,是指在表的多個字段創建的索引;
   全文索引,允許在這些索引列中插入重複值和空值,全文索引可以在char,varchar,或者text類型的列上創建;mysql中只有MyISAM存儲引擎支持全文索引;
創建索引的注意事項:
    當給表創建unique約束時,mysql會自動創建唯一索引;
    索引的名稱必須符合mysql的命名規範,且必須是表中唯一
    可以在創建表時創建想索引,或是給現存表創建索引;
    只有表的所有者才能給表創建索引;
創建唯一索引時,應保證創建索引的列不包括重複的數據(兩個爲null的也算重複值),如果有這種數據,必須現將其刪除,否者索引不能被成功創建;
-------------------------------
創建索引基本格式1:[unique|fulltext|spatial]<index|key> [索引名](屬性名[(長度)][asc|desc][,...])
創建索引基本格式2:create [unique|fulltext|spatial] index <索引名> on <表名> (屬性名[(長度)][asc|desc][,...]);
刪除索引基本格式:drop index<索引名> on <表名>;
-------------------------------
    -- 在創建表的時候創建索引;
    create table student(
    ...
    unique index id_sno(sno) desc
    );
    ------------------------------
    -- 在現有表中創建索引:
----------------------------------
    -- 刪除索引:
        drop index id_name on student;

– 視圖

提示:保存視圖的時候,實際上保存的就是select查詢.保存的是視圖的定義而不是select查詢的結果;
注意:創建視圖時,注意編碼要保持一直,不然會報1267的error.出現亂碼現象;
    -- sql語句創建視圖(創建視圖是不要用 阿拉伯數字命名 ,刪除時好像有語法錯誤):
        create View view_name [(Column[,...n])]
        as <select語句>
        [with check option]
        說明:with check option:強制所有通過視圖修改的數據瞞住select語句中指定的選擇條件;
        ----------------------
        事例:
        create view v_name
        as
            select A.sno,sname,cname,degree
            from student A,course B,sc C
            where A.sno and B.cno=C.cno and cname='數據庫';
        ----------------------
        視圖定義後,可以像基本表一樣進查詢.例如:
        select * from v_name;
    -- 視圖的使用:
    注意:修改視圖,會同時修改基表;
    注意:如果視圖中有下面所述屬性,則插入,更新或者刪除操作將失敗 :
        -1-視圖定義中的from子句包含兩個或者多個表,且select選擇列表達式中的列包含來自多個表的列;
        -2-視圖的列是從集合函數派生的;
        -3-視圖中的select語句包含group by 子句或distinct選項;
        -4-視圖的列是從常量或表達式派生的; 
    -- 視圖的修改:
        alter View View_name [(column[,...n])]
        as <select語句>
        -- 如果在創建視圖的時使用了with check option,則在alter中也必須使用; 
        [with check option] 

    --視圖的刪除
        drop View <視圖名> --可同時刪除多個,多個時用 , 分開;

– SQL語言基礎(存儲過程和函數):

1.常量8種;
    -- 字符串常量,十進制常量,十六進制常量,日期常量,實型常量,位字段值,布爾常量,null常量;
2.變量;
    -- 變量名不能和命令和函數名相同;
    -- 在mysql中存在三種類型的變量:系統變量,用戶變量,局部變量;其中系統變量有分爲全局變量和會話變量兩種;
    -- 1.全局變量和回話變量.全局變量在mysql啓動時由服務器自動將他們初始化爲默認值,這些默認值可以通過my.ini文件來更改;
    -- 會話變量在每次創建新的連接的時候,由mysql來初始化,mysql會將當前所有全局變量的值複製一份作爲會話變量;
    -- 大多數的系統變量應用於其他sql產品保持一致,某些特定的系統變量是要省略 @@ 的,如:current_date,current_user;
    -- 可以使用系統全局變量@@version查看當前使用的mysql的版本信息和當前日期,sql語句如下:
        select @@version as '當前系統版本',current_date;
        -- 圖片如下 -- 圖1:

——————這裏寫圖片描述

    -- a.顯示系統清單:
        show [global|session] variables [like '字符串'];
        其中,global表示全局變量,session爲會話變量.默認爲會話變量;
        -- 例:
            表示以 a 開頭的所有系統變量的值:show variables like 'a%';
            圖片如下 -- 圖2:

—————–這裏寫圖片描述

    --b.修改系統變量的值:
    形如:
        set system_var_name = expression
        set_system_var_name爲系統變量名,名稱前面可以添加,globalsession等關鍵字;
    -- 注意: 1.要想更改全局變量的值,需要擁有super權限;
            2.有些系統變量不可以改變,如:系統版本,系統日期;
    -- 用戶變量:
        定義和初始化一個用戶變量可以使用setselect語句,其語法格式如下:
        set @user_variable[:] = expression1 [,user_variable = expression2,...]
        或
        set @user_variable:=expression [,user_variable:= expression2,...];
        -- 說明:對於set語句,可以使用 = 或 := 作爲分配符.也可以用select 語句代替set語句來爲用戶變量分配一個值,在這種情況下,分配符必須爲 := ,而不能是 = ,因爲在非set語句中 = 被視爲比較操作符;
        -- 例如:創建用戶變量name並賦值爲 王小強;
            set @name = '王小強';select @name := '王小強';
        注意:1. @ 符號必須放在一個用戶變量的前面, 便於與列名區分開,如果給name重新賦不同類型的
            2.在group by,order by,having中不能使用select中的用戶變量,因爲在select中,表達式發送
            到客戶端後才進行計算;
    -- 局部變量:
        局部變量的作用範圍實在begin...end語句塊中,可以使用declare 語句進行定義,局部變量不用 @ ;
        局部變量與begin...end語句塊,流程控制語句只能用於函數,存儲過程,觸發器和事務的定義中;
    基本語法:declare var_name [,...] type [default value]
    例子:declare myvar int default 10;
    賦值: set myvar = 100;
--3.sql流程控制語句:
    --注:流程控制語句必須和存儲過程和存儲過程配合
---------------
    begin
    ...
    end
----------------
    if ... then
    ...
    else if ... then ...
    else ...
    end if;
    -- 注意:如果邏輯表達式中有select語句必須用括號把select括起來;
-----------------
    -- 這個語句運行好像不對:
    if (select office from department where deptname = '計算機工程系') is null then 
    begin
        select '辦公地點不像' as 辦公地點;
        select * from department where deptname = '計算機工程系';
    end;
    else
        select office from department where deptname = '計算機工程系';
    end if;
----------------------
case分支語句:
    基本格式:case input_expression 
            when when_expression then result_repression;
            [...n]
            [else else_result_expression];
            end case;
            說明:1.input_expression:使用case語句時所計算的表達式,可以是任何有效的表達式.
                2.when_expression:用來和input_expression表達式作比較的表達式,
                input_expression和每個when_expression表達式的數據類型必須相同,或者可以隱形轉換;
                3.result_expression:指當input_expression=when_expression的取值爲true時,需要返回
                的表達式.
                4.else_result_expression:指當input_expression=when_expression的取值爲false時,
                需要返回的表達式;
    例子:
        declare dj int default 0;
        select count(*) into dj from sc where degree<60;
        case 
        when dj>=100 then select '不及格門數' as  檔次;
        when dj>=50 and dj<100 then select '不及格門數一般' as 檔次;
        when dj>=1 and dl<50 then select '不及格門數' as 檔次;
        else select '沒有及格的' as 檔次;
        end case; 
---------------------
循環語句:   
    基本格式:while 布爾值 do
            {leave begin_lable;}
            {iterate begin_label;}
            end while;
            說明:leave begin_label:用與退出while循環;
                iterate begin_label:用與跳出本次循環,直接進入下一次循環;
    例子:
        set @i=,@sum=0;
        while @i <= 100 DO
            begin
                set @sum = @sum+@i;
                set @i = @i + 1;
            end;
        end while;
        select @sum;
-----------------------
註釋:
    在mysql中支持三種註釋:#,/* */,--;
-----------------------
mysql常用的函數:
遊標:
(以上內容有空就去看看,老師沒有講到;)
-----------------------
存儲過程和存儲函數:
-----------------------------------
1.創建存儲過程:
    基本格式:              -- 可一有參數,也可以不傳入參數,如: in param_name char(10)
        create procedure 存儲過程名 (<[in|out|inout]  參數名   type參數類型>)
        [characteristic[,...]]
        語句體(可以使用:
                    begin
                    ...語句體
                    end;
            )

    關於characteristic的具體介紹看下面 -- 圖3:

這裏寫圖片描述

    例子:
        use gradem;
        delimiter $  -- 這個在命令行界面中要用,在查詢中可以不用;
        create procedure pro()
        reads sql data 
        begin
        select sno,sname,classno,saddress from student
        where saddress like '%青島%' order by sno;
        end;  --  在命令行中是要把 ; 換成上面定義的 $  ,在查詢中不需要;
        delimiter;  -- 在查詢中不需要這個語句,命令行中需要
    執行存儲過程的語句: call pro();
-------------------------------
2.創建存儲函數:
    基本格式:create function 函數名稱([function_parammeter[,...]])
            returns type;
            [character[,...]]
            語句體(說明:這裏可以用begin ... end 語句體)
        說明:function_parameter和存儲過程中相同;
            returns指定返回值的類型;
    例子:
        create function func_name(class_no varchar(8))
        returns varchar(8)
        begin
            return (select header from class
            where classno = class_no);
        end;
        執行存儲函數:select func_name('20060101');
3.查看存儲過程和函數:
    基本格式:1.show {procedure|function} status [like '函數名'];
            2.show create [procedure|function] name;
            說明:show ... status語句只能查看儲存過程或函數是操作哪一個數據庫,存儲過程或函數的名稱、
            類型、誰定義的、創建和修改時間、字符編碼等信息.但是這個語句不能查詢存儲過程或函數的具體定
            義.若要查看具體定義要用 show create語句;
                也可以從information_schema.Routines表中查看存儲過程和函數的具體信息;
4.修改存儲過程和函數:
        基本格式:alter {procedure|function} 名稱 [characteristic ...];
        說明:characteristic 的說明見上面--圖3;
        例子:
            alter function  func_name  -- 修改;
            MODIFIES sql data sql-- 訪問數據的全限;
            SECURITY INVOKER    -- 修改安全類型;
            COMMENT '0000';  -- 修改函數註釋;
5.刪除存儲過程和函數:
    drop {procedure|function} [if exists] 要刪除的名稱;
    說明:其中if exists是mysql的擴展,如果函數和存儲過程不存在,它可以防止發生錯誤,產生一個show 
    warning的警告;     

– 觸發器

說明:觸發器是一種特殊的存儲過程,它與表緊密相連,可以是表定義的一部分;觸發器是基於一個表建立的;
在表的數據做了任何修改時,觸發器會自動執行,觸發器可以通過數據庫中的相關表進行層疊修改;觸發器可以強制限制,這些比用check約束所定義的更復雜;

1.創建觸發器:
            基本格式:CREATE  trigger trigger_name  trigger_time trigger_event
                                ON   table_name FOR EACH ROW trigger_statement;
            說明:trigger_time:指定觸發器觸發的時機.可以指定爲  after 或者 before;
                        trigger_event:指明觸發的程序的語句類型:1.insert 2.update 3.delete 
                        FOR EACH ROW:行級觸發和語句級觸發兩種;不加 for each row爲語句級觸發;
            麗姐講的比較通俗的理解:
                            分析:
                                    監視誰: table_name;
                                    監視動作: trigger_event;
                                    出發時間:trigger_time;
                                    觸發事件: trigger_statement;
            關於new和old的總結:
                            總結:
                                    new在before觸發器中賦值,取值;在after觸發器中取值。
                                    new是新插入的數據,old是原來的數據
                                    insert只會有new,代表着要插入的新記錄
                                    delete只會有old,代表着要刪除的記錄
            例子1:
                    create trigger t
                    after 
                    insert
                    on student
                    for each row
                    begin
                        insert into class(classno) value(new.sno);
                    end;
            例1的說明:創建名爲t的觸發器,當在student表中執行插入操作後,在class表中插入classno爲
            新插入的sno的值;
            例子2:
                    create trigger t2
                    after  update on student for each row
                    begin
                        if new.sno!=old.sno then
                            update sc set sno=new.sno where sno = old.sno;
                        end if;
                    end;
            例2的說明:創建名爲t2的觸發器,當在student表中執行更新操作後,先判斷所更新的那行的sno的新
            舊的值,是否一樣,不一樣就更新表sc中的相應數據;
2.查看觸發器:
        語句1:show trigger;
        語句2:select * from information_schema.triggers;
        語句3(精確查詢): 
            select * from information_schema.triggers where trigger_name='觸發器名稱';
            注意:觸發器的名稱要用單引號,括起來;
3.刪除觸發器:
        語句:drop trigger [dbname] trigger_name;
        注意:dbname爲數據庫的名稱,默認值爲當前的數據庫,也可以這樣用:
                                    use db_name;
                                    drop trigger trigger_name;

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章