讀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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...