實體完全性束縛
束縛種類 功能描寫
PRIMARY KEY(主鍵)束縛 唯1辨認每條記錄的標志,可以有多列共同組成
IDENTITY(自增)束縛 列值自增,1般使用此屬性設置的列作為主鍵
UNIQUE(唯1)束縛 可使用UNIQUE束縛確保在非主鍵列中不存在重復值,但列值可以是NULL(空)
域完全性束縛
CHECK(檢查)束縛 用于限制列中值得范圍
FOREIGN KEY(外鍵) 1個表中的FORENIGN KEY 指向另外一個表中的PRIMARY KEY
DEFAULT(默許值)束縛 用于向列中插入默許值
NOT NULL(非空)束縛 用于強迫列不接受NULL(空)值
注意:
1、PRIMARY KEY用于將表中的某類設置為主鍵,1張表中只有1個主鍵,主鍵可以是1列或由多列組成。
2、NOT NULL是對列值進行限制,即在表中添加數據時不允許有NULL值。
3、CHECK束縛的語法規則:CHECK(表達式)
外鍵的使用:字段名 數據類型 [FOREIGN KEY] REFERENCES 表名(字段名)
向http://www.vxbq.cn/db/中添加值:
語法:INSERT [INTO] table_name [(COLUMN1,COLUMN2,.....)] VALUES (VALUE1,VALUE2,.....)
注意:
1、VALUES需要與COLUMN對應
2、添加數據時,如果字段類型為varchar或datetime,否則必須使用單引號('')引發來。
3、雖然沒有顯示地添加IDENTIRY束縛字段,但是http://www.vxbq.cn/db/會自動依照IDENTITY規則添加數據
1次添加多行數據
語法:
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<表達式>
注意:分離http://www.vxbq.cn/db/是將http://www.vxbq.cn/db/文件從SQL Server中分離出來,而刪除http://www.vxbq.cn/db/是將http://www.vxbq.cn/db/文件刪除。
查詢語句語法結構
語法: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、在1個WHERE子句中,可以同時使用多個AND運算符鏈接多個查詢條件。
2、在“(表達式1)OR(表達式2)”中,如果表達式1為TRUE,將不再履行表達式2。
SQL Server內置函數(內置函數可作為where條件,聚合函數不能做為where條件)
字符串函數
函數名 示例 函數功能
CharIndex CharIndex('ab','cdab')結果返回3 返回‘ab’在‘cdab’中的位置,將返回第1個字母的位置
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⑴0-08')結果返回‘2009⑴2-08’ 向日期指定部份添加數字,其中,yy表示年、mm表示月、dd表示日
DateDiff DateDiff(dd,'2009-09-09','2010-09-09')結果返回‘365’ 返回兩個日期之間的間隔,其中,yy表示年、mm表示月、dd表示日
DateName DateName(DW,'2009-09-09')結果返回“星期3” 以字符串的情勢返回某個日期指定的部份
DatePart DatePart(DW,'2009-09-09')結果返回“4” 以整數情勢返回某個日期指定的部份
實例:獲得系統當前日期函數為GetDate(),表達式可以寫為“COLUMN1<GetDate()”,SQL語句以下:
SELECT * FROM table_name WHERE COLUMN1<GetDate()
注意:在創建http://www.vxbq.cn/db/時,如果對時間的選擇。例如聲明類型YYYY-MM-DD則需要使用Date類型,如果精確到時、分、秒則需要使用Datetime類型。
如果需要使用默許時間則只需在類型后添加 default getdate()。在插入數據時,對應的時間字段只需使用default便可。
判斷選課時間是不是是星期3的函數為DateName(DW,COLUMN),表達式可以寫成“DateName(DW,COLUMN)=‘星期3’”,SQL語句以下:
SELECT * FROM table_name DateName(DW,COLUMN)=‘星期3’
數學函數
函數名 示例 函數功能
Abs Abs(⑴)結果返回“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” 返回1個數值,舍入到指定的長度或精度
Sign Sign(100)結果返回“1” 正整數返回1,負整數返回⑴
Sqrt Sqrt(4)結果返回“2” 開平方
系統函數
函數名 示例 函數功能
Convert Convert(varchar(10),123)結果返回“123” 裝換數據類型
DataLength DataLength('12中國')結果返回6 返回任何數據類型的字節數?!爸袊卑?個字節,“12”包括兩個字節,所以返回6.
開發進程中對日期的操作:例如取得昨天、前天的數據。
SQL語句以下: select * from table_name where pudoctime>=SUBSTRING( Convert(varchar(20),DateAdd(DD,⑴,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%'
注意:“%”匹配1個或多個字符。
2、”_“通配符:”_“統配符的功能與”%“基本相同,只是它僅表示任意1個字符(區分)的匹配。若需要表示兩個字符的匹配,則使用兩個”_“通配符,即寫成”_ _“。
(1)匹配1個字符
示例:從表中查詢名稱(name)為”t_fu“("_"代表任意1個字符)的所有數據,SQL語句以下:
SELECT * FROM table_name where name LIKE 't_fu' 匹配字符串有(tafu,tbfu,tcfu.....)
(2)匹配多個字符
查詢名稱(name)為3個字符的數據SQL語句以下:
SELECT * FROM table_name where name LIKE '_ _ _'
注意:"_"只能匹配1個字符。
(3)"_"與"%"的綜合利用
在模糊查詢進程中,常常需要"_"和"%"1起使用才能完成查詢功能。
示例:查詢名稱(name)第2個字母為"c"的所有數據,SQL語句以下:
SELECT * FROM table_name where name LIKE '_c%'
3、"[]"通配符:"[]"通配符用于指定1系列的字符,只要滿足這些字符其中之1且出現在"[]"通配符的位置的字符串就滿足查詢條件
(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)中最后1個字符為"a","b","f","g"的所有數據:SELECT * FROM table_name WHERE name LIKE '%[a,b,f,g]'
查詢名稱(name)中最后1個字符不為"a","b","f","g"的所有數據:SELECT * FROM table_name WHERE name LIKE '%[^a,b,f,g]'
IN運算符
若只需要滿足多個條件中的1個查詢條件,則可使用IN運算符。IN運算符允許根據1行記錄中是不是有1列包括在1系列值當中而選擇轉業。
所有的條件羅列在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
2者的結果完全1致,都是返回多條數據記錄。但是,與OR運算符相比,IN運算符具有以下兩個優點:
(1)當選擇條件很多時,采取IN運算符將10分簡捷,只需要在括號中用逗號間隔后1次羅列便可,運行效力高于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后面的字段進行分組,合并相同的項。留下唯1的項,再履行SELECT后面的聚合函數。
SELET 后面只能有GROUP BY包括字段和聚合函數。
1、SELECT 后1個聚合函數情況
示例:從定單表Orders中查詢各個員工最早的定單時間(OrderDate)。員工ID為(EmployeeID)
SELECT EmployeeID,min(OrderDate) FROM table_name GROUP BY EmployeeID
原理:當履行時首先在表中查詢員工ID(EmployeeID),然后將相同的ID合并為1個。當所有的ID都唯1時,這時候便開始通過聚合函數取得
員工的最早定單時間。
2、SELECT 后多個聚合函數情況
示例:從定單表Orders中查詢各個員工最早的定單時間(OrderDate)和購買最便宜的價格(price)。員工ID為(EmployeeID)
SELECT EmployeeID,min(OrderDate),min(price) FROM table_name GROUP BY EmployeeID
原理:當履行時首先在表中查詢員工ID(EmployeeID),然后將相同的ID合并為1個。當所有的ID都唯1時,這時候便開始通過聚合函數取得
員工的最早定單時間,接著再通過聚合函數取得最便宜的價格。
3、GROUP BY后多個字段情況
實例:SELECT MAX(C) FROM table_name GROUP BY A,B
原理:當履行時先對A進行分組如果A中有相同項,則開始對B進行分組。如果A、B同時出現相同項。則將相同項合并,留下1個唯1項。
若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))
毛病緣由:根據分組字段,將具有相同分組字段的記錄歸并成了1條記錄。
這個時候剩下的那些不存在于Group By語句后面作為分組根據的字段就有可能出現多個值,
但是目前1種分組情況只有1條記錄,1個數據格是沒法放入多個數值的,
所以這里就需要通過1定的處理將這些多值的列轉化成單值,然后將其放在對應的數據格中,
那末完成這個步驟的就是聚合函數。這就是為何這些函數叫聚合函數(aggregate functions)了。
總結:GROUP BY 主要是用于分組以后,再通過聚合函數取得相應的值。GROUP BY后面的字段主要是分組的根據,
當取得唯1項以后再履行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值分別在同
1組,即認為他們是“相等”的
HAVING子句
GROUP BY子句只是簡單地根據所選列的數據進行分組,將該列具有相同值的行劃為1組。而實際利用中,
常常還需要刪除不滿足條件的組,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關鍵字,若需要創建1張名偉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個源表中的行
在另外一個源表中沒有匹配,則系統不會將該行放在最后的結果中,而在外連接系統生成的結果表中, 不但包括符合條件的行,還包括左表、
右表、或兩個表中所有的數據行。
(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
下一篇 phpMyAdmin