前言
由于最近做消息中心后臺(tái)開發(fā),需要進(jìn)行數(shù)據(jù)庫的操作暑刃,在編寫SQL(mybatis)上略感吃力厢漩,于是復(fù)習(xí)一下大學(xué)時(shí)代所學(xué)習(xí)的數(shù)據(jù)庫的相關(guān)基礎(chǔ)知識(shí),直接從SQL開始岩臣。
I.SQL與模式
II.本次學(xué)習(xí)所用到的幾個(gè)表
Student
學(xué)號(hào) Sno | 姓名 Sname | 性別 Ssex | 年齡 Sage | 所在系 Sdept |
---|---|---|---|---|
20021521 | 李勇 | 男 | 20 | CS |
20021522 | 劉晨 | 女 | 19 | CS |
20021523 | 王敏 | 女 | 18 | MA |
20021524 | 張力 | 男 | 19 | IS |
Course
課程號(hào) Cno | 課程名 Cname | 先行課 Cpno | 學(xué)分 Sage |
---|---|---|---|
1 | 數(shù)據(jù)庫 | 5 | 4 |
2 | 數(shù)學(xué) | 2 | |
3 | 信息系統(tǒng) | 1 | 4 |
4 | 操作系統(tǒng) | 6 | 3 |
5 | 數(shù)據(jù)結(jié)構(gòu) | 7 | 4 |
6 | 數(shù)據(jù)處理 | 2 | |
7 | PASCAL語言 | 6 | 4 |
CS
學(xué)號(hào) Sno | 課程號(hào) Cno | 成績(jī) Grade |
---|---|---|
20021521 | 1 | 92 |
20021521 | 2 | 85 |
20021521 | 3 | 88 |
20021522 | 2 | 90 |
20021522 | 3 | 80 |
III.SQL的數(shù)據(jù)定義語句
操作對(duì)象 | 創(chuàng)建 | 刪除 | 修改 |
---|---|---|---|
模式 | create schema | drop schema | |
表 | create table | drop table | alter table |
視圖 | create view | drop view | |
索引 | create index | drop index |
IV.創(chuàng)建表
一般格式
create table <表名> (<列名> <數(shù)據(jù)類型> [列級(jí)完整性約束]
[ , <列名> <數(shù)據(jù)類型> [列級(jí)完整性約束]]
...
[,<表級(jí)完整性約束>] );
例如:
create table Student(
Sno char(9) primary key, /*列級(jí)完整性約束溜嗜, Sno為主碼*/
Sname char(20) unique, /*列級(jí)完整性約束, Sname唯一*/
Ssex char(2),
Sage smallint,
Sdept char(20)
);
create table Course(
Cno char(4) Primary key, /*列級(jí)完整性約束架谎, Cno為主碼*/
Cname char(40),
Cpno char(4), /*Cpno是先行課*/
Ccredit smallint,
foreign key (Cpno) references Course(Cno) /*表級(jí)完整性約束炸宵,Cpno 是外碼,被參考Course,被參照Cno*/
);
create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
primary key (Sno, Cno), /* 主碼有兩個(gè)屬性構(gòu)成狐树,必須作為表級(jí)完整性約束進(jìn)行定義*/
foreign key (Sno) references Student(Sno), /*表級(jí)完整性約束焙压,Sno 是外碼,被參考Student,被參照Sno*/
foreign key (Cno) references Course(Cno) /*表級(jí)完整性約束抑钟,Cpno 是外碼涯曲,被參考Course,被參照Cno*/
);
V.關(guān)于數(shù)據(jù)類型
各個(gè)數(shù)據(jù)庫的數(shù)據(jù)類型不完全相同,選擇數(shù)據(jù)類型的原則有兩個(gè)在塔,一個(gè)是取值范圍幻件,二是要做哪些數(shù)據(jù)運(yùn)算。比如年齡:取值為100左右的正整數(shù)蛔溃,取值范圍很多數(shù)據(jù)類型都滿足绰沥,比如char(3)篱蝇、長(zhǎng)整形、短整型徽曲;運(yùn)算比如需要求平均年齡零截,這個(gè)只有長(zhǎng)整形和短整型支持,考慮到存儲(chǔ)空間的占用秃臣,故選用短整型涧衙。
數(shù)據(jù)類型 | 含義 |
---|---|
char(n) | 長(zhǎng)度為n的定長(zhǎng)字符串 |
varchar(n) | 最大長(zhǎng)度為n的變長(zhǎng)字符串 |
int | 長(zhǎng)整數(shù),也可以寫成integer |
smallint | 短整數(shù) |
numeric(p,d) | 定點(diǎn)數(shù)奥此,由p位數(shù)字(不包含小數(shù)點(diǎn)弧哎、符號(hào))組成,小數(shù)點(diǎn)后面有d為數(shù)字 |
real | 取決于機(jī)器精度的浮點(diǎn)數(shù) |
double precision | 取決于機(jī)器精度的雙精度浮點(diǎn)數(shù) |
float(n) | 浮點(diǎn)數(shù)稚虎,精度至少為n位數(shù)字 |
date | 日期撤嫩,包含年、月蠢终、日序攘,格式為 YYYY-MM-DD |
time | 時(shí)間,包含一日的時(shí)蜕径、分两踏、秒败京,格式為 HH:MM-SS |
更多數(shù)據(jù)類型請(qǐng)參考具體的數(shù)據(jù)庫廠商說明書兜喻。
VI.修改基本表
一般格式
alter table <表名>
[add <列名> <數(shù)據(jù)類型> [完整性約束]]
[drop <完整性約束 名>]
[alter column<列名> <數(shù)據(jù)類型>];
例如:
alter table Student add S_ontrance date; /*學(xué)生表增加入學(xué)時(shí)間列*/
alter table Student alter column Sage int; /*修改學(xué)生表的Sage列的數(shù)據(jù)類型為int,這個(gè)在mysql中執(zhí)行錯(cuò)誤*/
alter table Course add unique(Cname); /*增加課程名唯一的約束*/
VII.刪除表
一般格式
drop table <表名> [restrict | cascade]
restrict:刪除表示有限制的赡麦,如果該表有外鍵朴皆、視圖、觸發(fā)器泛粹、存儲(chǔ)過程遂铡、函數(shù)等約束,則刪除失敗晶姊,缺省為restrict
cascade: 刪除沒有條件扒接,刪除該表時(shí),相關(guān)聯(lián)的對(duì)象们衙,視圖等都會(huì)被刪除钾怔,使用值需謹(jǐn)慎;不同的數(shù)據(jù)庫廠商對(duì)的實(shí)現(xiàn)細(xì)節(jié)還是有差距的蒙挑,比如mysql如果該表有外鍵的話即使指定cascade也是無法刪除的宗侦。
比如:在mysq下
drop table Student restrict;
提示錯(cuò)誤信息:
[SQL] drop table Student restrict ;
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails
drop table Student cascade;
[SQL] drop table Student cascade;
[Err] 1451 - Cannot delete or update a parent row: a foreign key constraint fails
驗(yàn)證一個(gè)表只有視圖的情況下:restrict和cascade的差別:首先給SC表創(chuàng)建一個(gè)視圖,然后刪除該表忆蚀,SC表無其他關(guān)聯(lián)約束:
create view v_sc as select * from SC;
drop table SC restrict;
drop table SC cascade;
可以看到在mysql的實(shí)現(xiàn)下restrict矾利,cascade 都可以刪除表姑裂,但是視圖沒有刪除,在這一點(diǎn)上表現(xiàn)是一致的男旗。
VIII.建立索引
建立索引是加快查詢的有效手段舶斧。
一般格式
create [unique] [cluster] index <索引名稱> on <表名>(<列名>[<次序>] [,<列名>[<次序>]]...);
/**建立索引*/
create unique index StuNoIndex on Student(Sno);
IX.刪除索引
一般格式
drop index<索引名稱> on <表名>
drop index StuNoIndex on Student;
索引一旦建立,由系統(tǒng)使用并維護(hù)察皇,不需用戶干預(yù)捧毛。建立索引是為了減少查詢時(shí)間,如果數(shù)據(jù)頻繁增刪改让网,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來維護(hù)索引呀忧,從而減低了數(shù)據(jù)庫系統(tǒng)的效率,這個(gè)時(shí)候可以刪除一些不必要的索引溃睹。在RDBMS中一般采用B+樹而账、HASH索引來實(shí)現(xiàn),B+樹具有動(dòng)態(tài)平衡的優(yōu)點(diǎn)因篇,Hash索引則具有查找快速的優(yōu)點(diǎn)泞辐。索引是數(shù)據(jù)庫的內(nèi)部實(shí)現(xiàn)技術(shù),屬于內(nèi)模式范疇竞滓。至于某一索引在創(chuàng)建時(shí)是采用B+樹還是Hash索引則由具體的RDBMS來決定咐吼。