920 likes | 1.18k Views
第 8 章. SQL-99 :綱要定義、基本限制與查詢. 學習重點 (1/2). SQL 的定義、功能與敘述 CREATE TABLE 語法 DROP 語法 ALTER 語法 SQL 中的基本查詢語法 SELECT-FROM-WHERE 結構 簡單的 SQL 查詢 別名、* 和 DISTINCT 的用法 集合運算 子字串的比對 算術運算 區間值的比較運算 查詢結果的排序. 學習重點 (2/2). 空值的比較 巢狀查詢 EXISTS 函數 明確指定的集合 屬性的重新命名 合併表格功能 聚合函數、 GROUP BY 與 HAVING 子句
E N D
第 8 章 SQL-99:綱要定義、基本限制與查詢
學習重點 (1/2) • SQL的定義、功能與敘述 • CREATE TABLE語法 • DROP語法 • ALTER語法 • SQL中的基本查詢語法 • SELECT-FROM-WHERE結構 • 簡單的SQL查詢 • 別名、* 和DISTINCT的用法 • 集合運算 • 子字串的比對 • 算術運算 • 區間值的比較運算 • 查詢結果的排序 資料庫管理
學習重點 (2/2) • 空值的比較 • 巢狀查詢 • EXISTS函數 • 明確指定的集合 • 屬性的重新命名 • 合併表格功能 • 聚合函數、GROUP BY與HAVING子句 • 子字串比對與算術運算 • SQL查詢語法總整理 • 修改命令:INSERT、DELETE、UPDATE • 視界 (View) 資料庫管理
SQL的定義與功能 (1/2) • SQL (Structural Query Language):是結構化程式語言的簡稱,它已經成為關聯式DBMS的標準語言 • SQL包含下列功能 • SQL包含資料定義、查詢與更新的敘述 • SQL不但是一種DDL(資料定義語言),也是一種DML(資料操作語言) • SQL還具備定義資料庫視界、設定安全性與權限、定義完整性限制以及設定交易控制的功能 • 可以將SQL敘述嵌入Java、COBOL或C/C++等通用用途程式語言的機制 資料庫管理
SQL的定義與功能 (2/2) • SQL關聯式模型與理論性(theoretical)關聯式模型的差異: • SQL使用表格(table)、列(row)及欄(column),來代表關聯(relation)、值組(tuple)和屬性(attribute) • SQL中的table可能包含重覆列(duplicated row),但relation中不包含重覆tuple • SQL中的table可能沒有指定主鍵(primary key) 資料庫管理
SQL的定義敘述 • 定義綱要(schema) • 語法:CREATE SCHEMA • 範例:(須經由DBA下此語法) CREATE SCHEMA COMPANY AUTHORIZATION Jsmith • 定義表格(table) • 語法:CREATE TABLE • 範例: CREATE TABLE EMPLOYEE … … … • 基底表格(base table):透過CREATE TABLE宣告的關聯稱之。 • 與透過CREATE VIEW建立的關聯不同 資料庫管理
CREATE TABLE 語法 • CREATE TABLE: the following are defined: • table name • attribute name • attribute type • CHAR(), VARCHAR(), NUMBER or INTEGER, DECIMAL(x.x), TIME, DATE, BLOB, etc. • attribute constraints: • PRIMARY KEY (attribute-set) • FOREIGN KEY (attribute-set) REFERENCES table-name(attribute set) ON DELETE ... ON UPDATE ... • UNIQUE (attribute-set) • attribute-name attribute-type NOT NULL • attribute-name attribute-type DEFAULT value 資料庫管理
CREATE TABLE 範例 (1/2) 資料庫管理
CREATE TABLE 範例 (2/2) 資料庫管理
SQL的屬性資料型態和定義域 • INT • SMALLINT • FLOAT • REAL • DOUBLE • DECIMAL(i, j) • CHAR(n) • VARCHAR(n) • BIT(n) • BOOLEAN:TRUE/FALSE/UNKNOWN • DATE • TIMESTAMP • INTERVAL 資料庫管理
SQL Server的資料型態 (1/2) 資料庫管理
SQL Server的資料型態 (2/2) 資料庫管理
以SQL語法指定基本限制的範例 資料庫管理
SQL指定限制的例子 • 指定屬性的限制和屬性的預設值 • Dnumber INT NOT NULL CHECK (Dnumber > 0 AND Dnumber < 21) • CREATE DOMAIN D_NUM AS INTEGER CHECK (D_NUM > 0 AND D_NUM < 21) • 指定鍵值和參考完整性限制 • Dnumber INT PRIMARY KEY; • 使用CHECK指定值組的限制 • CHECK (Dept_create_date <= Mgr_start_date); 資料庫管理
SQL Server指定限制的語法範例 資料庫管理
DROP 的語法 • DROP:用來移除某個有名稱的綱要元件,如表格、定義域、限制或綱要 • 移除綱要: • DROP SCHEMA COMPANY CASCADE; • 移除綱要與它所有的表格、定義域和其他元素 • DROP SCHEMA COMPANY RESTRICT; • 只有在綱要內沒有任何元素時才能執行移除 • 移除表格: • DROP TABLE DEPENDENT CASCADE; 資料庫管理
ALTER 的語法 (1/2) • ALTER:用來變更基底關聯的定義或其他綱要元件 • 變更基底關聯/表格的動作包括: • 新增或移除欄位(即屬性) • 變更欄位的定義 • 新增或移除表格限制 • 新增表格的欄位/屬性 • ALTER TABLE COMPANY.EMPLOYEE ADD COLUMN Job VARCHAR(12); • 新增一個用來記錄員工職務的新屬性 • 移除表格的欄位/屬性 • ALTER TABLE COMPANY.EMPLOYEE DROP COLUMN Address CASCADE; • 移除欄位時,有CASCADE和RESTRICT兩種方式可以選擇 資料庫管理
ALTER 的語法 (2/2) • 移除原來的預設子句 • ALTER TABLE COMPANY.DEPARTMENT ALTER COLUMN Mgr_ssn DROP DEFAULT; • 定義新的預設子句 • ALTER TABLE COMPANY.DEPARTMEN ALTER COLUMN Mgr_ssn SET DEFAULT ‘333445555’; • 新增/移除表格的限制 • ALTER TABLE COMPANY.EMPLOYEE DROP CONSTRAINT EMPSUPERFK CASCADE 資料庫管理
DDL的摘要整理 • 基底關聯表上的 DDL: • Create table: 定義 base relations 上的 schema • Alter table: 修改 base relations 上的 schema • Drop schema: 刪除 database的 schema • Drop table: 刪除 base relations上的 schema和資料(data) • Truncate table: 僅刪除 base relations 上的資料 資料庫管理
SQL2與SQL-99的新增功能 • CREATE SCHEMA • REFERENTIAL INTEGRITY OPTIONS 資料庫管理
SQL2與SQL-99的新增資料型態 • DATE: • 由年-月-日所組成,格式為yyyy-mm-dd • TIME: • 由時:分:秒所組成,格式為hh:mm:ss • TIME(i): • 由時:分:秒加上代表幾分之一秒的數字 i 所組成 • 格式為hh:mm:ss:ii...i • TIMESTAMP (時間戳記): • 由DATE和TIME元件所組成 • INTERVAL (期間): • 指定一個相對值,而不是絕對值 • 可能是YEAR/MONTH期間或DAY/TIME期間 • 當它相加或相減另一個絕對值,可能是正數或負數,結果也會是絕對值 資料庫管理
SQL中的基本查詢語法 • SQL有個很重要的基本敘述,可以讓我們從資料庫中擷取資訊,也就是SELECT敘述 • 不同於關聯式代數(relational algebra)的SELECT運算 • SQL與關聯式模型正式定義間有個很重要差異: • SQL允許表格 (即關聯) 中存在兩筆或多筆所有屬性值完全相同的值組 • 因此,通常SQL表格並非一個值組的集合,因為集合不允許有重複的值組。 • SQL表格是值組的多重集合 (multiset,或稱為bag) • 不過,SQL關聯如果有指定PRIMARY KEY或UNIQUE屬性,或是在SELECT命令中加上DISTINCT選項,此時的SQL關聯就必須是值組的集合 資料庫管理
SELECT-FROM-WHERE結構 • 基本的SELECT敘述,有時也稱為SELECT-FROM-WHERE區塊 (block) SELECT <attribute list> FROM <table list> WHERE <condition> • <attribute list> :屬性名稱的列表 • 在查詢時需要參考這些屬性的值 • <table list>:列出處裡查詢時會用到的關聯 • <condition> :條件(布林)運算式 • 用來識別查詢時所要擷取的值組 資料庫管理
SQL的基本語法 資料庫管理
範例關聯式資料庫綱要 (圖5.5) 資料庫管理
範例關聯式資料庫狀態 (圖5.6) 資料庫管理
基本的SQL查詢 (單一表格) • 查詢範例0:擷取名叫 ‘John B. Smith’ 員工的生日與住址 SELECT Bdate, Address FROM EMPLOYEE WHERE Fname=‘John’ AND Minit=‘B’ AND Lname=‘Smith’; • 類似於關聯式代數的SELECT-PROJECT運算配對 • 其中SELECT子句負責指定投影屬性 • 而WHERE子句則負責指定選擇條件 • 查詢的結果可能會有重複的值組 資料庫管理
基本的SQL查詢結果 (單一表格) 範例0 的查詢結果 資料庫管理
基本的SQL查詢 (雙表格) • 查詢範例1:擷取在 ‘Research’ 部門工作的所有員工的姓名與住址 SELECT Fname, Lname, Address FROM EMPLOYEE, DEPARTMENT WHERE Dname=‘Research’ AND Dnumber=Dno; • 類似關聯式代數運算中的SELECT-PROJECT-JOIN • (DNAME=‘Research’) 是選擇條件 • 相當於關聯式代數的SELECT運算 • (DNUMBER=DNO) 則是合併條件 • 相當於在關聯式代數的JOIN運算 資料庫管理
基本的SQL查詢結果 (雙表格) 範例1 的查詢結果 資料庫管理
基本的SQL查詢 (三表格) • 查詢範例2:列出所有位在 ‘Stafford’ 地點的計畫,其計畫編號、控管部門編號,以及部門經理的姓氏、住址和生日 SELECT Pnumber, Dnum, Lname, Address, Bdate FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE Dnum=Dnumber AND Mgr_ssn=Ssn AND Plocation=‘Stafford’; • 在範例2裡有兩個合併條件 • 合併條件DNUM=DNUMBER,使得計劃與其控管部門產生關聯 • 合併條件MGRSSN=SSN,則讓控管部門與管理此部門的員工產生關聯 資料庫管理
基本的SQL查詢結果 (三表格) 範例2 的查詢結果 資料庫管理
模稜兩可的屬性名稱 • 在SQL中,只要屬性是屬於不同的關聯,就可以讓兩個或多個屬性使用同樣的名稱 • 若查詢會參考到兩個或多個同名的屬性,就必須用關聯名稱來修飾 (qualify) 屬性名稱,做法是將關聯名稱放在屬性名稱前,並用英文的句點 (.) 來分隔 • 範例1A: SELECT Fname, EMPLOYEE.Name, Address FROM EMPLOYEE, DEPARTMENT WHERE DEPARTMENT.Name=‘Research’ AND DEPARTMENT.Dnumber=EMPLOYEE.Dnumber; 資料庫管理
模稜兩可的關聯─使用別名 (1/2) • 假如查詢對同一個關聯參考兩次,也會發生模稜兩可的情形 • 在這類情況下要對關聯名稱指定別名(aliases) • 查詢範例8:擷取每一位員工的姓名與其直屬上司的姓名SELECT E.Fname, E.Lname, S.Fname, S.LnameFROM EMPLOYEE ESWHERE E.Super_ssn=S.Ssn; • 在範例8中的替代關聯名稱E和S被稱作EMPLOYEE關聯的別名 (alias) 或值組變數 (tuple) • E扮演部屬角色的員工 • S扮演上司角色的員工 資料庫管理
模稜兩可的關聯─使用別名 (2/2) • 別名可以用在任何SQL查詢中 • 也可以使用AS關鍵字來指定別名 • 查詢範例8:SELECT E.Fname, E.Lname, S.Fname, S.LnameFROM EMPLOYEE AS E, EMPLOYEE AS SWHERE E.Super_ssn=S.Ssn; • 查詢範例1B:SELECT Fname, EMPLOYEE.Name, Address FROM EMPLOYEE E, DEPARTMENT D WHERE D.Name=‘Research’ AND D.Dnumber=E.Dnumber; 資料庫管理
未指定的WHERE子句 • 假如沒有WHERE的子句,代表沒有選擇條件 • 因此FROM子句裡所指定關聯的所有值組都會被選取 • 查詢範例9:在資料庫中選擇所有員工的SSN資料 SELECT Ssn FROM EMPLOYEE; • 假如在FROM子句中指定一個以上的關聯,而且沒有WHERE子句,則表示結果等於這些關聯的CROSS PRODUCT • 也就是所有可能的值組組合都會被選取 • 查詢範例10:選擇EMPLOYEE SSN與DEPARTMENT DNAME的所有組合 SELECT Ssn, Dname FROM EMPLOYEE, DEPARTMENT; 資料庫管理
星號(*) 的使用 (1/2) • 在SQL中,假如要擷取所選值組的所有屬性值,只需要用一個星號 (*) 即可,這個星號就代表所有的屬性 • 查詢範例1C:擷取在DEPARTMENT編號為5的部門工作的員工 SELECT * FROM EMPLOYEE WHERE Dno=5; 資料庫管理
星號(*) 的使用 (2/2) • 查詢範例1D:擷取每個在 ‘Research’部門工作的員工,其所有的EMPLOYEE屬性值與DEPARTMENT的全部屬性值 SELECT * FROM EMPLOYEE, DEPARTMENT WHERE Dname=‘Research’ AND Dno=Dnumber; • 查詢範例10A:擷取EMPLOYEE與DEPARTMENT關聯的CROSS PRODUCT SELECT * FROM EMPLOYEE, DEPARTMENT; 資料庫管理
DISTINCT的用法 • SQL通常不會將關聯視為集合,因此可以出現重複的值組 • 為了消除查詢結果中的重複值組,可使用關鍵字DISTINCT • Q11的結果可能會有重複的SALARY值 • Q11A則不會有任何重複值 • 查詢範例11:擷取每一位員工的薪資 SELECT ALLSalary FROM EMPLOYEE; • 查詢範例11A:擷取所有不同的薪資值 SELECT DISTINCTSalary FROM EMPLOYEE; 資料庫管理
集合運算 (1/3) • SQL提供某些集合運算 • 聯集運算 (UNION) • 有些SQL 版本還會有差集 (EXCEPT) 和交集(INTERSECT) 運算 • 這些集合運算所產生的關聯是值組的集合 • 也就是說,重複的值組會在結果中被除去 • 集合運算只能應用在聯集相容(union compatible)的關聯上 • 所以必須先確定要運算的兩個關聯具有相同的屬性,而且這些屬性出現在兩個關聯的順序也相同 資料庫管理
集合運算 (2/3) • 查詢範例4:列出姓氏為 'Smith' 的員工所參與的所有計畫,不論該員工是計畫的工作人員或是管理此計畫的部門經理 (SELECT DISTINCT Pnumber FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE Dnum=Dnumber AND Mgr_ssn=Ssn AND Lname=‘Smith’) UNION (SELECT DISTINCT Pnumber FROM PROJECT, WORKS_ON, EMPLOYEE WHERE Pnumber=Pno AND Essn=Ssn AND Lname=‘Smith’); 資料庫管理
集合運算 (3/3) • SQL針對多重集合的運算,是利用ALL關鍵字 • UNION ALL • EXCEPT ALL • INTERSECT ALL 資料庫管理
子字串的比對 (1/2) • SQL利用LIKE運算,進行字串比對 • 「%」字元可取代任何數目的字元 • 「_」字元則可取代單一字元 • 查詢範例12:擷取所有住址在Houston, Texas的員工 SELECT Fname, Lname FROM EMPLOYEE WHERE Address LIKE ‘%Houston, TX%’; 資料庫管理
子字串的比對 (2/2) • 查詢範例12A:擷取所有在1950年代出生的員工 SELECT Fname, Lname FROM EMPLOYEE WHERE Bdate LIKE ‘1 9 5 _ _ _ _ _ _ _’; 資料庫管理
算術運算 • 標準的四則運算 • 加法(+)、減法(-)、乘法(*)、除法(/) • 查詢範例13:顯示出所有工作於 ‘ProductX’ 計畫的員工加薪 10% 後的薪資結果 SELECT Fname, Lname, 1.1*Salary AS Increased_sal FROM EMPLOYEE, WORK_ON, PROJECT WHERE Ssn=Essn AND Pno=Pnumber AND Pname=‘ProductX’; 資料庫管理
區間值的比較運算 • 區間值的比較運算:BETWEEN • 查詢範例14:擷取5號部門中所有薪資在$30,000到$40,000之間的員工 SELECT * FROM EMPLOYEE WHERE (Salary BETWEEN 30000 AND 40000) AND Dno=5; 資料庫管理
查詢結果的排序 • ORDER BY子句是用來針對值組內的一或多個屬性值,將查詢結果的值組加以排序 • 預設的順序是遞增排序(ASC),可用關鍵字DESC變成遞減 • 例如,ORDER BY Dname DESC, Lname ASC, Fname ASC • 查詢範例15:擷取員工與他們所工作計畫的清單,在清單中先針對部門號碼排序,每個部門內再依員工姓名的字母順序排序SELECT Dname, Lname, Fname, Pname FROM DEPARTMENT, EMPLOYEE, WORKS_ON, PROJECT WHERE Dnumber=Dno AND Ssn=Essn AND Pno=Pnumber ORDER BY Dname, Lname, Fname; 資料庫管理
空值(NULL)的比較 (1/2) • 在資料庫中,每個空值(NULL)都會被視為不同 • 所以,當空值在進行比較運算時,結果會是「未知」(UNKNOWN) • SQL中,使用3種邏輯值:TRUE、FALASE和UNKNOWN • 標準的布林邏輯理論只有TRUE和FALSE兩種值 資料庫管理
空值(NULL)的比較 (2/2) • SQL在查詢中檢查數值是否為NULL • 不是用 = 或 < > 來比較 • 而是用 IS 或 IS NOT 進行比較 • 查詢範例18:擷取所有無上司的員工姓名 SELECT Fname, Lname FROM EMPLOYEE WHERE Super_ssn IS NULL; 資料庫管理
巢狀查詢 (1/4) • 巢狀查詢 (nested query):指在一個查詢的WHERE子句內,含有完整的「SELECT-FROM-WHERE」區塊。 • 此時這個外部的WHERE查詢被稱為外部查詢 (outer query) • 之前的查詢範例可以使用巢狀查詢來改寫 • 查詢範例1:擷取所有在 'Research' 部門工作的員工的姓名與住址SELECT Fname, Lname, AddressFROM EMPLOYEEWHERE Dno IN (SELECT DnumberFROM DEPARTMENTWHERE Dname='Research' ); • 由巢狀查詢先選出 ‘Research’ 部門的編號 • 外部查詢來選擇其DNO值屬於巢狀查詢結果中的EMPLOYEE值 資料庫管理