SQL常用語法總結


表的相關數據:

字段

    用來模擬一個事物的某一個靜態特征

記錄

    字段的組合 表示的是一個具體事物

   記錄的組合 表示的是同一類型事物的集合

表和字段,記錄的關系

     字段是實物的屬性

     記錄是事物本身

     表是事物的集合

   字段的另一種稱謂

屬性

   字段的另一種稱謂

元組

   記錄的另一種稱謂

約束:

    定義:對一個表中的屬性操作的限制

主鍵約束:不允許重復元素

外鍵約束:通過外鍵約束從語法上保證了本事務所關聯的其他事物一定存在

    事物和事物之間的關系式通過外鍵來體現的

Check約束:保證事物的屬性的取值在合法的范圍之內

    Create table student

      (

       Stu_id int primary key,

       stu_sal int check(stu_sal<=4000 andstu_sal>=1000)

)

     Default約束: 保證事物的屬性一定會有一個值        

Create table student

      (

       Stu_id int primary key,

       stu_sal int check(stu_sal<=4000 andstu_sal>=1000),

          stu_sex nchar(1) default(‘男’)---SQL server數據庫中單引號(‘’)表示字符串 雙引號(“”)模擬一個對象的名字

唯一約束:unique 保證了失誤屬性的取值不允重復,但允許為空 但不允許多列為空  只能一列為空

         

Create table student

      (

       Stu_idint primary key,

       stu_sal int check(stu_sal<=4000 andstu_sal>=1000),

          stu_sex nchar(1) default(‘男’),

          stu_name nvarchar(50) unique---(在此表中stu_name 不能重復 唯一鍵可以為空)

     Not null

            要求用戶必須為該屬性附一個值,否則語法錯誤

表和約束的區別:

           數據庫是通過表來解決事物的存儲問題的

           數據庫是通過約束來解決事物取值的有效性和合法性的問題

           建表的過程就是指定事物屬性以及事物屬性各種有數的過程

 

什么是關系:

     數據庫中的關系:

分類:一對一,一對多,多對多

定義:表和表之間的關系

實現方式:通過設置不同形式的外鍵來表示表和表的不同關系

一對一:

      (A表與B表)

       既可以把表A的主鍵充當表B的外鍵

       也可以把表B的主鍵充當表A的外鍵

 一對多:

      外鍵添在多的一方

多對多:

Create table classroom

(

  classID int primary key,

  num int not null,

  className nvarchar(100)

)

 

Create table teacher

(

  teacherID int primary key,

  teacherName nvarchar(100)

)

 

Create table class_teacher-mapping

(

   classID int constrain fk_classID foreign keyreferences classroom(classID),

  teacherID int foreign key references teacher(teacherID),

  kecheng nvarchar(50),

constrain pk_classID_teacherID primary key (classID ,teacherID)

)

多對多關系必須通過單獨的一張表來表示

 

 

 

什么是主鍵

        能唯一標示一個事物的字段或字段組合        

        含有主鍵的表叫主鍵表

   主鍵的特征:

                 主鍵通常是整數,不建議使用字符做主鍵(如果主鍵用於集群式服務才可以考慮用字符)

                 主鍵的值通常不允許修改,除非本記錄刪除

                 主鍵不要定義成ID,而要定義成表名ID或表名_ID

                    任何一張表,強烈建議不要使用有業務含義的字段從當主鍵

                     我們通常都是在表中單獨添加一個整形的編號從當主鍵字段

                主鍵是否連續增長不是十分的重要

什么是外鍵

         來至另一個表或多張表的主鍵或唯一鍵

     注意:

          外鍵通常來至另外表的主鍵而不是唯一鍵,因為唯一鍵可能為null

          外鍵不一定來至另外表,也可能來自本表的主鍵

          含有外鍵的表叫外鍵表,外鍵來自的那一張表叫做主鍵表

問題:主鍵表和外鍵表先刪哪個?

        先刪外鍵表

        如果先刪主鍵表,外鍵表的數據引用失敗,系統報錯

Identity【主鍵自動增長,用戶不需要為identity修飾的主鍵賦值】

 

 

查詢(重點):注意執行順序                                                                                       

1.計算列

        Select * from emp

        Select empno ,ename from emp

         Select ename , sal*12 as “年薪”, sal as”月薪” from emp   

         Select 5 from emp --輸出的行數是emp表的行數 每行只有一個字段 值為5

        

   2.Distinct(不允許重復)

      Select distinct deptno from emp--distinct 會過濾掉重復記錄也可過慮掉null

      Select distinct comm ,deptno from emp--distint comm,deptno整體過濾

      Select deptno,distinctcomm from emp--error邏輯上有錯誤

      

3.Between

        Select * from emp where sal between 1500 and 3000 --等價於:select * from emp where sal<=3000 or sal>=1500

          Select * from emp where sal not between 1500 and 3000 --等價於:select * from emp where sal>=3000 or sal,+1500

 

4.In(屬於若干個孤立的值)

       Select 8 * from emp where sal in (1500,3000)--查詢結果只有1500 和 3000

       Select 8 * from emp where sal not in (1500,3000)--查詢結果除1500 和 3000以外的記錄

       數據庫中不等於有兩種表示:!=,<> 推薦使用第二種

5.Top

       Select top 2* from emp

        Select top 15 percent * from emp--也可以用百分比記錄數取整(進一法)

        可以用來分頁

        Selecttop 2 *from emp

wheresal between 1500 and 3000

orderby sal desc

(先執行條件,再執行select)

6.null【空 沒有值】

     Select * from emp wherecomm not is null

     --------null不能參與<> != 等運算不能參與數學運算

     --------null只能參與 is      not is

     --------注意0和null的區別

     ---------任何數據都允許為null

     --------- 任何數字與null運算結果都是null

    

6.order by(排序)

            select * from emp order by sal------默認升序

         select * from emp order by deptno, sal-------先按deptno排序,如果deptno相同 再按sal排序

         select* from emp order by deptno desc, sal-------desc只對deptno有效

8模糊查詢

      Select * from emp whereename like ‘%A%’----查找ename中包含A的記錄

      格式:

           Select 字段的集合 from 表名 where 某個字段的名字 llike 匹配的條件

           匹配的條件通常含有通配符:

                   %:任意零個或多個字符

                   _[下划線]:任意單個字符

                   [a-f]:a到f中的任意單個字符

                   [a,f]:a或f

                   [^a-c]:不是a,也不是b,也不是c的任意單個字符

                通配符要用單引號括起來

                通配符作為為普通字符

                   Select*from student where name  like ‘%\%%’escape’\’—查找名字中有%的記錄

                   escape 關鍵字把’\’作為轉義的標志,也就是說\%中的%將作為普通字符,其中轉義字符的標志可以為任意字符:

Select* from student where name like ‘%/%%’ escape’/’—作用同上

               

9聚合函數

        函數的分類:

            單行函數:

               每一行返回一個值

        多行函數:

               聚合函數是多行函數

               多行返回一個值

        例子:select lower(ename) from emp,----返回所有記錄—lower表示輸出的字符為小寫,upper表示輸出字段為大寫

       聚合函數分類:

             Max(),min(),avg()—平均數,count()—求個數

      Count()函數:

             Count(*)返回表中所有的記錄的個數

             Count(字段名)返回字段值非空的記錄,重復記錄也會被當做有效記錄

             Count(distinct 字段名)返回字段不重復並且非空記錄的個數

           Select count(*)from emp,--返回emp表所有記錄的個數

           Select count(distinct depton) from emp,-deptno重復的記錄會被忽略

           Select count(comm)from emp—comm為null的記錄不會被當做有效記錄,也就是不會被統計

     注意:單行函數和多行函數不能同時使用!

10 group by

        Select deptno,avg(sal) as “部門的平均工資” from emp groupby deptno

        總結:使用group by之后select中只能出現分組后的整體信息,不能出現組內的詳細信息

        格式:group by 字段集合

        功能:把表中的記錄按照字段分成不同的組

        例子:

             查詢不同部門的平均工資

                Select deptno,avg(sal) as “部門平均工資” from emp groupby deptno

        注意:理解:group by a,b,c的用法

                 先按a分組,如果a相同,再按b分組,如果b相同,再按c分組

                 最終統計的是最小分組的信息

       

11 having【對分組之后的信息進行過濾】

        ///having子句是用來對分組之后的數據進行過濾

          因此使用having時通常都會使用group  by

       ///如果沒有使用group  by 但使用了having把所有的記錄當成一組來進行過濾…極少使用

       ///having 子句出現的字段必須是分組的整體信息

          Having子句不允許出現組內的詳細信息

      ///盡管select字段中可以出現別名

         但是having子句中不能出現字段的別名,只能使用字段的原始名字

       Select deptno avg(sal)as”平均工資” from emp group by deptnohaving avg(sal)>2000

       Having 和 where的異同

              相同:都是對數據的過濾,只保留有效的數據

                    Having和where都不允許出現字段的別名

              不同:where是對原始的數據記錄過濾,having是對分組之后的記錄過慮 where必須寫在having的前面,順序不可顛倒

       注意:select語句的參數的順序是不允許變化的

               Select語句格式:

                      Select  ……….

                             From …………

                             Where ………….

                             Group by …………

                             Having ………….

                             Order by…………..

12連接查詢

      定義:將兩個或者兩個以上的表以一定的連接條件連接起來從中檢索出滿足條件的數據

       分類:

          內連接【重難點】

            例子:select “E”.ename as’員工名’ “D”.dnameas’部門名稱’

                          Fromemp “E”

                          Joindept “D”

                          On “E”.deptno=”D”.deptno

            1 select ……from A ,B 的用法

                 Select * fromemp ,dept ----查詢結果的列數是兩張表列數的和,行數是兩張表行數的乘積(笛卡爾積)

                 (emp 8 列14 行,dept 3列 5行)

            2 select ……from A ,B where…… 的用法(對笛卡爾積過濾)

                Select * fromemp ,dept

                       Whereempno=4369---輸出5行(empno是emp中的一列)

            3 select ……from A jion B on……的用法

                   select “E”.enameas’員工名’ “D”.dname as’部門名稱’

                          From emp “E”----------般會取個別名

                          Join dept “D”------join是連接關鍵字

                          On “E”.deptno=D”.deptno---鏈接條件(注意字體顏色的順序)

-----------查詢結果:14行 11列

 

                          Select * from emp

                                   Join dept

                                   Onemp.deptno=dept.deptno

 

                     -----------查詢結果:14行 11列

                       注意:如果要查詢的多張表內有相同的字段,可以為表制定別名,用別名來確定字段來自哪張表

                       ----------------格式不變

            4 select ……from A ,B where……(SQL92標准)與select ……from A jion Bon……(SQL99標准)的比較

                兩語句功能相同推薦使用SQl99標准

                    SQL99標准更容易理解

                    SQL99標准中,on 和where分工不同

                      On指定鏈接條件

                      Where對連接后的臨時表的數據進行過濾

            5 select ,from,where, join, on ,group by, order, top ,having的混合使用

                   查詢的順序:

                         Select top……

                               From A ……

                               Join B ……

                               On ……

                               Join C……

                               On ……

                               Where ……

                               Group by ……

                               Having ……

                                Order by ……

                  例子:

                        

                  Select *from emp “E”

                         Joindept “D”

                         On “E”.deptno=”D”.deptno

                         Where“E”.sal>2000

                  三表查詢
                          select * from emp “E”

                             Joindept “D”

                             On“E”.deptno=”D”.deptno

                             Joinsalgrade “S”

                             On“E”.sal>=”S”.losal  and “E”.sal<=”S”.hisal

                             Where “E”.sal>=2000

          外連接

              定義:不但返回滿足連接條件的所有記錄,而且會返回部分不滿足條件

                   的記錄                                                                                                                                                      

              分類:左外連接:返回一個事物的相關信息,如果該事物沒有相關信息,

                            則輸出null

                       不但返回滿足連接條件的所有記錄,而且會返回左表不滿足

                       條件的記錄

                        Select *from dept “D”

                               Left jion emp “E”

                              On E.deptno=D.deptno

                    右外連接:與左外鏈接類似

                       不但返回滿足條件的所有記錄,而且會返回右表不滿足條件

                       的記錄    

          完全連接:(full 表示查詢為完全連接查詢)

                 兩個表中匹配的所有行記錄

                 左表中那些在右表中找不到匹配的行的記錄,這些記錄的右邊全

                    為null

                 右表中那些在左表中找不到匹配的行的記錄,這些記錄的左邊全為

                   null

 

                 Select * fromproductStocts

                         Fulljoin orderform

                         On productStocks.pid=orderform.pid

          交叉連接

             (略)

          自連接

              定義:一張表自己和自己連接起來查詢數據

              例子:不用聚合函數,求薪水最高的員工信息

                 (帶有聚合函數)

                    Select *from emp where sal=(select max(sal) from emp)

                 (不用聚合函數)

                     Select *from emp

                         Where empon not in(

                                          Select distinct “E”.empno

                                               From emp ”E1”

                                                Join emp“E2”

                                               On “E1”.sal<”E2”.sal

                                           )

                   

          聯合 :  

               定義:表和表之間的的數據以縱向的方式連接在一起

               注意:我們以前講的所有的連接是以橫向的方式連接在一起的

 

              例子:輸出每個員工的姓名工資 上司姓名

                   Select “E1”.ename,”E2”.sal,”E2”.ename“上司的名字”

                         Fromemp “E1

Join emp ”E2”

On “E1”.mgr=”E2”.empno

                          Union

                           Select ename ,sal , ‘已是最大老板’ from emp where mgr is null

                   注意:

                       若干個select 字句要聯合成功 必須滿足兩個條件

                        1 這若干個select 字句輸出的列必須相等

                        2 這若干個select字句輸出列的數據類型必須是兼容的

       

           分頁查詢(重點):

                工資從高到低排序,輸出工資式第4-6的員工信息

                  Select top 3 *

                     From emp

                     Where empno not in (selecttop 3 empno from emp order by sal desc)

                     Order by sal desc

               工資從高到低排序,輸出工資式第10-12的員工信息

                  Select top 3 *

                     From emp

                     Where empno not in (selecttop 9 empno from emp order by sal desc)

                     Order by sal desc

         總結:

            假設每一頁顯示n條信息,當前頁數為m

                   表名A 主鍵A_id

                  Select top n *

                        From A

                        Where A_id not in(select top (m-1)*n A_id from emp)

               

           

視圖

    Create view v$_emp1

    As

       Select deptno ,avg(sal)“ave_sal”

       From emp

       Group by deptno

   ---------------------------

    Select * from v$_emp1

         Where avg_sal=(selectmax(avg_sal) from v$_emp1)

    為什么需要視圖:

         簡化查詢 避免了代碼冗余

    什么是視圖:

代碼上看視圖就是一個select語句,邏輯上可以當成一個臨時表

       視圖格式:

          Create view 視圖名字

          As

            Select語句---select的前面不能添加begin 后面不能添加end

       注意問題:

            創建視圖的select語句須為所有的計算列指定別名

            視圖不是物理表,是虛擬表

            不建議通過視圖更新視圖所依附的原始表的數據或結果

              

事物【重點】

    什么是事物:

          一系列操作要么全部執行成功,要么全部執行失敗

    為什么需要事物:

          事物可以保證避免數據處於一種不合理的中間狀態

          利用事物可以實現多個用戶對共享資源的同時訪問

    事物和線程的關系

          事物也通過鎖來解決很多問題

          線程同步就是通過鎖來解決的

    如何創建事物:

       開始事物: begin transaction

       提交事務:commit transaction

       回滾(撤銷)事物: rollback transaction

      一旦事物提交或回滾,則事物結束

  事物的三種運行模式:

      自動提交:

         每個單獨的語句都是一個事物,如果成功執行,則自動提交,如果錯誤,則自動回滾

      顯式事物:

          每個事物均以begin transaction語句顯式開始

          以 commit 或 rollback 語句顯式結束

      隱性事物:

         在一個事物完成時新事物隱式開啟,但每個事物仍以commit 或rollback語句結束

   事物錯誤處理:

 Try…Catch語句的具體語法格式如下:

BEGIN TRY

         <語句或語句塊1>

END TRY

BEGIN CATCH

        <語句或語句塊2>

END CATCH

 事物實例:

    Begin transaction

      Declare @errorSum int

      Set @errorSum =0

      Update bank setcurrentMoney=currentMoney-1000

         Where customerEname=’張三’

      Set@errorSum=@errorSum+@@error

      Update bank setcurrentMoney=currentMoney+1000

         Where customerEname=’李四’

      Set@errorSum=@errorSum+@@error

      If(@errorSum<>0)

         Begin

            Print ‘轉賬失敗’

            Rollbacktransaction

         End

      Else

         Begin

            Print’轉賬成功’

            Commit transaction

         End

     End

 

 

存儲過程

     Sql server 2008中提供了三種存儲過程類型

          自定存儲過程  擴展存儲過程系統存儲過程

     Create procedure 語句創建存儲過程

     語法的基本形式:

          Create procedure 存儲過程的名字

             Parameter_namedata_type,……----參數列表

             Withprocedure_option(可選)

             As

             Sql-statement

     例子:

        Create procedureGetEmployeeInfo

           @lastnamevarchar(50),

          @firstnamevarchar(50)

        As

        SelectLastNme,FirstName ,JobTitle,Department

              From tb_Employee

               WhereLastName=@lastname and FirstName=@firstname

       Go

    帶有OUTPUT類型參數的存儲過程

        Create procedureComputePlus

          @firstpara decinal(10,2),

          @secondpara decinal(10,2),

          @plusresultdecinal(10,2) output

        As

          Set@plusresult=@firstpara+@seccondpara

        Go

   執行存儲過程:

        Exec 存儲過程名字‘參數1’, ‘參數2’……

   帶有output參數的存儲過程的執行

      Declare @resultdecinal(10,2)

      Exec ComputePlus123,568,@result output

      Print @result

      Go

  刪除存儲過程: drop procedure 存儲過程名字

索引:在數據庫中,索引是表中數據和相應存儲位置的列表

    索引的基本類型:聚集索引,非聚集索引

    聚集索引:是一種數據表的物理順序與索引順序相同的索引

    非聚集索引:與聚集索引相反

    創建索引:create index 或使用圖形工具

     例子:

      Create unique clusteredindex ind_books_ISBN

      On books(ISBN)

      Go

     

      Create uniquenonclustered index ind_books_title

      On books(title)

      Go

 

游標

    

 

觸發器

   觸發器是一種特殊的存儲過程 SqlServer2008 提供兩種觸發器:DML ,DDL

   DML觸發器(在數據庫中發生數據操縱語言事件時將調用DML)

       分為三種類型:insert ,update ,delete

       語法:

       Create triggertrigger_name

       On table_name orview_name

       With encryption

       { for|after|instead of}{delete[,][insert][,][update]}

       As sql_statement

     觸發器的工作原理:向表中插入數據時,insert觸發器執行。當insert觸發器觸發時,新的紀錄增加到觸發器表中和inserted表中 inserted表是一個邏輯表,保存了所插入記錄的備份,允許用戶參考insert語句中數據。觸發器可以檢查inserted表,來確定觸發器的操作是否應該執行和如何執行

       Delete 和 update觸發器的工作原理和起相同

    例子:

      Create triggert_accountData_insert

      On accountData

      With encryption

      For insert

      As

      Declare@insertActionAmount money

      Select@insertActionAmount = accountAmount

         From inserted

      Insert intoaudiAccountData(audit_log_actionType,audit_log_amount)

            Values(‘insert’,@insertActionAmount)

      Go

 

      Create triggeraccountData_delete

      On accountData

With encryption

      For delete

      As

      Declare@deleteActionAmount money

      Select@deleteActionAmount =accountAmount

          From deleted

      Insert intoaudiAccountData(audit_log_actionType,audit_log_amount)

            Values(‘delete’,@insertActionAmount)

  DDL觸發器:DDL觸發器的觸發事件主要是create,alter,drop以及grant ,deny,revork

       並且觸發的時間條件只有after

沒有instead of

   語法:

    Create trigger  trigger_name

    On {all server|database}

    With encryption

    {for|after}{event_tpye}

    As sql_statement

  例子:

    Create triggersafetyAction

    On database

    For drop_table,after_table

    As

    Print N’禁止刪除或修改當前數據庫中的表’

    Rollback

Go


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: