關(guān)系數(shù)據(jù)庫(kù)
1.關(guān)系數(shù)據(jù)結(jié)構(gòu)以及形式化定義
1.1.關(guān)系
- 域:一組具有相同數(shù)據(jù)類型的值的集合
- 笛卡爾積:域的一種集合運(yùn)算(相乘)
- 候選碼:某一屬性組的值能唯一的標(biāo)識(shí)一個(gè)元組(其子集不同)
- 主碼:選一個(gè)候選碼
- 主屬性:候選碼中的每一個(gè)屬性
- 全碼:關(guān)系模式的所有屬性是這個(gè)關(guān)系模式的候選碼(無(wú)非主屬性)
1.2.關(guān)系模式
- R(U,D,DOM,F)
- R:關(guān)系名得问,U:組成該關(guān)系的屬性名集合梳虽,DOM:屬性向域的影響集合痕貌,F(xiàn):函數(shù)依賴
2.關(guān)系操作
3.關(guān)系的完整性
3.1.實(shí)體完整性
- 以主碼為唯一標(biāo)識(shí)符
- 主碼屬性不為空
3.2.參照完整性
3.3.用戶定義的完整性
4.關(guān)系代數(shù)
- 選擇 投影Π 連接 除運(yùn)算
- 自然連接:會(huì)去掉重復(fù)的屬性列糙俗,特殊的等值連接
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL
1.SQL特點(diǎn)
- 綜合統(tǒng)一
- 高度非過(guò)程化
- 面向集合的操作方式
- 一種語(yǔ)法結(jié)構(gòu)提供多種使用方式
- 支持?jǐn)?shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu)(通過(guò)視圖模式實(shí)現(xiàn))
- SQL語(yǔ)言功能:
- 數(shù)據(jù)定義勒奇、數(shù)據(jù)操縱预鬓、數(shù)據(jù)控制
2.數(shù)據(jù)定義
操作對(duì)象 |
創(chuàng)建 |
刪除 |
修改 |
模式 |
create schema |
drop schema |
|
表 |
create table |
drop table |
alter table |
視圖 |
create view |
drop view |
|
索引 |
create index |
drop index |
alter index |
2.1.模式定義與刪除
create schema <模式名>authorization<用戶名>[<表定義子句>|<試圖定義子句>|<授權(quán)定義子句>]
drop schema <模式名><cascade|restrict>
- cascade:級(jí)聯(lián) restict:限制
2.2.表的各種操作
2.2.1.創(chuàng)建基本表
create table<表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]
······
[,<表級(jí)完整性約束條件>])
2.2.2.修改基本表
Alter Table <表名> //列級(jí)操作
[add [column]<新列名><數(shù)據(jù)類型>[完整性約束]] //增
[add <表級(jí)完整性約束>] //增
[drop [column]<列名>[cascade|restrict] ] //刪
[drop constraint<完整性約束名>[cascade|restrict]] //刪
[alter column<列名><數(shù)據(jù)類型>] //改
2.2.3.刪除基本表
drop table <表名>
2.3.索引操作
2.3.1.建立索引
create [unique][cluster] index<索引名>
on<表名>(<列名>[<次序>],······)
2.3.2.修改 刪除索引
alter index<舊索引表> rename to <新索引明>
drop index <索引名>
3.數(shù)據(jù)類型(Mysql)
3.1.Text 類型:
CHAR(size) |
保存固定長(zhǎng)度的字符串(可包含字母格二、數(shù)字以及特殊字符)劈彪。在括號(hào)中指定字符串的長(zhǎng)度。最多 255 個(gè)字符顶猜。 |
VARCHAR(size) |
保存可變長(zhǎng)度的字符串(可包含字母沧奴、數(shù)字以及特殊字符)。在括號(hào)中指定字符串的最大長(zhǎng)度长窄。最多 255 個(gè)字符滔吠。 注釋:如果值的長(zhǎng)度大于 255,則被轉(zhuǎn)換為 TEXT 類型挠日。 |
TINYTEXT |
存放最大長(zhǎng)度為 255 個(gè)字符的字符串疮绷。 |
TEXT |
存放最大長(zhǎng)度為 65,535 個(gè)字符的字符串。 |
BLOB |
用于 BLOBs (Binary Large OBjects)嚣潜。存放最多 65,535 字節(jié)的數(shù)據(jù)冬骚。 |
MEDIUMTEXT |
存放最大長(zhǎng)度為 16,777,215 個(gè)字符的字符串。 |
MEDIUMBLOB |
用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字節(jié)的數(shù)據(jù)只冻。 |
LONGTEXT |
存放最大長(zhǎng)度為 4,294,967,295 個(gè)字符的字符串庇麦。 |
LONGBLOB |
用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節(jié)的數(shù)據(jù)喜德。 |
ENUM(x,y,z,etc.) |
允許你輸入可能值的列表山橄。可以在 ENUM 列表中列出最大 65535 個(gè)值住诸。如果列表中不存在插入的值驾胆,則插入空值。 注釋:這些值是按照你輸入的順序存儲(chǔ)的贱呐。 可以按照此格式輸入可能的值:ENUM('X','Y','Z') |
SET |
與 ENUM 類似丧诺,SET 最多只能包含 64 個(gè)列表項(xiàng),不過(guò) SET 可存儲(chǔ)一個(gè)以上的值奄薇。 |
3.2.Number 類型:
數(shù)據(jù)類型 |
描述 |
TINYINT(size) |
-128 到 127 常規(guī)驳阎。0 到 255 無(wú)符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)馁蒂。 |
SMALLINT(size) |
-32768 到 32767 常規(guī)呵晚。0 到 65535 無(wú)符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)沫屡。 |
MEDIUMINT(size) |
-8388608 到 8388607 普通饵隙。0 to 16777215 無(wú)符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)沮脖。 |
INT(size) |
-2147483648 到 2147483647 常規(guī)金矛。0 到 4294967295 無(wú)符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)勺届。 |
BIGINT(size) |
-9223372036854775808 到 9223372036854775807 常規(guī)驶俊。0 到 18446744073709551615 無(wú)符號(hào)*。在括號(hào)中規(guī)定最大位數(shù)免姿。 |
FLOAT(size,d) |
帶有浮動(dòng)小數(shù)點(diǎn)的小數(shù)字饼酿。在括號(hào)中規(guī)定最大位數(shù)。在 d 參數(shù)中規(guī)定小數(shù)點(diǎn)右側(cè)的最大位數(shù)胚膊。 |
DOUBLE(size,d) |
帶有浮動(dòng)小數(shù)點(diǎn)的大數(shù)字故俐。在括號(hào)中規(guī)定最大位數(shù)。在 d 參數(shù)中規(guī)定小數(shù)點(diǎn)右側(cè)的最大位數(shù)紊婉。 |
DECIMAL(size,d) |
作為字符串存儲(chǔ)的 DOUBLE 類型药版,允許固定的小數(shù)點(diǎn)。 |
* 這些整數(shù)類型擁有額外的選項(xiàng) UNSIGNED肩榕。通常刚陡,整數(shù)可以是負(fù)數(shù)或正數(shù)惩妇。如果添加 UNSIGNED 屬性,那么范圍將從 0 開始筐乳,而不是某個(gè)負(fù)數(shù)歌殃。
3.3.Date 類型:
數(shù)據(jù)類型 |
描述 |
DATE() |
日期。格式:YYYY-MM-DD 注釋:支持的范圍是從 '1000-01-01' 到 '9999-12-31' |
DATETIME() |
*日期和時(shí)間的組合蝙云。格式:YYYY-MM-DD HH:MM:SS 注釋:支持的范圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() |
*時(shí)間戳氓皱。TIMESTAMP 值使用 Unix 紀(jì)元('1970-01-01 00:00:00' UTC) 至今的描述來(lái)存儲(chǔ)。格式:YYYY-MM-DD HH:MM:SS 注釋:支持的范圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() |
時(shí)間勃刨。格式:HH:MM:SS 注釋:支持的范圍是從 '-838:59:59' 到 '838:59:59' |
YEAR() |
2 位或 4 位格式的年波材。 注釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69身隐,表示從 1970 到 2069廷区。 |
4.數(shù)據(jù)查詢
select [all | distinct] <目標(biāo)列表達(dá)式>···
from <表名或視圖>,··· as <別名>
where <條件表達(dá)式>
group by <列名1>[having<表達(dá)式> ]
order by <列明2>[desc|asc]
where條件 |
謂詞 |
確定范圍 |
between and,not between and |
確定集合 |
in贾铝,not in |
字符匹配 |
like隙轻,not like %aa%注意百分號(hào)的使用 ‘_’表示數(shù)量 |
空值 |
is null,is not null |
4.1.聚集函數(shù)
- 只能作用于select子句和group by 中的having子句
- 聚集函數(shù)遇到空值時(shí)垢揩,除了count(*)外玖绿,都跳過(guò)nulls
count(*) //統(tǒng)計(jì)行數(shù)
count([distinct|all] <列名>)
sum([distinct|all] <列名>) //值求和
avg([distinct|all] <列名>) //值求平均
max([distinct|all] <列名>) //最大
min([distinct|all] <列名>) //最小
4.2.連接查詢
4.2.1.自身連接
select a.cno,b.cno
from course a,course b
where a.cpno=b.cno
select *
from a left outer join b on(a.a=b.a)
4.3.嵌套查詢
- 查詢塊:select-from-where
- 將查詢塊作為一個(gè)查詢中的where中叁巨,為嵌套查詢
- 注意 IN(多值) 和 = 的使用
- 子查詢中不可用 order by斑匪,必須放在最終查詢中
select *
from a
where a IN (
select a
from b
)
- 有些嵌套查詢可以用連接運(yùn)算代替(不相關(guān)子查詢)
- 相關(guān)子查詢/不相關(guān)子查詢,取決于子查詢是否受父查詢影響
- 子查詢結(jié)果為單值時(shí)锋勺,可用 > < != = ;
- 子查詢結(jié)果為多值時(shí)蚀瘸,可用 >any <any !=any IN ;
4.3.1.帶有EXISTS謂詞的子查詢
- exists 的子查詢不返回?cái)?shù)據(jù),返回true宙刘,false
- 存在 not exists的用法
select *
from a
where EXISTS (
select *
from b
)
5.數(shù)據(jù)更新
5.1.插入數(shù)據(jù)
5.1.1.插入元組
insert into <tableName> [<屬性列1>,<屬性列2>,···]
values (<常量1>苍姜,<常量2>牢酵,···)
- 如果只給出表名悬包,不給出屬性列,意味著新元組要在所有屬性列上賦值馍乙,并且次序一一對(duì)應(yīng)
5.2.2.插入子查詢結(jié)果
insert into <tableName> [<屬性列1>,<屬性列2>,···]
子查詢
- 屬性列和子查詢中 【select 屬性列1,屬性列2】要一一對(duì)應(yīng)
5.2.修改數(shù)據(jù)
update <tableName>
set <列名> = <表達(dá)式>布近,···
[where <條件>]
- 如果不指定 where 則表示要修改表中的所有元組
5.3.刪除數(shù)據(jù)
delete from <tablename>
[where <條件>]
- 省略where則表示刪除表中所有元素,但保留表
- delete 是對(duì)表內(nèi)部的操作丝格,不對(duì)表級(jí)單位操作
5.4.空值的判斷
- is null 和is not null 來(lái)判斷
- =null 來(lái)賦值空值
6.視圖
- 視圖是從一個(gè)表或多個(gè)表切分出來(lái)的表撑瞧,是一張?zhí)摫?/li>
- 數(shù)據(jù)庫(kù)中只存放視圖的定義,不存放視圖的數(shù)據(jù)显蝌,數(shù)據(jù)還是在原表中预伺。
- 可以理解為 觀察角度 的不同
6.1.定義視圖
create view <視圖名>[<列名>订咸,···]
as <子查詢>
[with check option]
create view stu1
as
select sno,sname
from stu
where sedpt='is'
with check option //加入此句,表示在插入修改刪除時(shí)酬诀,會(huì)自動(dòng)加上sdept='is'的條件
- 視圖名后面的列名脏嚷,要么全部寫出,要么全部忽略瞒御,默認(rèn)select中的屬性父叙。不存在列出部分列名情況
- 行列子集視圖:如果一個(gè)視圖是從一個(gè)基本表中導(dǎo)出的,并去掉了某些行列肴裙,但保留了主碼趾唱。
- 分組視圖:帶有聚集函數(shù)和group by子句的子句的查詢來(lái)定義視圖
6.2.刪除視圖
Drop view <視圖名> [cascade]
- cascade表示刪除由該視圖衍生出的子視圖
- 刪除基本表后,由該產(chǎn)生的視圖無(wú)法使用蜻懦,但需要調(diào)用該語(yǔ)句甜癞,才能刪除視圖定義
6.3.更新/查詢視圖
- 視圖消解:從數(shù)據(jù)字典取出視圖定義,處理視圖宛乃,轉(zhuǎn)換成對(duì)基本表的查詢带欢,再執(zhí)行修正了的查詢
- 因?yàn)橐晥D是不存儲(chǔ)數(shù)據(jù)的虛表,所以對(duì)視圖的各種操作烤惊,都要轉(zhuǎn)為對(duì)基本表的操作乔煞,即視圖消解
6.4.視圖的作用
- 簡(jiǎn)化用戶操作
- 使用戶多角度看待同一數(shù)據(jù)
- 為重構(gòu)數(shù)據(jù)庫(kù)提供了一定程度的邏輯獨(dú)立性
- 可以提供安全保護(hù)
- 可以更清楚的表達(dá)查詢