右連接與左連接的差別在于:不管左側表里有沒有匹配的記錄,它都從左側表中返回所有記錄。
例:假如想了解客戶的信息,并統計各個地區的客戶分布,這時可以用一個右連接,即使某個地區沒有客戶,也要返回客戶信息。
空值不會相互匹配,可以通過外連接才能測試被連接的某個表的字段是否有空值。
SELECT *
FROM talbe1
LEFT JOIN table2 ON table1.a=table2.c
1 連接查詢中使用Iif函數實現以0值顯示空值
Iif表達式: Iif(IsNull(Amount,0,Amout)
例:無論定貨大于或小于¥50,都要返回一個標志。
Iif([Amount]>50,?Big order?,?Small order?)
五. 分組和總結查詢結果
在SQL的語法里,GROUP BY和HAVING子句用來對數據進行匯總。GROUP BY子句指明了按照哪幾個字段來分組,而將記錄分組后,用HAVING子句過濾這些記錄。
GROUP BY 子句的語法
SELECT fidldlist
FROM table
WHERE criteria
[GROUP BY groupfieldlist [HAVING groupcriteria]]
注:Microsoft Jet數據庫 Jet 不能對備注或OLE對象字段分組。
GROUP BY字段中的Null值以備分組但是不能被省略。
在任何SQL合計函數中不計算Null值。
GROUP BY子句后最多可以帶有十個字段,排序優先級按從左到右的順序排列。
例:在‘WA’地區的雇員表中按頭銜分組后,找出具有同等頭銜的雇員數目大于1人的所有頭銜。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP BY Title
HAVING Count(Title)>1
JET SQL 中的聚積函數
聚集函數 意義
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表達式中記錄的數目
COUNT (* ) 計算記錄的數目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 標準誤差
FIRST 第一個值
LAST 最后一個值
六. 用Parameters聲明創建參數查詢
Parameters聲明的語法:
PARAMETERS name datatype[,name datatype[, …]]
其中name 是參數的標志符,可以通過標志符引用參數.
Datatype說明參數的數據類型.
使用時要把PARAMETERS 聲明置于任何其他語句之前.
例:
PARAMETERS[Low PRice] Currency,[Beginning date]datatime
SELECT OrderID ,OrderAmount
FROM Orders
WHERE OrderAMount>[low price]
AND OrderDate>=[Beginning date]
七. 功能查詢
所謂功能查詢,實際上是一種操作查詢,它可以對數據庫進行快速高效的操作.它以選擇查詢為目的,挑選出符合條件的數據,再對數據進行批處理.功能查詢包括更新查詢,刪除查詢,添加查詢,和生成表查詢.
1 更新查詢
UPDATE子句可以同時更改一個或多個表中的數據.它也可以同時更改多個字段的值.
更新查詢語法:
UPDATE 表名
SET 新值
WHERE 準則
例:英國客戶的定貨量增加5%,貨運量增加3%
UPDATE OEDERS
SET OrderAmount = OrderAmount *1.1
Freight = Freight*1.03
WHERE ShipCountry = ‘UK’
2 刪除查詢
DELETE子句可以使用戶刪除大量的過時的或冗于的數據.
注:刪除查詢的對象是整個記錄.
DELETE子句的語法:
DELETE [表名.*]
FROM 來源表
WHERE 準則
例: 要刪除所有94年前的定單
DELETE *
FROM Orders
WHERE OrderData<#94-1-1#
3 追加查詢
INSERT子句可以將一個或一組記錄追加到一個或多個表的尾部.
INTO 子句指定接受新記錄的表
valueS 要害字指定新記錄所包含的數據值.
INSERT 子句的語法:
INSETR INTO 目的表或查詢(字段1,字段2,…)
valueS(數值1,數值2,…)
例:增加一個客戶
INSERT INTO Employees(FirstName,LastName,title)
valueS(‘Harry’,’Washington’,’Trainee’)
4 生成表查詢
可以一次性地把所有滿足條件的記錄拷貝到一張新表中.通常制作記錄的備份或副本或作為報表的基礎.
SELECT INTO子句用來創建生成表查詢語法:
SELECT 字段1,字段2,…
INTO 新表[IN 外部數據庫]
FROM 來源數據庫
WHERE 準則
例:為定單制作一個存檔備份
SELECT *
INTO OrdersArchive
FROM Orders
八. 聯合查詢
UNION運算可以把多個查詢的結果合并到一個結果集里顯示.
UNION運算的一般語法:
[表]查詢1 UNION [ALL]查詢2 UNION …
例:返回巴西所有供給商和客戶的名字和城市
SELECT CompanyName,City
FROM Suppliers
WHERE Country = ‘Brazil’
UNION
SELECT CompanyName,City
FROM Customers
WHERE Country = ‘Brazil’
注:
缺省的情況下,UNION子句不返回重復的記錄.假如想顯示所有記錄,可以加ALL選項
UNION運算要求查詢具有相同數目的字段.但是,字段數據類型不必相同.
每一個查詢參數中可以使用GROUP BY 子句 或 HAVING 子句進行分組.要想以指定的順序來顯示返回的數據,可以在最后一個查詢的尾部使用OREER BY子句.
九. 交叉查詢
交叉查詢可以對數據進行總和,平均,計數或其他總和計算法的計算,這些數據通過兩種信息進行分組:一個顯示在表的左部,另一個顯示在表的頂部.
Microsoft Jet SQL 用TRANSFROM語句創建交叉表查詢語法:
TRANSFORM aggfunction
SELECT 語句
GROUP BY 子句
PIVOT pivotfield[IN(value1 [,value2[,…]]) ]
Aggfounction指SQL聚積函數,
SELECT語句選擇作為標題的的字段,
GROUP BY 分組
說明:
Pivotfield 在查詢結果集中創建列標題時用的字段或表達式,用可選的IN子句限制它的取值.
value代表創建列標題的固定值.
例:顯示在1996年里每一季度每一位員工所接的定單的數目:
TRANSFORM Count(OrderID)
SELECT FirstName&’’&LastName AS FullName
FROM Employees INNER JOIN Orders
ON Employees.EmployeeID = Orders.EmployeeID
WHERE DatePart(“yyyy”,OrderDate)= ‘1996’
GROUP BY FirstName&’’&LastName
ORDER BY FirstName&’’&LastName
POVOT DatePart(“q”,OrderDate)&’季度’
十 .子查詢
子查詢可以理解為 套查詢.子查詢是一個SELECT語句.
1 表達式的值與子查詢返回的單一值做比較
語法:
表達式 comparision [ANYALLSOME](子查詢)
說明:
ANY和SOME謂詞是同義詞,與比較運算符(=,<
,>,<>,<=,>=)一起使用.返回一個布爾值True或False.ANY的意思是,表達式與子查詢返回的一系列的值逐一比較,只要其中的一次比較產生True結果,ANY測試的返回 True值(既WHERE子句的結果),對應于該表達式的當前記錄將進入主查詢的結果中.ALL測試則要求表達式與子查詢返回的一系列的值的比較都產生True結果,才回返回True值.
例:主查詢返回單價比任何一個折扣大于等于25%的產品的單價要高的所有產品
SELECT * FROM ProdUCts
WHERE UnitPrice>ANY
(SELECT UnitPrice FROM[Order Details] WHERE Discount>0.25)
2 檢查表達式的值是否匹配子查詢返回的一組值的某個值
語法:
[NOT]IN(子查詢)
例:返回庫存價值大于等于1000的產品.
SELECT ProductName FROM Products
WHERE ProductID IN
(SELECT PrdoctID FROM [Order DEtails]
WHERE UnitPrice*Quantity>= 1000)
3檢測子查詢是否返回任何記錄
語法:
[NOT]EXISTS (子查詢)
例:用EXISTS檢索英國的客戶
SELECT ComPanyName,ContactName
FROM Orders
WHERE EXISTS
(SELECT *
FROM Customers
WHERE Country = ‘UK’ AND
Customers.CustomerID= Orders.CustomerID)