SQL必知必會 -------- order by、where等

来源:http://www.cnblogs.com/jinxiao-pu/archive/2017/05/06/6814043.html
-Advertisement-
Play Games

一、排序檢索數據 1.排序數據:SELECT prod_name FROM Products ORDER BY prod_name(對prod_name列以字母順序排序數據) ORDER BY子句的位置在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句 ...


一、排序檢索數據

1.排序數據SELECT prod_name FROM Products ORDER BY prod_name(對prod_name列以字母順序排序數據)

ORDER BY子句的位置
在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句,將會出現錯誤消息。
通過非選擇列進行排序
通常,ORDER BY子句中使用的列將是為顯示而選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。

2.按多個列排序SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name

重要的是理解在按多個列排序時,排序的順序完全按規定進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的prod_price值時才對產品按prod_name進行排序。如果prod_price列中所有的值都是唯一的,則不會按prod_name排序。

3.按列位置排序SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3 這個和按多個列排序結果是一樣的,無非就是本來的列名稱改成了位置序號。

可以看到,這裡的輸出與上面的查詢相同,不同之處在於ORDER BY子句。SELECT清單中指定的是選擇列的相對位置而不是列名。ORDER BY 2表示按SELECT清單中的第二個列prod_name進行排序。ORDER BY 2,3表示先按prod_price,再按prod_name進行排序。
這一技術的主要好處在於不用重新輸入列名。但它也有缺點。首先,不明確給出列名有可能造成錯用列名排序。其次,在對SELECT清單進行更改時容易錯誤地對數據進行排序(忘記對ORDER BY子句做相應的改動)。最後,如果進行排序的列不在SELECT清單中,顯然不能使用這項技術。

4.指定排序方向SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC

SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC,prod_name

DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對prod_price列指定DESC,對prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每個價格內)仍然按標準的升序排序。

警告:在多個列上降序排序
如果想在多個列上進行降序排序,必須對每一列指定DESC關鍵字。
請註意,DESC是DESCENDING的縮寫,這兩個關鍵字都可以使用。與DESC相對的是ASC(或ASCENDING),在升序排序時可以指定它。但實際上,ASC沒有多大用處,因為升序是預設的(如果既不指定ASC也不指定DESC,則假定為ASC)。
提示:區分大小寫和排序順序
在對文本性數據進行排序時,A與a相同嗎?a位於B之前,還是Z之後?這些問題不是理論問題,其答案取決於資料庫的設置方式。
在字典(dictionary)排序順序中,A被視為與a相同,這是大多數資料庫管理系統的預設行為。但是,許多DBMS允許資料庫管理員在需要時改變這種行為(如果你的資料庫包含大量外語字元,可能必須這樣做)。
這裡的關鍵問題是,如果確實需要改變這種排序順序,用簡單的ORDER BY子句可能做不到。你必須請求資料庫管理員的幫助。

二、過濾數據

1.where語句SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49

警告:WHERE子句的位置
在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。例如:SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49 ORDER BY prod_name ASC

 

2.檢查單個值SELECT prod_name,prod_price FROM Products WHERE prod_price < 0

3.不匹配檢查SELECT vend_id,prod_name FROM Products WHERE vend_id <>'DLL01'

4.範圍值檢查SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10

5.空值檢查SELECT cust_name FROM customers WHERE cust_email IS NULL

三、高級數據過濾

1.AND操作符SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' AND prod_price <=4

SQL語句檢索由供應商DLL01製造且價格小於等於4美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,用AND關鍵字聯結在一起。AND指示DBMS只返回滿足所有給定條件的行。如果某個產品由供應商DLL01製造,但價格高於4美元,則不檢索它。

AND
用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。
這個例子只包含一個AND子句,因此最多有兩個過濾條件。可以增加多個過濾條件,每個條件間都要使用AND關鍵字。
說明:沒有ORDER BY子句
為了節省空間,也為了減少你的輸入,我在很多例子里省略了ORDER BY子句。因此,你的輸出完全有可能與書上的輸出不一致。雖然返回行的數量總是對的,但它們的順序可能不同。當然,如果你願意也可以加上一個ORDER BY子句,它應該放在WHERE子句之後。
2.OR操作符SELECT vend_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' OR vend_id='BRS01'

SQL語句檢索由任一個指定供應商製造的所有產品的產品名和價格。OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。 

3.求值順序(AND OR)

輸入:

SELECT prod_name, prod_price FROM Products 

WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10

輸出:

問題:請看上面的結果。返回的行中有4行價格小於10美元,顯然,返回的行未按預期的進行過濾。為什麼會這樣呢?原因在於求值的順序。SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解為:由供應商BRS01製造的價格為10美元以上的所有產品,以及由供應商DLL01製造的所有產品,而不管其價格如何。換句話說,由於AND在求值過程中優先順序更高,操作符被錯誤地組合了。

解決方法

SELECT prod_name, prod_price FROM Products 

WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10

其實只要用括弧括起來就好了

提示:在WHERE子句中使用圓括弧
任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括弧明確地分組操作符。不要過分依賴預設求值順序,即使它確實如你希望的那樣。使用圓括弧沒有什麼壞處,它能消除歧義。

4.IN操作符

輸入:

SELECT vend_id,prod_name,prod_price FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name

輸出:

為什麼要使用IN操作符?其優點為:

  • 在有很多合法選項時,IN操作符的語法更清楚,更直觀。
  • 在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。
  • IN操作符一般比一組OR操作符執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。
  • IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句。第11課會對此進行詳細介紹。

IN
WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。

5.NOT操作符

SELECT prod_name FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

為什麼使用NOT?對於這裡的這種簡單的WHERE子句,使用NOT確實沒有什麼優勢。但在更複雜的子句中,NOT是非常有用的。例如,在與IN操作符聯合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。

作者:今孝
出處:http://www.cnblogs.com/jinxiao-pu/p/6814043.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

覺得好就點個推薦把!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前安卓開發中使用的網路工具為OKhttp,但是okhttp的使用還不是很方便,在okhttp的基礎上再對請求進行封裝會極大的方便網路調用。 下麵直接上代碼。 請求封裝 上面對okhttp的put請求進行了簡單封裝,四個參數分別是 1.請求地址 2.請求頭,以map的形式傳入,如不需要可傳入null ...
  • iOS:詳細的正則表達式 1、簡介: 在項目中,正則的使用是很普遍的,例如登錄賬號和密碼(手機號、郵箱等)。用到的方法就是謂詞對象過濾:NSPredicate。 2、什麼是正則表達式: 正則表達式,又稱正規表示法,是對字元串操作的一種邏輯公式。正則表達式可以檢測給定的字元串是否符合我們定義的邏輯,也 ...
  • iOS 真機測試錯誤“The application bundle does not contain a valid identifier” 真機測試的時候報錯:“The application bundle does not contain a valid identifier”。在這裡找到解決方 ...
  • 本文旨在提供最基本的,可以用於在生產環境進行Hadoop、HDFS分散式環境的搭建,對自己是個總結和整理,也能方便新人學習使用。 一、基礎環境 在Linux上安裝Hadoop之前,需要先安裝兩個程式: 1.1 安裝說明 1. JDK 1.6或更高版本(本文所提到的安裝的是jdk1.7); 2. SS ...
  • 所謂的預處理技術,最初也是由MySQL提出的一種減輕伺服器壓力的一種技術! 傳統mysql處理流程 1, 在客戶端準備sql語句 2, 發送sql語句到MySQL伺服器 3, 在MySQL伺服器執行該sql語句 4, 伺服器將執行結果返回給客戶端 這樣每條sql語句請求一次,mysql伺服器就要接收 ...
  • 這兩天在自己的windows7上安裝了一下MySQL資料庫,安裝使用的是5.7.18版本的 noinstall Zip Archive安裝包mysql-5.7.18-win32.zip。由於5.7版本相對5.6版本發生了一下變化,很多網上的安裝教程都失效了,因此在安裝過程中遇到了一系問題,在這裡根據 ...
  • MySQL基本概念以及簡單操作 一、MySQL MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Ma ...
  • 在我們很多情況下的開發,為了方便或者通用性的考慮,都首先考慮SQL Server資料庫進行開發,但有時候客戶的生產環境是Oracle或者其他資料庫,那麼我們就需要把對應的數據結構和數據腳本轉換為對應的資料庫,數據結構一般來說,語法都遵循了SQL92的標準,或者我們根據不同的PowerDesigner... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...