讀SQL進階教程筆記14_SQL編程要點

来源:https://www.cnblogs.com/lying7/archive/2023/05/01/17365836.html
-Advertisement-
Play Games

1. 消滅NULL 1.1. NULL惹人討厭的原因 1.1.1. 進行SQL編碼時,必須考慮違反人類直覺的三值邏輯 1.1.2. 指定IS NULL、IS NOT NULL的時候,不會用到索引,SQL語句執行起來性能低下 1.1.2.1. 1 + NULL = NULL 2- NULL = NUL ...


1. 消滅NULL

1.1. NULL惹人討厭的原因

1.1.1. 進行SQL編碼時,必須考慮違反人類直覺的三值邏輯

1.1.2. 指定IS NULL、IS NOT NULL的時候,不會用到索引,SQL語句執行起來性能低下

1.1.2.1.

   1 + NULL = NULL
   2- NULL = NULL
    3 * NULL = NULL
    4 / NULL = NULL
    NULL / 0 = NULL

1.1.3. 四則運算以及SQL函數的參數中包含NULL,會引起“NULL的傳播”

1.1.4. 接收SQL查詢結果的宿主語言中,NULL的處理方法沒有統一標準

1.1.4.1. Oracle不區分空字元串和NULL

1.1.4.2. Visual Basic是區分的

1.1.5. 與一般列的值不同,NULL是通過在數據行的某處加上多餘的位(bit)來實現的,使程式占據更多的存儲空間,使得檢索性能變差

1.2. 無法完全消除NULL

1.2.1. 僅僅靠在表中所有列加上NOT NULL的約束是不夠的

1.2.2. 在使用外連接,或者SQL-99中添加的帶CUBE或ROLLUP的GROUP BY時,還是很容易引入NULL的

1.3. 消除NULL的具體做法

1.3.1. 首先分析能不能設置預設值

1.3.2. 僅在無論如何都無法設置預設值時允許使用NULL

1.3.3. 編號:使用異常編號

1.3.3.1. ISO的性別編號

1.3.3.1.1. “1:男性”“2:女性”
1.3.3.1.2. “0:未知”“9:不適用”
1.3.3.1.2.1. 編號9可用於法人的情況
1.3.3.1.2.2. 由Codd區分的兩類NULL“未知”和“不適用”相吻合了

1.3.3.2. 插入編號未知的顧客信息時,定義一個表示未知的編號“×××××”就可以了

1.3.3.2.1. 避免使用“99999”這樣的編號作為異常編號
1.3.3.2.2. 可能會出現用來表示異常的編號和真實的顧客編號重覆的情況

1.3.3.3. 編號列應該使用字元串類型

1.3.4. 名字:使用“無名氏”

1.3.4.1. 賦予表示未知的值

1.3.4.1.1. UNKNOWN

1.3.5. 數值:用0代替

1.3.5.1. 對於數值型的列,將NULL轉換為0再存儲到資料庫中

1.3.5.2. 如果允許NULL,那麼就必須在統計數據時使用NULLIF函數或者IS NOT NULL謂詞來排除NULL

1.3.5.3. 如果一定要區分0和NULL,那麼允許使用NULL

1.3.5.4. “沒有油箱的車”和“空油箱”是不同的

1.3.6. 日期:用最大值或最小值代替

1.3.6.1. 開始日期和結束日期這樣的“期限”的時候,我們可以使用0000-01-01或者9999-12-31這樣可能存在的最大值或最小值來處理

1.3.6.2. 當NULL的含義是“未知”的時候,可以允許使用NULL

1.3.6.2.1. 當預設值原本就不清楚的時候,例如歷史事件發生的日期,或者某人的生日等

2. 名字和意義

2.1. 如果沒有為索引和約束顯式地指定名稱,DBMS就會自動為之分配隨機的名稱,這也是應該避免的

2.2. 為內聯視圖命名

2.3. 命名時允許的字元有以下3種

2.3.1. 英文字母

2.3.2. 阿拉伯數字

2.3.3. 下劃線“_”

2.4. 標準SQL中規定名稱的第一個字元應該是英文字母

3. 屬性和列

3.1. 列代表的是“屬性”,應該具有一貫性

3.2. “根據位置調用數據”是明確禁止的

3.2.1. 對於存儲了“年份不同格式就不同的報表”這類值的表,格式切換的時間點不同,某一列中存儲的值的意義就會發生變化

3.2.2. 使用某一列去管理多種編號(都道府縣編號或客戶編號等)

4. 註釋

4.1. “--”單行註釋的寫法

4.2. “/* */”去寫多行註釋

5. 縮進

5.1. 代碼難以閱讀的原因

5.1.1. 沒有進行縮進

5.1.2. 沒有對長代碼劃分模塊,所有的都揉在一起

5.2. 所有關鍵字都頂格左齊的寫法比讓關鍵字右齊的寫法更好

5.2.1. 緊接著的列名或表名的位置也能對齊,代碼更易讀

6. 大小寫

6.1. 不成文的約定

6.1.1. 關鍵字使用大寫字母,列名和表名使用小寫字母

7. 空格

7.1. 不管用什麼語言編程都一樣,代碼中需要適當地留一些空格

8. 逗號

8.1. 前置逗號

8.1.1.

 SELECT     col_1

            ,  col_2
            ,  col_3
            ,  col_4
      FROM  tbl_A;

8.1.1.1. 刪掉最後一列“col_4”後執行也不會出錯

8.1.1.2. 每行中逗號都出現在同一列,因此使用Emacs等可以進行矩形區域選擇的編輯器就會非常方便操作

8.1.2. 把逗號寫在要素和要素的中間

8.1.3. SQL格式化/美化

8.1.3.1. dbeaver不支持

8.1.3.2. navicat不支持

8.1.3.3. sql prompt 支持

9. 不使用通配符

9.1. 因為結果的格式依賴於列的排列順序,所以修改表中列的排列順序,或者添加、修改列就會導致結果的格式發生變化

10. ORDER BY中不使用列編號

10.1. 這個功能在SQL-92中已經被列為了“未來會被刪除的功能”

10.2. 一般來說會受列的順序和位置影響的寫法都應該避免,這也是一條鐵律

11. SQL標準語法

11.1. 不使用依賴各種資料庫實現的函數和運算符

11.1.1. DECODE(Oracle)、IF(MySQL)、NVL(Oracle)、STUFF(SQL Server)等

11.1.2. 使用CASE表達式或者COALESCE、NULLIF等標準函數代替

11.2. SIGN或ABS、REPLACE這些,雖然標準SQL沒有定義它們,但是幾乎所有的資料庫都實現了

11.3. 標準SQL中有定義,但是各資料庫實現情況不同的功能

11.3.1. 日期函數EXTRACT,以及用於字元串連接的運算符“||”或者POSITION函數

12. 連接操作

12.1. 使用INNER或CROSS等表明連接類型的關鍵字,連接條件可以使用ON子句分開寫

12.1.1. 一眼就能看明白連接的類型和條件,代碼可讀性很好

12.2. 外連接請使用LEFT OUTER JOIN、RIGHT OUTER JOIN或者FULL OUTER JOIN來寫

12.3. 標準SQL中允許省略關鍵字OUTER,但是這個關鍵字便於我們理解它是外連接而非內連接,所以還是寫上吧

12.4. 左連接有一個優勢:一般情況下表頭都出現在左邊

13. 從FROM子句開始寫

13.1. SQL中各部分的執行順序是:FROM→WHERE→GROUP BY→HAVING→SELECT(→ORDER BY)

13.2. 嚴格地說,ORDER BY並不是SQL語句的一部分,因此可以排除在外


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

-Advertisement-
Play Games
更多相關文章
  • 構造 Socket 在【客戶端/服務端】的通信模式中,客戶端需要主動構造與伺服器連接的 Socket,構造方法有以下幾種重載形式: Socket() Socket(InetAddress address, int port) throws UnknownHostException,IOExcepti ...
  • 原文鏈接: 為什麼 Go for-range 的 value 值地址每次都一樣? 迴圈語句是一種常用的控制結構,在 Go 語言中,除了 for 關鍵字以外,還有一個 range 關鍵字,可以使用 for-range 迴圈迭代數組、切片、字元串、map 和 channel 這些數據類型。 但是在使用 ...
  • Springboot的優點 內置servlet容器,不需要在伺服器部署 tomcat。只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目 SpringBoot提供了starter,把常用庫聚合在一起,簡化複雜的環境配置,快速搭建spring應用環境 可以快速創建獨立 ...
  • Runtime包 GOMAXPROCS() ​ 用來設置可以並行計算的CPU核數最大值,並返回之前的值,具體使用方法上一篇有些,這裡不再贅述 Gosched() ​ 用於讓出CPU時間片,讓出當前goroutine的執行許可權,調度器安排其他等待的任務運行,併在下次某個時候從該位置恢復執行 Goexi ...
  • 在前兩篇: .NET Core部署到linux(CentOS)最全解決方案,常規篇 .NET Core部署到linux(CentOS)最全解決方案,進階篇(Supervisor+Nginx) 我們對.netcore部署到linux有了一個充分的瞭解,已經可以滿足應用要求了,這篇文章我們繼續深入... ...
  • 這一篇簡單說明 CH32V208 的片記憶體儲結構和時鐘的特點, 以及通過 SDK 中的示例代碼分析 CH32V208 的時鐘設置 ...
  • CH32V208系列是沁恆32位RISC-V中比較新的一個系列, 基於青稞RISC-V4C內核, 最高144MHz主頻, 64KB SRAM,128KB Flash, 供電電壓2.5/3.3V. 這個型號的特點: 除了特有的硬體堆棧區、快速中斷入口, 片上集成了2Mbps低功耗藍牙BLE 5.3, ... ...
  • (初探MySQL) 前言 周所周知MySQL已成為全世界最受歡迎的資料庫之一。無論你用的何種編程語言在開發系統,資料庫基本上都是必不可少的。 無論是小型項目開發如我們開發一個個人博客系統,還是構建那些聲名顯赫的網站如某寶、某訊等,MySQL都有著穩定、可靠、快速等優點。可以勝任數據存儲的業務需求。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...