1. 程式人生 > >《SQL必知必會——第1、2課:sql基礎概念及檢索資料》

《SQL必知必會——第1、2課:sql基礎概念及檢索資料》

       現在還會有這種想法,出於對技術的敬畏,在開始真正使用某項技術之前,都會翻翻相關書籍,潛心學習一下,然後在開始,所謂出生牛犢不怕虎,在軟體開發這個行業還是不提倡,一旦亂用技術,後面的坑實在難填。程式碼的改動就意味著除錯、測試,以及對生產環境的影響,是很花團隊時間和精力的。最好就是一開始把技術用正確,後面即使有改動,也是小改動,可以很快修復。還是說說這本書《SQL必知必會》(Ben Forta 著,鐘鳴  劉曉霞 譯),總覺得自己的sql學的不夠系統,然後去年上半年買了這本書,拖拖拉拉到下半年才翻完,其實這本書是一本入門書,總共才200多頁,主要還是自己被各種瑣事耽擱,然後看書節奏拖沓很多,看完後一直想寫點什麼,最後想想sql語法相關文章太多了,即使寫也寫不出太深層次的東西,還是做做筆記吧,摘錄一下本書的知識點,後面工作用到大家可以隨時查閱,自己也可以隨時查閱。本書一共分22課,我試著摘錄整理成幾篇部落格,成一個系列。

       第1課  瞭解sql

       本課都是基礎概念,這些概念經常被大家在工作中提及,相信這些概念早在大學時代上資料庫原理課時就已經建立,但真要說一下資料庫的定義,大家肯定會支支吾吾。資料庫是一個以某種有組織的方式儲存的資料集合。最簡單的辦法是將資料庫想象為一個檔案櫃,這個檔案櫃是一個存放資料的物理位置,不管資料是什麼,也不管資料是如何組織的,或者把資料庫想象成是一個儲存有組織的資料的容器。這裡面有一個很容易混淆的地方,那就是人們通常用資料庫這個術語來代表他們使用的資料庫管理系統(DBMS)。實際資料庫是通過DBMS建立和操縱的容器,而具體它究竟是什麼,形式如何,各種資料庫都不一樣。舉個例子,我們經常說mysql資料庫,其實mysql是資料庫管理系統,非資料庫,當然也不必特別較真,mysql資料庫這句話也可以理解為:使用mysql資料庫管理系統建立和操縱的資料庫。

  • 表:某種特定型別資料的結構化清單;
  • 列:表中的一個欄位,所有表都是由一個或多個列組成;
  • 行:表中的一個記錄,也就是把資料庫表想象為網格,網格中垂直的列為表列,水平行為錶行;
  • 主鍵:一列(或幾列),其值能夠唯一標識表中每一行,主鍵不允許修改和更新,不能重用(如果某行從表中刪除,它的主鍵不能賦給以後的新行)。
  • SQL:結構化查詢語言,專門用來與資料庫溝通的語言。sql不是某個特定資料庫供應商專有的語言,而是一種業界標準,由ANSI標準委員會管理,也叫ANSI SQL,幾乎所有重要的DBMS都支援sql。這一點保證了學習sql,就幾乎能與所有資料庫打交道。甚至現在的spark sql,hive sql等等都長的差不多,sql已經夠簡潔了,實在設計不出什麼新花樣了。

       第2課  檢索資料

       所謂檢索資料,就是查詢資料,也就是select,你可能寫的第一條sql語句就是select。關於select查詢本課開篇幾節並沒有講太多,可能太簡單了,不過講了一個注意點:一般而言,除非確實需要表中的每一列,否則最好別使用*萬用字元,因為檢索不需要的列會降低檢索和應用程式的效能。這一點還真得注意,有時會圖省事,直接來個select *,在測試環境這樣查查就算了,但是生產環境,還是要謹慎。

       檢索不同的值:也就是查詢出的列每個值都不一樣,可以使用distinct關鍵字,比如:select distinct vend_id from products,有一個注意點是該關鍵字作用於所有列,不僅僅是跟在其後的那一列,所以這裡不要誤用,如果distinct後面跟著多列的話,那distinct基本也就廢了,後面幾列的組合值,可能多半都是不一樣的,也就起不到去重的作用了。當然,具體場景具體分析,也可能就是需要多個列值組合起來去重呢。

       限制結果:如果只想返回第一行或一定數量的行,可以使用top(SQL Server / Access)關鍵字或者limit(MySql / MariaDB / PostgreSQL / SQLite)關鍵字。不同的DBMS還不太一樣,不過這個理解起來也非常簡單。不過下面這個例子可以看一下:select prod_name from products limit 5 offset 5; 這裡的limit 5 offset 5表示返回從第5行起的5行資料。

       使用註釋:sql語句也是程式碼,也要有註釋。我看過有把業務邏輯寫進sql的,比如一些業務上的判斷,也用sql實現,寄希望於強大的sql直接出最終結果,可想而知,這樣的sql有多複雜,非常晦澀難懂,這樣的sql不加註釋,後期是非常難維護的。當然,個人覺得最好不要這麼幹,還是把業務梳理清楚,劃分若干個環節,每個環節使用sql查詢資料,然後通過程式把各個環節資料串聯起來,這樣sql也方便維護,業務程式碼也容易看懂,無論後面誰接手維護,都能很快上手。言歸正傳,sql註釋形式比較多,可以使用--或者#進行行內註釋,也可以使用/**/,像c/java程式碼那樣進行多行註釋。有複雜程式碼的地方,就應該寫註釋,當然註釋要準確,不準確的註釋和沒有註釋一樣坑,甚至更坑。