SQL查詢中的子句順序
select,from,where,group by,having,order by
前兩個是必須
SQL結構化查詢語言,即是數據操作語言又是數據定義語言。
創建表
create table movies(
title char(100),
year int,
……
)
刪除表
DROP TABLE <表名> [RESTRICT | CASCADE];
若選擇RESTRICT,則要刪除的基本表不能被其他表的約束所引用(如CHECK,FOREIGN KEY等),不能有視圖、觸發器、存儲過程等,否則將不能刪除該表。缺省默認為RESTRICT。
若選擇CASCADE,則將無條件地刪除該表,而且在刪除該基本表的同時,相關的依賴對象(如視圖)將被一起刪除。
drop table movies
修改表
ALTER TABLE <表名>?
[ADD <新列名> <數據類型> [完整性約束]]?
[ADD <完整性約束>]
[DROP <COLUMN 列名>]?
[DROP <完整性約束名>]?
[ALTER COLUMN <列名> <數據類型>];
alter table movieStar add phone char(16)
//每個元組的該字段會自動置為空值或默認值
alter table movieStar drop phone
//增加name屬性唯一的完整性約束
alter table movieStar add unique(name)
默認值
一個常量、系統函數以及NULL都可以作為默認值。
//create table中
phone char(16) default 'unlisted'
//修改表時
alter table movieStar add phone char(16) default 'unlisted
聲明鍵
1.primary key
2.unique(允許null,兩個元組不能在S的所有屬性上具有完全相同的值,除非其中
有一個是null值)
//1
name char(30) primary key
//2
primary key(title,year)
外鍵
foreign key(bookid) references notebook(id)
注意兩個屬性類型要相同
查詢
基本語句
select title AS name,length*0.016667 AS lengthInHours,'hrs.' AS inHours
from movies
where year=1990 and studioName='Disney'
第一句是個擴展投影
AS重命名,也可用空格或等號
可以用屬性名,表達式,甚至一個常量如'hrs.'
除了加減乘除這些運算符,還可以使用||進行字符串的連接
邏輯運算符優先級
NOT>AND>OR
WHERE Sage BETWEEN 20 AND 23;
WHERE Sage NOT BETWEEN 20 AND 23;
WHERE Sdept IN (‘計算機’,’經管’) ;
位串的表示
二進制:B'011'
十六進制:X'7ff'
模式匹配
s Like p
s是字符串,p是模式
%:可以與s中任意長度(包括0長度)字符串匹配
_:可與s中的任意一個字符匹配
[ ]: 指定范圍內的任意單個字符
[ ^]:不在指定范圍內的任意單個字符
LIKE ‘[CK]%’ 第1個是C或K
LIKE ‘[^A-D]%’ 第1個不是A-D之間
s NOT Like p
!!注意SQL中,用連兩個連續的單引號表示一個單引號
若需要在p中直接使用%,_需要用ESCAPE指定轉義字符,跟在轉義字符后面的%就是%本身
s Like 'x%%x%' ESCAPE 'x'(將x指定為轉義字符)
日期和時間
DATA'1983-06-17'
TIMA'15:00:02.5' 采用24小時制
TIMESTAMP'1948-05-14 12:00:00'
可以使用比較運算符,<表示前一個比后一個早
空值與涉及空值的比較
NULL
未知值,不適用的值,保留的值
1.對NULL和任何值(包括NULL)進行算術運算,結果仍是空值
x為NULL,x+3也為NULL,但NULL+3是不合法的表達式
2.比較運算結果為unknown
x=3是unknown,但NULL=3不合法
0*NULL為NULL,x-x為NULL
布爾值unknown
令true為1,unknown為1/2,false為0
1.兩個布爾值AND取兩者之間小的那個
2.兩個布爾值OR取兩者之間大的那個
3.布爾值v的非是1-v
where length<=120 or length>120
直觀上看是返回所有元組
但如果有個元組的length為null,unknown or unknown就是unknown,該元組不會被返回
就變成了返回所有length字段非空的元組
輸出排序
order by <list of attributes>
order by A,B,C+D DESC
默認升序ASC,加了DESC就是倒降序
排序位于所有子句之后,在from,where和別的子句的結果上進行排序,排序后在應用select的投影,所以排序用到的屬性不屬于投影屬性也沒關系
多關系查詢
movies(title,year,length,genre,studioName,producerC#)
movieExec(name,address,cert#,netWorth)
select name
from movies,movieExec
where title='star wars' and producerC#=cert#
當有屬性重名的時候可以用R.A
元組變量
若查詢中使用到同一個關系的多個元組,可在from中將關系R列出任意次,為每次出現的R定義一個別名 R (AS)NR
select star1.name,star2.name
from movieStar star1,movieStar star2
where star1.address=star2.address and star1.name<star2.name
查詢并,交,差
應用在多個查詢結果上,這些查詢結果提供的關系具有相同的屬性和屬性類型列表(模式相同)
交
(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)
注意這里的重命名
子查詢
某個查詢是另一個查詢的一部分
1.返回單個常量,在where子句中與另一個常量進行比較
注意是單個!!
注:一個能成為元組字段值的原子值稱為標量
select name
from movieExec
where cert#=
(select producerC#
from movies
where title='star wars')
2.子查詢返回關系在where中使用
條件表達式
s為單個的值,R為一元關系
exist R:當R非空時為真 not exist R
s in R:s等于R中的某個值
s not in R:s不等于R中的任何一個值
s > all R:s大于R中的任何一個值 not s > all R
s > any R:s至少大于R中的某個值 not s > any R
t為元組,R為關系
應用上面的條件表達式時是將t與R中的元組進行比較
select name
from movieExec
where cert# in
(select producerC#
from movies
where (title,year) in
(select movieTitle,movieYear //并沒有要求同名
from starsIn
where starName='tom'
)
)
本質上等價于
select name
from movieExec,movies,starsIn
where cert#=producerC# and
title=movieTitle and
year=movieYear and
starName='tom'
不同的是后者的結果中可能會有重復的值
關聯的子查詢
簡單的子查詢只進行一次,查詢的結果用于高層查詢
復雜的子查詢根據查詢中某項賦值的不同對子查詢進行多次
每次賦給查詢中的某項來自子查詢外部的某個元組變量的值
找出被兩部及以上電影使用過的電影名
movies(title,year,length,genre,studioName,producerC#)
select title
from movies old
where year < any
(select year
from movies
where title=old.title
)
對于該關系的每一個元組,在子查詢中找是否有一部電影與它具有相同的名字并且年份比它大(因為where也是一個一個元組帶進去比的嘛)
每次根據old的不同進行了多次查詢
3.子查詢返回關系在from中使用
要為子查詢的結果取一個元組變量別名
select name
from movieExec,(select producerC#
from movies,starsIn
where title=movieTitle and
year=movieYear and
starName='tom'
)Prod
where cert#=Prod.producerC#
SQL中的連接表達式
通過將不同的連接運算符作用在兩個關系上創建新的關系
交叉連接——>笛卡兒積
R cross join S
θ連接
R join S on C
在積運算RXS的基礎上,在根據條件C進行選擇
自然連接
對兩個關系中具有相同名字且值相同的屬性作連接
兩個等值的屬性只投影一個
R natural join S
外連接
填充懸浮元組,顯示在結果中
自然外連接
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