Sql語句的分類詳細總結
SQL包含四種程式設計語言類別的語句:
資料定義語言(DDL)、資料操作語言(DML)、資料控制語言(DCL)和事物控制語言(TCL)。
Data Definition Language(DDL)
DDL使我們有能力建立或刪除表格。也可以定義索引(鍵),規定表之間的連結,以及施加表間的約束。
CREATE DATABASE - 建立新資料庫
ALTER DATABASE - 修改資料庫
CREATE TABLE - 建立新表
ALTER TABLE - 變更(改變)資料庫表
DROP TABLE - 刪除表
CREATE INDEX - 建立索引(搜尋鍵)
DROP INDEX - 刪除索引
Data Manipulation Language(DML)
供使用者實現對資料的追加、刪除、更新、查詢等操作。
SELECT - 從資料庫表中獲取資料
UPDATE - 更新資料庫表中的資料
DELETE - 從資料庫表中刪除資料
INSERT INTO - 向資料庫表中插入資料
Data Control Language(DCL)
GRANT - 授權
REVOKE - 撤銷授權
DENY - 拒絕授權
Transaction Control Language(TCL)
SAVEPOINT - 設定儲存點
ROLLBACK - 回滾
COMMIT - 提交
Sql語句的分類詳細總結
一、 資料定義語言DDL(Data Ddefinition Language)
SQL資料定義語言主要用來定義邏輯結構,包括定義基表,檢視和索引。
1、 定義
定義表
Create table<表名> (<列名字><資料型別>[列級完整性約束條件] , ………….);
定義檢視
檢視:從一個或者幾個基表或者檢視匯出的表(結果集),是一個邏輯上的虛表。資料庫中只存放檢視的定義,不存放檢視的資料。所以基表的資料變化,檢視的資料也會跟著變化。
Create view <檢視名> [(列名),(列名)…] as <子查詢> [with check option]
子查詢可以是不包含order by 子句 和 distinct 短句的任意複雜select語句。
定義索引
Create[unque][cluster] index <索引名> on <表名>[次序] (<列名>……..)
Unique選項表示此索引的每一個索引值不能重複,對應唯一的資料記錄。
Cluster 選項表示要建立的索引是聚簇索引。
<表名>是所需要建立索引的基表的名稱。索引可以建立在對應標的一列或者多列上,個列名之間用逗號分隔。
(次序)指定了索引值的排列次序,ASC升序,DESC降序。預設值ASC。
聚簇索引:指索引項的順序與表中記錄的物理順序相一致的索引組織。(聚簇索引是將索引和表記錄一起存放,一個基表只能建立一個聚簇索引。)(建立聚簇索引後,更新列資料時會導致表記錄的物理順序的變更,代價較高,經常更新的列不宜建立索引)
2、 修改
Alter table 語句
Alter table<表名>
[Add <新列名><資料型別>[完整性約束]]
[drop <完整性約束名>]
[modify <列名><資料型別>];
<表名>表示所要修改的基表,ADD子句用於增加新列和完整性約束條件,DROP子句用於三處指定的完整性約束條件,MODIFY子句用於修改原有的列定義,修改列名和資料型別
3、 刪除
刪除表
Drop table <表名>;
刪除表後,表中的資料,表上的索引都將別刪除。在oracle中,刪除基表後,建立在表上的檢視依然在資料字典中,但是使用者引用會報錯。
刪除檢視
Drop view <檢視名>;
檢視是定義在了資料字典中的。
刪除索引:
索引由系統進行維護,如果資料頻繁的刪改,系統維護索引的時間就會增加,此時可以刪除不必要的索引。索引刪除後,系統會從資料字典中清除該索引的描述。
二、 資料查詢語言DQL(Data Query Language)
SQL的資料查詢語言主要用來對資料庫中的各種資料物件進行查詢。
完整語法:
SELECT[ALL | DISTINCT] TOP n[PERCENT] WITH TIES select_list
[INTO[new table name]]
[FROM{table_name | view_name} [(optimizer_hints)]
[,{table_name2| view_name2} [(optimizer_hints)]
[…,table_name6|view_name6][(optimizer hints)]]]
[WHERE clause]
[GROUPBY clause]
[HAVING clause]
[ORDERBY clause]
[COMPUTE clause]
[FORBROW SE]
SQL 查詢語句的解析順序:
1、from子句組裝來自不同資料來源的資料;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將資料劃分為多個分組;
4、使用聚集函式進行計算;
5、使用having子句篩選分組;
6、計算所有的表示式;
7、select 的欄位;
8、使用order by對結果集進行排序。
SQL語言不同於其他程式語言的最明顯特徵是處理程式碼的順序。在大多資料庫語言中,程式碼按編碼順序被處理。
簡單查詢
僅含有SELECT子句和FROM子句的查詢就是簡單查詢。
1.使用FROM子句指定表
Select語句的不同部分常用來指定要從資料庫返回的資料。Select語句使用from子句指定查詢中包含的行和列所在的表。
2.使用SELECT指定列
使用者可以指定查詢表中的某些列,屬於投影操作。列名跟在SELECT關鍵詞後面,每個列名用逗號隔開。
SELECTcolumn name1,……,column_name_n FROM table_name_1,….. table_name_n
4.算術表示式
5.在SELECT語句中可以使用算術表示式,+-*/和()
6.DISTINCT關鍵字
去除重複行
例:SELECT distinct deptno_id from emp;
在select 語句中使用distinct 篩選重複
7.WHERE子句
WHERE 子句用於篩選從from子句中返回的值,完成選擇操作
子句中的條件表示式
A=B 表示A值=B值,返回true
A>B
A<B
A!=B或A<>B 表示不等
A LIKE B (萬用字元 % 任意字元 ,_代表任意一個字元)
NOT <條件表示式> NOT運算子用於對結果取反。
子語句中的連線運算子
常用連線運算子:AND和OR。AND 左右兩邊都是TRUE才是TRUE OR 是一邊為TRUE就為TRUZ
子語句中的NULL值
NULL是一個特定的術語,稱之為空。
這是NULL的由來、也是NULL的基礎,所有和NULL相關的操作的結果都可以從NULL的概念推匯出來。
判斷一個欄位是否為NULL,應該用IS NULL或IS NOT NULL,而不能用‘=’。對NULL的判斷只能定性,既是不是NULL(IS NULL/IS NOT NULL),而不能定值。簡單的說,由於NULL存在著無數的可能,因此兩個NULL不是相等的關係,同樣也不能說兩個NULL就不相等,或者比較兩個NULL的大小,這些操作都是沒有意義,得不到一個確切的答案的。因此,對NULL的=、!=、>、<、>=、<=等操作的結果都是未知的,也就算說,這些操作的結果仍然是NULL。
同理,對NULL進行+、-、*、/等操作的結果也是未知的,所以也是NULL。
所以,很多時候會這樣總結NULL,除了IS NULL、IS NOT NULL以外,對NULL的任何操作的結果還是NULL。
上面這句話總結的很精闢,而且很好記,所以很多時候人們只記得這句話,而忘了這句話是如何得到的。其實只要清楚NULL的真正含義,在處理NULL的時候就不會出錯。
8.ORDERBY 子句(在select語句後執行)
ORDERBY 子句可以對結果集中的資料進行排序。
語法:
SELECT column_list
FROM table_name
ORDERBY[(order_by_expression[ASC|DESC])……]
order_by_expression表示將要排序的列名或者由列名組成的表示式,關鍵字ASC升序排列,DESC降序排列。
9.GROUPBY 語句
用於在查詢結果集中對記錄進行分組,以彙總數居或者為整個分組顯示單行的彙總資訊。
使用GROUPBY 子句,必須滿足下面的條件:
在SELECT子句的後面只可以有兩類表示式:統計函式和進行分組的列名。
在SELECT子句中的列名必須是進行分組的列,初次之外新增其他的列名都是錯誤的,但是GROUP BY 子句後面的列名可以不出現在SELECT子句中。
如果使用了WHERE子句,那麼所有參加分組計算的資料必須首先滿足WHERE子句只等的條件。
在預設情況下,將按照GROUP BY 子句指定的分組列升序排列,如果需要重新排序,可以使用ORDERBY 子句指定新的排列順序。
10.HAVING 子句
HAVING 子句通常與GROUP BY子句一起使用,在完成對分組結果統計後,使用HAVING 子句的功能對分組的結果進一步的篩選。
在SELECT 子句中使用了GROUPBY子句,那麼HAVING子句將應用於GRPUP BY建立的那些組。如果指定了WHERE子句,二沒有指定GROUP BY子句那麼HAVING子句將應用於WHERE子句的輸出,並且整個輸出別看做是一個組,如果在SELECT語句中既沒有指定WHERE子句,也沒有指定GROUP BY子句,那麼HAVING子句將應用於FROM子句的輸出,並且將其看作是一個組。
連線查詢
1.簡單鏈接
(1.基本形式
僅僅通過select子句和from子句連線多個表,查詢結果是通過笛卡爾積生成的表。(兩個錶行數的乘積)
(2.條件限定
笛卡爾積含有大量冗餘資料,一般情況下毫無意義。為了避免這種情況的出現,新增過濾條件。
(3.表的別名
表別名是在FROM子句中用於各表的間斷名稱,可以唯一的表示資料來源。
{如果為表指定了別名,那麼語句中的所有子句都必須使用別名,而不允許再使用實際的表名}
2. JOIN連線
(1.內連線
內鏈節是常用的多表查詢,用關鍵字 INNER JOIN 。可以省略 INNER。
使用內連結查詢多個表時候,在FROM子句中除了JOIN關鍵字外,必須定義一個ON子句,自定內連結操作列出與條件匹配的資料行,使用比較運算子比較被連結值。
內連結就是使用JOIN關鍵字連線兩個表,使用ON指定連線表的連線條件。記憶不限制查詢範圍,可以在後面新增where子句。
使用內連線僅僅包含符合查詢條件和連線條件的行。
(2.自然連線
其限制條件,連線的各個表之間必須具有相同名稱的列。
(3.外連結
外連線分為左外連線【LEFT OUTER JOIN 】右外連線【RIGHTOUTER JOIN 】全外連線【FULL OUTER JOIN】三種。
外連線不僅僅列出符合與連線條件相匹配的行,還列出所有符合搜尋條件的資料行。
左外連線(顯示左表)
右外連線(顯示右表)
全連結(顯示所有符合搜尋條件的資料行)
3.集合操作(複合查詢)
將兩個或者多個SQL查詢結果合併構成複合查詢。集合操作主要由集合操作實現,包括UNION(並運算),UNION ALL,INTERSECT(交運算)和MINUS(差運算)。
UNION
並運算子將多個查詢結果集相加,形成一個結果集。將第一個查詢中的所有行與第二個查詢中的所有行相加,消除其中重複行形成一個集合。
UNION ALL
UNION ALL 操作符形成的結果集中包含有兩個自結果集中重複的行。
INTERSECT
對兩個結果集中的資料,取交集
MINUS
表示差集,返回從第一個查詢中返回的,但是沒有在第二個查詢中返回的記錄。
4.子查詢
子查詢和連線查詢,都提供了使用單個查詢訪問多個表中資料的方法。子查詢在其他查詢的基礎上,提供一種進一步有效的方式來表示WHERE子句中的條件。子查詢是一個SELECT 語句,可以在SELECT,INSERT,UPDATE或DELETE語句中使用。也可以在HAVING子句中使用子查詢。
(1.IN關鍵字
使用IN關鍵可以將源表中特定列的值與子查詢返回的結果集中的值進行比較,若某行的特定列的值存在,則在SELECT語句的查詢結果中就包含這一行。
(2.EXISTS關鍵字
只需要考慮是否滿足判斷條件,資料本身不重要,就使用EXISTS。
查詢返回一個或著多行,為TRUE否則為FALSE。
(3.比較運算子
確認子查詢返回的結果中只包含一個單值,可以直接使用比較運算【=,<>|!=,<,>,<=,>=】
三、 資料操縱語言DML(Data Manipulation Language)
SQL的資料操縱語言,用於改變資料庫中的資料,包括插入,刪除,修改。
1.插入
INSERT語句想資料表中插入資料,可以一次插入一條資料,也可以根據SELECT查詢子句的結果集批量插入指定資料表。
1) 一般的INSERT語句
INSERT INTO[user] table [@db_link] [(column)]
VALUES(express,[express2])
Table:表名
Db_link:資料庫連結名
Column:列名【欄位】
Values:插入的值
2) 批量插入
用SELECT語句替換VALUES語句,由SELECT語句提供新增的資料
INSERT INTO [user]table [@db_link] [(column)] subquery
Subquery是子查詢語句,可以是任何合法的select語句,其中所選列的個數和型別應該與前邊的column相對應。
SELECT返回的語句必須滿足表中列的約束。
2.刪除
從資料庫中刪除記錄用DELETE語句。
DALETE FROMtable_name
[WHEREcondition]
(不加限定條件,會刪除表中的全部記錄)
3.TRUNCATE語句
使用TRUNCATE,刪除表中的所有資料,比DELETE快。
TRUNCATE 語句不能被撤銷
4.修改
使用UPDATE語句,可以修改表中一列或者多列的值,使用WHERE子句可以限定被修改的行。
UPDATEtable_name
SET {column1=express1[,column2=express2]
(column1[,column2])=(selectquery)}
[WHEREcondition]
UPDATE子句用於指定要修改的表名稱。需要後跟一個或多個要修改的表名稱,這部分是必不可少的。
SET子句用於設定要更新的列以及各列的新值。需要後跟一個或多個要修改的表列。
WHERE後跟更新限定條件。
四.資料控制功能DCL(Data Control Language)
資料控制指資料庫的安全性和完整性控制
SQL的資料控制語言,對錶和檢視的授權,完整性規則的描述以及事務開始和結束等控制語句。
SQL通過對資料庫使用者的授權和取消授權命令來實現相關資料的存取控制,保證資料庫的安全性,。還提供了資料完整性約束的定義和檢查機制,保證資料庫的完整性。
通過GRANT和REVOKE語句將授權的決定告知系統。
將授權結果存入資料字典
1.授權
SQL用GRANT語句向用戶授予操作許可權:
GRANT <許可權>[,許可權]………
[ON <物件型別><物件名>]
TO <使用者>[,<使用者>]……
[WITH GRANTOPTION]
[WITH ADMINOPTION]
對屬性列和檢視許可權:
SELECT(查詢),INSERT(插入),UPDATE(修改),DELETE(刪除),四種許可權的總包(ALLPRIVILEGES)。
對錶的許可權:
查詢,插入,修改,刪除,修改表(ALTER),建立索引(INDEX)以及這六種許可權的總和。(ALL PRIVILEGES)
對資料庫:
CREATETAB(建表)
不同物件型別允許的操作許可權
物件 |
物件型別 |
操作許可權 |
屬性列 |
TABLE COLUMN |
SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES |
檢視 |
TABLE VIEW |
SELECT,INSERT,UPDATE,DELETE,ALL PRIVILEGES |
基表 |
TABLE |
SELECT,INSERT,UPDATE,DELETE,ALTER,INDEX, ALL PRIVILEGES |
資料庫 |
DATABASE |
CREATETA |
接收許可權的使用者可以是一個或者多個具體使用者,也可以是全體使用者(PUBLIC)。
2.回收
收回許可權使用,REVOKE語句
REVOKE <許可權>[,<許可權>]………
[ON <物件型別><物件類>]
FROM <使用者>[,<使用者>]……;