SQL Server 基礎

返回非空值的計數:Count(*)  用於數字或字符類型的列
    例:select Count(*) as 及格人數 from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的人數
SQL Server 基礎 
一.基礎
   1.SQL Server 使用的是SQL(Structured Query Language,結構化的查詢語言)語言,他只是數據庫能識別的指令,T-SQL(Transact-SQL             )是標準的SQL加強版,由:數據庫的定義語言(DDL),數據庫的操作語言和數據庫的控制語言組成;

      注:SQL中的下標從1開始;SQL中不分大小寫
  
   2.主數據庫文件:*.mdf
     次數據庫文件:*.ndf   可多個,如:可分別在三個驅動盤上建立3個次數據庫文件(1.ndf,2.ndf和3.ndf)
     日誌文件    :*.ldf
  
   3.註釋:
    (1).單行註釋:--
    (2).多行註釋:

   4.快捷鍵:
    F5       :執行語句
    Ctrl F5 :檢查語法

   5.登陸及權限的管理:
     (1).添加登陸賬戶:
         1).添加Windows賬戶:exec sp_grantlogin '賬戶名\密碼'
        例:exec sp_grantlogin 'wzy\123123'
  
         2).添加SQL賬戶:exec sp_addlogin '賬戶名',',密碼'
        例:exec sp_addlogin 'wzy','12313'
          
            刪除登陸賬戶:exec sp_droplogin  '賬戶名'
        例:exec sp_droplogin 'wzy'

     (2).添加數據庫用戶:
     exec sp_grantdbaccess '數據庫賬戶','密碼'
     例:exec sp_grantdbaccess 'wzydb','123'
      
         刪除數據庫用戶:
     exec sp_revokedbaccess  '數據庫賬戶'
     例:exec sp_revokedbaccess 'wzydb'
  
     (3).管理數據庫用戶的權限:
     爲數據庫的用戶分配權限:
     grant  權限,權限   on  表名 to  數據庫賬戶
     例:grant insert,delete,check on Studnet to wzy
        ——賦予wzy數據庫用戶對Studnet表的添加,刪除,查找的權限
  
     刪除數據庫的用戶的權限:
     revoke  權限,權限   on  表名 from 數據庫賬戶
     例:revoke insert,delete  on Student from wzy
        ——刪除wzy數據庫用戶對Studnet表的添加和刪除的權限
二.
   1.SQL中的表達式:
    = 等於;>大於;< 小於;>= 大於或等於;<=小於或等於;<> 不等於;! 非

   2.通配符:
       ‘_’ :表示一個字符 ;例:A Like ‘C_’;
     %   :表示任意長度的字符串;例:A Like ‘C_%’;
        [ ]  :括號中所指定範圍內的任意一個字符;例:A Like ‘C_WO[1-2]’;
    [^ ] :不在括號中所指定範圍內的任意一個字符;例:A Like ‘C_WO[^1-2]’;

   3.邏輯表達式:
     AND,OR,NOT  (先是Not,再是AND,最後是Ro)
     例:Not(付款方式='信用卡')OR(信用卡 IN ('牡丹卡','龍卡','陽光卡'))????????????????
     注:IN是用來限制範圍的;


三.函數
   1.字符串函數:
     1).字符串的長度:len
    例:select len(name) from Student where id=1;——》返回id爲1的學生姓名的字符串長度:

     2).大小寫轉換:lower,upper
    例:select lower(name) from Student where id=1;——》返回id爲1的學生姓名的字符串的小寫
    例:select upper(name) from Student where id=1;——》返回id爲1的學生姓名的字符串的大寫

     3).尋找一個字符串在另一個字符串中的起始下標:charindex
    例: select charindex('Accp','My Accp',1);——》4

     4).清楚左邊的空格:ltrim
    例:select ltrim(' 哈哈');——》查詢返回的是:哈哈(前面沒有空格)

     5).清楚右邊的空格:rtrim
    例:select ltrim('哈哈 ');——》查詢返回的是:哈哈(後面沒有空格)

     6).從字符串右邊數返回指定數目的字符:right
    例:select right('哈市咔噠收視費',3) ;——》查詢返回的是:收視費

     7).替換字符串中的字符:replace
    例:select replace('師傅師傅是爽膚水愛仕達阿達','師','爽');——》查詢返回的是:爽傅爽傅是爽膚水愛仕達阿達

     8).在字符串中刪除指定長度的字符串字符,用另一個字符串代替:stuff
    例:select stuff('ABCDEFGHRJ',2,6,'我的地盤我做主');——》查詢返回的是:A我的地盤我做主HRJ
    注:返回字符串中從2開始的6個字符的被替換後的字符串;SQL中的下標從1開始;
 

   2.日期函數:(yy:年;mm:月;dd:日 dw:星期(從1開始,表示週日);)
     1).取得當前的系統的日期:getDate()
    例:select getDate();——》查詢返回的是:今天的日期:2009-03-25 15:39:24.870

     2).推遲指定日期的:DateAdd()
    例:select DateAdd(mm,4,'01/03/2009');——》查詢返回的日期是:2009-05-03 00:00:00.000

     3).兩個日期之間指定日期部分的差值(前-後):DateDiff()
    例:select DateDiff(mm,'01/03/2009','07/12/2008');——》查詢返回的日期是:-6

     4).返回日期中指定部分的字符串形式:DateName()
    例:select DateName(dw,'01/01/2000');——》查詢返回的日期是:星期六

     5).返回指定日期部分的整數形式:DatePart()
    例:select DatePart(day,'07/12/2008');——》查詢返回的日期是:12
        Select DatePart(dw,getDate());——》查詢返回的日期是:6(今天是星期5)


   3.數學函數:
     1).取絕對值:Abs()
    例:select Abs(-23);——》查詢返回的是:23
     2).大於或等於指定數值或表達式的最小整數:Ceiling()
    例:select Ceiling(23.5);——》查詢返回的是:24
 
     3).小於或等於指定數值或表達式的最大整數:Floor()
    例:select Floor(23.5);——》查詢返回的是:23
  
     4).取數值表達式的冪:Power()
    例:select Power(2,4);——》查詢返回的是:16

     5).將數值表達式精確到指定的位數:Round()
    例:select Round(23.5329323,3);——》查詢返回的是:23.5330000

     6)判斷正負(正數的返回 1;負數的返回 1;0返回0):Sign()
    例:select Sign(-234);——》查詢返回的是:-1
 
     7).取平方根:Sqrt()
    例:select Sqrt(9);——》查詢返回的是:3.0
 

  4.系統函數:
     1).轉換數據類型:Convert
    例:select Convert(Varchar(5),12345)——》查詢返回的是:"12345";(把12345轉換成字符串)
    例:select Convert(int,'12345')——》查詢返回的是:12345;(把字符串12345轉換成整形數字)

三.插入
    1.插入一條語句:
          insert into 表名(列名)values(值列表)
    例:Insert into Students(name,address,age)values('老李','北京',23);
    注:1).(列名)和(值列表)要完全對應,實現實體(行)的完整性

        2).如果允許爲空或者有默認值時,且(列名)中沒寫該字段,(值列表)中對應的項均可以不填

        3).如果允許爲空或者有默認值時,且(列名)中寫該字段,(值列表)中對應的項必填,(列名)中默認值對應(值列表)中用                   default,(列名)中允許爲的對應(值列表)中用null(表示表中該列對應的字段沒有應用對象)或' '(表示表中該列對應的                 字段類型的默認值)代替

        4).要完全符合檢查約束:(列名)中的字段有約束時,(值列表)中對應的項必須符合約束,否則添加失敗


     2.一次插入多條語句:
    1).插入的新表必須預先存在:
      例:insert into User (name,address,Email)
          select name,address,Email  from Student
      注:User表必須預先存在,查詢到的數據的個數,順序,數據類型等,必須與插入的項保持一致

    2).插入的新表預先不存在:
      例:select Student.name,Studnet.Address,Student.Emial
          into User
          from Student
      注:User表必須預先不存在,語句運行的過程中自己創建的

          向新表插入數據的時候需要創建標示例:
          例:select identity(int,1(標示的種子),1(增長量)as Student.Id,Student.name,Studnet.Address,Student.Emial
          into User
                from Student
      
四.修改
    update 表名 set  列名='',列名='',... where 列名=''
    例:update Student set name='老王',address='南京' where Student.Id=1;
    update Scores  set scores=scores 5 where scores<=90;

    注:1).如果不用where 限制,整個表所有的數據都被更新
    2).update 可以更新一條數據,也可以更新多條數據,還可以更新整張表
  
五.刪除
   (1).刪除表中的數據
       delete from 表名  where 列名=''
       例; delete from Scores where scores<=60;

       注:如果不用where 限制,整個表所有的數據都被刪除

   (2).刪除表中的所有數據,表存在
       truncate table 表名:  刪除沒有主外建約束的表
       delete 表名:  可刪除有主外建約束的表

   (3).刪除表中的所有數據,表也被刪掉
       drop  table 表名:  完全刪除表的所有

 

六.查詢
  1.簡單的查詢:
    (1).查詢表中的所有數據:select * from 表名;                 
        例:select * from Students

    (2).帶條件的查詢:select * from 表名 where 列名='';            
        例:select * from Students where name='老王';

    (3).指定列名的查詢:select  列名1,列名2,...  from 表名 where 列名='';
        例:select name,address from Students where id=1;

    (4).查詢空行:select  列名1,列名2,...  from 表名 where 列名 is null;       (或者is Not null)
    例:select name,address from Students where Email is null; ——》查詢Email爲空的實體

    (5).查詢後顯示標題的爲漢字,查詢後多出一列(常量列):
    例:select 姓名=name,地址=address,學校名稱='北大青鳥'  from Students
            或:select name as 姓名,address as 地址,'北大青鳥' as 學校名稱 from Students

    (6).查詢顯示限制行數:
    例:select Top 5 姓名=name,地址=address,'北大青鳥' as 學校名稱 from Students where Email is Not  null;
        或:select Top 20  percent 姓名=name,地址=address,'北大青鳥' as 學校名稱 from Students where Email is Not  null;

    注:percent :表示百分之幾;TOP :表示從上往下
        Top 20  percent:所有查詢的數據的前20%條
    (7).合併列名的查詢:
    例:select FirstName '.' LastName as 姓名  from User
  
    (8).排序查詢結果:
    1).使用order by語句;並不是where的條件
           例:select StudentId as 學員編號,(Scores*0.9 9) as 學員成績 from Student order by Scores

    2).ASC爲升序;DESC爲降序;默認爲ASC升序排列;
       例:select StudentId as 學員編號,(Scores*0.9 9) as 學員成績 from Student where (Scores*0.9 5)<60  order by Scores
       注: order by Scores——》查出的結果按成績的升序排序

    3).也可以按多個字段進行排序顯示查詢結果,注意排序是按字段的先後順序的:
       例:select StudentId as 學員編號,Scores as 學員成績 from Student where Scores>60  order by Scores,StudentId
       注:order by Scores,StudentId——》查出的結果先按按成績的升序排序,再按學員編號的升序排序

  2.模糊查詢:
    (1).使用Like:只用於字符串,僅與Char和Varchar數據的類型聯合使用
    例:select * from Studnet where name Like '張%';——》查詢返回的是:姓張的所有學生
    例:select * from Card where id Like '%[^8]%[A,C]%';——》查詢返回的是:第三位不是8的A卡或C卡

    (2).使用Between...and...或Not Between...and...進行範圍查詢:
    例:select * from Scores where Score Between 60 and 80; ——》查詢返回的是:分數是60到80的成績
        例:select * from Student where birthday Between '1993-2-3' and '2009-3-4';——》查詢返回的是:出生在那時間段你的學生

    (3).使用in或not in進行範圍查詢:
    例:select * from Student where address in ('北京','上海','天津'); ——》查詢返回的是:住址是這三個地的所有學生

  3.聚合函數查詢:
    (1).數字的彙總:Sum ,不能彙總字符,日期等其他函數
    例:select Sum(Score) from Student where name like '張%'; ——》查詢返回的是:姓張的所有同學的分數總和
     注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)

    (2).查詢數字的平均值:Avg ,不能彙總字符,日期等其他函數
    例:select Avg(Score) from Student where name like '張%'; ——》查詢返回的是:姓張的所有同學的分數平均值
    例:select avg(Score) from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的平均值
     注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)

    (3).查詢最大值或最小值:Max,Min; 能用於數字,字符,日期等其他函數
    例:select Age(Score) as 平均分,Max(Score) 最高分,Min(Score) as 最低分 from Student where Score>=60
         ——》查詢返回的是:分數大於60分的同學的平均分,最高分,最低分
    注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)

    (4).返回非空值的計數:Count(*)  用於數字或字符類型的列
    例:select Count(*) as 及格人數 from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的人數
 
  4.分組查詢:
    (1).使用Group By 進行分組查詢:先分組在進行查詢,並不是where的條件
    例:select CourseId as 課程id ,Avg(Score) as 課程的平均成績 from Score Group By  CourseId
        ——》查詢返回的是:按課程的id進行分組查詢,返回每門課程的平均成績
    例:select StudnetId as 學生id,CourseId as 課程id,Avg(Score) as 課程的平均成績 from Score
             Group by CourseId,Studentid
        ——》查詢返回的是:先按課程的id進行分組,再按學生的id進行分組,然後查詢返回每個學生每門課程的平均成績
                    (還是每個學生每門課程的成績,因爲select語句中只能出現爲每個分組返回一個值得表達式)
    注:分組查詢中:select語句中只能出現:(1)被分組的列(2)爲每個分組返回一個值得表達式(如聚合函數)


    (2).使用Having進行分組篩選:
    例:select * from StudnetId as 學生id,CourseId as 課程id,Avg(Score) as 課程的平均成績 from Score
             Group by CourseId,Studentid Having Count(Score)>1
         ——》查詢返回的是:先按課程的id進行分組,再按學生的id進行分組,並且分組後出現1次以上的列
                                    然後查詢返回每個學生每門課程的平均成績
                    (還是每個學生每門課程的成績,因爲select語句中只能出現爲每個分組返回一個值得表達式)

    注:查詢語句中:篩選順序是:where,Group By ,Having
    where是從數據源中去掉不符合搜索條件的語句
    Group By從剩下的符合條件的列中,進行分組,表達式(函數)爲各個組進行計算統計
    Having對分組進行篩選,去掉不符合組搜索條件的各組中的數據行

  5.多表查詢:
    (1).內聯查詢:表之間存在主外鍵關係,表之間的地位平等
    1).在where語句中制定查詢條件:
       例:select Studnet.name as 學生姓名,Course.name as 課程名稱,Scores.Score as 課程成績 from Studnet,Scores,Course
        where Student.id = Scores.StudentId,Course.Id=Scores.CourseId
           ==》select S.name as 學生姓名,C.name as 課程名稱,SC.Score as 課程成績
                     from Studnet as S
             inner Join Scores as SC on (S.id = SC.StudentId)
                     inner Join Course as C  on (C.Id=SC.CourseId)
        ——》查詢返回的是:查詢學生表和成績表,返回每個學生的每門課程的成績

    2).通過(inner)Join...on...語句中制定查詢條件:
       例:select student.name,Scores.CourseId,Scores.Score from Studnet,Scores
        where Student.id = Scores.StudentId
        ==>select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績 from Studnet as S  inner join Scores as C
        on S.id = C.StudentId


     (2)外聯查詢:表之間存在主外鍵關係,表之間的地位有主次之分
    1).左外鏈接查詢:包含左表中所有匹配的行,如果右表中有的項左表中沒有對應的項,以空填充
       例:select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績
               from Studnet as S
           left outer Join Scores as C
               on S.id=C.StudentId
         ——》查詢返回的是:以學員信息表爲主表,成績表爲次表,查詢符合條件的列中的某些學員沒有對應的科目和成績,以空填充


    2).右外鏈接查詢:包含右表中所有匹配的行,如果右表中有的項左表中沒有對應的項,以空填充
       例:select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績
               from Studnet as S
           right outer Join Scores as C
               on S.id=C.StudentId
         ——》查詢返回的是:以成績表爲主表,學員信息表爲次表,查詢符合條件的列中的某些成績沒有對應的學員和課程,以空填充

七.變量:
     (1).聲明變量:局部變量用'@',系統(全局)變量用'@@',不能賦值
    DeClare @變量名  變量的類型
    例:deClare @name varchar(10)
        set  @name='馬文才'
        select * from Student where name= @name
        ——查找馬文才的信息


     (2).爲變量賦值:
     1). set 專用的賦值常量,一次只能爲一個變量賦值
         例:deClare @name varchar(10) 
                 set  @name='馬文才'

     2).select 給從表中查詢的結果賦值,可以給多個變量賦值,用逗號隔開
         例:deClare @name varchar(10) 
         set  @name='馬文才'
         deClare @seat int
        
                 select  @seat=Seat from Student where StuName=@name ——》查找馬文才的座位號並賦值給變量@seat
                 select * from Student where (Seat=@seat 1) or (Seat=@seat 1) ——》查找馬文才的左右同桌
     (3).最常用的全局變量:@@error  , @@identity
         1).@@error :判斷最近一條增刪改的語句是否正確;成功:0;不成功:非0
        例:print '當前的錯誤號:' Convert(varchar(5),@@error)
         ——》輸出錯誤號,大於0,表示上一條語句執行錯誤

         2).@@identity:最新的標識列號
         例:insert into Studnet (id,names)values(1,'wzy')
                 print '當前的錯誤號:' Convert(varchar(5),@@identity)
         ——》輸出最後一條添加語句的id

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