主頁 > 資料庫 > 讀SQL進階教程筆記14_SQL編程要點

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

2023-05-01 08:00:09 資料庫

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陳述句的一部分,因此可以排除在外

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/551537.html

標籤:其它

上一篇:手記系列之四 ----- 關于使用MySql的經驗

下一篇:返回列表

標籤雲
其他(158353) Python(38110) JavaScript(25398) Java(18011) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7154) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1929) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 讀SQL進階教程筆記14_SQL編程要點

    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 ......

    uj5u.com 2023-05-01 08:00:09 more
  • 手記系列之四 ----- 關于使用MySql的經驗

    前言 本篇文章主要介紹的關于本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。 一、MySql安裝 下載地址:https://dev.mysql.com/downloads/ 在安裝MySql之前,查看是否以及安裝過MySql,如果已經安 ......

    uj5u.com 2023-05-01 07:59:11 more
  • MySQL常用資料庫陳述句

    ==資料庫==1、創建資料庫create database [IF NOT EXISTS] 資料庫名; 2、洗掉資料庫drop database [IF EXISTS] 資料庫名; 3、切換資料庫select database(); 4、查詢資料庫show databases; —————————— ......

    uj5u.com 2023-04-30 07:59:05 more
  • MySQL常用資料庫陳述句

    ==資料庫==1、創建資料庫create database [IF NOT EXISTS] 資料庫名; 2、洗掉資料庫drop database [IF EXISTS] 資料庫名; 3、切換資料庫select database(); 4、查詢資料庫show databases; —————————— ......

    uj5u.com 2023-04-30 07:58:10 more
  • day08-優惠券秒殺04

    功能03-優惠券秒殺04 4.功能03-優惠券秒殺 4.7Redis優化秒殺 4.7.1優化分析 現在來回顧一下優惠券秒殺業務的兩個主要問題: (1)首先是對優惠券的扣減,需要防止庫存超賣現象; (2)其次,需要對每個用戶下單數量進行限制,實作一人一單的功能。 處理秒殺優惠券的業務: 先根據獲取到的 ......

    uj5u.com 2023-04-29 07:31:59 more
  • day08-優惠券秒殺04

    功能03-優惠券秒殺04 4.功能03-優惠券秒殺 4.7Redis優化秒殺 4.7.1優化分析 現在來回顧一下優惠券秒殺業務的兩個主要問題: (1)首先是對優惠券的扣減,需要防止庫存超賣現象; (2)其次,需要對每個用戶下單數量進行限制,實作一人一單的功能。 處理秒殺優惠券的業務: 先根據獲取到的 ......

    uj5u.com 2023-04-29 07:30:43 more
  • Performance_schema中的主從復制系串列總結

    主從半同步復制是目前用得最多的MySQL復制方案,日常作業中我們一般通過show slave status陳述句查看當前復制程序中狀態資訊,基本上能滿足大多數場景下的需求。Performance_schema中提供了16個關于復制的監控表(包括組復制、過濾復制等,這里我們先不討論),show slav ......

    uj5u.com 2023-04-28 12:15:09 more
  • [20230425]CBO cost與行遷移關系.txt

    [20230425]CBO cost與行遷移關系.txt--//一般現在很少使用analyze table分析表,如果出現大量行遷移是否考慮看看是否考慮cbo cost成本.--//測驗參考鏈接:--//https://richardfoote.wordpress.com/2023/03/21/cb ......

    uj5u.com 2023-04-28 12:15:04 more
  • day07-優惠券秒殺03

    功能03-優惠券秒殺03 4.功能03-優惠券秒殺 4.6Redisson的分布式鎖 Redis分布式鎖—Redisson+RLock可重入鎖實作篇 4.6.1基于setnx實作的分布式鎖問題 我們在4.5自己實作的分布式鎖,主要使用的是redis的setnx命令,它仍存在如下問題: 4.6.2Re ......

    uj5u.com 2023-04-28 12:11:01 more
  • mysql基礎

    SQL陳述句 SQL陳述句分類 SQL分類: 資料定義語言:簡稱DDL(Data Definition Language),用來定義資料庫物件:資料庫,表,列等。關鍵字:create,alter,drop等 資料操作語言:簡稱DML(Data Manipulation Language),用來對資料庫中 ......

    uj5u.com 2023-04-28 12:10:40 more