表概念

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

1.1 文本

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

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

1.1.1 char 固定文本

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

1.1.2 varchar 可變文本(重要)

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

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

  • 數(shù)據(jù)在存儲(chǔ)中不會(huì)有多余的冗余部分(主要指的是填滿長(zhǎng)度的空格)
  • 數(shù)據(jù)準(zhǔn)確性,"Tom"和"Tom+7個(gè)空格"不是一樣的數(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 時(shí)間
1.3.1 date 日期類型(年月日)(重要)

可以存儲(chǔ)“年-月-日”的時(shí)間

1.3.2 time 時(shí)間類型(時(shí)分秒)

可以存儲(chǔ)“時(shí):分:秒”的時(shí)間

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

可以存儲(chǔ)“年-月-日 時(shí):分:秒”的時(shí)間

1.3.4 timestamp 時(shí)間戳類型(了解)

在Java體系中,時(shí)間原點(diǎn)是1970年1月1日 8時(shí)0分0秒 GMT+8。時(shí)間戳就是表述時(shí)間與時(shí)間原點(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)制文件占用的空間比較大,存儲(chǔ)這種文件可能會(huì)拖慢數(shù)據(jù)庫(kù)的執(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.約束

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

3.1 主鍵約束 Primary Key(重要)

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

image

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

主鍵約束的規(guī)則

  • 一張表中最多只能有一個(gè)主鍵約束

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

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

    image

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

主鍵約束的規(guī)范

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

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

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

列級(jí)聲明:

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

表級(jí)聲明:
創(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

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

image

學(xué)生表

image

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

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

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

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

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))

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

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

添加唯一約束的語句
列級(jí)聲明

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

表級(jí)聲明

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

3.4 非空約束 Not Null

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

列級(jí)聲明

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

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

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

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

4.維護(hù)表

4.1 刪除表

刪除表時(shí)一定要事先確認(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時(shí)刪除整張表,包含表結(jié)構(gòu);truncate是截?cái)啾恚A舯斫Y(jié)構(gòu),數(shù)據(jù)無法恢復(fù)

4.3 更改表名

將表student2更名為student3

ALTER TABLE student2 RENAME student3

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

更改student3表中的sname列為snamex,同時(shí)列的數(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,944評(píng)論 0 9
  • 1.數(shù)據(jù)類型 1.1 文本 MySQL 5.0之前的版本char(10)或varchar(10)表述的是10個(gè)字節(jié)...
    yangsg閱讀 2,375評(píng)論 0 11
  • 1.數(shù)據(jù)類型 1.1 文本 MySQL 5.0之前的版本char(10)或varchar(10)表述的是10個(gè)字節(jié)...
    夜白從來都是一個(gè)人閱讀 350評(píng)論 0 0
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 8,056評(píng)論 5 115
  • 工作需求,需要設(shè)計(jì)一個(gè)短信驗(yàn)證碼界面。因?yàn)檫@個(gè)界面只有一個(gè)輸入短信驗(yàn)證碼框,做成一個(gè)界面有點(diǎn)顯得很空蕩。所以,我設(shè)...
    Jaesoon閱讀 2,839評(píng)論 2 0

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