1. 程式人生 > 其它 >mysql 必知必會整理—sql 排序與過濾[三]

mysql 必知必會整理—sql 排序與過濾[三]

前言

簡單整理一下MySQL的排序與過濾。

正文

我們查詢出來的結果有時候是希望進行排序的,比如說:

select product_name
from products
order by prod_name

經常需要按不止一個列進行資料排序。例如,如果要顯示僱員清單,可能希望按姓和名排序(首先按姓排序,然後在每個姓中再按名排序)。如果多個僱員具有相同的姓,這樣做很有用。

這裡面就是先按照prod_price,如果prod_price 相同的話,那麼按照prod_name來。

資料排序不限於升序排序(從A到Z)。這只是預設的排序順序,還可以使用ORDER BY子句以降序(從Z到A)順序排序。為了進行降序排序,必須指定DESC關鍵字。

注意:

在多個列上降序排序 如果想在多個列上進行降序排序,必須
對每個列指定DESC關鍵字。
區分大小寫和排序順序 在對文字性的資料進行排序時,A與 a相同嗎?a位於B之前還是位於Z之後?這些問題不是理論問
題,其答案取決於資料庫如何設定。
在字典(dictionary)排序順序中,A被視為與a相同,這是MySQL
(和大多數資料庫管理系統)的預設行為。但是,許多資料庫
管理員能夠在需要時改變這種行為(如果你的資料庫包含大量
外語字元,可能必須這樣做)。
這裡,關鍵的問題是,如果確實需要改變這種排序順序,用簡
單的ORDER BY子句做不到。你必須請求資料庫管理員的幫助。

過濾語句,一般指的是where 子句。

資料庫表一般包含大量的資料,很少需要檢索表中所有行。通常只
會根據特定操作或報告的需要提取表資料的子集。只檢索所需資料需要
指定搜尋條件(search criteria),搜尋條件也稱為過濾條件(filter 
condition)。

一般使用where 來進行過濾。

比如說:

select *
from product
where price>100

表示過濾出100的價格。

SQL過濾與應用過濾 資料也可以在應用層過濾。為此目
的,SQL的SELECT語句為客戶機應用檢索出超過實際所需的
資料,然後客戶機程式碼對返回資料進行迴圈,以提取出需要
的行。
通常,這種實現並不令人滿意。因此,對資料庫進行了優化,
以便快速有效地對資料進行過濾。讓客戶機應用(或開發語言)
處理資料庫的工作將會極大地影響應用的效能,並且使所建立
的應用完全不具備可伸縮性。此外,如果在客戶機上過濾資料,
伺服器不得不通過網路傳送多餘的資料,這將導致網路頻寬的
浪費。

where 子句通常有操作符。

這裡需要注意的是一個null值,NULL 無值(no value),它與欄位包含0、空字串或僅僅包含
空格不同。

可以看到這裡顯示的是is,而不是==,至於為什麼可以檢視我的整理1800篇sql語句中檢視。

NULL與不匹配 在通過過濾選擇出不具有特定值的行時,你
可能希望返回具有NULL值的行。但是,不行。因為未知具有
特殊的含義,資料庫不知道它們是否匹配,所以在匹配過濾
或不匹配過濾時不返回它們。 
因此,在過濾資料時,一定要驗證返回資料中確實給出了被
過濾列具有NULL的行。

在使用where的時候,我們一般要知道另外交給關鍵詞,and or in not 這幾個操作符號。

and 例子:

OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行。

or 例子:

WHERE可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高階的過濾。

但是,組合AND和OR帶來了一個有趣的問題。

先說一下其本來的意思,其查詢條件為vend_id=1002或者vend_id 為1003的,且價格要大於10元的。

但是按照上面的指示,

SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操
作符。當SQL看到上述WHERE子句時,它理解為由供應商1003製造的任何
價格為10美元(含)以上的產品,或者由供應商1002製造的任何產品,
而不管其價格如何。換句話說,由於AND在計算次序中優先順序更高,操作
符被錯誤地組合了。

此問題的解決方法是使用圓括號明確地分組相應的操作符。請看下
面的SELECT語句及輸出:

在WHERE子句中使用圓括號 任何時候使用具有AND和OR操作
符的WHERE子句,都應該使用圓括號明確地分組操作符。不要
過分依賴預設計算次序,即使它確實是你想要的東西也是如
此。使用圓括號沒有什麼壞處,它能消除歧義。

下面介紹一下in 操作符:

圓括號在WHERE子句中還有另外一種用法。IN操作符用來指定條件範
圍,範圍中的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清
單,全都括在圓括號中。下面的例子說明了這個操作符:

此SELECT語句檢索供應商1002和1003製造的所有產品。IN操作符後跟由逗號分隔的合法值清單,整個清單必須括在圓括號中

in 和 or 有相同的效果,那麼有時候為什麼要使用in呢?

 在使用長的合法選項清單時,IN操作符的語法更清楚且更直觀。

 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。

 IN操作符一般比OR操作符清單執行更快。

 IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建
立WHERE子句。

這裡的NOT否定跟在它之後的條件,因此,MySQL不是匹配1002
和 1003 的 vend_id ,而是匹配 1002 和 1003 之外供應商的
vend_id。

這裡再介紹兩個東西,一個是exits和 not exits。

exit 其實用的不多,因為其替代性強。

比如:

要求:查詢選修了課程”作業系統“的同學

select sname from student

where exits (select * from sc,course where sno = student.sno and sc.cno = course.cno and course.cname ="作業系統")

完全可以這樣替代:

select * from sc,course,student where sc.sno = student.sno and sc.cno = course.cno and course.cname ="作業系統"

但是如果是現在需求是這樣的:

查詢沒有選修課程”作業系統“的同學

select sname from student

where not exits (select * from sc,course where sno = student.sno and sc.cno = course.cno and course.cname ="作業系統")

這樣似乎有點艱難吧,可能有些初學者認為這樣:

select * from sc,course,student where sc.sno = student.sno and sc.cno = course.cno and course.cname !="作業系統"

這當然是不對的啦,因為是先做笛卡兒積,然後再做where過濾,這樣當然是不滿足條件的了。