2019-05-05

1.數(shù)據(jù)類型

1.1 文本

MySQL 5.0之前的版本char(10)或varchar(10)表述的是10個字節(jié)
1英文 = 1字節(jié) 可以存儲10個英文
1漢字 = 2字節(jié)(GBK)/3字節(jié)(utf-8) 可以存儲5個漢字(GBK)/3個漢字(utf-8)

MySQL 5.0之后的版本char(10)或varchar(10)表述的是10個字符
1英文 = 1字符 可以存儲10個英文
1漢字 = 1字符 可以存儲10個漢字

1.1.1 char 固定文本

將“學(xué)生姓名”列設(shè)置為char(10) - 表示可以支持最多10個字符
此時將“Tom”存入“學(xué)生姓名”中,實(shí)際上存了10個字符 可以理解存儲的是"Tom"加7個空格。如果名字長度超過10個,無法存入數(shù)據(jù)。

1.1.2 varchar 可變文本(重要)

將“學(xué)生姓名”列設(shè)置為varchar(10) - 表示可以支持最多10個字符
此時將“Tom”存入“學(xué)生姓名”中,實(shí)際上存了3個字符 。如果名字長度超過10個,無法存入數(shù)據(jù)。

推薦使用varchar類型作為文本數(shù)據(jù)的類型,優(yōu)點(diǎn):

  • 數(shù)據(jù)在存儲中不會有多余的冗余部分(主要指的是填滿長度的空格)
  • 數(shù)據(jù)準(zhǔn)確性,"Tom"和"Tom+7個空格"不是一樣的數(shù)據(jù)
1.2 數(shù)值
1.2.1 int 整數(shù)類型(重要)

int類型支持?jǐn)?shù)據(jù)為整數(shù)性質(zhì)

1.2.2 float 浮點(diǎn)數(shù)類型(小數(shù))(重要)

float類型支持?jǐn)?shù)據(jù)為浮點(diǎn)數(shù)性質(zhì)

1.3 時間
1.3.1 date 日期類型(年月日)(重要)

可以存儲“年-月-日”的時間

1.3.2 time 時間類型(時分秒)

可以存儲“時:分:秒”的時間

1.3.3 datetime 日期時間類型(年月日時分秒)(重要)

可以存儲“年-月-日 時:分:秒”的時間

1.3.4 timestamp 時間戳類型(了解)

在Java體系中,時間原點(diǎn)是1970年1月1日 8時0分0秒 GMT+8。時間戳就是表述時間與時間原點(diǎn)之間的所經(jīng)過毫秒數(shù)(1s = 1000ms)

1.4 其他(了解)
1.4.1 blob 字節(jié)流類型(二進(jìn)制數(shù)據(jù))

將二進(jìn)制文件(圖片,聲音....)的內(nèi)容存入blob
一般二進(jìn)制文件占用的空間比較大,存儲這種文件可能會拖慢數(shù)據(jù)庫的執(zhí)行速度

1.4.2 boolean 邏輯類型("真"和"假")

通常情況下使用int類型替代boolean類型
int中認(rèn)為 0-假 1-真

2.創(chuàng)建表

建表至少需要提供表名,列名和列的數(shù)據(jù)類型
這些名字的命名規(guī)則:

  • 不能使用中文,只能英文和數(shù)字,不能以數(shù)字開頭
  • 名字中間不允許出現(xiàn)空格
  • 不要使用SQL中的關(guān)鍵字
  • 不能使用已有的名字

命名規(guī)范

  • 使用英文單詞進(jìn)行命名

語法

CREATE TABLE 表名(
    列1名 列1的數(shù)據(jù)類型,
    列2名 列2的數(shù)據(jù)類型,
        ...
    列n名 列n的數(shù)據(jù)類型
);

3.約束

約束在表中對數(shù)據(jù)輸入的限制,保證數(shù)據(jù)錄入的準(zhǔn)確性

3.1 主鍵約束 Primary Key(重要)

作用: 非空并且唯一
被主鍵約束修飾的列,具有唯一性,可以代表一行數(shù)據(jù)
比如

image

編號具有體現(xiàn)某行數(shù)據(jù)的唯一性,可以代表這一行數(shù)據(jù)

主鍵約束的規(guī)則

  • 一張表中最多只能有一個主鍵約束

  • 做為主鍵的列,其中的數(shù)據(jù)不能是Null

  • 一個主鍵約束可以作用在多個列上,叫做“聯(lián)合主鍵”
    多個列組成一個主鍵,這些列數(shù)據(jù)的組合作為主鍵出現(xiàn)

    image

面試題
一張表最多只能有一個主鍵約束
一張表中最多只能有一個列是主鍵約束 x

主鍵約束的規(guī)范

  • 不使用有實(shí)際意義的數(shù)據(jù)做為主鍵列,因?yàn)閷?shí)際意義的列可能發(fā)生改動

創(chuàng)建主鍵的兩種方式

  • 建表時聲明主鍵約束
    創(chuàng)建表時,直接在主鍵列后進(jìn)行primary key進(jìn)行聲明

列級聲明:

CREATE TABLE haha(
    hid INT(8) PRIMARY KEY,
    hname VARCHAR(32),
    birthday DATE
);

表級聲明:
創(chuàng)建sno和cno為聯(lián)合主鍵的表

CREATE TABLE stu_course(
    sno INT(8), 
    cno INT(8),
    score INT(4),
    PRIMARY KEY(sno,cno)
);

CREATE TABLE haha(
    hid INT(8), 
    hname VARCHAR(32),
    birthday DATE,
    CONSTRAINT PK_HAHA PRIMARY KEY(hid)
);

  • 建表后追加主鍵約束
    為student表的sno列添加主鍵約束
ALTER TABLE student ADD PRIMARY KEY(sno);

3.2 外鍵約束 Foreign Key

一張表的某個數(shù)據(jù)來源于另一張表,這就形成了外鍵關(guān)系
班級表

image

學(xué)生表

image

學(xué)生表中cno的數(shù)據(jù)應(yīng)該來源于班級表的cno主鍵,形成外鍵關(guān)系
學(xué)生表中cno列依賴于班級表的cno列

為學(xué)生表(student)追加外鍵約束

ALTER TABLE student ADD FOREIGN KEY(cno) REFERENCES classes(cno)

創(chuàng)建學(xué)生表(Student)直接設(shè)置外鍵,只有表級聲明

CREATE TABLE student(
    sno INT(8) PRIMARY KEY,
    sname VARCHAR(32),
    cno INT(8),
    FOREIGN KEY(cno) REFERENCES classes(cno)
);

3.3 唯一約束 Unique

被唯一約束修飾的列,其中數(shù)據(jù)不允許出現(xiàn)重復(fù)
唯一約束的特點(diǎn)(與主鍵約束的不同點(diǎn))

  • 一張表中可以有多個唯一約束
  • 唯一約束的數(shù)據(jù)中可以有null

主鍵約束與唯一約束的區(qū)別

添加唯一約束的語句
列級聲明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique,
);

表級聲明

create table student(
    sno INT(8),
    sname VARCHAR(32),
    primary key(sno),
    unique(sname)
);

3.4 非空約束 Not Null

約束數(shù)據(jù)不能為null

列級聲明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique not null,
);

3.5 檢查約束 Check(MySQL不支持 Oracle支持)

自定義規(guī)則
比如約定某個整數(shù)類型的列輸入的數(shù)字不能小于0
check(xxx > 0)
check(score >= 0 and score <= 100)

筆試題:寫出五種數(shù)據(jù)庫的約束,各自進(jìn)行解釋?

4.維護(hù)表

4.1 刪除表

刪除表時一定要事先確認(rèn)
不僅僅刪除的是表中的數(shù)據(jù),表結(jié)構(gòu)(表自身)都被刪除了

drop table 表名;

4.2 截?cái)啾恚ㄇ蹇毡碇械臄?shù)據(jù))

清空表中的數(shù)據(jù),保留表結(jié)構(gòu)(表自身)

truncate table 表名;

面試題
- drop和truncate的區(qū)別?
答 drop時刪除整張表,包含表結(jié)構(gòu);truncate是截?cái)啾?,保留表結(jié)構(gòu),數(shù)據(jù)無法恢復(fù)

4.3 更改表名

將表student2更名為student3

ALTER TABLE student2 RENAME student3

4.4 更改列名和列的數(shù)據(jù)類型

更改student3表中的sname列為snamex,同時列的數(shù)據(jù)類型varchar(64)

ALTER TABLE student3 CHANGE sname snamex VARCHAR(64);

4.5 增加列

為student3表新增birthday列,列的數(shù)據(jù)類型是date類型

ALTER TABLE student3 ADD COLUMN birthday DATE

4.6 刪除列

刪除student3表中birthday列

ALTER TABLE student3 DROP COLUMN birthday

本章重點(diǎn)

  1. 表的概念
  2. 各種約束的概念
  3. 主鍵約束的一些細(xì)節(jié)(聯(lián)合主鍵)
  4. 主鍵和唯一的區(qū)別
  5. drop和truncate的區(qū)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容