Chapter 4 Intermediate SQL

中級SQL(Chapter 4)

Join

join.jpg

普通連接的條件


A join B on A.id=B.courseid;

根據(jù)on后面的條件將表A與B進行連接

Outer Join

與inner join和natural join不同狭归,減少了在連接中信息的丟失

  • left outer join

保留左邊的table中的所有tuple夭坪,沒有對應(yīng)的就設(shè)為null

  • right outer join

保留右邊的table中的所有tuple戈二,沒有對應(yīng)的就設(shè)為null

  • full outer join

保留兩邊的table中的所有tuple立莉,沒有對應(yīng)的就設(shè)為null

Inner Join

如果沒有說明是outer join臀蛛,默認就是inner join


視圖(View)

出于數(shù)據(jù)安全及隱私的考慮选泻,需要建立視圖

定義

v表示視圖名


create view v as <query expression>;

如果要指定視圖的屬性名,可以如下顯式指定


CREATE VIEW faculty(ID,Name,Department,Total_salary) AS

    SELECT 

        Id, name, dept_name,sum(salary)

    FROM

        instructor;

使用

  • 視圖使用起來和表沒有什么差別

  • 可以用于select from

  • 可以用于創(chuàng)建其他的視圖

物化視圖(materialized view)

如果用于定義視圖的實際關(guān)系發(fā)生改變籽腕,視圖也得隨之修改

保持物化視圖一直在最新狀態(tài)的過程稱為物化視圖的維護

不同的數(shù)據(jù)庫的更新頻率不一致

  • 有的只要實際關(guān)系一發(fā)生改變丑勤,就進行更新

  • 有的允許物化視圖過時稳强,周期性進行更新

  • 有的在視圖被訪問時進行更新

更新視圖

可以通過對某些符合要求的視圖進行插入刪除更新來影響到原表敷待,但是一般不建議

能進行操作的視圖需要滿足以下條件:

  • from子句中只有一個table

  • select中只有屬性名间涵,不包含任何表達式,聚集函數(shù)和distinct等聲明

  • 沒有被select屬性沒有not null約束榜揖,也不構(gòu)成主碼

  • query expression中不包含group by或having語句


事務(wù)(Transaction)

由查詢或/和更新語句的序列組成勾哩。當(dāng)一條sql語句被執(zhí)行時抗蠢,就隱式地開啟了事務(wù)

結(jié)束事務(wù)

  • commit work

提交當(dāng)前事務(wù),當(dāng)前事務(wù)所做的更新在數(shù)據(jù)庫中永久保存思劳。事務(wù)被提交后迅矛,自動開始新的事務(wù)

  • rollback work

回滾當(dāng)前事務(wù),撤銷該事物對數(shù)據(jù)庫所做的更新

由于有的操作不能彼此分離敢艰,要么都做要么都沒做,所以引入原子事務(wù)

格式如下


begin atomic

<transaction>

end;

其間的transaction所包含的多條語句全部完成才會提交册赛,否則回滾


完整性約束

單關(guān)系約束

  • not null 約束

在create table時


name varchar(20) not null

  • unique約束

unique(A1,A2,...)

相當(dāng)于指出屬性A1,A2,...構(gòu)成了一組候選碼钠导,如果未約束not null,那么null是可以的

  • check約束

check(P)


check(semester in ('Spring','Summer','Fall','Winer'))

或者

check(budget>0)

經(jīng)實測森瘪,MySQL不支持check語句

  • 斷言(Assertion)

域約束和參照完整性約束都只是斷言的特殊形式


create assertion <assertion name> check <predicate>;


其他數(shù)據(jù)結(jié)構(gòu)

默認值

在create table的時候可以為屬性設(shè)置默認值牡属,如果一個元組被插入到table中但是沒有被給出該屬性值的時候,就自動填充為默認值


dept_name varchar(20) default 'CS'

索引(Index)

查詢文件中的少量記錄扼睬,利用索引可以不用掃描關(guān)系中的所有元組逮栅,進行高效查詢


create index studentID_index on student(ID);

在student關(guān)系的屬性ID上創(chuàng)建了一個名為studentID_index的索引

大對象數(shù)據(jù)類型

用法和varchar,int一致

  • clob 字符數(shù)據(jù)的大對象數(shù)據(jù)類型

  • blob 二進制數(shù)據(jù)的大對象數(shù)據(jù)類型

用戶定義數(shù)據(jù)類型(類似C中的typedef)

定義type


create type Dollars as numeric(12,2) final;

create type Pounds as numeric(12,2) final;

final無實際意義

雖然Dollars和Pounds都是numeric(12,2)窗宇,但是如果把Dollars的值賦給Pounds也會出錯

強制類型轉(zhuǎn)換形式如下


cast(dept.budget to numeric(12,2));

可以用drop type或alter type修改以前創(chuàng)造過的類型

定義domain


create domain DDollars as numeric(12,2) not null;

DDollars域可以像Dollars屬性一樣使用

type與domain之間的差別

  • domain上可以聲明約束而type上不行

  • domain沒有強制類型檢查措伐,只要基本類型相同就可以相互賦值


用戶權(quán)限

權(quán)限種類:

  • select

  • insert

  • update

  • delete

授權(quán)與撤銷

  • 通過grant語句授予權(quán)限

grant <權(quán)限列表>

on <關(guān)系名或視圖名>

to <用戶/角色列表>;

可用all privileges代指所有權(quán)限

  • 在授予update/insert權(quán)限時,可以指定屬性名军俊,如果不指定侥加,就默認是關(guān)系中所有屬性的update/insert權(quán)限

如果只授予部分屬性的insert權(quán)限,那么insert時粪躬,其余屬性要么是默認值担败,要么是null


grant update(budget)

on departments

to Amit,Chen;

  • 用戶名如果是public,代指系統(tǒng)所有的當(dāng)前用戶和將來用戶

  • 通過revoke語句撤銷權(quán)限


revoke <權(quán)限列表>

on <關(guān)系名或視圖名>

from <用戶/角色列表>;

用戶角色(role)

  • 創(chuàng)建角色

create role instructor;

  • 角色可以像用戶一樣被授予權(quán)限

grant select on dept to instructor;

  • 角色也可以被授予給用戶镰官,也可以被授予給其他角色

  • 一個用戶/角色的權(quán)限包括:所有直接授予的權(quán)限提前;授予給用戶/角色的角色所擁有的權(quán)限

視圖的授權(quán)

  • 創(chuàng)建視圖的用戶在原關(guān)系上擁有的權(quán)限不會增多,如果原來沒有update權(quán)限泳唠,創(chuàng)建視圖后對視圖也不會有update權(quán)限

  • 默認函數(shù)所具有的權(quán)限是創(chuàng)建者的權(quán)限狈网,但是如果函數(shù)定義有一個額外的sql security invoker子句,那么就在調(diào)用該函數(shù)的用戶的權(quán)限下進行

模式的授權(quán)

  • 原本只有模式的擁有者才能夠執(zhí)行對模式的任何操作

  • references權(quán)限笨腥,可以像update權(quán)限那樣授予與收回孙援,允許用戶在創(chuàng)建關(guān)系時聲明foreign key


grant references(dept_name) on department to Amit;

意味著用戶Amit可以在創(chuàng)建關(guān)系時聲明外碼參照department中的dept_name

Amit定義的foreign key可以限制其他用戶對department將來的行為

  • 如果想要新建關(guān)系r上的check約束,而約束里面有參照department的子查詢扇雕,那也需要references權(quán)限

權(quán)限轉(zhuǎn)移

  • 使用以下形式進行

grant select on department to Amit with grant option;

意味著在給用戶Amit授權(quán)department上的select時拓售,還賦予其給其他用戶授予select權(quán)的權(quán)限

即被賦予給Amit的department上的select可以被Amit轉(zhuǎn)移給其他用戶

  • 以此種方式授權(quán)的在revoke時默認級聯(lián)刪除,如果Amit的權(quán)限被revoke了镶奉,那么它給予別的用戶的權(quán)限也將失效

  • 想要防止級聯(lián)刪除權(quán)限础淤,可以加關(guān)鍵字restrict


revoke select on department from Amit restrict;

  • 想要收回Amit的權(quán)限轉(zhuǎn)移能力(一些數(shù)據(jù)庫不支持)

revoke grant option for select on department from Amit;

  • 某些時候不希望這樣的級聯(lián)崭放,所以就允許權(quán)限通過角色而非用戶被授予(4.6.6)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸽凶,隨后出現(xiàn)的幾起案子币砂,更是在濱河造成了極大的恐慌,老刑警劉巖玻侥,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件决摧,死亡現(xiàn)場離奇詭異,居然都是意外死亡凑兰,警方通過查閱死者的電腦和手機掌桩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姑食,“玉大人波岛,你說我怎么就攤上這事∫舭耄” “怎么了则拷?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長曹鸠。 經(jīng)常有香客問我煌茬,道長,這世上最難降的妖魔是什么彻桃? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任宣旱,我火速辦了婚禮,結(jié)果婚禮上叛薯,老公的妹妹穿的比我還像新娘浑吟。我一直安慰自己,他們只是感情好耗溜,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布组力。 她就那樣靜靜地躺著,像睡著了一般抖拴。 火紅的嫁衣襯著肌膚如雪燎字。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天阿宅,我揣著相機與錄音候衍,去河邊找鬼。 笑死洒放,一個胖子當(dāng)著我的面吹牛蛉鹿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播往湿,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼妖异,長吁一口氣:“原來是場噩夢啊……” “哼惋戏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起他膳,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤响逢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棕孙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舔亭,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年蟀俊,在試婚紗的時候發(fā)現(xiàn)自己被綠了钦铺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡欧漱,死狀恐怖职抡,靈堂內(nèi)的尸體忽然破棺而出葬燎,到底是詐尸還是另有隱情误甚,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布谱净,位于F島的核電站窑邦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壕探。R本人自食惡果不足惜冈钦,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望李请。 院中可真熱鬧瞧筛,春花似錦、人聲如沸导盅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽白翻。三九已至乍炉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滤馍,已是汗流浹背岛琼。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巢株,地道東北人槐瑞。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像阁苞,于是被迫代替她去往敵國和親随珠。 傳聞我的和親對象是個殘疾皇子灭袁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,226評論 0 7
  • 走著走著,梅就開了 看著看著窗看,花就紅了 等著等著茸歧,地就白了 想著想著,你就來了 走過最寒冷的冬天 我記得你的微笑 ...
    樵夫筆記閱讀 103評論 0 0
  • 累了显沈,偷懶一天软瞎。
    肖爺_族長閱讀 339評論 0 4
  • 01 轉(zhuǎn)眼間,一年又差不多到底了院尔。 每年這個時候蜻展,總會格外焦慮。似乎是積攢了一年的迷茫邀摆、困頓纵顾、浮躁,總要在這時躥出...
    小毛同學(xué)文閱讀 526評論 0 13