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