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ù)
比如

編號(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í)表

學(xué)生表

學(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)
- 表的概念
- 各種約束的概念
- 主鍵約束的一些細(xì)節(jié)(聯(lián)合主鍵)
- 主鍵和唯一的區(qū)別
- drop和truncate的區(qū)別
