Sql Server數據庫使用


                          實體完整性約束
  約束種類                                      功能描述
  PRIMARY KEY(主鍵)約束                         唯一識別每一條記錄的標誌,可以有多列共同組成
  IDENTITY(自增)約束                            列值自增,一般使用此屬性設置的列作爲主鍵
  UNIQUE(唯一)約束                              可以使用UNIQUE約束確保在非主鍵列中不存在重複值,但列值可以是NULL(空)
  
  
                     域完整性約束
  CHECK(檢查)約束                                用於限制列中值得範圍
  FOREIGN KEY(外鍵)                              一個表中的FORENIGN KEY 指向另一個表中的PRIMARY KEY
  DEFAULT(默認值)約束                            用於向列中插入默認值
  NOT NULL(非空)約束                             用於強制列不接受NULL(空)值
  
  
  
注意:
1、PRIMARY KEY用於將表中的某類設置爲主鍵,一張表中只有一個主鍵,主鍵可以是一列或由多列組成。
2、NOT NULL是對列值進行限制,即在表中添加數據時不允許有NULL值。
3、CHECK約束的語法規則:CHECK(表達式)
外鍵的使用:字段名 數據類型 [FOREIGN KEY] REFERENCES 表名(字段名)
  
向數據庫中添加值:
語法:INSERT [INTO] table_name [(COLUMN1,COLUMN2,.....)] VALUES (VALUE1,VALUE2,.....)
注意:
1、VALUES需要與COLUMN對應
2、添加數據時,如果字段類型爲varchar或datetime,否則必須使用單引號('')引起來。
3、雖然沒有顯示地添加IDENTIRY約束字段,但是數據庫會自動按照IDENTITY規則添加數據

一次添加多行數據
語法:
INSERT [INTO] tabale_name([COLUMN1,COLUMN2,.....])
SELECT VALUE UNION
SELECT VALUE

刪除表中的數據
語法:DELECT FROM table_name[WHERE <表達式>]
注意:
1、使用DELETE語句刪除數據時,是以整條記錄爲單位的,不能只刪除某個字段
刪除整張表數據
語法:TRUNCATE TABLE table_name
                                  
           兩種刪除語句的優缺點
   語句                     優點                                        缺點
   DELETE                   選擇性地刪除,數據可恢復                    當刪除整張表的數據時效率低
   TRUNCATE                 只能刪除整張表的數據,但是效率高於          不能選擇性地刪除,數據可恢復
                            DELETE語句

修改表中的數據
語法:UPDATE table_name SET COLUMN1={},COLUMN2={},.... WHERE<表達式>

注意:分離數據庫是將數據庫文件從SQL Server中分離出來,而刪除數據庫是將數據庫文件刪除。


查詢語句語法結構
語法:SELECT <COLUMN1,COLUMN2,.....> FROM <table_name> [表達式] [ORDER BY <COLUMN1,COLUMN2,.....> [ASC或DESC]]
ORDER BY 子句用於對查詢結果進行排序。ASC表示升序,DESC表示降序排列,默認的排序是ASC.
注意:將查詢得到的結果稱爲結果集(RecordSet).SQL Server對大小寫不敏感,包括關鍵字在內。例如,SELECT、select和Select是等效的。

使用別名
1、語法:SELECT 字段名1 別名,字段名2 別名 FROM 表名
2、語法:SELECT 別名=字段名1,別名=字段名2 FROM
3、語法:SELECT 字段名1 AS 別名,字段名2 AS 別名 FROM 表名
注意:使用“=”更改查詢結果列名時比較特殊,在SELECT語句中語法必須是“別名=字段名”;

單列排序:SELECT * FROM table_name ORDER BY
多列排序;SELECT * FROM table_name ORDER BY COLUMN1 DESC,COLUMN2 DESC....

查詢限定行TOP N
語法:SELECT TOP N <COLUMN1,COLUMN2,.....> FROM <table_name> [WHERE <表達式>] [ORDER BY <COLUMN1,COLUMN2,.....> [ASC或DESC]]
查詢百分比
語法:SELECT TOP N PERCENT <COLUMN1,COLUMN2,.....> FROM <table_name> [WHERE <表達式>] [ORDER BY <COLUMN1,COLUMN2,.....> [ASC或DESC]]

條件查詢注意:
1、在一個WHERE子句中,可以同時使用多個AND運算符鏈接多個查詢條件。
2、在“(表達式1)OR(表達式2)”中,如果表達式1爲TRUE,將不再執行表達式2。

 

SQL Server內置函數(內置函數可作爲where條件,聚合函數不能做爲where條件)

                                      字符串函數
  函數名                       示例                                          函數功能
  CharIndex                  CharIndex('ab','cdab')結果返回3                 返回‘ab’在‘cdab’中的位置,將返回第一個字母的位置
  Len                        Len('adc')結果返回3                             返回字符串的長度
   Upper                      Upper('abc')結果ABC                             將字符串中的小寫字母轉換爲大寫
  Ltrim                      Ltrim('  adc')結果返回adc                       清楚左邊空格
  Rtrim                      Rtrim('abc  ')結果返回abc                       清除右邊空格
  Replace                    Replace('abb','b','z')結果返回azz               替換指定的字符
  Stuff                      Stuff('abcd',1,2,'mm')結果返回mmcd              替換指定範圍的字符
  substring                  substring('abc','2','2')結果返回bc              從指定位置截取
  
實例:測試字符串長度SELECT Len(字段名) FROM table_name
將內置函數作爲條件使用:SELECT * FROM table_name WHERE  Len(字段名)>VALUE


                                    日期函數
        函數名                  示例                                                  函數功能
        GetDate                 GetDate結果返回“當前日期”                             返回當前日期
        DateAdd                 DateAdd(mm,2,'2009-10-08')結果返回‘2009-12-08’        向日期指定部分添加數字,其中,yy表示年、mm表示月、dd表示日
  DateDiff                DateDiff(dd,'2009-09-09','2010-09-09')結果返回‘365’   返回兩個日期之間的間隔,其中,yy表示年、mm表示月、dd表示日
  DateName                DateName(DW,'2009-09-09')結果返回“星期三”             以字符串的形式返回某個日期指定的部分
  DatePart                DatePart(DW,'2009-09-09')結果返回“4”                  以整數形式返回某個日期指定的部分
  
實例:獲取系統當前日期函數爲GetDate(),表達式可以寫爲“COLUMN1<GetDate()”,SQL語句如下:
SELECT * FROM table_name WHERE COLUMN1<GetDate()
注意:在創建數據庫時,如果對於時間的選擇。例如聲明類型YYYY-MM-DD則需要使用Date類型,如果精確到時、分、秒則需要使用Datetime類型。
如果需要使用默認時間則只需在類型後添加 default getdate()。在插入數據時,對應的時間字段只需使用default即可。

判斷選課時間是否是星期三的函數爲DateName(DW,COLUMN),表達式可以寫成“DateName(DW,COLUMN)=‘星期三’”,SQL語句如下:
SELECT * FROM table_name DateName(DW,COLUMN)=‘星期三’


                                    數學函數
  函數名                  示例                                                   函數功能
   Abs                     Abs(-1)結果返回“1”                                     求絕對值
  Ceiling                 Ceiling(24.1)結果返回“25”                              大於24.1的最小整數     
  Floor                   Floor(24.1)結果返回“24”                                小於24.1的最大整數
  Power                   Power(2,3)結果返回“8”                                  計算2的3次方
  Round                   Round(748.32,1)結果返回“748.30”                        返回一個數值,舍入到指定的長度或精度
  Sign                    Sign(100)結果返回“1”                                   正整數返回1,負整數返回-1
  Sqrt                    Sqrt(4)結果返回“2”                                     開平方

                                  系統函數
  函數名                      示例                                                 函數功能
        Convert                 Convert(varchar(10),123)結果返回“123”                   裝換數據類型
  DataLength              DataLength('12中國')結果返回6                           返回任何數據類型的字節數。“中國”包含4個字節,“12”包含兩個字節,所以返回6.
 

開發過程中對於日期的操作:例如獲得昨天、前天的數據。
SQL語句如下: select * from table_name where pudoctime>=SUBSTRING( Convert(varchar(20),DateAdd(DD,-1,GETDATE()),120),1,10)


 
模糊查詢
在SQL Server中,通過使用通配符來實現LIKE運算,通配符“%”,“_”,“[]”。
注意:只有char、varchar和text類型的數據才能使用LIKE運算符和通配符。

1、“%”通配符:表示任意字符的匹配,且不計字符的多少。
(1)開頭、結尾匹配
開頭匹配(以字母“c”開頭的所有數據):SELECT * FROM table_name WHERE COLUMN LIKE 'c%'
結尾匹配(以字母“c”結尾的所有數據):SELECT * FROM table_name WHERE COLUMN LIKE '%c'

(2)中間匹配
以“c”開頭,以“b”結尾的所有數據:SELECT * FROM table_name WHERE COLUMN LIKE 'c%b'

(3)兩端匹配
查詢出包含字母“c”的所有數據:SELECT * FROM table_name WHERE COLUMN LIKE '%c%'

注意:“%”匹配一個或多個字符。

2、”_“通配符:”_“統配符的功能與”%“基本相同,只是它僅表示任意一個字符(區別)的匹配。若需要表示兩個字符的匹配,則使用兩個”_“通配符,即寫成”_ _“。
(1)匹配一個字符
示例:從表中查詢名稱(name)爲”t_fu“("_"代表任意一個字符)的所有數據,SQL語句如下:
SELECT * FROM table_name where name LIKE 't_fu'     匹配字符串有(tafu,tbfu,tcfu.....)

(2)匹配多個字符
查詢名稱(name)爲3個字符的數據SQL語句如下:
SELECT * FROM table_name where name LIKE '_ _ _'
注意:"_"只能匹配一個字符。

(3)"_"與"%"的綜合應用
在模糊查詢過程中,經常需要"_"和"%"一起使用才能完成查詢功能。
示例:查詢名稱(name)第二個字母爲"c"的所有數據,SQL語句如下:
SELECT * FROM table_name where name LIKE '_c%'

3、"[]"通配符:"[]"通配符用於指定一系列的字符,只要滿足這些字符其中之一且出現在"[]"通配符的位置的字符串就滿足查詢條件
(1)、各種通配符可以組合使用,必須自習分析它所表示的匹配條件
       
                                  匹配條件列表
   查詢條件                                                      匹配條件
   LIKE '5[%]'                                                     5%
   LIKE '[_]n'                                                     _n
   LIKE '[a-f]'                        a,b,c,d,e,f
   LIKE '[[]'                                                       [
   LIKE '[]]'                                                       ]
   LIKE 'abc[def]'                                             abcd,abce,abcf
   LIKE 'abc[_]d%'                                             adbc_d...(省略號表示可以有任意字符)
   LIKE 'a[^a]d%'                                              不能爲aad...([^]表示不能取[]內的字符)
   
示例:
查詢名稱(name)中包含"_"的所有數據:SELECT * FROM table_name WHERE name LIKE '%[_]%'
查詢名稱(name)中最後一個字符爲"a","b","f","g"的所有數據:SELECT * FROM table_name WHERE name LIKE '%[a,b,f,g]'
查詢名稱(name)中最後一個字符不爲"a","b","f","g"的所有數據:SELECT * FROM table_name WHERE name LIKE '%[^a,b,f,g]'


IN運算符
若只需要滿足多個條件中的一個查詢條件,則可以使用IN運算符。IN運算符允許根據一行記錄中是否有一列包括在一系列值之中而選擇改行。
所有的條件羅列在IN運算符之後,並以園括號括起來,各個條件之間使用逗號分開。
示例:
查詢ID爲1、3或4的數據:SELECT * FROM table_name WHERE ID IN (1,3,4)
注意:
在大多數情況下,OR運算符與IN運算符可以實現相同的功能。
示例:SELECT * FROM talbe_name WHERE ID=1 OR ID=3 OR ID=4

二者的結果完全一致,都是返回多條數據記錄。但是,與OR運算符相比,IN運算符具有以下兩個優點:
(1)當選擇條件很多時,採用IN運算符將十分簡捷,只需要在括號中用逗號間隔後一次羅列即可,運行效率高於OR運算符。
(2)IN運算符後面所列的條件可以是另一條SELECT語句,即子查詢。

BETWEEN運算符
在WHERE子句中,可以採用BETWEEN運算符在兩個值之間進行比較篩選。
1、用於數字類型數據比較
查詢年齡(age)在6~10之前的數據:SELECT * FROM table_name WHERE age BETWEEN 6 AND 10
2、用於時間日期比較
查詢日期(bridate)在"1952-01-01"到"1954-01-01"之間的數據:SELECT * FROM table_name WHERE bridate BETWEEN '1952-01-01' AND '1954-01-01'
注意:BETWEEN運算符篩選包含頭和尾。例如數字類型比較,數據會包含6和10

 

                                  聚合函數(不能做爲WHERE條件)
   函數名稱                                                        函數功能
   SUM                                                             返回選取結果集所有值的和
   MAX                                                             返回選取結果集中所有值的最大值
   MIN                                                             返回選取結果集中所有值的最小值
   AVG                                                             返回選取結果集中所有值的平均值
      COUNT                                                           返回選取結果集中行的數目

使用實例:SELECT SUM(COLUMN) FROM table_name

 

分組查詢
GROUP BY子句
原理:先通過GROUP BY後面的字段進行分組,合併相同的項。留下唯一的項,再執行SELECT後面的聚合函數。
SELET 後面只能有GROUP BY包含字段和聚合函數。

1、SELECT 後一個聚合函數情況
示例:從訂單表Orders中查詢各個員工最早的訂單時間(OrderDate)。員工ID爲(EmployeeID)
SELECT EmployeeID,min(OrderDate) FROM table_name GROUP BY EmployeeID
原理:當執行時首先在表中查詢員工ID(EmployeeID),然後將相同的ID合併爲一個。當所有的ID都唯一時,這時便開始通過聚合函數獲得
員工的最早訂單時間。

2、SELECT 後多個聚合函數情況
示例:從訂單表Orders中查詢各個員工最早的訂單時間(OrderDate)和購買最便宜的價格(price)。員工ID爲(EmployeeID)
SELECT EmployeeID,min(OrderDate),min(price) FROM table_name GROUP BY EmployeeID
原理:當執行時首先在表中查詢員工ID(EmployeeID),然後將相同的ID合併爲一個。當所有的ID都唯一時,這時便開始通過聚合函數獲得
員工的最早訂單時間,接着再通過聚合函數獲得最便宜的價格。

3、GROUP BY後多個字段情況
實例:SELECT MAX(C) FROM table_name GROUP BY A,B
原理:當執行時先對A進行分組如果A中有相同項,則開始對B進行分組。如果A、B同時出現相同項。則將相同項合併,留下一個唯一項。
若A出現相同項,B爲不同項。則此時不進行合併,保留此時的項。當A、B分組結束後,則開始通過聚合函數找出分組好後C的最大項。

錯誤情況:
SELECT EmployeeID,price FROM table_name GROUP BY EmployeeID
錯誤提示:選擇列表中的列 'table_name.price' 無效,因爲該列沒有包含在聚合函數或 GROUP BY 子句中。
解決辦法:
1、將price寫在GROUP BY。(原因:沒有被GROUP BY包含,Group By語句的後面,作爲分組的依據)
2、將price寫在聚合函數中 (例如:min(price))

錯誤原因:根據分組字段,將具有相同分組字段的記錄歸併成了一條記錄。
這個時候剩下的那些不存在於Group By語句後面作爲分組依據的字段就有可能出現多個值,
但是目前一種分組情況只有一條記錄,一個數據格是無法放入多個數值的,
所以這裏就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的數據格中,
那麼完成這個步驟的就是聚合函數。這就是爲什麼這些函數叫聚合函數(aggregate functions)了。

總結:GROUP BY 主要是用於分組之後,再通過聚合函數獲得相應的值。GROUP BY後面的字段主要是分組的依據,
當獲得唯一項之後再執行SELECT後的聚合函數獲得相應的值。GROUP BY 可以通過條件來獲得指定的組,
例如:SELECT EmployeeID,min(OrderDate) FROM  table_name WHEER price =value GROUP BY EmployeeID
另一種用法:Group By All [COLUMN]
SELECT EmployeeID,min(OrderDate) FROM  table_name WHEER price =value GROUP BY All EmployeeID
分組好之後顯示對應的項
聚合函數會根據返回值的類型用默認值0或者NULL來代替聚合函數的返回值。
注意:當GROUP BY子句中用於分組的列中出現了NULL值時,會將所有的NULL值分別在同
一組,即認爲他們是“相等”的

HAVING子句
GROUP BY子句只是簡單地依據所選列的數據進行分組,將該列具有相同值的行劃爲一組。而實際應用中,
往往還需要刪除不滿足條件的組,SQL提供HAVING子句來實現該功能。
示例:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)
查詢重複字段:
--查找重複記錄
select * from personnel 
where name in (select   name from   personnel group by name having count(name) > 1)
可以看出,雖然聚合函數不能直接做爲where的條件。但是通過group by 和 having 組合,便可以將其作爲條件進行查詢

HAVING與WHERE的區別
HAVING子句與WHERE子句的相似之處在於定義了搜索條件,但與WHERE子句不同,HAVING子句與組有關,而不是與單個的行有關。
WHERE子句不能直接以聚合函數作爲搜索條件。在SELECT語句中,WHERE和HAVING子句的執行順序不同。
添加限制條件
1、SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)>20 AND EmployeeID>2

錯誤寫法:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID HAVING MIN(price)>100 AND OrderID>5
錯誤提示:選擇列表中的列 'table_name.OrderID' 無效,因爲該列沒有包含在聚合函數或 GROUP BY 子句中。
產生錯誤的原因:不能將單個的OrderID的值應用於組,包括在HAVING子句中的列必須是祖列。此時,WHERE子句不能用HAVING子句代替。
爲了獲得所需的結果,需要需改如下:
SELECT EmployeeID,MIN(price) FROM table_name WHERE OrderID>5 GROUP BY   EmployeeID HAVING MIN(price)>100


表的基本鏈接
1、兩錶鏈接:SELECT * FROM table_name1 [AS] a,table_name2 [AS] b WHERE a.ID=b.ID
2、多表鏈接:SELECT * FROM table_name1 [AS] a,table_name2 [AS] b,table_name3 [AS] c WHERE a.ID=b.ID AND b.ID=c.ID
注意:
1、使用SQL Server關鍵字作爲表名、列名時,需要使用"[]"括起來。例如Order爲SQL Server關鍵字,若需要創建一張名偉Order的表,則寫爲"CREATE TABLE [Order]"
2、SELECT語句首先執行FROM子句,由於定義表別名是在FROM子句中執行,而在其他子句中使用,所以在SELECT語句的任何子句中都可以使用表的別名。

表的連接類型
1、內鏈接:內連接也稱等同連接,返回的結果集是兩個表中所有相匹配的數據,並捨棄不匹配的數據(類似於上面的表的基本連接)。
語法:SELECT * FROM table_name1 [INNER] JOIN table_name2 ON <表達式> [WHERE] [<表達式>]
示例:SELECT * FROM Categories INNER JOIN  Prouducts ON Categories.CategorID=Prouducts.CategorID
注意:INNER關鍵字可以省略。

2、外連接:無論是內連接還是帶WHERE子句的多表查詢,都只返回相匹配的數據(內連接和外連接的區別)。即如果任何一個源表中的行
在另一個源表中沒有匹配,則系統不會將該行放在最後的結果中,而在外連接系統生成的結果表中, 不僅包含符合條件的行,還包括左表、
右表、或兩個表中所有的數據行。
(1)左外連接(LEFT [OUTER] JOIN)
左外連接除了包括匹配的行之外,還包括JOIN關鍵字左表中不匹配的行,其中,右表中缺少的屬性值用NULL值表示。左表連接示意圖如下:
                                              
             
      TB_A                                     TB_B
                A      B      C                                C       D
    a1     b1     c1                               c1      d1
    a2     b2     c2                               c2      d2
    a3     b3     c3
               
           TB_A LEFT [OUTER] JOIN TB_B ON TB_A.C=TB_B.C
      A      B      C       C       D
         a1     b1     c1      c1      d1
         a2     b2     c2      c2      d2
         a3     b3     c3      NULL     NULL
     
UNION運算符
UNION運算符用於執行集合的“並”運算。
語法:SELECT * FROM table_name1 WHERE <表達式> UNION SELECT * FROM table_name1 WHERE <表達式>
內連接實現多表連接
語法:SELECT * FROM table_name1 Orders o INNER JOIN Details od ON o.OrderID=od.OrderID INNER JOIN Employees e ON e.EmployeeID=o.EmployeeID

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章