1. 程式人生 > >SQL筆記(一)

SQL筆記(一)

本文章為系列文章,是學習《SLQ必知必會》(Ben Forta 著 人民郵電出版社出版)一書的筆記,因此文中大量引用了原書內容, 所以推薦想系統學習的同學閱讀原書。同時本文所涉及的相關知識及內容版權由《SLQ必知必會》(Ben Forta 著 人民郵電出版社出版)作者所有,如涉及作品內容、版權或其他問題,將在第一時間刪除。本文旨在研究學習使用,禁止用做商業用途。如有其他媒體、網站或個人從本網下載、連線或以其他形式的複製發表、使用所產生的版權等法律問題本站(本人)均不承擔責任。
部落格地址:http://blog.csdn.net/xiaoyuan511

一、基礎類

首先,要先知道一下什麼是資料庫。

資料庫:是一個以某種有組織的方式儲存的資料集合。

也可以說儲存有組織的資料的容器通常是一個檔案或一組檔案。當然,要注意的一點是“資料庫”這個術語並不可以用來代表他們使用的資料庫軟體,確切的說,資料庫軟體應該稱為資料庫管理系統(DBMS)。

:某種特定型別資料的結構化清單。

表名在資料庫是唯一的,也就是說在同一個資料庫中不能連續使用兩次相同的表名,但是在不同的資料庫中完全可以使用相同的表名。而每個表則是由列組成的,列儲存表中的某部分資訊也就是俗稱的欄位。

:表中的一個欄位,所有表都是由一個列或者多個列組成的。

在資料庫中,每個列都有相應的資料型別,每個表列都有相應的資料型別,它限制(或允許)該列中資料的儲存。(資料型別及其名稱是SQL不相容的一個主要原因,這塊一定要注意,在使用某種資料庫的時候一定要先查詢好。)

表中的資料是按行儲存的,所儲存的每個記錄儲存在自己的行內。因此:行是表中的一個記錄。
表中每一行都應該有一列(或幾列)可以唯一標記自己,而這就是主鍵

主鍵:一列(或一組列),其值能夠唯一標識表中每一行。

雖然並不總是需要主鍵,但是多數資料庫設計者都會保證他們建立的每個表具有一個主鍵,以便於以後的資料操作和管理,因此應該總是定義主鍵。

二、資料檢索

SELECT語句應該是最常用的語句,它的用途是從一個或多個表中檢索資訊。而使用SELECT必須至少給出兩個條件:

  • 想選擇什麼
  • 從什麼地方選擇

例:

SELECT prod_name FROM Products;

這表示從Products表中檢索prod_name的列。(如果沒有明確排序查詢結果,則返回資料沒有特定的順序)
注:

  • 多條SQL語句必須以“;”分隔,因此SELECT不需要再單條SQL語句後加分號,當然也有可能有的DBMS需要單條也加上分好,因此可以總是加上分號。

  • 在SQL語句大小寫方面,SQL語句是不區分大小寫的,因此SELECT與select是相同的,同樣Select也沒有關係,只是為了便於閱讀和除錯,習慣對關鍵字進行大寫,對列名錶名進行小寫。

  • 在處理SQL語句時,其中所有空格都被忽略。

想要從一個表中檢索多個列,仍然可以用SELECT語句,且必須在SELECT關鍵字之後給出多個列名,並用逗號分隔,例如:

SELECT prod_id,prod_name,prod_price FROM Products;

SQL語句一般返回原始的、無格式的資料。資料的格式化是表示問題而非檢索問題。
除了查詢指定的列之外,SELECT還可以檢索所有的列而不必逐個列出在檢索的語句中,例如:

SELECT * FROM Products;

如果給定一個萬用字元(*),則返回表中所有列。(一般來說,除非你確定需要表中的每一列,否則不推薦使用萬用字元,因為會降低檢索的效率。)

如前所述,SELECT語句返回所有匹配的行,但是如果你不希望每個值都回返,比如說重複的值只返回一次機器,那麼我們應該怎麼做呢?可以這麼寫:

SELECT DISTINCT vend_id FROM Products;

這樣就只會返回不同的vend_id行了。但是要注意的是,DISTINCT關鍵字作用於所有的列而非僅僅是跟在其後的那一列。

當然,有時候並不單單隻顯示排重操作,有時還需要只返回第一行或者一定數量的行,而這個方法在不同的DBMS中實行並不相同,在此僅舉例SQLite的實現:

SELECT prod_name FROM Products LIMIT 5;

這句話的意思是返回不超過5行的資料。

為了得到後面的5行資料,需要制定從哪開始以及檢索的行數,像這樣:

SELECT prod_name FROM products LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5 是指返回從第5行起的5行資料,第一個數字是檢索的行數,第二個數字是從哪開始。(在SQLite中支援簡化語句,可以使用 LIMIT 5,5代替,逗號之前的值對應OFFSET,之後的值對應LIMIT。)同時,在使用的時候要注意第0行,因為第一個被檢索的行是第0行,而不是第1行,因此,LIMIT 1 OFFSET 1會被檢索到第2行,而非第一行。