?《數(shù)據(jù)庫(kù)系統(tǒng)概念》4-DDL、集合運(yùn)算币叹、嵌套子查詢(xún)

一润歉、DDL

a) SQL Data Definition

SQL的基本數(shù)據(jù)類(lèi)型有char(n)、varchar(n)颈抚、int踩衩、smallint、numeric(p,d)、real,double precision驱富、float(n)等锚赤,int smallint real float依賴(lài)機(jī)器的精度

b) char(n)不夠的用空格補(bǔ)齊,比較兩個(gè)char(n)時(shí)會(huì)先補(bǔ)齊成一樣的長(zhǎng)度褐鸥;比較char和varchar時(shí)有的數(shù)據(jù)庫(kù)會(huì)先補(bǔ)齊线脚,但有的不會(huì),所以存儲(chǔ)字符串時(shí)最好都用varchar叫榕;

c)表結(jié)構(gòu)的定義:

類(lèi)似Create table department (dept_name varchar(20), budget numeric(12,2), primary key(dept_name));

定義表結(jié)構(gòu)的通用形式為:

Create table r

(A1, D1,

… ,

integrity-constraint1,

integrity-constraint2,

…);

常用的一致性約束類(lèi)型有:主鍵浑侥、外鍵、非空

二晰绎、集合運(yùn)算和null

a) 集合運(yùn)算包括并集union寓落、交集intersect、差集except寒匙。比如要查詢(xún)2009年秋季開(kāi)課的課程和2010年春季開(kāi)課課程分別為:

select course_id

from section

where semester=’Fall’ and year=2009

select course_id

from section

where semester=’Spring’ and year=2010

要得出兩個(gè)季度所有的課程可以用Union零如;使用intersect可以查找到兩個(gè)季度都開(kāi)課的課程躏将;而使用except可以得到第一個(gè)結(jié)果集中存在但第二個(gè)結(jié)果集不存在的內(nèi)容锄弱,這三種操作如果不需要去重,可以對(duì)應(yīng)使用union all, intersect all, except al祸憋。

b)Null

null與其它值類(lèi)型的算術(shù)運(yùn)算結(jié)果都為null会宪;

比較運(yùn)算中,1

AND :

true,unknown=unknown

false,unknown=false

unknown, unknown= unknown

OR:

true, unknown=true

false, unknown= unknown

unknown, unknown= unknown

NOT:

NOT unknown= unknown

三蚯窥、嵌套子查詢(xún)(Nested Subqueries)

子查詢(xún)是嵌套在另一個(gè)查詢(xún)中的select-from-where表達(dá)式掸鹅,用于對(duì)集合的成員資格進(jìn)行檢查以及對(duì)集合的比較。

a)檢查集合成員資格

比如前面用交集操作實(shí)現(xiàn)的查詢(xún)也可以寫(xiě)為:

select course_id

from section

where semester=’Fall’ and year=2009 and

course_id in (select course_id

from section

where semester=’Spring’ and year=2010)

可見(jiàn)SQL實(shí)現(xiàn)同一查詢(xún)目的的方法可以是多樣的拦赠。

b)集合的比較

集合比較用到的寫(xiě)法有>some, >=some, =some, >all等巍沙,比如要查找比生物系中至少一位教師工資高的人,可以寫(xiě)為:

select distinct T.name

from instructor as T, instructor as S

where T.salary > S.salary and S.dept name = ‘Biology’

也可以使用>some的寫(xiě)法:

select name

from instructor

where salary > some (select salary

from instructor

where dept name = ‘Biology’);

c)空關(guān)系測(cè)試

可以用exist來(lái)測(cè)試關(guān)系中是否存在元組荷鼠,對(duì)應(yīng)還有not exist

前面要查詢(xún)的2009秋季和2010春季都開(kāi)課的課程句携,也可以寫(xiě)為:

select course id

from section as S

where semester = ‘Fall’ and year= 2009 and

exists (select *

from section as T

where semester = ‘Spring’ and year= 2010 and S.course id= T.course id);

d)測(cè)試重復(fù)元組

使用unique來(lái)檢查關(guān)系中是否存在重復(fù)元組,對(duì)應(yīng)也有not unique允乐。比如要查找2009年秋季至多開(kāi)課一次的課程:

select T.course id

from course as T

where unique (select R.course id

from section as R

where T.course id= R.course id and R.year = 2009);

對(duì)于當(dāng)時(shí)沒(méi)開(kāi)課的課程矮嫉,因?yàn)榻Y(jié)果為empty,unique對(duì)empty的計(jì)算結(jié)果也是true

e)From子句中的子查詢(xún)

在from子句中也可以使用子查詢(xún)牍疏,因?yàn)槿魏蝧elect-from-where返回的結(jié)果都是關(guān)系蠢笋,所以可以在其上面繼續(xù)使用from子句。

查詢(xún)平均薪水超過(guò)42000的部門(mén)鳞陨,如果使用having子句可以是:

select dept name, avg (salary) as avg_salary

from instructor

group by dept name

having avg (salary) > 42000;

也可以采用From子查詢(xún)的方式:

select dept name, avg_salary

from (select dept name, avg (salary) as avg salary

from instructor

group by dept name)

where avg_salary > 42000;

同時(shí)還可以為from子查詢(xún)的的表和字段重命名:

select dept name, avg_salary

from (select dept name, avg (salary)

from instructor

group by dept name)

as dept_avg (dept name, avg_salary)

where avg salary > 42000;

f)With子句

with子句用來(lái)定義臨時(shí)關(guān)系昨寞,這個(gè)定義只對(duì)包含with子句的查詢(xún)有效。比如查詢(xún)擁有最多預(yù)算的部門(mén),可以使用子查詢(xún)援岩,但子查詢(xún)往往結(jié)構(gòu)復(fù)雜熟史、可讀性差,而使用with子句就會(huì)好很多:

with max budget (value) as

(select max(budget)

from department)

select budget

from department, max budget

where department.budget = max budget.value;

雖然with子句只能在緊接著的查詢(xún)中使用窄俏,但比子查詢(xún)方便的是蹂匹,它可以被多次使用。

g)標(biāo)量查詢(xún)

標(biāo)量查詢(xún)是指返回結(jié)果只是一個(gè)值的子查詢(xún)凹蜈,比如查詢(xún)每個(gè)部門(mén)的員工人數(shù):

select dept_name,

(select count(*)

from instructor

where department.dept_name = instructor.dept name)

as num instructors

from department;

由于使用了count限寞,這兒的子查詢(xún)結(jié)果只有一個(gè)值,雖然這仍然是一張表仰坦,但數(shù)據(jù)庫(kù)會(huì)自動(dòng)從表中取出值使用履植。標(biāo)量查詢(xún)可應(yīng)用于select, where, having等處。而且編譯時(shí)無(wú)法確保子查詢(xún)結(jié)果確實(shí)是一個(gè)值悄晃,如果不是玫霎,在運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。

四妈橄、數(shù)據(jù)的修改

a)Insert

插入數(shù)據(jù)時(shí)可以直接使用select的結(jié)果庶近,但下面的寫(xiě)法會(huì)造成死循環(huán),插入無(wú)限多條:

insert into student

select *

from student;

而且數(shù)據(jù)庫(kù)產(chǎn)品一般會(huì)提供批量插入的方式眷蚓,用于快速地從格式化文本讀取并插入大批量的數(shù)據(jù)鼻种。

b)Update

更新數(shù)據(jù)時(shí)可以使用case when來(lái)區(qū)分不同的情況:

update instructor

set salary = case

when salary <= 100000 then salary * 1.05

else salary * 1.03

end

此外,set子句也可以使用子查詢(xún)

學(xué)習(xí)資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沙热,一起剝皮案震驚了整個(gè)濱河市叉钥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篙贸,老刑警劉巖投队,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爵川,居然都是意外死亡敷鸦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)雁芙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轧膘,“玉大人,你說(shuō)我怎么就攤上這事兔甘』寻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵洞焙,是天一觀(guān)的道長(zhǎng)蟆淀。 經(jīng)常有香客問(wèn)我拯啦,道長(zhǎng),這世上最難降的妖魔是什么熔任? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任褒链,我火速辦了婚禮,結(jié)果婚禮上疑苔,老公的妹妹穿的比我還像新娘甫匹。我一直安慰自己,他們只是感情好惦费,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布兵迅。 她就那樣靜靜地躺著,像睡著了一般薪贫。 火紅的嫁衣襯著肌膚如雪恍箭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天瞧省,我揣著相機(jī)與錄音扯夭,去河邊找鬼。 笑死鞍匾,一個(gè)胖子當(dāng)著我的面吹牛交洗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播候学,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼藕筋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纵散!你這毒婦竟也來(lái)了梳码?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伍掀,失蹤者是張志新(化名)和其女友劉穎掰茶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜜笤,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡濒蒋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了把兔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪伙。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖县好,靈堂內(nèi)的尸體忽然破棺而出围橡,到底是詐尸還是另有隱情,我是刑警寧澤缕贡,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布翁授,位于F島的核電站拣播,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏收擦。R本人自食惡果不足惜贮配,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞赂。 院中可真熱鬧泪勒,春花似錦、人聲如沸宴猾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳍置。三九已至辽剧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間税产,已是汗流浹背怕轿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辟拷,地道東北人撞羽。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衫冻,于是被迫代替她去往敵國(guó)和親诀紊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • mysql數(shù)據(jù)庫(kù)中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進(jìn)入mysqlmysql -...
    賦閑閱讀 557評(píng)論 0 0
  • 1. 問(wèn)題的提出## 在應(yīng)用系統(tǒng)開(kāi)發(fā)初期邻奠,由于開(kāi)發(fā)數(shù)據(jù)庫(kù)數(shù)據(jù)比較少,對(duì)于查詢(xún)SQL語(yǔ)句为居,復(fù)雜視圖的的編寫(xiě)等體會(huì)不出...
    七寸知架構(gòu)閱讀 5,353評(píng)論 1 111
  • 1.簡(jiǎn)介 數(shù)據(jù)存儲(chǔ)有哪些方式碌宴?電子表格,紙質(zhì)文件蒙畴,數(shù)據(jù)庫(kù)贰镣。 那么究竟什么是關(guān)系型數(shù)據(jù)庫(kù)? 目前對(duì)數(shù)據(jù)庫(kù)的分類(lèi)主要是...
    喬震閱讀 1,702評(píng)論 0 2
  • 5.多表查詢(xún) 多表查詢(xún) 目的:從多張表獲取數(shù)據(jù) 前提:進(jìn)行連接的多張表中有共同的列 等連接 通過(guò)兩個(gè)表具有相同意義...
    喬震閱讀 1,198評(píng)論 0 0
  • oracle 數(shù)據(jù)庫(kù)的scott帳號(hào)膳凝。 <>作為查詢(xún)條件時(shí)碑隆,可以使用!= 來(lái)替換蹬音。 SQL> select * f...
    莊棟棟閱讀 2,122評(píng)論 0 0