SQL數(shù)據(jù)類(lèi)型、基本表的定義、索引定義

前言

由于最近做消息中心后臺(tái)開(kāi)發(fā),需要進(jìn)行數(shù)據(jù)庫(kù)的操作,在編寫(xiě)SQL(mybatis)上略感吃力,于是復(fù)習(xí)一下大學(xué)時(shí)代所學(xué)習(xí)的數(shù)據(jù)庫(kù)的相關(guān)基礎(chǔ)知識(shí),直接從SQL開(kāi)始。

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ù)庫(kù) 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語(yǔ)言 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ù)定義語(yǔ)句

操作對(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ù)類(lèi)型> [列級(jí)完整性約束]
    [ , <列名> <數(shù)據(jù)類(lèi)型> [列級(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ù)類(lèi)型

各個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型不完全相同,選擇數(shù)據(jù)類(lèi)型的原則有兩個(gè),一個(gè)是取值范圍,二是要做哪些數(shù)據(jù)運(yùn)算。比如年齡:取值為100左右的正整數(shù),取值范圍很多數(shù)據(jù)類(lèi)型都滿足,比如char(3)、長(zhǎng)整形、短整型;運(yùn)算比如需要求平均年齡,這個(gè)只有長(zhǎng)整形和短整型支持,考慮到存儲(chǔ)空間的占用,故選用短整型。

數(shù)據(jù)類(lèi)型 含義
char(n) 長(zhǎng)度為n的定長(zhǎng)字符串
varchar(n) 最大長(zhǎng)度為n的變長(zhǎng)字符串
int 長(zhǎng)整數(shù),也可以寫(xiě)成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ù)類(lèi)型請(qǐng)參考具體的數(shù)據(jù)庫(kù)廠商說(shuō)明書(shū)。

VI.修改基本表

一般格式

alter table <表名> 
    [add <列名> <數(shù)據(jù)類(lèi)型> [完整性約束]]
    [drop <完整性約束 名>]
    [alter column<列名> <數(shù)據(jù)類(lèi)型>];

例如:

alter table Student add S_ontrance date;  /*學(xué)生表增加入學(xué)時(shí)間列*/

alter table Student alter column Sage int; /*修改學(xué)生表的Sage列的數(shù)據(jù)類(lèi)型為int,這個(gè)在mysql中執(zhí)行錯(cuò)誤*/

alter table Course add unique(Cname); /*增加課程名唯一的約束*/

VII.刪除表

一般格式

drop table <表名> [restrict | cascade] 

restrict:刪除表示有限制的,如果該表有外鍵、視圖、觸發(fā)器、存儲(chǔ)過(guò)程、函數(shù)等約束,則刪除失敗,缺省為restrict

cascade: 刪除沒(méi)有條件,刪除該表時(shí),相關(guān)聯(lián)的對(duì)象,視圖等都會(huì)被刪除,使用值需謹(jǐn)慎;不同的數(shù)據(jù)庫(kù)廠商對(duì)的實(shí)現(xiàn)細(xì)節(jié)還是有差距的,比如mysql如果該表有外鍵的話即使指定cascade也是無(wú)法刪除的。

比如:在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表無(wú)其他關(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 都可以刪除表,但是視圖沒(méi)有刪除,在這一點(diǎn)上表現(xiàn)是一致的。

VIII.建立索引

建立索引是加快查詢的有效手段。

一般格式

create [unique] [cluster] index <索引名稱(chēng)> on <表名>(<列名>[<次序>] [,<列名>[<次序>]]...);
/**建立索引*/
create unique index StuNoIndex on Student(Sno);

IX.刪除索引

一般格式

drop index<索引名稱(chēng)> on <表名>
drop index StuNoIndex on Student;

索引一旦建立,由系統(tǒng)使用并維護(hù),不需用戶干預(yù)。建立索引是為了減少查詢時(shí)間,如果數(shù)據(jù)頻繁增刪改,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引,從而減低了數(shù)據(jù)庫(kù)系統(tǒng)的效率,這個(gè)時(shí)候可以刪除一些不必要的索引。在RDBMS中一般采用B+樹(shù)、HASH索引來(lái)實(shí)現(xiàn),B+樹(shù)具有動(dòng)態(tài)平衡的優(yōu)點(diǎn),Hash索引則具有查找快速的優(yōu)點(diǎn)。索引是數(shù)據(jù)庫(kù)的內(nèi)部實(shí)現(xiàn)技術(shù),屬于內(nèi)模式范疇。至于某一索引在創(chuàng)建時(shí)是采用B+樹(shù)還是Hash索引則由具體的RDBMS來(lái)決定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容