天天看點

MySQL組合查詢(轉)

有的時候我們進行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