有的時候我們進行MySQL查詢時的查找條可能并不在同一張表中,或者外部資料庫中,這個時候我們就要用到組合查詢。最近剛剛開始學習這個,慢慢發現 MySQL的功能真的很強大。除了組合查詢,複合語句外,還有存儲過程。存儲過程看起來功能好像更強大,比MySQL函數要靈活的多。網上找了一些資料對自已算是一種入門學習吧。
組合查詢
組合查詢是指所查詢得資料來源并不隻有單一的表格,而是聯合一個以上的
表格才能夠得到結果的。
Select *
FROM table1,table2
Where table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格互相比較的欄位,其資料形态必須相同。
3.一個複雜的查詢其動用到的表格可能會很多個。
整合性的查詢:
Select COUNT (*)
FROM table_name
Where column_name = xxx
說明:
查詢符合條件的資料共有幾筆。
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
說明:
1.GROUP BY: 以column1 為一組計算 column2 的平均值必須和 AVG、SUM等整合性查詢的關鍵字
一起使用。
2.HAVING : 必須和 GROUP BY 一起使用作為整合性的限制。
複合性的查詢
Select *
FROM table_name1
Where EXISTS (
Select *
FROM table_name2
Where conditions )
說明:
1.Where 的 conditions 可以是另外一個的 query。
2.EXISTS 在此是指存在與否。
Select *
FROM table_name1
Where column1 IN (
Select column1
FROM table_name2
Where conditions )
說明:
1. IN 後面接的是一個集合,表示column1 存在集合裡面。
2. Select 出來的資料形态必須符合 column1。
其他查詢
Select *
FROM table_name1
Where column1 LIKE ’x%’
說明:LIKE 必須和後面的’x%’ 相呼應表示以 x為開頭的字串。
Select *
FROM table_name1
Where column1 IN (’xxx’,’yyy’,..)
說明:IN 後面接的是一個集合,表示column1 存在集合裡面。
Select *
FROM table_name1
Where column1 BETWEEN xx AND yy
說明:BETWEEN 表示 column1 的值介於 xx 和 yy 之間。
《SQL語句的基本文法》
Select語句的完整文法為:
Select[ALL|DISTINCT|DISTINCTROW|TOP]
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]}
FROM tableexpression[,…][IN externaldatabase]
[Where…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]
說明:
用中括号([])括起來的部分表示是可選的,用大括号({})括起來的部分是表示必須從中選擇其中的一個。
1 FROM子句
FROM子句指定了Select語句中字段的來源。FROM子句後面是包含一個或多個的表達式(由逗号分開),其中的表達式可為單一表名稱、已儲存的查詢或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的複合結果。如果表或查詢存儲在外部資料庫,在IN 子句之後指明其完整路徑。
例:下列SQL語句傳回所有有定單的客戶:
Select orderID,Customer.customerID
FROM orders Customers
Where orders.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP謂詞
(1) ALL 傳回滿足SQL語句條件的所有記錄。如果沒有指明這個謂詞,預設為ALL。
例:Select ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多個記錄的選擇字段的資料相同,隻傳回一個。
(3) DISTINCTROW 如果有重複的記錄,隻傳回一個
(4) TOP顯示查詢頭尾若幹記錄。也可傳回記錄的百分比,這是要用 TOP N PERCENT子句(其中N 表示百分比)
例:傳回5%定貨額最大的定單
Select TOP 5 PERCENT*
FROM [ order Details]
orDER BY UnitPrice*Quantity*(1-Discount) DESC
3 用 AS 子句為字段取别名
如果想為傳回的列取一個新的标題,或者,經過對字段的計算或總結之後,産生了一個新的值,希望把它放到一個新的列裡顯示,則用AS保留。
例:傳回FirstName字段取别名為NickName
Select FirstName AS NickName ,LastName ,City
FROM Employees
例:傳回新的一列顯示庫存價值
Select ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS valueInStock
FROM Products
Where 子句指定查詢條件
1 比較運算符
比較運算符 含義
= 等于
〉 大于
〈 小于
〉= 大于等于
〈= 小于等于
〈〉 不等于
!〉 不大于
!〈 不小于
例:傳回96年1月的定單
Select orderID, CustomerID, orderDate
FROM orders
Where orderDate〉#1/1/96# AND orderDate〈#1/30/96#
注意:
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函數來代替。在比較字元型的資料時,要加上單引号’’,尾空格在比較中被忽略。
例:
Where orderDate〉#96-1-1#
也可以表示為:
Where orderDate〉Datevalue(‘1/1/96’)
使用 NOT 表達式求反。
例:檢視96年1月1日以後的定單
Where Not orderDate〈=#1/1/96#
2 範圍(BETWEEN 和 NOT BETWEEN)
BETWEEN …AND…運算符指定了要搜尋的一個閉區間。
例:傳回96年1月到96年2月的定單。
Where orderDate Between #1/1/96# And #2/1/96#
3 清單(IN ,NOT IN)
IN 運算符用來比對清單中的任何一個值。IN子句可以代替用OR子句連接配接的一連串的條件。
例:要找出住在 London、Paris或Berlin的所有客戶
Select CustomerID, CompanyName, ContactName, City
FROM Customers
Where City In(‘London’,’ Paris’,’ Berlin’)
4 模式比對(LIKE)
LIKE運算符檢驗一個包含字元串資料的字段值是否比對一指定模式。
LIKE運算符裡使用的通配符
通配符 含義
? 任何一個單一的字元
* 任意長度的字元
# 0~9之間的單一數字
[字元清單] 在字元清單裡的任一值
[!字元清單] 不在字元清單裡的任一值
- 指定字元範圍,兩邊的值分别為其上下限
例:傳回郵政編碼在(171)555-0000到(171)555-9999之間的客戶
Select CustomerID ,CompanyName,City,Phone
FROM Customers
Where Phone Like ‘(171)555-####’
LIKE運算符的一些樣式及含義
樣式 含義 不符合
LIKE ‘A*’ A後跟任意長度的字元 Bc,c255
LIKE’5
’ 5*5 555
LIKE’5?5’ 5與5之間有任意一個字元 55,5wer5
LIKE’5##5’ 5235,5005 5kd5,5346
LIKE’[a-z]’ a-z間的任意一個字元 5,%
LIKE’[!0-9]’ 非0-9間的任意一個字元 0,1