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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...