如何使用 SQL WHERE 過濾返回的數據

来源:https://www.cnblogs.com/vin-c/archive/2022/04/26/16195006.html
-Advertisement-
Play Games

本文介紹如何使用 SQL WHERE 子句指定搜索條件,過濾返回的數據。還介紹如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL 值等。 一、使用 WHERE 子句 資料庫表一般包含大量的數據,很少需要檢索表中的所有行。通常只會根據特定操作或報告的需要提取表數據的子集。只檢索所需數據需要指定搜 ...


目錄

本文介紹如何使用 SQL WHERE 子句指定搜索條件,過濾返回的數據。還介紹如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL 值等。

一、使用 WHERE 子句

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

SELECT 語句中,數據根據 WHERE 子句中指定的搜索條件進行過濾。WHERE 子句在表名(FROM 子句)之後給出,如下所示:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;

這條語句從 products 表中檢索兩個列,但不返回所有行,只返回 prod_price 值為 3.49 的行,如下所示:

prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit bean bag toy     3.49

這個示例使用了簡單的相等檢驗:檢查這一列的值是否為指定值,據此過濾數據。不過,SQL 不只能測試等於,還能做更多的事情。

提示:有多少個 0?

你在練習這個示例時,會發現顯示的結果可能是 3.49、3.490、3.4900 等。出現這樣的情況,往往是因為 DBMS 指定了所使用的數據類型及其預設行為。

所以,如果你的輸出可能與本文中的有點不同,不必焦慮,畢竟從數學角度講,3.49 和 3.4900 是一樣的。

提示:SQL 過濾與應用過濾

數據也可以在應用層過濾。為此,SQL 的 SELECT 語句為客戶端應用檢索出超過實際所需的數據,然後客戶端代碼對返回數據進行迴圈,提取出需要的行。

通常,這種做法極其不妥。優化資料庫後可以更快速有效地對數據進行過濾。

而讓客戶端應用(或開發語言)處理資料庫的工作將會極大地影響應用的性能,並且使所創建的應用完全不具備可伸縮性。

此外,如果在客戶端過濾數據,伺服器不得不通過網路發送多餘的數據,這將導致網路帶寬的浪費。

註意:WHERE 子句的位置

在同時使用 ORDER BYWHERE 子句時,應該讓 ORDER BY 位於 WHERE 之後,否則將會產生錯誤(關於 ORDER BY 的使用,請參閱 如何使用 ORDER BY 根據需要排序檢索出的數據)。

二、WHERE 子句操作符

我們在做相等檢驗時看到了第一個 WHERE 子句,它確定一個列是否包含指定的值。SQL 支持表 1 列出的所有條件操作符。

表 1 WHERE 子句操作符

操作符 說明
= 等於
<> 不等於
!= 不等於
< 小於
<= 小於等於
!< 不小於
> 大於
>= 大於等於
!> 不大於
BETWEEN 在指定的兩個值之間
IS NULL NULL

註意:操作符相容

表 1 中列出的某些操作符是冗餘的(如 <>!= 相同,!< 相當於 >=)。並非所有 DBMS 都支持這些操作符。想確定你的 DBMS 支持哪些操作符,請參閱相應的文檔。

2.1 檢查單個值

我們已經看到了檢驗相等的例子,現在來看看幾個使用其他操作符的例子。

第一個例子是列出所有價格小於 10 元的產品。

SELECT prod_name, prod_price
FROM Products
WHERE prod_price < 10;

輸出:

prod_name               prod_price
-------------------     ----------
Fish bean bag toy       3.49
Bird bean bag toy       3.49
Rabbit bean bag toy     3.49
8 inch teddy bear       5.99
12 inch teddy bear      8.99
Raggedy Ann             4.99
King doll               9.49
Queen doll              9.49

下一條語句檢索所有價格小於等於 10 元的產品(因為沒有價格恰好是 10 元的產品,所以結果與前一個例子相同):

SELECT prod_name, prod_price
FROM Products
WHERE prod_price <= 10;

2.2 不匹配檢查

這個例子列出所有不是供應商 DLL01 製造的產品:

SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';

輸出:

vend_id        prod_name
----------     ------------------
BRS01          8 inch teddy bear
BRS01          12 inch teddy bear
BRS01          18 inch teddy bear
FNG01          King doll
FNG01          Queen doll

提示:何時使用引號

如果仔細觀察上述 WHERE 子句中的條件,會看到有的值括在單引號內,而有的值未括起來。單引號用來限定字元串。如果將值與字元串類型的列進行比較,就需要限定引號。用來與數值列進行比較的值不用引號。

下麵是相同的例子,其中使用 != 而不是 <> 操作符:

SELECT vend_id, prod_name
FROM Products
WHERE vend_id != 'DLL01';

註意:是 != 還是 <>

!=<> 通常可以互換。但是,並非所有 DBMS 都支持這兩種不等於操作符。如果有疑問,請參閱相應的 DBMS 文檔。

2.3 範圍值檢查

要檢查某個範圍的值,可以使用 BETWEEN 操作符。其語法與其他 WHERE 子句的操作符稍有不同,因為它需要兩個值,即範圍的開始值和結束值。

例如,BETWEEN 操作符可用來檢索價格在 5 元和 10 元之間的所有產品,或在指定的開始日期和結束日期之間的所有日期。

下麵的例子說明如何使用 BETWEEN 操作符,它檢索價格在 5 元和 10 元之間的所有產品。

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

輸出:

prod_name               prod_price
-------------------     ----------
8 inch teddy bear       5.99
12 inch teddy bear      8.99
King doll               9.49
Queen doll              9.49

從這個例子可以看到,在使用 BETWEEN 時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用 AND 關鍵字分隔。BETWEEN 匹配範圍中所有的值,包括指定的開始值和結束值。

2.4 空值檢查

在創建表時,表設計人員可以指定其中的列能否不包含值。在一個列不包含值時,稱其包含空值 NULL

NULL

無值(no value),它與欄位包含 0、空字元串或僅僅包含空格不同。

確定值是否為 NULL,不能簡單地檢查是否等於 NULLSELECT 語句有一個特殊的 WHERE 子句,可用來檢查具有 NULL 值的列。這個 WHERE 子句就是 IS NULL 子句。其語法如下:

SELECT prod_name
FROM Products
WHERE prod_price IS NULL;

這條語句返回所有沒有價格(空 prod_price 欄位,不是價格為 0)的產品,由於表中沒有這樣的行,所以沒有返回數據。但是,Customers 表確實包含具有 NULL 值的列:如果沒有電子郵件地址,則 cust_email 列將包含 NULL 值:

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;

輸出:

cust_name
----------
Kids Place
The Toy Store

提示:DBMS 特有的操作符

許多 DBMS 擴展了標準的操作符集,提供了更高級的過濾選擇。更多信息請參閱相應的 DBMS 文檔。

註意:NULL 和非匹配

通過過濾選擇不包含指定值的所有行時,你可能希望返回含 NULL 值的行。但是這做不到。因為 NULL 比較特殊,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。

三、小結

本文介紹瞭如何用 SELECT 語句的 WHERE 子句過濾返回的數據。還介紹瞭如何檢驗相等、不相等、大於、小於、值的範圍以及 NULL 值等。

原文鏈接:https://www.developerastrid.com/sql/sql-where

(完)


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

-Advertisement-
Play Games
更多相關文章
  • 在開發過程中經常需要在程式中嵌入瀏覽器控制項用於訪問網頁,Visual Studio中自帶了一個webbrowser控制項,但無奈這個控制項是調用用戶電腦上的IE瀏覽器來實現的,如果用戶裝的是低版本IE(比如Win7的IE8)很多新的網頁標準就無法得到支持,這時使用CefSharp來替代webbrowse... ...
  • Linux 下的 Docker 安裝與使用 一、安裝與配置 1.安裝依賴包 1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.設置阿裡雲鏡像源 1 sudo yum-config-manager --add-re ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 按下按鈕控制LED燈的亮滅。 硬體設計 在第一節的基礎上,在Proteus中添加電路如下圖所示。 打開CubeM ...
  • win10系統不知道哪天開始,打不開組策略,區域網共用印表機也搜索不到,運行輸入gpedit.msc,就提示下圖: 百度了一大推解決方法,不是改防火牆就是win10安裝包重置系統,都沒有解決問題,最後終於找到瞭解決辦法: 因為mmc.exe不能運行,運行視窗直接輸入gpedit.msc是打不開組策略 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、版本說明 JetPack 4.6——2021.8 yolov5-v6.0版本 使用的為yolov5的yolov5n.pt,並利用tensorrtx進行加速推理,在調用攝像頭實時檢測可以達到FPS=25。 二、配置CUDA sudo gedit ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 STM32單片機控制單個LED燈亮滅,在PC0引腳控制LED燈以1s為周期閃爍。 硬體設計 在上一節的基礎上,在 ...
  • 1 緩存穿透 問題描述 緩存穿透是指查詢一個一定不存在的數據,由於緩存是不命中時需要從資料庫查詢,查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到資料庫去查詢,進而給資料庫帶來壓力。 解決方案 緩存空值,即對於不存在的數據,在緩存中放置一個空對象(註意,設置過期時間) 2 緩存擊穿 問 ...
  • 導讀: 眾所周知,信息時代下的數據就是能源,就是生產力。但是面對海量、紛繁的數據,特別是在金融領域,如何充分地利用數據是核心問題。本次分享主要想和大家一起探討下,在金融風控場景下,如何通過數據對齊模型和業務目標,哪些數據、方法可以應用於風控模型,通過哪些指標可以正確地評估模型效果,以及最終如何用數據 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...