SQL(上)

SQL查詢中的子句順序

select,from,where,group by,having,order by
前兩個(gè)是必須


SQL結(jié)構(gòu)化查詢語(yǔ)言激率,即是數(shù)據(jù)操作語(yǔ)言又是數(shù)據(jù)定義語(yǔ)言低缩。


創(chuàng)建表

create table movies(
     title     char(100),
     year    int,
     ……
)

刪除表

DROP TABLE <表名> [RESTRICT | CASCADE];

若選擇RESTRICT嘉冒,則要?jiǎng)h除的基本表不能被其他表的約束所引用(如CHECK,F(xiàn)OREIGN KEY等)咆繁,不能有視圖讳推、觸發(fā)器、存儲(chǔ)過(guò)程等玩般,否則將不能刪除該表银觅。缺省默認(rèn)為RESTRICT。
若選擇CASCADE坏为,則將無(wú)條件地刪除該表究驴,而且在刪除該基本表的同時(shí),相關(guān)的依賴對(duì)象(如視圖)將被一起刪除匀伏。

drop table movies

修改表

ALTER TABLE <表名>?                  
[ADD <新列名> <數(shù)據(jù)類型> [完整性約束]]?    
[ADD <完整性約束>]             
[DROP <COLUMN 列名>]?                  
[DROP <完整性約束名>]?                  
[ALTER COLUMN <列名> <數(shù)據(jù)類型>];
alter table movieStar add phone char(16) 
//每個(gè)元組的該字段會(huì)自動(dòng)置為空值或默認(rèn)值
alter table movieStar drop phone
//增加name屬性唯一的完整性約束
alter table movieStar add unique(name)

默認(rèn)值

一個(gè)常量洒忧、系統(tǒng)函數(shù)以及NULL都可以作為默認(rèn)值。
//create table中
phone char(16) default 'unlisted'
//修改表時(shí)
alter table movieStar add phone char(16) default 'unlisted

聲明鍵

1.primary key
2.unique(允許null够颠,兩個(gè)元組不能在S的所有屬性上具有完全相同的值熙侍,除非其中
有一個(gè)是null值)

//1
name char(30) primary key
//2
primary key(title,year)

外鍵

foreign key(bookid) references notebook(id)
注意兩個(gè)屬性類型要相同


查詢


基本語(yǔ)句

select title AS name,length*0.016667 AS lengthInHours履磨,'hrs.' AS inHours
from movies 
where year=1990 and studioName='Disney'

第一句是個(gè)擴(kuò)展投影
AS重命名蛉抓,也可用空格或等號(hào)
可以用屬性名,表達(dá)式剃诅,甚至一個(gè)常量如'hrs.'


除了加減乘除這些運(yùn)算符巷送,還可以使用||進(jìn)行字符串的連接


邏輯運(yùn)算符優(yōu)先級(jí)
NOT>AND>OR


WHERE Sage BETWEEN 20 AND 23;
WHERE Sage NOT BETWEEN 20 AND 23综苔;
WHERE Sdept IN (‘計(jì)算機(jī)’,’經(jīng)管’) 惩系;


位串的表示
二進(jìn)制:B'011'
十六進(jìn)制:X'7ff'


模式匹配
s Like p
s是字符串位岔,p是模式
%:可以與s中任意長(zhǎng)度(包括0長(zhǎng)度)字符串匹配
_:可與s中的任意一個(gè)字符匹配
[ ]: 指定范圍內(nèi)的任意單個(gè)字符
[ ^]:不在指定范圍內(nèi)的任意單個(gè)字符

LIKE  ‘[CK]%’         第1個(gè)是C或K
LIKE  ‘[^A-D]%’     第1個(gè)不是A-D之間

s NOT Like p
!堡牡!注意SQL中抒抬,用連兩個(gè)連續(xù)的單引號(hào)表示一個(gè)單引號(hào)
若需要在p中直接使用%,_需要用ESCAPE指定轉(zhuǎn)義字符,跟在轉(zhuǎn)義字符后面的%就是%本身
s Like 'x%%x%' ESCAPE 'x'(將x指定為轉(zhuǎn)義字符)


日期和時(shí)間
DATA'1983-06-17'
TIMA'15:00:02.5' 采用24小時(shí)制
TIMESTAMP'1948-05-14 12:00:00'
可以使用比較運(yùn)算符晤柄,<表示前一個(gè)比后一個(gè)早


空值與涉及空值的比較
NULL
未知值擦剑,不適用的值,保留的值
1.對(duì)NULL和任何值(包括NULL)進(jìn)行算術(shù)運(yùn)算芥颈,結(jié)果仍是空值
x為NULL惠勒,x+3也為NULL,但NULL+3是不合法的表達(dá)式
2.比較運(yùn)算結(jié)果為unknown
x=3是unknown爬坑,但NULL=3不合法
0*NULL為NULL纠屋,x-x為NULL


布爾值unknown
令true為1,unknown為1/2盾计,false為0
1.兩個(gè)布爾值A(chǔ)ND取兩者之間小的那個(gè)
2.兩個(gè)布爾值OR取兩者之間大的那個(gè)
3.布爾值v的非是1-v

where length<=120 or length>120
直觀上看是返回所有元組
但如果有個(gè)元組的length為null售担,unknown or unknown就是unknown,該元組不會(huì)被返回
就變成了返回所有l(wèi)ength字段非空的元組

輸出排序

order by <list of attributes>
order by A,B,C+D DESC

默認(rèn)升序ASC署辉,加了DESC就是倒降序
排序位于所有子句之后族铆,在from,where和別的子句的結(jié)果上進(jìn)行排序哭尝,排序后在應(yīng)用select的投影哥攘,所以排序用到的屬性不屬于投影屬性也沒(méi)關(guān)系


多關(guān)系查詢


movies(title,year,length,genre,studioName,producerC#)
movieExec(name,address,cert#,netWorth)
select name
from movies,movieExec
where title='star wars' and producerC#=cert#

當(dāng)有屬性重名的時(shí)候可以用R.A


元組變量
若查詢中使用到同一個(gè)關(guān)系的多個(gè)元組,可在from中將關(guān)系R列出任意次材鹦,為每次出現(xiàn)的R定義一個(gè)別名 R (AS)NR

select star1.name,star2.name
from movieStar star1,movieStar star2
where star1.address=star2.address and star1.name<star2.name

查詢并逝淹,交,差
應(yīng)用在多個(gè)查詢結(jié)果上侠姑,這些查詢結(jié)果提供的關(guān)系具有相同的屬性和屬性類型列表(模式相同)

交
(select name,address from movieStar where gender='F')
intersect
(select name,address from movieExec where netWorth>10000000)

差
(select name创橄,address from movieStar)
except
(select name,address from movieExec)

并
(select title莽红,year from movie)
union
(select movieTitle as title,movieYear as year from starsIn)
注意這里的重命名

子查詢

某個(gè)查詢是另一個(gè)查詢的一部分


1.返回單個(gè)常量邦邦,在where子句中與另一個(gè)常量進(jìn)行比較
注意是單個(gè)0灿酢!
注:一個(gè)能成為元組字段值的原子值稱為標(biāo)量

select name
from movieExec
where cert#=
         (select producerC#
          from movies
          where title='star wars')

2.子查詢返回關(guān)系在where中使用
條件表達(dá)式
s為單個(gè)的值燃辖,R為一元關(guān)系
exist R:當(dāng)R非空時(shí)為真 not exist R
s in R:s等于R中的某個(gè)值
s not in R:s不等于R中的任何一個(gè)值
s > all R:s大于R中的任何一個(gè)值 not s > all R
s > any R:s至少大于R中的某個(gè)值 not s > any R

t為元組鬼店,R為關(guān)系
應(yīng)用上面的條件表達(dá)式時(shí)是將t與R中的元組進(jìn)行比較

select name
from movieExec
where cert# in
          (select producerC#
           from movies
           where (title,year) in
                      (select movieTitle,movieYear            //并沒(méi)有要求同名
                       from starsIn
                       where starName='tom'
                       )
           )

本質(zhì)上等價(jià)于

select name
from movieExec,movies,starsIn
where cert#=producerC# and
           title=movieTitle and
           year=movieYear and
           starName='tom'

不同的是后者的結(jié)果中可能會(huì)有重復(fù)的值


關(guān)聯(lián)的子查詢
簡(jiǎn)單的子查詢只進(jìn)行一次,查詢的結(jié)果用于高層查詢
復(fù)雜的子查詢根據(jù)查詢中某項(xiàng)賦值的不同對(duì)子查詢進(jìn)行多次
每次賦給查詢中的某項(xiàng)來(lái)自子查詢外部的某個(gè)元組變量的值

找出被兩部及以上電影使用過(guò)的電影名
movies(title,year,length,genre,studioName,producerC#)
select title
from movies old
where year < any
          (select year
           from movies
           where title=old.title
          )

對(duì)于該關(guān)系的每一個(gè)元組黔龟,在子查詢中找是否有一部電影與它具有相同的名字并且年份比它大(因?yàn)閣here也是一個(gè)一個(gè)元組帶進(jìn)去比的嘛)
每次根據(jù)old的不同進(jìn)行了多次查詢


3.子查詢返回關(guān)系在from中使用
要為子查詢的結(jié)果取一個(gè)元組變量別名

select name
from movieExec,(select producerC#
                             from movies,starsIn
                             where title=movieTitle and
                                        year=movieYear and
                                        starName='tom'
                             )Prod
where cert#=Prod.producerC#

SQL中的連接表達(dá)式

通過(guò)將不同的連接運(yùn)算符作用在兩個(gè)關(guān)系上創(chuàng)建新的關(guān)系


交叉連接——>笛卡兒積
R cross join S


θ連接
R join S on C
在積運(yùn)算RXS的基礎(chǔ)上妇智,在根據(jù)條件C進(jìn)行選擇


自然連接
對(duì)兩個(gè)關(guān)系中具有相同名字且值相同的屬性作連接
兩個(gè)等值的屬性只投影一個(gè)
R natural join S


外連接
填充懸浮元組滥玷,顯示在結(jié)果中
自然外連接
R natural full outer join S
R natural left outer join S
R natural right outer join S
自然θ連接
R full outer join S on C
R left outer join S on C
R right outer join S on C


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巍棱,隨后出現(xiàn)的幾起案子惑畴,更是在濱河造成了極大的恐慌,老刑警劉巖航徙,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如贷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡到踏,警方通過(guò)查閱死者的電腦和手機(jī)杠袱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窝稿,“玉大人楣富,你說(shuō)我怎么就攤上這事“槔疲” “怎么了菩彬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)潮梯。 經(jīng)常有香客問(wèn)我骗灶,道長(zhǎng),這世上最難降的妖魔是什么秉馏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任耙旦,我火速辦了婚禮,結(jié)果婚禮上萝究,老公的妹妹穿的比我還像新娘免都。我一直安慰自己,他們只是感情好帆竹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布绕娘。 她就那樣靜靜地躺著,像睡著了一般栽连。 火紅的嫁衣襯著肌膚如雪险领。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天秒紧,我揣著相機(jī)與錄音绢陌,去河邊找鬼。 笑死熔恢,一個(gè)胖子當(dāng)著我的面吹牛脐湾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叙淌,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秤掌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼愁铺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闻鉴,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茵乱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后椒拗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體似将,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蚀苛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了在验。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堵未,死狀恐怖腋舌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渗蟹,我是刑警寧澤块饺,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站雌芽,受9級(jí)特大地震影響授艰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜世落,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一淮腾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屉佳,春花似錦谷朝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至体箕,卻和暖如春专钉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背干旁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工驶沼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人争群。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像大年,于是被迫代替她去往敵國(guó)和親换薄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玉雾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法轻要,內(nèi)部類的語(yǔ)法复旬,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法冲泥,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理驹碍,服務(wù)發(fā)現(xiàn),斷路器凡恍,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 提到道歉大部分人會(huì)想到“對(duì)不起”“不好意思” 誰(shuí)不會(huì)嚼酝?連剛剛會(huì)走的小朋友都會(huì)說(shuō)了 其實(shí)大家有沒(méi)有想過(guò)好的道歉不過(guò)能...
    塞外明親王閱讀 362評(píng)論 0 0
  • 想學(xué)圣人浮还,輕欲寡歡,可我終究落入紅塵闽巩,也許钧舌,作為凡塵里的一粒谷子,我終究逃不過(guò)那片田野涎跨。 世界上最美麗風(fēng)景不是你我...
    呆呆先生閱讀 317評(píng)論 3 2
  • 其實(shí)不幸福洼冻,不快樂(lè),跟現(xiàn)在的工作沒(méi)太大關(guān)系隅很,主要還是自己的原因撞牢。小時(shí)候,總在想外构,長(zhǎng)大了就好了普泡,能自己掙錢(qián)買(mǎi)自己想要...
    一只豬女孩都精致生活閱讀 191評(píng)論 0 0