前言
所有Example在SQL2000的查詢分析器(Microsoft SQL Server/80/Tools/Binn/isqlw.exe)執行通過。(*以下Example 簡記爲EX))
* append file 分支包括函數類型列表,數據類型列表。
一、 基本DML
基本DML的增加數據(insert)、更改數據(update) 、刪除數據(delete) 、查詢數據(query)四種模式:
1.增加數據:
· INSERT INTO table_name (column1,column2,...) VALUES 二、 複雜查詢
1.組合查詢:
組合查詢是指所查詢得數據來源並不只有單一的表格,而是聯合一個以上的表格才能夠得到結果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的數據
2.當然兩個表格相互比較的列,其數據形態必須相同
3.一個複雜的查詢其用到的表格可能會很多個
EX)
SELECT * FROM employees a , employeeterritories b WHERE a.employeeid=b.employeeid
SELECT distinct lastname FROM employees a , employeeterritories b WHERE a.employeeid=b.employeeid (沒發現有distinctrow???)
2.整合性的查詢:
· 條數記數
SELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
說明:
查詢符合條件的數據條數
EX)
SELECT count(*) FROM employees
· 含有聚合函數:
在SQL查詢分析器中打開對象瀏覽器可看到函數列表
以下是常用的聚合函數
SELECT SUM(column1)
FROM table_name
說明:
1.計算出總和,所選的列必須是可數的數字形態
2.除此以外還有 AVG() 是計算平均、MAX()、MIN()
計算最大最小值的整合性查詢
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
說明:
EX)
SELECT sum(unitprice) FROM [order details] *** 表名分開的情況
GROUP BY: 以column1 爲一組計算 column2 的平均值必須和 AVG、SUM 等整合性查詢的關鍵字一起使用
SELECT ProductID ,avg(unitprice) FROM [order details] group by ProductID
HAVING : HAVING 子句通常與 GROUP BY 子句結合使用一起使用作爲整合性的限制
例如,下列 WHERE 子句僅限定以高於 $100 的單價銷售產品的訂單,而 HAVING 子句進一步將結果限制爲只包括 100 件以上的訂單:
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100
3.複合性的查詢
SELECT *
FROM table_name1
WHERE EXISTS ( SELECT * FROM table_name2 WHERE conditions )
說明:
WHERE 的 conditions 可以是另外一個的 query
1.EXISTS 在此是指存在與否
SELECT *
FROM table_name1
WHERE column1 IN ( SELECT column1 FROM table_name2 WHERE conditions )
說明
IN 後面接的是一個集合,表示column1 存在集合裏面SELECT 出來的數據形態必須符合 column1
EX)
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE not exists (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100
4.其他查詢 (like,between,top n)
SELECT *
FROM table_name1 WHERE column1 LIKE 'x%'
說明:
1.LIKE 必須和後面的'x%' 相呼應表示以 x爲開頭的字串
SELECT * FROM table_name1 WHERE column1 BETWEEN xx AND yy
說明
1. BETWEEN 表示 column1 的值介於 xx 和 yy 之間
· 關於like
通配符 描述 示例
% 包含零個或更多字符的任意字符串。 WHERE title LIKE '%computer%' 將查找處於書名任意位置的包含單詞 computer 的所有書名。
_(下劃線) 任何單個字符。 WHERE au_fname LIKE '_ean' 將查找以 ean 結尾的所有 4 個字母的名字(Dean、Sean 等)。
[ ] 指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符。 WHERE au_lname LIKE '[C-P]arsen' 將查找以arsen 結尾且以介於 C 與 P 之間的任何單個字符開始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不屬於指定範圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符。 WHERE au_lname LIKE 'de[^l]%' 將查找以 de 開始且其後的字母不爲 l 的所有作者的姓氏。
SELECT CompanyName, ContactName, Phone, Fax
FROM Customers
WHERE CompanyName LIKE N'%snabbk?p'+'%'
ORDER BY CompanyName ASC, ContactName ASC; ===>***N的作用???
· 關於between
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales NOT BETWEEN 4095 AND 12000
· 關於TOP N
SELECT TOP 5 orderid,productid,quantity from [order details] order by quantity desc ( value1,value2, ...)
1.若沒有指定column 系統則會按表格內的列順序填入數據
2.列的數據形態和所填入的數據必須吻合
3.table_name 也可以是景觀 view_name
· INSERT INTO table_name (column1,column2,...) SELECT columnx,columny,... FROM another_table
說明:也可以經過一個子查詢(subquery)把別的表格的數據填入
EX)
(OrderDate,RequiredDate,Freight,ShipName)
(CONVERT(DateTime,'2004/12/02 1:1:1'),Null,99,'GEC')
*該語句包含了日期,數字,字符,和空值的輸入。其中日期類型爲隱性轉換 如果比較 char 和 datetime 表達式 SQL Server 可將它們自動轉換。
OrderDate《==='2004/12/02 1:1:1'
2.更改數據:
· UPDATE table_name SET column1=value1, column2=value2 ... ... WHERE conditoins
1.更改某個列設定其值爲'xxx'
2.conditions 是所要符合的條件、若沒有 WHERE 則 整個 table 的那個列都會全部被更改
EX)
SET orderdate='
WHERE orderid=10248
3.刪除數據:
· DELETE FROM table_name WHERE conditions
EX)
DELETE [Order Details]
FROM Suppliers, Products
WHERE Products.SupplierID = Suppliers.SupplierID
AND Suppliers.CompanyName = 'Lyngbysild'
AND [Order Details].ProductID = Products.ProductID
* [order details] 是一個空格分開的表名
4.查詢數據:
· SELECT column1,columns2,... FROM table_name
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
1.'*'表示全部的列都列出來
2.WHERE 之後是接條件式,把符合條件的數據列出來
SELECT column1,column2
FROM table_name
ORDER BY column2 [DESC]
ORDER BY 是指定以某個列做排序,[DESC]是指從大到小排列,若 沒有指明[ASC],則是從小到大排列
EX)
SELECT * FROM employees WHERE employeeid>3 OR employeeid=1 ORDER BY employeeid ASC;
組合查詢 , 整合性的查詢 , 含有聚合函數 , 複合性的查詢 , 其他查詢(like,between.... ...) 後續
二、複雜查詢
1.組合查詢:
組合查詢是指所查詢得數據來源並不只有單一的表格,而是聯合一個以上的表格才能夠得到結果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的數據
2.當然兩個表格相互比較的列,其數據形態必須相同
3.一個複雜的查詢其用到的表格可能會很多個
EX)
SELECT * FROM employees a , employeeterritories b WHERE a.employeeid=b.employeeid
SELECT distinct lastname FROM employees a , employeeterritories b WHERE a.employeeid=b.employeeid
(沒發現有distinctrow???)
2.整合性的查詢:
· 條數記數
SELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
說明:
查詢符合條件的數據條數
EX)
SELECT count(*) FROM employees
· 含有聚合函數:
在SQL查詢分析器中打開對象瀏覽器可看到函數列表
以下是常用的聚合函數
SELECT SUM(column1)
FROM table_name
說明:
1.計算出總和,所選的列必須是可數的數字形態
2.除此以外還有 AVG() 是計算平均、MAX()、MIN()
計算最大最小值的整合性查詢
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
說明:
EX)
SELECT sum(unitprice) FROM [order details] *** 表名分開的情況
GROUP BY: 以column1 爲一組計算 column2 的平均值必須和 AVG、SUM 等整合性查詢的關鍵字一起使用
SELECT ProductID ,avg(unitprice) FROM [order details] group by ProductID
HAVING : HAVING 子句通常與 GROUP BY 子句結合使用一起使用作爲整合性的限制
例如,下列 WHERE 子句僅限定以高於 $100 的單價銷售產品的訂單,而 HAVING 子句進一步將結果限制爲只包括 100 件以上的訂單:
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100
3.複合性的查詢
SELECT *
FROM table_name1
WHERE EXISTS ( SELECT * FROM table_name2 WHERE conditions )
說明:
WHERE 的 conditions 可以是另外一個的 query
1.EXISTS 在此是指存在與否
SELECT *
FROM table_name1
WHERE column1 IN ( SELECT column1 FROM table_name2 WHERE conditions )
說明
IN 後面接的是一個集合,表示column1 存在集合裏面SELECT 出來的數據形態必須符合 column1
EX)
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE not exists (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100
4.其他查詢 (like,between,top n)
SELECT *
FROM table_name1 WHERE column1 LIKE 'x%'
說明:
1.LIKE 必須和後面的'x%' 相呼應表示以 x爲開頭的字串
SELECT * FROM table_name1 WHERE column1 BETWEEN xx AND yy
說明
1. BETWEEN 表示 column1 的值介於 xx 和 yy 之間
· 關於like
通配符 描述 示例
% 包含零個或更多字符的任意字符串。 WHERE title LIKE '%computer%' 將查找處於書名任意位置的包含單詞 computer 的所有書名。
_(下劃線) 任何單個字符。 WHERE au_fname LIKE '_ean' 將查找以 ean 結尾的所有 4 個字母的名字(Dean、Sean 等)。
[ ] 指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符。 WHERE au_lname LIKE '[C-P]arsen' 將查找以arsen 結尾且以介於 C 與 P 之間的任何單個字符開始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不屬於指定範圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符。 WHERE au_lname LIKE 'de[^l]%' 將查找以 de 開始且其後的字母不爲 l 的所有作者的姓氏。
SELECT CompanyName, ContactName, Phone, Fax
FROM Customers
WHERE CompanyName LIKE N'%snabbk?p'+'%'
ORDER BY CompanyName ASC, ContactName ASC; ===>***N的作用???
· 關於between
SELECT title_id, ytd_sales
FROM titles
WHERE ytd_sales NOT BETWEEN 4095 AND 12000
· 關於TOP N
SELECT TOP 5 orderid,productid,quantity from [order details] order by quantity desc
三、外聯接的使用
僅當至少有一個同屬於兩表的行符合聯接條件時,內聯接才返回行。內聯接消除與另一個表中的任何行不匹配的行。
而外聯接會返回 FROM 子句中提到的至少一個表或視圖的所有行,只要這些行符合任何 WHERE 或 HAVING 搜索條件。將檢索通過左向外聯接引用的左表的所有行,以及通過右向外聯接引用的右表的所有行。完整外部聯接中兩個表的所有行都將返回。
Microsoft SQL Server 2000 對在 FROM 子句中指定的外聯接使用以下 SQL-92 關鍵字:
LEFT OUTER JOIN 或 LEFT JOIN
RIGHT OUTER JOIN 或 RIGHT JOIN
FULL OUTER JOIN 或 FULL JOIN
SQL Server 支持 SQL-92 外聯接語法,以及在 WHERE 子句中使用 *= 和 =* 運算符指定外聯接的舊式語法。由於 SQL-92 語法不容易產生歧義,而舊式 Transact-SQL 外聯接有時會產生歧義,因此建議使用 SQL-92 語法。
· 使用左向外聯接
假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。
若要在結果中包括所有的作者,而不管出版商是否住在同一個城市,請使用 SQL-92 左向外聯接。下面是 Transact-SQL 左向外聯接的查詢和結果:
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
不管是否與 publishers 表中的 city 列匹配,LEFT OUTER JOIN 均會在結果中包含 authors 表的所有行。注意:結果中所列的大多數作者都沒有相匹配的數據,因此,這些行的 pub_name 列包含空值。
· 使用右向外聯接
假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。SQL-92 右向外聯接運算符 RIGHT OUTER JOIN 指明:不管第一個表中是否有匹配的數據,結果將包含第二個表中的所有行。
若要在結果中包括所有的出版商,而不管城市中是否還有出版商居住,請使用 SQL-92 右向外聯接。下面是 Transact-SQL 右向外聯接的查詢和結果:
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a RIGHT OUTER JOIN publishers AS p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
· 使用完整外部聯接
若要通過在聯接結果中包括不匹配的行保留不匹配信息,請使用完整外部聯接。Microsoft? SQL Server? 2000 提供完整外部聯接運算符 FULL OUTER JOIN,不管另一個表是否有匹配的值,此運算符都包括兩個表中的所有行。
假設在 city 列上聯接 authors 表和 publishers 表。結果只顯示在出版商所在城市居住的作者(本例中爲 Abraham Bennet 和 Cheryl Carson)。SQL-92 FULL OUTER JOIN 運算符指明:不管表中是否有匹配的數據,結果將包括兩個表中的所有行。
若要在結果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一個城市,請使用完整外部聯接。下面是 Transact-SQL 完整外部聯接的查詢和結果:
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a FULL OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
四、字符串函數
這些標量函數對字符串輸入值執行操作,返回字符串或數字值。
返回字符表達式最左端字符的 ASCII 代碼值。
根據 Unicode 標準所進行的定義,用給定整數代碼返回 Unicode 字符。
用第三個表達式替換第一個字符串表達式中出現的所有第二個給定字符串表達式。
語法
REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' )
由數字數據轉換到字符數據。
返回字符串中從左,右邊開始指定個數的字符。
LEFT ( character_expression , integer_expression )
返回由重複的空格組成的字符串。
語法
SPACE ( integer_expression )
以指定的次數重複字符表達式。
語法
REPLICATE ( character_expression , integer_expression )
*若要在 Unicode 數據中包括空格,請使用 REPLICATE 而非 SPACE。
返回字符、binary、text 或 image 表達式的一部分。有關可與該函數一起使用的有效 Microsoft® SQL Server™ 數據類型的更多信息,請參見數據類型。
語法
SUBSTRING ( expression , start , length )
返回給定字符串表達式的字符(而不是字節)個數,其中不包含尾隨空格。
語法
LEN ( string_expression )
返回將大寫小寫字符數據轉換的字符表達式。
去空格後返回一個字符串
... ...
五、日期和時間函數
函數 確定性
DATEADD 具有確定性
DATEADD ( datepart , number, date )
SELECT DATEADD(day, 21, pubdate) AS timeframe
FROM titles
datepart 是規定應向日期的哪一部分返回新值的參數。下表列出了 Microsoft? SQL Server? 識別的日期部分和縮寫。
日期部分 縮寫
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms
DATEDIFF 具有確定性
返回跨兩個指定日期的日期和時間邊界數。
DATEDIFF ( datepart , startdate , enddate )
DATENAME 不具有確定性
返回代表指定日期的指定日期部分的字符串。
DATENAME ( datepart , date )
DATEPART 除了用作 DATEPART (dw, date) 外都具有確定性。dw 是工作日的日期部分,取決於由設置每週第一天的 SET DATEFIRST 所設置的值。
SELECT DATEPART(weekday,GETDATE()) AS 'WORD DAY'
DAY 具有確定性
MONTH 具有確定性
YEAR 具有確定性
GETDATE 不具有確定性
按 datetime 值的 Microsoft? SQL Server? 標準內部格式返回當前系統日期和時間。
2004-12-02 00:31:30.840
GETUTCDATE 不具有確定性
返回表示當前 UTC 時間(世界時間座標或格林尼治標準時間)的 datetime 值。當前的 UTC 時間得自當前的本地時間和運行 SQL Server 的計算機操作系統中的時區設置。
2004-12-01 16:33:12.107
六、轉換函數
要轉換的表達式(例如,銷售報告要求銷售數據從貨幣型數據轉換爲字符型數據)。
要將所給表達式轉換到的數據類型,例如,varchar 或 SQL Server 提供的任何其它數據類型。
除非將被轉換的值存儲起來,否則轉換僅在 CAST 或 CONVERT 函數的作用期內有效。
在下面的示例中,第一個 SELECT 語句中使用 CAST,第二個 SELECT 語句中使用 CONVERT,將 title 列轉換爲 char(50) 列,以使結果更可讀:
SELECT CAST(title AS char(50)), ytd_sales
SELECT CONVERT(char(50), title), ytd_sales
----------------------------------------- -----------
Onions, Leeks, and Garlic: Cooking Secrets of the 375
Fifty Years in
在下面的示例中,int 類型的ytd_sales 列轉換爲 char(20) 列,從而可以對該列使用 LIKE 謂詞:
WHERE CAST(ytd_sales AS char(20)) LIKE '15%'
----------------------------------------- ---------
Fifty Years in
SQL Server 自動處理某些數據類型的轉換。例如,如果比較 char 和 datetime 表達式、smallint 和 int 表達式、或不同長度的 char 表達式,SQL Server 可將它們自動轉換。這種轉換稱爲隱性轉換。對這些轉換不必使用 CAST 函數。但是,在下列情況下使用 CAST 都是可以接受的:
如果試圖進行不可能的轉換(例如,將含有字母的 char 表達式轉換爲 int 類型),SQL Server 將顯示一條錯誤信息。
如果轉換時沒有指定數據類型的長度,則 SQL Server 自動提供長度爲 30。
要轉換爲 float 或 real 數據類型的 char 或 varchar 類型表達式還可選擇性地包含指數符號(e 或 E,後面有可選的 + 或 - 符號,再後面是數字)。
SELECT SUBSTRING(title, 1, 25) AS Title, CONVERT(char(2), ytd_sales)
在進行數據類型轉換時,若目標數據類型的小數位數小於源數據類型的小數位數,則該值將被截斷。例如,CAST(10.3496 AS money) 的結果是 $10.35。
style 參數
SELECT CONVERT(char(10), GETDATE(), 111) + ' ' + CONVERT(char(8), GETDATE(), 108)
此語句把當前日期轉換爲樣式 111,yyyy/mm/dd + hh:mm:ss
CAST 和 CONVERT
函數
在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換爲字符數據的 style 值。給 style 值加 100,可獲得包括世紀數位的四位年份 (yyyy)。
不帶世紀數位 (yy) 帶世紀數位 (yyyy)
標準
輸入/輸出**
- 0 或 100 (*) 默認值 mon dd yyyy hh:miAM(或 PM)
1 101 美國 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英國/法國 dd/mm/yy
4 104 德國 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默認值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美國 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 歐洲默認值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 規範 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 規範(帶毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM
* 默認值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。