1.select語(yǔ)句
SELECT語(yǔ)句的通用形式:subquery::=SELECT [ALL | DISTINCT] { * | expr [ [AS] c_alias] {, expr [ [AS] c_alias]...}}FROM tableref {, tableref...}[WHERE search_condition][GROUP by colname {, colname...}][HAVING search_condition][ORDER BY result_colunm [ASC | DESC] {, result_colunm [ASC | DESC] ...}]subquery {UNION [ALL] | INTERSECT [ALL] | EXCEPT [ALL] subquery }
select語(yǔ)句的求解過(guò)程:
SQL-99標準規定了select語(yǔ)句中的from子句執行的是連接運算。但是實(shí)際上大多數廠(chǎng)商并沒(méi)有實(shí)現,而是通過(guò)表之間的笛卡爾積并在where子句中包含特定條件來(lái)模擬連接運算。
非相關(guān)子查詢(xún):如果內層的子查詢(xún)完全獨立于外層的子查詢(xún),即沒(méi)有接受任何來(lái)自外層的輸入數據。不然就是相關(guān)子查詢(xún)。
在非相關(guān)子查詢(xún)中時(shí),內層的子查詢(xún)會(huì )向外層提供一個(gè)查詢(xún)結果集,然后外層根據條件來(lái)利用這個(gè)結果集。
一些謂詞:IN,θ,EXISTS(有待補充)
IN謂詞:
很顯然,in謂詞有兩種用法,第一種是后面是接一個(gè)子查詢(xún),判斷expr是否在子查詢(xún)返回的結果集當中;
還有一種后面直接跟一個(gè)顯式定義的set,判斷expr是否在(val,val,val...)中
θ謂詞:
其中的θ可以取六種比較運算符:<,>,<=,>=,=,<>
需要特別注意的是SQL標準中對ANY和SOME的定義是相同的。
比如說(shuō)我們需要表達“小于任何一個(gè)”的意思:
應該表示成 < ALL (subquery) 而不是 < ANY (subquery)
θ謂詞于IN謂詞間的等價(jià)形式:
=SOME 于 IN 具有完全相同的效果
<>ALL 于 NOT IN 具有完全相同的效果
EXISTS謂詞:
注意在子查詢(xún)的select子句中為*,而不是某個(gè)屬性或者屬性集。
EXISTS謂詞需要注意兩點(diǎn):
第一,NOT EXISTS謂詞實(shí)現了關(guān)系代數中的MINUS運算
第二,雙重NOT EXISTS實(shí)現了關(guān)系代數中的DIVIDE運算
詳見(jiàn)http://fengyapizi.javaeye.com/admin/blogs/359941
三種運算,UNION,INTERSECT,EXCEPT:加上關(guān)鍵字ALL會(huì )使得SQL考慮重復的行
<1>.UNION
它實(shí)現了關(guān)系代數里面的“并運算”。union用于兩個(gè)兼容表,它可以連接任意數目的子查詢(xún)。SQL-99標準定了union可以在任何子查詢(xún)的地方使用。但是實(shí)際上大部分數據庫產(chǎn)品只支持在完整的select語(yǔ)句中使用,而不支持在包含了子查詢(xún)的謂詞中使用。
<2>.INTERSECT 實(shí)現了關(guān)系代數里面的“交運算”。
<3>.EXCEPT實(shí)現了關(guān)系代數里面的“差運算”。
注意其中的INTERSECT,EXCEPT并沒(méi)有增強SQL的能力,通過(guò)上面的not in謂詞或者not exists謂詞,我們已經(jīng)具備了這種能力。所以,很多的數據庫實(shí)際上并未實(shí)現以上兩種謂詞。
SQL提供的5個(gè)集合函數:
<1>.count,作用在有多個(gè)列值的行集上
<2>.max,min,sum,avg 作用在由簡(jiǎn)單值組成的集合上
注意集合函數與標量函數(例如upper,mod,abs,substr,length)的區別:
1.內置函數于標量函數均可以出現在select語(yǔ)句中
2.標量函數以單個(gè)行為參數,并且返回與這個(gè)行對應的單值
3.內置函數以表中所以滿(mǎn)足條件的結果集為參數,返回對應這個(gè)結果集的單值
2.Insert語(yǔ)句
INSERT INTO TABLE [(colname {, colname...})]{ values (expr | NULL {, expr |NULL...}) | subquery}需要注意的是兩點(diǎn):
1.insert語(yǔ)法不支持表別名,因此不能用別的限定名
2.insert有兩種用法,一種是后面接vlaues定義的值的集合,還有一種后面接子查詢(xún)
3.Update語(yǔ)句
UPDATE tableSET cloname={expr | null | (subquery)}{,cloname={expr | null | (subquery)...}}[WHERE condition]
4.delete語(yǔ)句
聯(lián)系客服