SQL(上)

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


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,760評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • 提到道歉大部分人會想到“對不起”“不好意思” 誰不會?連剛剛會走的小朋友都會說了 其實大家有沒有想過好的道歉不過能...
    塞外明親王閱讀 382評論 0 0
  • 想學圣人,輕欲寡歡,可我終究落入紅塵,也許,作為凡塵里的一粒谷子,我終究逃不過那片田野。 世界上最美麗風景不是你我...
    呆呆先生閱讀 335評論 3 2
  • 其實不幸福,不快樂,跟現在的工作沒太大關系,主要還是自己的原因。小時候,總在想,長大了就好了,能自己掙錢買自己想要...
    一只豬女孩都精致生活閱讀 204評論 0 0