掌握SQL四條最基本的數據*作語句
Insert
Select
Update和Delete
練掌握SQL是數據庫用戶的寶貴財 富
在本文中
我們將引導你掌握四條最基本的數據*作語句—SQL的核心功能—來依次介紹比較*作符
選擇斷言以及三值邏輯
當你完成這些學習後
顯然你已經開始算是精通SQL了
在我們開始之前
先使用CREATE TABLE語句來創建一個表
DDL語句對數據庫對象如表
列和視進行定義
它們並不對表中的行進行處理
這是因為DDL語句並不處理數據庫中實際的數據
這些工作由另一類SQL語句—數據*作語言(DML)語句進行處理
SQL中有四種基本的DML*作
INSERT
SELECT
UPDATE和DELETE
由於這是大多數SQL用戶經常用到的
我們有必要在此對它們進行一一說明
我們給出了一個名為EMPLOYEES的表
其中的每一行對應一個特定的雇員記錄
請熟悉這張表
我們在後面的例子中將要用到它
INSERT語句
用戶可以用INSERT語句將一行記錄插入到指定的一個表中
例如
要將雇員John Smith的記錄插入到本例的表中
可以使用如下語句
INSERT INTO EMPLOYEES VALUES
(
Smith
John
Los Angles
);
通過這樣的INSERT語句
系統將試著將這些值填入到相應的列中
這些列按照我們創建表時定義的順序排列
在本例中
第一個值
Smith
將填到第一個列LAST_NAME中
第二個值
John
將填到第二列FIRST_NAME中……以此類推
我們說過系統會
試著
將值填入
除了執行規則之外它還要進行類型檢查
如果類型不符(如將一個字符串填入到類型為數字的列中)
系統將拒絕這一次*作並返回一個錯誤信息
如果SQL拒絕了你所填入的一列值
語句中其他各列的值也不會填入
這是因為SQL提供對事務的支持
一次事務將數據庫從一種一致性轉移到另一種一致性
如果事務的某一部分失敗
則整個事務都會失敗
系統將會被恢復(或稱之為回退)到此事務之前的狀態
回到原來的INSERT的例子
請注意所有的整形十進制數都不需要用單引號引起來
而字符串和日期類型的值都要用單引號來區別
為了增加可讀性而在數字間插入逗號將會引起錯誤
記住
在SQL中逗號是元素的分隔符
同樣要注意輸入文字值時要使用單引號
雙引號用來封裝限界標識符
對於日期類型
我們必須使用SQL標准日期格式(yyyy
mm
dd)
但是在系統中可以進行定義
以接受其他的格式
當然
年臨近
請你最好還是使用四位來表示年份
既然你已經理解了INSERT語句是怎樣工作的了
讓我們轉到EMPLOYEES表中的其他部分
INSERT INTO EMPLOYEES VALUES
(
Bunyan
Paul
Boston
);
INSERT INTO EMPLOYEES VALUES
(
John
Adams
Boston
);
INSERT INTO EMPLOYEES VALUES
(
Smith
Pocahontas
Los Angles
);
INSERT INTO EMPLOYEES VALUES
(
Smith
Bessie
Boston
);
INSERT INTO EMPLOYEES VALUES
(
Jones
Davy
Boston
);
INSERT INTO EMPLOYEES VALUES
(
Jones
Indiana
Chicago
NULL
NULL);
在最後一項中
我們不知道Jones先生的工薪級別和年薪
所以我們輸入NULL(不要引號)
NULL是SQL中的一種特殊情況
我們以後將進行詳細的討論
現在我們只需認為NULL表示一種未知的值
有時
像我們剛才所討論的情況
我們可能希望對某一些而不是全部的列進行賦值
除了對要省略的列輸入NULL外
還可以采用另外一種INSERT語句
如下
INSERT INTO EMPLOYEES(
FIRST_NAME
LAST_NAME
HIRE_DATE
BRANCH_OFFICE)
VALUE(
Indiana
Jones
Indianapolis
);
這樣
我們先在表名之後列出一系列列名
未列出的列中將自動填入缺省值
如果沒有設置缺省值則填入NULL
請注意我們改變了列的順序
而值的順序要對應新的列的順序
如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規定不能為空)
SQL*作將失敗
讓我們來看一看上述INSERT語句的語法圖
INSERT INTO table
[(column {
column})]
VALUES
(columnvalue [{
columnvalue}]);
和前一篇文?幸謊頤怯梅嚼ê爬幢硎究裳∠睿罄ê瘧硎究梢災馗慈我獯問南睿ú荒茉谑導實腟QL語句中使用這些特殊字符)
VALUE子句和可選的列名列表中必須使用圓括號
SELECT語句
SELECT語句可以從一個或多個表中選取特定的行和列
因為查詢和檢索數據是數據庫管理中最重要的功能
所以SELECT語句在SQL中是工作量最大的部分
實際上
僅僅是訪問數據庫來分析數據並生成報表的人可以對其他SQL語句一竅不通
SELECT語句的結果通常是生成另外一個表
在執行過程中系統根據用戶的標准從數據庫中選出匹配的行和列
並將結果放到臨時的表中
在直接SQL(direct SQL)中
它將結果顯示在終端的顯示屏上
或者將結果送到打印機或文件中
也可以結合其他SQL語句來將結果放到一個已知名稱的表中
SELECT語句功能強大
雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算
選擇
(或稱
限制
)
但實際上它也可以完成其他兩種關系運算—
投影
和
連接
SELECT語句還可以完成聚合計算並對數據進行排序
SELECT語句最簡單的語法如下
SELECT columns FROM tables;
當我們以這種形式執行一條SELECT語句時
系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表
這就是實現關系投影運算的一個形式
讓我們看一下使用EMPLOYEES表的一些例子(這個表是我們以後所有SELECT語句實例都要使用的
而我們在圖
和圖
中給出了查詢的實際結果
我們將在其他的例子中使用這些結果)
假設你想查看雇員工作部門的列表
那下面就是你所需要編寫的SQL查詢
SELECT BRANCH_OFFICE FROM EMPLOYEES;
由於我們在SELECT語句中只指定了一個列
所以我們的結果表中也只有一個列
注意結果表中具有重復的行
這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)
要消除結果中的重復行
只要在SELECT語句中加上DISTINCT子句
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
現在已經消除了重復的行
但結果並不是按照順序排列的
如果你希望以字母表順序將結果列出又該怎麼做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
這一查詢的結果如表
所示
請注意在ORDER BY之後是如何放置列名BRANCH _OFFICE的
這就是我們想要對其進行排序的列
為什麼即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序
即使它們並不顯示出來
列名BRANCH_ OFFICE之後的關鍵字ASC表示按照升序排列
如果你希望以降序排列
那麼可以用關鍵字DESC
同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序
並不影響原來的表
假設我們希望得到按部門排序並從工資最高的雇員到工資最低的雇員排列的列表
除了工資括號中的內容
我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表
以下是你將要用到的語句
SELECT BRANCH_OFFICE
FIRST_NAME
LAST_NAME
SALARY
HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC
HIRE_DATE DESC;
這裡我們進行了多列的選擇和排序
排序的優先級由語句中的列名順序所決定
SQL將先對列出的第一個列進行排序
如果在第一個列中出現了重復的行時
這些行將被按照第二列進行排序
如果在第二列中又出現了重復的行時
這些行又將被按照第三列進行排序……如此類推
這次查詢的結果如表
所示
將一個很長的表中的所有列名寫出來是一件相當麻煩的事
所以SQL允許在選擇表中所有的列時使用*號
SELECT * FROM EMPLOYEES;
這次查詢返回整個EMPLOYEES表
如表
所示
下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項
允許在其中選擇一項
)
SELECT [DISTINCT]
(column [{
columns}])| *
FROM table [ {
table}]
From:http://tw.wingwit.com/Article/program/Oracle/201311/18760.html