《SQL CookBook 》筆記-第二章-查詢結果排序

来源:https://www.cnblogs.com/shanzhiming/archive/2019/02/11/10358502.html
-Advertisement-
Play Games

第二章 shanzm [TOC] 第二章 查詢結果排序 2.1 以指定順序返回查詢結果 問題: 你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。 解決方案: 使用 代碼如下: 當然你可以使用多欄位排序 比如先按照sal升序排序,然自後按照入職日期降序排列 【註意】 1. ...


目錄

第二章 shanzm



第二章 查詢結果排序

2.1 以指定順序返回查詢結果

問題:
你想顯示部門編號為 10 的員工的名字、職位和工資,並根據工資從低到高排序。

解決方案:
使用order by column_Name

代碼如下:

select ename,job,sal,hiredate
from emp
where deptno = 10
order by sal asc

當然你可以使用多欄位排序
比如先按照sal升序排序,然自後按照入職日期降序排列

select ename,job,sal,hiredate
from EMP
where deptno = 10
order by sal asc,hiredate desc

【註意】

  1. order by 預設是升序,即ASC
  2. 降序則使用DESC
  3. 在同時使用 ORDER BY 和 WHERE 子句時,應該讓 ORDER BY 位於
    WHERE 之後,否則將會產生錯誤



2.2 依據子串排序

問題:
按照一個字元串的特定部分排列查詢結果。

例如:
希望從 EMP 表檢索10號部門的員工的名字和職位,並且按照職位欄位的最後兩個字元對檢索結果進行排序。

解決方案:
order by 子句里使用 substring() 函數。

代碼如下:

select ename,job
from EMP
where deptno=10
order by substring(job,len(job)-2,2)

結果:

ename job
KING PRESIDENT
MILLER CLERK
CLARK MANAGER

【分析】
substring() 函數

第一個參數:字元串所在列的列名
第二個參數:取子串的開始位置
第三個參數:所取的子串的長度



2.3 排序時對 Null 值的處理

問題:
排序依據的列中有null,把該列的值為null的行放在最後

例如:你想按照 EMP 表的 COMM 列對查詢結果進行排序,但該欄位可能為 Null 。非 Null 值以升序排列或降序排列,把全部 Null 值都放到最後面

解決方案:
使用 CASE 表達式來動態調整排序項。

代碼下:

select ename,sal,comm
from 
(
    select ename,sal,comm,
    case when comm is null then 0 
    else 1 
    end as is_null
    from emp
)X
order by is_null desc,comm

結果如下:

ename sal comm
TURNER 1500 0
ALLEN 1600 300
WARD 1250 500
MARTIN 1250 1400
BLAKE 2850 NULL
CLARK 2450 NULL
SCOTT 3000 NULL
KING 5000 NULL
ADAMS 1100 NULL
JAMES 950 NULL
FORD 3000 NULL
MILLER 1300 NULL
JONES 2975 NULL
SMITH 800 NULL

此處你得想明白,這裡面的子查詢表X,都是臨時的,其中is_null就是一個輔助列,我們按照這個列來排序。

其中子查詢:

select ename,sal,comm,
    case when comm is null then 0 
    else 1 
    end as is_null
from emp

結果如下:

ename sal comm is_null
SMITH 800 NULL 0
ALLEN 1600 300 1
WARD 1250 500 1
JONES 2975 NULL 0
MARTIN 1250 1400 1
BLAKE 2850 NULL 0
CLARK 2450 NULL 0
SCOTT 3000 NULL 0
KING 5000 NULL 0
TURNER 1500 0 1
ADAMS 1100 NULL 0
JAMES 950 NULL 0
FORD 3000 NULL 0
MILLER 1300 NULL 0

【註意】
此例在 FROM 子句里用到了內嵌視圖(即子查詢)。

ANSI SQL 標準規定要給它們取別名。
(只有 Oracle 不要求指定這一類別名。)因此,我在解決方案里經常用類似 X 和 Y 這樣的別
名來標識內嵌視圖。
註意最後緊挨著圓括弧的字母 X 。
在這裡,字母 X 變成了 FROM 子句里那個子查詢返回的表的名字。
列別名是一個有用的工具,能幫我們寫出自註釋的代碼;
相對而言,(本書中出現過的多數)內嵌視圖的別名只是一種形式化的東西。
通常我會為它們取一個簡單的名字,諸如 X 、 Y 、 Z 、 TMP1 和 TMP2 。



2.4 依據條件邏輯動態調整排序項

問題:
你希望按照某個條件邏輯來排序。

例如:
如果 job 等於 salesman ,就要按照 comm 來排序;否則,按照 SAL 排序

解決方案1:
order by 子句里使用 case 表達式。

代碼下:

select ename,sal,job,comm
from emp
order by 
    case when job = 'SALESMAN' then comm 
    else sal 
    end

【註意】case子句還可以在select句中使用。

你可記否?在select子句中時,case子句的end子句的最後要使用as定義一個列名
記住了,不論在哪,case子句的基礎格式都是:


 case when condition1 then return_value1
 case when condition2 then return_value2
 else return_default_value
 end 

解決方案2:構造輔助列

註意case語句的返回值。


select ename,sal,job,comm,
    case when job = 'SALESMAN' then comm
    else sal 
    end as ordered
from emp
order by ordered




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

-Advertisement-
Play Games
更多相關文章
  • 簡述 OData,即Open Data Protocol,是由微軟在2007年推出的一款開放協議,旨在通過簡單、標準的方式創建和使用查詢式及互動式RESTful API。 類庫 在.NET Core中想要使用OData功能的話需要添加 包。 準備模型類 創建Edm模型 OData使用EDM,即Ent ...
  • 常用示例如下:takeown /f 文件名 獲取該文件的所屬權takeown /f /r /d n 文件夾 獲取整個文件夾及其下麵子目錄文件的所屬權takeown /f * /a /r /d y強制將當前目錄下的所有文件及文件夾、子文件夾下的所有者更改為管理員組(administrators)cac... ...
  • 1.創建文件夾:mkdir 文件夾名稱 2.查看IP地址信息:ipconfig -a 3.查看記憶體使用情況:free -m 4.查看CPU使用情況:top 5.查看磁碟使用情況:df -a/-h 6.查看當前文件夾大小:du -sh 7.創建文件:touch -linux.sh(空白文件) cat> ...
  • 文件許可權 瞭解文件許可權前需要先知道用戶和用戶組的概念 用戶:https://www.cnblogs.com/holmes-cat/p/10345553.html用戶組:https://www.cnblogs.com/holmes-cat/p/10346842.html 1.使用 ll -a 命令可以 ...
  • 發佈與訂閱模型在許多編程語言中都有實現,也就是我們經常說的設計模式中的一種--觀察者模式。在一些應用場合,例如發送方並不是以固定頻率發送消息,如果接收方頻繁去咨詢發送方,這種操作無疑是很麻煩並且不友好的。 舉個生活的例子,一個喜歡購買鮮牛奶的人,需要每天在上班的時候/下班的時候都專門去牛奶店購買鮮牛 ...
  • 對MySQL有研究的讀者,可能會發現MySQL更新很快,在安裝方式上,MySQL提供了兩種經典安裝方式:解壓式和一鍵式,雖然是兩種安裝方式,但我更提倡選擇解壓式安裝,不僅快,還乾凈。在操作系統上,MySQL也支持多類型操作系統,如linux,windows等,如下為MySQL幾個重大變化的操作系統。 ...
  • --1.創建臨時空間 create temporary tablespace zyj_temp tempfile 'D:\app2\user\virtual\oradata\orcl\zyj_temp.dbf' size 50m autoextend on next 50m maxsize 2048... ...
  • 1. WordCount程式 1.1 WordCount源程式 1.2 運行程式,Run As->Java Applicatiion 1.3 編譯打包程式,產生Jar文件 2 運行程式 2.1 建立要統計詞頻的文本文件 wordfile1.txt Spark Hadoop Big Data word ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...