數(shù)據(jù)庫(kù) (二)

關(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.參照完整性

  • 外碼與主碼間的引用規(guī)則

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.連接查詢

  • where連接

4.2.1.自身連接

  • 要為自身連接的表取兩個(gè)別名
select a.cno,b.cno
from course a,course b
where a.cpno=b.cno
  • 外連接
    • 左外保留左邊的所有,右置null
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á)查詢
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柒室,隨后出現(xiàn)的幾起案子渡贾,更是在濱河造成了極大的恐慌,老刑警劉巖雄右,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空骚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡擂仍,警方通過(guò)查閱死者的電腦和手機(jī)囤屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逢渔,“玉大人肋坚,你說(shuō)我怎么就攤上這事∷嗬” “怎么了智厌?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盲赊。 經(jīng)常有香客問(wèn)我铣鹏,道長(zhǎng),這世上最難降的妖魔是什么哀蘑? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任诚卸,我火速辦了婚禮葵第,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘合溺。我一直安慰自己羹幸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布辫愉。 她就那樣靜靜地躺著栅受,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恭朗。 梳的紋絲不亂的頭發(fā)上屏镊,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音痰腮,去河邊找鬼而芥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛膀值,可吹牛的內(nèi)容都是我干的棍丐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沧踏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歌逢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起翘狱,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秘案,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后潦匈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阱高,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年茬缩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赤惊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凰锡,死狀恐怖未舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寡夹,我是刑警寧澤处面,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布厂置,位于F島的核電站菩掏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昵济。R本人自食惡果不足惜智绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一野揪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞧栗,春花似錦斯稳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至殴边,卻和暖如春憎茂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锤岸。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工竖幔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人是偷。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓拳氢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛋铆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馋评,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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