sql删除元组_Lecture #02: 中级SQL
1 關(guān)系語言
在20世紀(jì)70年代,Edgar Codd發(fā)布了一篇關(guān)于關(guān)系模型的論文。最初,他只定義了數(shù)據(jù)庫在關(guān)系模型上運(yùn)行查詢的數(shù)學(xué)符號。
用戶只需要使用聲明性的語言指定他們想要的結(jié)果(例如SQL)。數(shù)據(jù)庫有責(zé)任去決定最有效率的計(jì)劃并返回結(jié)果。
關(guān)系代數(shù)基于set(無序,沒有重復(fù)),SQL基于bag(無序,有重復(fù))。
2 SQL歷史
用于關(guān)系型數(shù)據(jù)庫的聲明式查詢語言,最初是在20世紀(jì)70年代作為IBM System R項(xiàng)目的一部分開發(fā)的。IBM最初稱為“SEQUEL”(Structured English Query Language 結(jié)構(gòu)化英文查詢語言)。在20世紀(jì)80年代改名為“SQL”(Structured Query Language 結(jié)構(gòu)化查詢語言)。
這個(gè)語言由不同種類的命令組成:
SQL不是一個(gè)死(一成不變)的語言,每隔幾年就會添加新功能。SQL-92標(biāo)準(zhǔn)是一個(gè)數(shù)據(jù)庫支持SQL的最低要求。每個(gè)供應(yīng)商都在一定程度上遵循標(biāo)準(zhǔn),但同時(shí)他們也有很多自己的擴(kuò)展語法。
3 聚合
聚合函數(shù)接受一批元組作為輸入并產(chǎn)生單個(gè)標(biāo)量作為輸出。聚合函數(shù)只能用于SELECT的輸出列。
例子:獲取學(xué)生用“@cs”登錄的數(shù)量。下列3個(gè)查詢是等價(jià)的:
SELECT可以使用多個(gè)聚合函數(shù)在一個(gè)SELECT語句塊中:
SELECT一些聚合函數(shù)支持DISTINCT關(guān)鍵字:
SELECT同時(shí)輸出聚合函數(shù)列和非聚合函數(shù)列是未定義行為(e.cid在這里是未定義行為)
注:未定義行為指該行為標(biāo)準(zhǔn)中未定義,不同數(shù)據(jù)庫可能會返回不同的結(jié)果(甚至可能會報(bào)錯(cuò))
SELECT因此,其他非聚合函數(shù)的列必須使用GROUP BY命令進(jìn)行聚合:
SELECTHAVING:聚合后進(jìn)行過濾,像WHERE子句中使用GROUP BY過濾這樣
SELECT4 字符串操作
SQL標(biāo)準(zhǔn)規(guī)定字符串區(qū)分大小寫并只能使用單引號。有些函數(shù)可以在查詢的任何地方使用并操縱字符串。
Pattern Matching(模式匹配):LIKE關(guān)鍵字被用于在謂詞中的字符串匹配。
- “%” 匹配任何子串(包括空串)。
- “_” 匹配單個(gè)字符。
Concatenation(連接):兩個(gè)豎線(“||”)會連接2個(gè)或多個(gè)字符串變成1個(gè)字符串。
5 輸出重定向
除了可以直接給用戶返回結(jié)果,你還可以告訴數(shù)據(jù)庫存儲結(jié)果到另外一張表,然后你可以在后續(xù)查詢中訪問這些數(shù)據(jù)。
- New Table(新表):存儲查詢的輸出到新表中。
- Existing Table(已存在的表):存儲查詢的輸入到已經(jīng)存在表中。目標(biāo)表必須有相同的列數(shù)和相同的類型,列名可以和輸出列不匹配。
6 輸出控制
由于SQL是無序的,你必須使用ORDER BY子句去對結(jié)果進(jìn)行排序:
SELECT你可以使用多個(gè)ORDER BY子句做更復(fù)雜的排序:
SELECT你可以使用任意的表達(dá)式在ORDER BY子句中:
SELECT通常,數(shù)據(jù)庫會返回所有符合條件的元組。你可以使用LIMIT子句去限制返回元組的數(shù)量:
SELECT同時(shí)也可以提供offset去獲得一個(gè)結(jié)果的區(qū)間:
SELECT除非你使用一個(gè)ORDER BY子句搭配LIMIT,否則數(shù)據(jù)庫可能在每次查詢會返回不同的元組,因?yàn)殛P(guān)系模型不在意順序。
7 嵌套查詢
嵌套查詢可以使單個(gè)查詢中運(yùn)行更復(fù)雜的查詢。外部查詢的作用域在內(nèi)部查詢中(內(nèi)部查詢可以訪問外部查詢的屬性),反之不行。
內(nèi)部查詢可以出現(xiàn)在查詢的幾乎所有地方:
2. FROM子句:
SELECT3. WHERE子句:
SELECT例子:獲取所有報(bào)名“15-445”的學(xué)生名字
SELECT注意,根據(jù)sid出現(xiàn)的不同位置,它擁有不同的作用域。
Nest Query Results Expressions(嵌套查詢表達(dá)式):
- ALL:必須滿足子查詢中所有的行
- ANY:必須滿足子查詢中至少1行
- IN:等價(jià)于ANY()
- EXISTS:至少1行被返回
8 窗口函數(shù)
跨元組執(zhí)行“移動”計(jì)算。和聚合一樣,但它依然返回原始元組。
Functions(函數(shù)):窗口函數(shù)可以是上面討論的任意的聚合函數(shù)。同時(shí)還有一些特殊的窗口函數(shù):
Grouping(分組):OVER子句指定當(dāng)計(jì)算窗口函數(shù)的時(shí)候如何分組。使用PARTITION BY去指定分組。
SELECT你也可以在OVER中使用ORDER BY去確定結(jié)果的順序,即使數(shù)據(jù)庫內(nèi)部存儲結(jié)構(gòu)發(fā)生改變也不會影響結(jié)果。
SELECT重點(diǎn):RANK函數(shù)在窗口函數(shù)排序后計(jì)算,ROW_NUBMER函數(shù)在排序前計(jì)算。
9 公用表表達(dá)式(CTE)
公用表表達(dá)式(CTE)是窗口函數(shù)和嵌套查詢的替代方法去編寫更加復(fù)雜的查詢。可以認(rèn)為CTE是在單次查詢的一個(gè)臨時(shí)表。
WITH子句將內(nèi)部查詢的輸出綁定到臨時(shí)的結(jié)果。
例子:生成一個(gè)CTE叫cteName包含1個(gè)tuple的1個(gè)屬性,屬性值為1。這個(gè)查詢返回了cteName的所有屬性及值。
WITH你可以綁定輸出列的名字在AS之前:
WITH單個(gè)查詢可以包括多個(gè)CTE的定義:
WITH在WITH后添加RECURSIVE關(guān)鍵字允許CTE引用自己。
例子:打印1到10的序列
WITH總結(jié)
以上是生活随笔為你收集整理的sql删除元组_Lecture #02: 中级SQL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后端:Java中如何更优雅的处理空值,看
- 下一篇: 分布式数据库基础:分布式事务相关概念介绍