Like Share Discussion Bookmark Smile

J.J. Huang   2020-06-08   MySQL   瀏覽次數:

MySQL - 第一章 | 了解SQL

程式開發到越後面,越是返璞歸真,常常碰到使用到的東西,僅限於會使用並不了解其基礎;所以最後都會往回去看些基礎的教學。
當然基礎教學可能會枯燥乏味,但是只有在對基礎更加了解後,才能夠深入其了解其特性,進而更加暸解透徹。

這次將針對整天碰到的資料庫的部分,對基礎重新來學習,而這邊上網挑了一本書後來決定研讀並撰寫筆記。

資料庫基礎

在深入學習MySQL及其SQL語言的實作之前,應該對資料庫及資料庫技術的某些基本概念有所了解。

你可能還沒有意識到,其實你自己一直在使用資料庫。每當你從自己的電子郵件地址簿裡查找名字時,你就在使用資料庫。如果你在某個網際網路搜索站點上進行搜索,也是在使用資料庫。如果你在工作中登錄網路,也需要依靠資料庫驗證自己的名字和密碼。即使是在自動取款機上使用ATM卡,也要利用資料庫進行PIN碼驗證和餘額檢查。

雖然我們一直都在使用資料庫,但對究竟什麼是資料庫並不十分清楚。特別是不同的人可能會使用相同的資料庫術語表示不同的事物,更加劇了這種混亂。因此,我們學習的良好切入點就是給出一張最重要的 資料庫術語清單,並加以說明。

什麼是資料庫

資料庫這個術語的用法很多,資料庫是一個以某種有組織的方式存儲的資料集合。理解資料庫的一種最簡單的辦法是將其想像為一個文件櫃。此文件櫃是一個存放資料的物理位置,不管資料是什麼以及如何組織的。

術語:資料庫(database) 保存有組織的資料的容器(通常是一個文 件或一組文件)。

注意:誤用導致混淆人們通常用資料庫這個術語來代表他們使用的資料庫軟體。這是不正確的,它是引起混淆的根源。確切地說,資料庫軟體應稱為DBMS(資料庫管理系統)。資料庫是通過DBMS建立和操縱的容器。資料庫可以是保存在硬設備上的文件,但也可以不是。在很大程度上說,資料庫究竟是文件還是別的什麼東西並不重要,因為你並不直接訪問資料庫;你使用的是DBMS,它替你訪問資料庫。

表(Table)

在你將資料放入自己的文件櫃時,並不是隨便將它們扔進某個抽屜就完事了,而是在文件櫃中建立文件,然後將相關的資料放入特定的文件中。

在資料庫領域中,這種文件稱為表。表是一種結構化的文件,可用來存儲某種特定類型的資料。表可以保存顧客清單、產品目錄,或者其他訊息清單。

術語:表(Table) 某種特定類型資料的結構化清單。這裡關鍵的一點在於,存儲在表中的資料是一種類型的資料或一個清單。決不應該將顧客的清單與訂單的清單存儲在同一個資料庫表中。這 樣做將使以後的檢索和訪問很困難。應該建立兩個表,每個清單一個表。
資料庫中的每個表都有一個名字,用來標識自己。此名字是唯一的,這表示資料庫中沒有其他表具有相同的名字。

說明:表名的唯一性取決於多個因素,如資料庫名和表名等的結合。這表示,雖然在相同資料庫中不能兩次使用相同的表名,但在不同的資料庫中卻可以使用相同的表名。

表具有一些特性,這些特性定義了資料在表中如何存儲,如可以存儲什麼樣的資料,資料如何分解,各部分訊息如何命名,等等。描述表的這組訊息就是所謂的模式,模式可以用來描述資料庫中特定的表以及整個資料庫(和其中表的關係)。

術語:模式(schema) 關於資料庫和表的佈局及特性的訊息。

說明:是模式還是資料庫? 有時,模式用作資料庫的同義詞。遺憾的是,模式的含義通常在上下文中並不是很清晰,模式指的是上面給出的定義。

列和資料類型

表由列組成。列中存儲著表中某部分的訊息。

術語:列(column) 表中的一個欄位。所有表都是由一個或多個列組成的。

理解列的最好辦法是將資料庫表想像為一個網格。網格中每一列存儲著一條特定的訊息。例如,在顧客表中,一個列存儲著顧客編號,另一個列存儲著顧客名,而地址、城市、州以及郵政編碼全都存儲在各自的列中。

提示:分解資料:正確地將資料分解為多個列極為重要。例如,城市、州、郵政編碼應該總是獨立的列。通過把它分解開,才有可能利用特定的列對資料進行排序和過濾(如,找出特定州或特定城市的所有顧客)。如果城市和州組合在一個列中,則按州進行排序或過濾會很困難。

資料庫中每個列都有相應的資料類型。資料類型定義列可以存儲的資料種類。例如,如果列中存儲的為數字(或許是訂單中的物品數),則相應的資料類型應該為數值類型。如果列中存儲的是日期、文本、註解、金額等,則應該用恰當的資料類型規定出來。

術語:資料類型(datatype) 所容許的資料的類型。每個表列都有相應的資料類型,它限制(或容許)該列中存儲的資料。

資料類型限制可存儲在列中的資料種類(例如,防止在數值欄位中錄入字符值)。資料類型還幫助正確地排序資料,並在優化磁盤使用方面起重要的作用。因此,在建立表時必須對資料類型給予特別的關注。

表中的資料是按行存儲的,所保存的每個記錄存儲在自己的行內。
如果將表想像為網格,網格中垂直的列為表列,水平行為表行。例如,顧客表可以每行存儲一個顧客。表中的行數為記錄的總數。

術語:行(row) 表中的一個記錄。

說明:是記錄還是行? 你可能聽到用戶在提到行(row)時稱其為資料庫記錄(record)。在很大程度上,這兩個術語是可以互相替代的,但從技術上說,行才是正確的術語。

主鍵

表中每一行都應該有可以唯一標識自己的一列(或一組列)。一個顧客表可以使用顧客編號列,而訂單表可以使用訂單ID,僱員表可以使用僱員ID或僱員社會保險號。

術語:主鍵(primary key)1一一列(或一組列),其值能夠唯一區分表中每個行。

唯一標識表中每行的這個列(或這組列)稱為主鍵。主鍵用來表示一個特定的行。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只涉及相關的行。

提示:應該總是定義主鍵 雖然並不總是都需要主鍵,但大多數資料庫設計人員都應保證他們建立的每個表具有一個主鍵,以便於以後的資料操縱和管理。

表中的任何列都可以作為主鍵,只要它滿足以下條件:

  • 任意兩行都不具有相同的主鍵值;
  • 每個行都必須具有一個主鍵值(主鍵列不允許NULL值)。

說明:主鍵值規則 這裡列出的規則是MySQL本身強制實施的。

提示:主鍵通常定義在表的一列上,但這並不是必需的,也可以一起使用多個列作為主鍵。在使用多列作為主鍵時,上述條件必須應用到構成主鍵的所有列,所有列值的組合必須是唯一的(但單個列的值可以不唯一)。
主鍵的最好習慣除MySQL強制實施的規則外,應該堅持的 幾個普遍認可的最好習慣為:

  • 不更新主鍵列中的值;
  • 不重用主鍵列的值;
  • 不在主鍵列中使用可能會更改的值。(例如,如果使用一個名字作為主鍵以標識某個供應商,當該供應商合併和更改其名字時,必須更改這個主鍵。)

什麼是SQL

SQL(發音為字母S-Q-L或sequel)是結構化查詢語言(Structured Query Language)的縮寫。SQL是一種專門用來與資料庫通信的語言。

與其他語言(如,英語以及Java和Visual Basic這樣的程序設計語言)不一樣,SQL由很少的詞構成,這是有意而為的。設計SQL的目的是很好地完成一項任務,即提供一種從資料庫中讀寫資料的簡單有效的方法。

SQL有如下的優點:

  • SQL不是某個特定資料庫供應商專有的語言。幾乎所有重要的DBMS都支持SQL,所以,學習此語言使你幾乎能與所有資料庫打交道。
  • SQL簡單易學。它的語句全都是由描述性很強的英語單詞組成,而且這些單詞的數目不多。
  • SQL儘管看上去很簡單,但它實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和高級的資料庫操作。

說明:DBMS專用的SQL SQL不是一種專利語言,而且存在一個標準委員會,他們試圖定義可供所有DBMS使用的SQL語法,但事實上任意兩個DBMS實作的SQL都不完全相同。這邊專門針對MySQL的,雖然所講授的多數語法也適用於其他DBMS,但不要認為這些SQL語法是完全可移植的。

結語

對於這篇針對術語的部分,讓自己可以更加容易地去了解其意思,而且當有人問起時,你知道該如何去解釋每個術語所表示的意思含義和說明。

當然這些術語,其實我早就都了解並已經在使用了,再次閱讀主要是讓自己再次複習,再次對其定義更加確定;而且有些還有提到其優點和注意事項,這才是我在這篇文章中主要多吸收學習到的。

註:以上參考了
MySQL必知必会 MySQL Crash Course