Sql Service的藝術(二) SQL複雜條件搜索

来源:https://www.cnblogs.com/liuchenxing/archive/2018/01/10/8259440.html
-Advertisement-
Play Games

本次講到where字句中經常用到的集中較為複雜的搜索條件,包括組合的查詢條件、IN運算符、NOT運算符、LIKE運算符和相關通配符。 學習本節需要用到一下兩張表: 以下是各複雜條件的查詢: 我們再講一個ESCAPE定義轉義符: 在使用LIKE關鍵字進行模糊查詢的時候,“%”,“_”,“[]”,單獨出 ...


  本次講到where字句中經常用到的集中較為複雜的搜索條件,包括組合的查詢條件、IN運算符、NOT運算符、LIKE運算符和相關通配符。

  學習本節需要用到一下兩張表:

CREATE TABLE TEACHER
(
    TNO INT NOT NULL, --教工號
    TNAME CHAR(10) NOT NULL, --教師姓名
    CNO INT NOT NULL, --課程號
    SAL INT, --工資
    DNAME CHAR(10) NOT NULL, --所在系
    TSEX CHAR(2) NOT NULL, --性別
    AGE INT NOT NULL --年齡
)
alter table TEACHER alter column SAL INT null 
INSERT INTO
dbo.TEACHER
        ( TNO, TNAME, CNO, SAL, DNAME, TSEX, AGE )
VALUES  ( 0, -- TNO - int
          '', -- TNAME - char(10)
          0, -- CNO - int
          0, -- SAL - int
          '', -- DNAME - char(10)
          '', -- TSEX - char(2)
          0  -- AGE - int
          )
          SELECT * FROM dbo.TEACHER
INSERT INTO dbo.TEACHER VALUES( 3,'王永軍',1,1000,'電腦','',45)
INSERT INTO dbo.TEACHER VALUES( 4,'劉曉婧',2,8000,'電腦','',23)
INSERT INTO dbo.TEACHER VALUES( 5,'高維',8,6000,'電子工程','',54)
INSERT INTO dbo.TEACHER VALUES( 6,'李偉',7,230,'機械工程','',23)
INSERT INTO dbo.TEACHER VALUES( 7,'劉輝',3,0,'生物','',65)
INSERT INTO dbo.TEACHER VALUES( 8,'劉偉',9,500,'電腦','',23)
INSERT INTO dbo.TEACHER VALUES( 9,'劉靜',12,0,'經濟管理','',45)
INSERT INTO dbo.TEACHER VALUES( 10,'劉奕鍇',13,70000,'電腦','',65)
INSERT INTO dbo.TEACHER VALUES( 11,'高維',14,70000,'經濟管理','',61)

CREATE TABLE COURSE
(
    CNO INT NOT NULL, --課程號
    CNAME CHAR(30) NOT NULL, --課程名稱
    CTIME INT NOT NULL, --學時
    SCOUNT INT NOT NULL, --容納人數
    CTEST SMALLDATETIME NOT NULL, --考試時間
)
SELECT * FROM dbo.COURSE
INSERT INTO dbo.COURSE VALUES( 4,'應用數學基礎',48,120,'2006-7-10')
INSERT INTO dbo.COURSE VALUES( 5,'生物工程概論',32,80,'2006-7-8')
INSERT INTO dbo.COURSE VALUES( 1,'電腦軟體基礎',32,70,'2006-7-8')
INSERT INTO dbo.COURSE VALUES( 2,'電腦軟體基礎',24,80,'2006-6-28')
INSERT INTO dbo.COURSE VALUES( 8,'模擬電路設計',28,90,'2006-7-10')
INSERT INTO dbo.COURSE VALUES( 7,'機械設計實踐',48,68,'2006-7-14')
INSERT INTO dbo.COURSE VALUES( 3,'生物化學',32,40,'2006-7-2')
INSERT INTO dbo.COURSE VALUES( 9,'資料庫設計',16,80,'2006-7-1')
INSERT INTO dbo.COURSE VALUES( 6,'設計理論',28,45,'2006-6-30')
INSERT INTO dbo.COURSE VALUES( 10,'電腦入門',25,150,'2006-6-29')
INSERT INTO dbo.COURSE VALUES( 11,'數字電路設計基礎',30,125,'2006-6-20')
DROP TABLE dbo.COURSE

  

  以下是各複雜條件的查詢:

------組合查詢條件
    --1、and運算符 查詢年齡大於30的女老師
    SELECT * FROM dbo.TEACHER WHERE AGE>30 AND TSEX=''


    --2、多個and運算符 查詢年齡大於30的電腦系女老師
    SELECT * FROM dbo.TEACHER WHERE AGE>30 AND TSEX='' AND DNAME='電腦'


    --3、or運算符 查詢電腦系和生物系女老師的姓名和工資
    SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='電腦' OR DNAME='生物'


    --4、or and運算符混合使用 查詢電腦系和生物系老師的姓名和工資
    SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='電腦' OR DNAME='生物' AND TSEX='' ORDER BY SAL
    SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE (DNAME='電腦' OR DNAME='生物') AND TSEX='' ORDER BY SAL
    --AND OR 一起使用的時候,要註意運算符的優先順序。AND要高於OR,所以第一條線執行AND,加上括弧後才是正確的結果


    --5、IN和NOT IN運算符使用 查詢電腦系和生物系的所有信息
    SELECT * FROM dbo.TEACHER WHERE DNAME IN('電腦','生物')
    SELECT * FROM dbo.TEACHER WHERE DNAME NOT IN('電腦','生物')
    --使用IN有以下優點
        --1、當選擇條件很多時,採用IN運算符就顯得很便捷,只需要在括弧內用逗號間隔依次羅列即可,運行效率比OR運算符要高
        --2、使用IN運算符,其後面所列的條件可以使另一條SELECT語句,即子查詢,如下:
    SELECT * FROM dbo.TEACHER WHERE DNAME IN(SELECT DNAME FROM dbo.TEACHER WHERE AGE>65)


    --6、NOT BETWEEN運算符混合使用 查詢年齡不在40~50歲的教師姓名,年齡,系,性別
    SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE NOT BETWEEN 40 AND 50 ORDER BY AGE
    --我們在用OR來得到相同的數據,相比之下,似乎OR更簡潔,註意,MySQL不支持NOT運算符
    SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE<40 OR age>50 ORDER BY AGE


    --7、使用LIKE運算符查詢
    SELECT * FROM dbo.TEACHER WHERE DNAME LIKE '電腦'
    --%通配符,表示任意字元匹配不計較字元的多少,可以在''中間任意位置使用,以XX開頭或結尾或中間
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%電路%' --中間有"電路"的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%基礎'  --以“基礎”結尾的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦%'  --以“電腦”開頭的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦%基礎'  


    --_通配符,表示任意一個字元匹配,可以在''中間任意位置使用,以XX開頭或結尾或中間
    --   _代表一個字元,__代表兩個字元
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '__電路__'  --中間帶有“電路”的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____基礎'  --以“基礎”結尾,且前面是四個字的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦__'  --以“電腦”開頭,兩個字結尾的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦__基礎'  --中間兩個字的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____'  --查詢四個字的系


    --"[]"通配符用於指定一系列的字元,只要滿足這些字元其中之一且位置出現在"[]"通配符的位置,字元串就滿足查詢條件
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[模]%'  --以“模“開頭的
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[^模]%'  --加上"^"表示不以"模擬"開頭的


    ------以上三種通配符是可以自由組合使用的
  ------以上所有的運算符和條件查詢都是可以組合使用的,根據實際情況選擇適合的查詢方法才是明智的選擇

  

  我們再講一個ESCAPE定義轉義符:

    在使用LIKE關鍵字進行模糊查詢的時候,“%”,“_”,“[]”,單獨出現則會被認為是通配符。為了在字元數據類型的列中查詢是否存在百分號(%),下劃線(_),方括弧([])字元,我們就需要一種方法告訴DBMS,將LIKE表達式中的這些字元看作實際值,而不是通配符。關鍵字ESCAPE允許確定一個轉義字元,告訴DBMS,緊跟ESCAPE之後的字元是實際值。

    --增加兩條數據
    INSERT INTO dbo.COURSE VALUES( 11,'數字電路設計基礎%',30,125,'2006-6-20')
    INSERT INTO dbo.COURSE VALUES( 6,'_設計理論',28,45,'2006-6-30')

    ----以下是將"M"後面的"%"作為實際值,也就是說查詢的是以"%"結尾的數據
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%M%' ESCAPE 'M' 
    
    ----以下是將"M"後面的"_"作為實際值,也就是說查詢的是以"_"開頭的數據
    SELECT * FROM dbo.COURSE WHERE CNAME LIKE 'M_%' ESCAPE 'M'  
     

 

    


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

-Advertisement-
Play Games
更多相關文章
  • 自從用了mybatis後,被坑的次數不下於無數次,今天我們就來說說最最頭疼的錯誤,看看有多少人入過這個坑呢。 當程式出現了 Result Maps collection already contains value for com.qmw.mapper.OrderMappe.OrderMap錯誤的時 ...
  • /*修改用戶密碼:1.輸入cmd打開dos視窗2.sqlplus/nolog3.conn/as sysdba4.alter user system identified by orcl;*/ /**數據完整性指存儲在資料庫中的所有數據值均正確的狀態。如果資料庫中存儲有不正確的數據值,則該資料庫稱為已 ...
  • 伺服器斷電重啟導致備份生產環境的恢複目錄庫無法進行啟動,提示Ora-01092常式終止。強行斷開連接 ...
  • Transaction Isolation Levels InnoDB支持SQL1992標準中的四種隔離級別:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。預設的隔離級別是REPEATABLE READ。 通過SET TRA ...
  • 導讀:2015年8月,國務院印發《促進大數據發展行動綱要》,首次明確提出建設數據強國;2015年10月,黨的十八屆五中全會提出“實施國家大數據戰略”,將大數據上升為國家戰略。其後,國家政府部門、科技研究院、互聯網大企業、傳統工業企業等不斷發佈戰略藍皮書,對未來進行規劃佈局。 神奇的大數據 現在的社會 ...
  • Locking Reads 在同一個事務中,如果你先查詢數據,隨後對相關數據進行插入或修改,那麼在標準的SLELECT中不會給出足夠的保護。在你查詢期間另一個事務可以更新或者刪除相同的行。InnoDB提供兩種類型的加鎖讀: SELECT ... LOCK IN SHARE MODE 給讀到的每一行都 ...
  • Consistent Nonlocking Reads 一致讀意味著InnoDB用多版本來提供一個查詢資料庫某個時間點的快照。這種查詢可以看到在當前世界點之前事務提交的改變,看不到此後提交的改變,更看不到未提交的改變。這個規則有一種例外情況是它可以看到同一個事務中在這個查詢之前的改變。這種異常就造成 ...
  • 共用鎖和排它鎖 InnoDB實現了標準的行級鎖,包括兩種類型:共用鎖(S)和排它鎖(X) 一個共用鎖(S)允許事務持有這種鎖來讀取一行 一個排它鎖(X)允許事務持有這種鎖來修改或刪除一行 如果事務T1對行r持有一個共用鎖(S),那麼來自其它事務T的對於行r的鎖的請求處理如下: 如果T2請求的是共用鎖 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...