基本 SQL 之數據庫及表管理

上篇文章,咱們基於『數據庫』作了一個宏觀上的介紹,你應當瞭解到數據庫是在何種背景下,爲了解決什麼樣的問題而誕生的,以及在具體實現下又能夠劃分哪些中類型。java

非關係型數據庫的種類不少,咱們會在後續的篇章中進行介紹,數據庫這塊咱們仍是以目前當下主流的關係型數據庫進行學習。git

SQL 是什麼

咱們看看程序員

SQL(結構化查詢語言)是一種特定目的編程語言,用於管理關係數據庫管理系統(RDBMS),或在關係流數據管理系統(RDSMS)中進行流處理github

簡而言之,SQL 是一門編程語言,它很特殊,它是一門幫助咱們管理數據的標準語言sql

爲何強調標準語言?數據庫

關係型數據的主要三大實現者分別是,Mysql,MS SQLServer,Oracle。編程

它們實現數據存儲的底層引擎或許不一樣,但提供出來管理數據的編程語言必須遵循 SQL 規範,但能夠定製添加屬於本身的額外語法,這些額外的、SQL 以外的語法又被稱做它們各自的『SQL方言』。bash

記得遇到過不少新手,拿着 SqlServer 的方言跑到 Mysql 裏去執行,怎麼都報錯,怎麼都解決不了。其實仍是沒了解到這一層。微信

數據庫管理

一個數據庫系統裏是能夠同時存在多個數據庫的,也就是說一個數據庫引擎能夠服務多個數據庫。編程語言

當你成功登錄數據庫系統以後,你能夠經過這麼一個命令查看系統中存在的數據庫集合。

SHOW DATABASES;

除此以外,你也能夠建立數據庫,使用如下這個命令。

CREATE DATABASE [DATABASENAEM];

若是你想要刪除某個數據庫:

DROP DATABASE [DATABASENAEM];

若是你須要選中某個數據庫,這裏說明一下,數據庫由多張數據表構成,若是你想要操做數據表,你就必須先選中某個數據庫,否則系統怎麼知道你這一頓猛如虎的操做是基於的哪一個數據庫下的表呢。

USE[DATABASENAEM];

數據庫的管理其實沒什麼太複雜的,它就像一個容器同樣,建立後就意味着佔有了一塊磁盤空間,具體的數據存儲仍是在表結構中,因此接下來咱們來看看數據庫表管理狀況。

表管理

關係型數據庫中對於數據的存儲採用一種符合人的思惟邏輯的結構進行存儲,那就是表格結構。

表格是一個二維的結構,有行和列,咱們管一行數據叫作『一條記錄』或是『一條數據』,每一列都是一條數據的一部分,咱們管某一列的數據叫作『字段』,在數據庫中它們能夠具備不一樣的數據類型。

SQL 規範瞭如下一些通用的數據類型:

image

image

可是實際上,SQLServer,Oracle,MySQL 等數據庫的具體實現上也大多都支持這些類型,只不過在不一樣的數據庫中,同一種數據類型可能有不一樣的名稱。

舉個例子吧,數據類型 Integer,在 Oracle 裏使用 Number 描述,SQLServer 裏使用 int 來描述,而 MySQL 裏既可使用 int 也可使用 Integer 進行描述。

因此,在我看來,既然你們都不是那麼遵照規範,那麼就不必謹記規範,你用到哪一個數據庫,你去了解他的數據類型就是了

我以 MySQL 來講,他主要的數據類型大體能夠分爲三類,Text(文本)、Number(數字)和 Date/Time(日期/時間)。

==Text 類型:==

image

==Number 類型:==

image

==Date 類型:==

image

有了數據類型,咱們的列也就有了類型約束了,也即限定了每一列該存放什麼類型的數據,那麼咱們的表結構也就由此肯定了。

如今咱們來看看如何在一個數據庫中建立一張表:

CREATE TABLE table_name(
       column1 datatype,
       column2 datatype,
       column3 datatype,
       .....
       columnN datatype
    );
複製代碼

這是最基本的建立表語句,例如咱們能夠這樣建立一張表:

CREATE TABLE person(
       id int,
       name varchar(16),
       phone char(11),
    );
複製代碼

固然,這種方式建立的表結構仍是太簡單了,現實中咱們的字段每每具備更加嚴格的約束。

一、NULL 非空約束

NULL 約束用來指定當前字段的值是否容許爲空,這裏的空並非空字符串,空格字符串,而是未對該字段賦值就斷定爲空。

create table person(
    id,int NOT NULL,
    uName,varchar(16) NOT NULL,
    phone,char(11) NUll
)
複製代碼

NULL 則指定該字段的值能夠爲空,NOT NULL 指定該字段不能夠爲空。

二、DEFAULT 默認約束

DEFAULT 約束用於指定某一列在容許爲 NULL 的前提下,若是在插入數據時未賦值該字段時,數據庫統一賦的默認值。

create table person(
	id int DEFAULT 12,
	uName VARCHAR(16)
)
複製代碼

當咱們向表 person 插入數據時,若是你不爲 id 字段賦值,那麼該條數據記錄的 id 值就會是 12 。

三、UNIQUE 惟一約束

UNIQUE 約束用於限制表的某一字段不可重複,也即惟一,一張表中能夠有不少記錄,每條記錄的該字段的值必須各不相同。

create table person(
	id int,
	uName VARCHAR(16) UNIQUE
)
複製代碼

這樣,不管你向 person 表中插入多少條數據記錄,uName 這個字段的是必須各不相同,也即當你嘗試向 person 表插入一條數據時,若是檢測到你將要插入的這條數據的 uName 字段的值在表中已知記錄中存在,你將不能成功插入。

四、PRIMARY KEY 主鍵約束

『主鍵』就是可以惟一肯定一條具體數據記錄的一個或多個字段的組合,也就是說,主鍵是表數據中一行記錄的標記,經過它能夠惟必定位到一行數據記錄。

它與咱們的 UNIQUE 看起來是同樣的,咱們能夠經過 UNIQUE 指定表的一個或多個字段惟一不可重複,看似 UNIQUE 也能夠惟一肯定一行數據?

但時,UNIQUE 是不能惟一肯定一行數據的,那是由於 UNIQUE 對空值沒法約束。

你不讓我將字段的值賦值爲表中已知行數據的該字段值,那我能夠不賦值,該字段的值爲空。

因此,存在一種狀況就是,已經對錶的某一字段進行了 UNIQUE 約束,但時表中大量行數據的該字段值爲空,你還能經過該字段惟一肯定一行嗎?

有人認爲咱們的主鍵約束就等同於 UNIQUE + NOT NULL 兩個約束的集合,但其實我認爲這並不許確,由於有時咱們的主鍵能夠由多個字段共同構成,只要他們組合起來可以惟一肯定一行數據,單個字段是否遵照上述兩個約束就成爲非必要條件了。

例如:我有一張 person 表,裏面保存了不少數據,已知能夠經過姓名的手機號碼惟一肯定一條數據,那麼咱們的主鍵就是姓名和手機號碼兩個字段的組合,而至於姓名是否惟一,是否容許爲空,咱們不須要關心。

這其實就是主鍵約束和 UNIQUE 約束的一個主要的區別所在,你只要記住主鍵是用於惟一肯定一行數據的,UNIQUE 用於約束某一字段的值不可重複出現。

關於主鍵約束的語法,

create table person(
    id int primary key,
    uName varchar(16)
)
複製代碼

若是須要多個字段組合構成主鍵,語法是這樣的:

create table person(
    id int,
    uName varchar(16),
    primary key(id,uName)
)
複製代碼

五、FOREIGN KEY 約束

最後咱們講講外鍵約束,關係型數據庫的一個核心特色就是表與表之間能夠存在關係,而如何關聯到另一張表呢?這就用到一個鍵叫『外鍵』,兩張表之間的微妙關係咱們能夠叫作外鍵約束。

舉個例子吧,本身畫圖太醜,網上隨便找的表結構示意圖:

image

image

這裏涉及到兩張表,第一張訂單表記錄交易記錄數據,其中也須要記錄下建立這筆訂單的消費者,一種作法是把 persons 表中的全部字段從新定義一遍,追加到 Orders 表中,這顯然繁瑣、字段冗餘。

另外一種作法就是我只增長一個字段,該字段存儲的值是 persons 表的主鍵,也就是當我須要關聯到某一個具體的 person 時,我只保存它的主鍵值,而不去保存它全部的字段信息,由於我是能夠經過主鍵值定位到 persons 表的某條具體數據的。

上述示例中,咱們管訂單表中的 Id_P 字段叫作『外鍵』,它其實又是 persons 表的『主鍵』。

所以,構建一個外鍵約束,可使用以下語法:

CREATE TABLE Orders
(
    Id_O int NOT NULL,
    OrderNo int NOT NULL,
    Id_P int,
    PRIMARY KEY (Id_O),
    FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
複製代碼

前提是,Persons 表已經存在,不然將建立 Orders 表失敗。

以上,咱們講了建立表所涉及到的一些基本的內容,包括基本的字段類型、約束限制等,

但有的時候,表結構已經建立出來了,因爲一些需求變動須要更改表結構,咱們總不能 drop table 再從新定義一遍吧,SQL 規範中也提供了動態修改表結構的語句語法,咱們一塊兒來看看:

一、爲表新增列

ALTER TABLE [tableName] ADD [columName] [列數據類型]
複製代碼

例如:

alter table person add email varchar(24)
複製代碼

爲 person 表新增一列 email,varchar 類型。

二、修改表列屬性

列屬性包括,列名、列數據類型,咱們分別來看下修改它們的 SQL 語法。

修改列名

alter table 表名 change column 舊列名 新列名  新列名格式;
複製代碼

例如:

alter table person change column uName userName varchar(123)
複製代碼

修改列數據類型:

MySQL:

alter table 表名 modify column 列名 列類型
複製代碼

例如:

alter table person modify column userName varchar(16)
複製代碼

SQLServer:

alter table 表名 alter column 列名 列類型
複製代碼

修改數據類型這塊,各個應用數據庫實現語法稍有差別,但僅限於關鍵字不一樣,格式上大致類似。

三、刪除列

alter table 表名 drop column 列名
複製代碼

例如:

ALTER TABLE person DROP COLUMN email
複製代碼

刪除 person 表列 email。

關於表的刪除,就更加簡單了:

drop table 表名
複製代碼

注意,這裏的表刪除是連同表結構加表數據所有刪除,謹慎使用。

關於表管理,大致上就介紹到這,看似不少,但實際上並無什麼特別複雜的點,無非是建立、刪除、修改表。

建立表的時候能夠同時指定約束,修改表結構又分爲修改列名和修改列的數據類型,而同時咱們要當心謹慎使用 drop 刪除表。

雖然本篇寫不少,但並未涉及到複雜的 SQL 語句,僅限於簡單的建立 DDL 語句,下一篇咱們看較爲複雜的 DML 語句,進一步瞭解 SQL 對錶的增刪改查。


關注公衆不迷路,一個愛分享的程序員。
公衆號回覆「1024」加做者微信一塊兒探討學習!
每篇文章用到的全部案例代碼素材都會上傳我我的 github
github.com/SingleYam/o…
歡迎來踩!

YangAM 公衆號
相關文章
相關標籤/搜索