630 likes | 788 Views
學習目標. 熟悉資料庫系統的 SQL 查詢語言。 透過實例來學習 SQL 的語法。 安裝與設定 MySQL 。 利用 MySQL 測試 SQL 語法。. 從疑惑中開始學習. SQL 是什麼 ? SQL 有什麼用途 ?. 這是一個腦力激盪的園地 !. 關聯式資料庫查詢系統. SQL 資料查詢語言. relational data model 與 programming language 的 computation model 不同的特性也稱為 impedance mismatch 。. 資料查詢語言( DQL, Data Query Language )
E N D
學習目標 • 熟悉資料庫系統的SQL查詢語言。 • 透過實例來學習SQL的語法。 • 安裝與設定MySQL。 • 利用MySQL測試SQL語法。
從疑惑中開始學習 • SQL是什麼 ? • SQL有什麼用途 ? 這是一個腦力激盪的園地!
SQL資料查詢語言 relational data model與programming language的computation model不同的特性也稱為impedance mismatch。
資料查詢語言(DQL, Data Query Language) • Select • 資料定義語言(DDL, Data Definition Language) • Create table, alter table • 資料處理語言(DML, Data Manipulation Language) • Insert, Update, Delete • 資料控制語言(DCL, Data Control Language) • Begin transaction, commit
練習 • 將汽車銷售範例資料庫(EX5.mdf,EX5_log.ldf) Attach(附加)到 MS SQL 資料庫伺服器 • 查出[台北銷售紀錄]之中,RAV4的銷售數量 • 查出產品編號 04 的產品名稱 • 查出 Yaris 的售價與庫存量
練習 • 使用汽車銷售範例資料庫 • USE EX5 • 結合台北銷售紀錄與產品基本資料,列出台北銷售月報表,欄位包括:產品編號 ,產品名稱,數量,售價 • 序前題,將售價改稱為[單價],並計算『小計』 • 用 AS 更改欄位名稱 • 欄位可以直接加減乘除
DDL 資料定義語言 -- 建立資料表 create table customers ( cust_id char(3) not null primary key, cust_name nvarchar(20), region char(2), phone char(13) ); -- 刪除資料表 drop table customers;
insert into customers (cust_id, cust_name, region, phone) values('I01', 'John', 'TW', '02-232-1111-3'); insert into customers (cust_id, cust_name, region, phone) values('I02', 'Mary', 'JP', '03-393-7457-4'); insert into customers values('I03', 'Anne', 'CA', '02-999-1234-5'); '以單引號括住字串' 注意字串括號必須是半形字 ‘不可以是全形字’
MySQL與MS SQL 2008 適用 insert into customers values ('I04','許蓋功','TW','02-232-1111-3'), ('I05','蘇瑜珮','JP','03-393-7457-4'), ('I06','項慧慧','CA','02-999-1234-5'); 舊版的只能一次新增一筆紀錄 insert into customers values ('I04','許蓋功','TW','02-232-1111-3'); insert into customers values ('I05','蘇瑜珮','JP','03-393-7457-4'); insert into customers values ('I06','項慧慧','CA','02-999-1234-5');
-- 刪除一筆資料 delete from customers where cust_id='I01'; -- 刪除全部資料 delete from customers; -- 清除整個資料表內的資料 truncate table customers;
update customers set phone='02-292-3311-4' where cust_id='I02';
練習 • 如何查出所有的日本(JP)客戶? • 如何將項慧慧的區域別(region)改成TW? • 如何新增一位客戶: • Cust_id=I07 • Cust_name=Marty • Region=CN • 可否將 Marty 的 cust_id 改成 I01?
SQL的查詢語法 SELECT [DISTINCT|ALL] {*|欄位名稱}FROM 表格名稱[WHERE 條件設定][GROUP BY 欄位名稱][HAVING 條件設定] /*針對GROUP BY */[ORDER BY 欄位名稱]
聚集函數的使用Aggregation Functions select * from orders; SELECT COUNT (DISTINCT ITEM) FROM ORDERS -- 結果為3 SELECT AVG(QUANTITY) * COUNT(DISTINCT ITEM) FROM ORDERS /* 結果為81 */
create table orders ( order_no char(4) not null primary key, item char(3) not null, quantity int default 1, date datetime default GETDATE() ); insert into orders (order_no, item) values ('P001', 'I01'); update orders set quantity=40, date='2010/02/01' where order_no='P001'; insert into orders values ('P002','I03',20,'2010/3/4'), ('P003','I01',50,'2010/2/15'), ('P004','I03',10,'2010/5/1'), ('P005','I02',15,'2010/5/9');
聚集函數的使用Aggregation Functions • AVG() 計算平均值 Average • SUM() 計算加總 Summation • COUNT() 計算個數 • MAX() 求最大值 • MIN() 求最小值
練習 • 如何算出總銷售量(total quantity)? • 如何算出產品I03總共賣出多少個? • 如何算出產品I01共有幾張訂單?
進階SQL語法 • 用 AS 幫欄位取別名 • 用 AS 幫資料表取別名 • AS 可以省略!
其他好用的SQL函數 • FIRST() 第一個 • LAST() 最後一個 • UCASE() 轉成大寫英文字母 • LCASE() 轉成小寫英文字母 • MID() 擷取字串中間的一段字 • MID(column_name,start[,length]) • 從 1 開始數 • LEN() 計算字串長度
其他好用的SQL函數 • ROUND() 四捨五入 • ROUND(column_name, 小數點以下的位數) • NOW() 現在日期與時間 • MS SQL 用 GetDate()
資料集VIEW,在微軟的系統中翻譯成『檢視』或『檢視表』資料集VIEW,在微軟的系統中翻譯成『檢視』或『檢視表』 是一種虛擬的資料表 儲存的是SQL敘述,不是資料!
提昇資料存取使用的彈性 • 只要記一個名字,不必記憶複雜的整串SQL • 安全性 • 可以隱藏不想讓特定人士看到的資料 • 一致性 • 一致的資料表示法
資料集的定義與使用(1) 資料表 EMPLOYEE 檢視表 AvgSal VIEW:觀點 資料集 檢視表 CREATE VIEW AvgSal AS SELECT AVG(Salary) AS 平均薪資 FROM EMPLOYEE ; SELECT * FROM AvgSal;
CREATE TABLE EMPLOYEE ( EmpNo CHAR(3) NOT NULL PRIMARY KEY, Name NVARCHAR(20) NOT NULL, Salary MONEY, DepNo CHAR(3) /* 員工不一定歸部門 */ ); CREATE TABLE DEPARTMENT ( DepNo CHAR(3) NOT NULL PRIMARY KEY, Name NVARCHAR(20) NOT NULL, Manager CHAR(3) NOT NULL /* 部門主管 */ );
INSERT INTO EMPLOYEE VALUES ('E01','Marty',36000,'D01'), ('E02','Rick',15000,'D03'), ('E03','Allen',24000,'D02'), ('E04','Mary',12000,'D01'), ('E05','Tom',24000,'D01'), ('E06','Joseph',38000,'D03'); INSERT INTO DEPARTMENT VALUES ('D01','RD','E01'), ('D02','MIS','E02'), ('D03','Marketing','E06');
ALTER TABLE EMPLOYEE WITH NOCHECK ADD CONSTRAINT FK1 FOREIGN KEY(DepNo) REFERENCES DEPARTMENT(DepNo); ALTER TABLE DEPARTMENT ADD CONSTRAINT FK2 FOREIGN KEY(Manager) REFERENCES EMPLOYEE(EmpNo);
資料集的定義與使用(2) 資料表 EMPLOYEE 虛擬表格 DepEmp CREATE VIEW DepEmp AS SELECT DepNo, EmpNo, Name, Salary FROM Employee; SELECT * FROM DepEmp ORDER BY DepNo, Salary;
有時候查詢所得到的資料很多,經過排序(sorting)與分組(grouping)以後,會比較容易瀏覽有時候查詢所得到的資料很多,經過排序(sorting)與分組(grouping)以後,會比較容易瀏覽 • 資料記錄的排序可以用「order by」的語法,然後以關鍵字「asc」代表升冪(Ascending)的排序,以「desc」代表降冪(Descending)的排序
練習:orders 資料表 • 以SQL列出各項產品(item)的總銷售量 • SUM(quantity) • GROUP BY item • 以SQL列出各項產品被下訂的次數(訂單量) • COUNT(order_no) • GROUP BY item • 請將上面兩個結果合成一個 • 試計算各項產品的『平均訂單銷售量』,平均訂單銷售量=總銷售量/訂單量 • 試比較使用VIEW和不用VIEW的差異
練習:orders 資料表 • 設計一個SQL敘述,列出各部門的平均薪資,依照平均薪資的高低排列,薪資水準高的排前面。 • AVG(Salary) • GROUP BY DepNo • 以設計好的SQL製作一個名為 DepSalaryLevel 的 VIEW
進階SQL語法 • 合併 • 自然合併 JOIN … ON • 兩邊資料表都有的才留下 • LEFT OUTER JOIN … ON • 左邊資料表有的都必須留下,右邊對不上的資料顯示 null • RIGHT OUTER JOIN … ON • 右邊資料表有的都必須留下,左邊對不上的資料顯示null • 聯集 • UNION
內部合併 INNER JOIN SELECT …FROM T1, T2WHERE T1.F1=T2.F2; 相當於 SELECT …FROM T1 INNER JOIN T2 ON T1.F1=T2.F2;
左外部合併列出左邊資料表全部的項目 SELECT …FROM T1 LEFT OUTER JOIN T2 ONT1.F1=T2.F2;
右外部合併列出右邊資料表全部的項目 SELECT …FROM T1 RIGHT OUTER JOIN T2 ONT1.F1=T2.F2;
練習:JOIN • 使用 ch6-ex3.sql • 以 SQL 列出員工名單,包含員工所屬的部門名稱。 • 製作一個VIEW,名稱為EmpDept,列出『所有的』員工,包含員工所屬的部門名稱。 • 製作一個VIEW,名稱為DeptEmp,列出『所有的』部門,以及歸屬於該部門的員工。
聯集 UNION SELECT … UNION SELECT … • 將兩個(以上) SQL 查詢的結果合併起來 • 個別 SQL 語句所產生的資料必須 • 欄位數量相同 • 資料型別相同 • 順序相同 • UNION只返回不同值的資料列如同 SELECT DISTINCT
聯集 UNION ALL SELECT … UNION ALL SELECT … • UNION ALL 列出所有的資料 • 重複列出相同的資料
練習:UNION • 使用汽車銷售範例資料庫(EX5.mdfEX5_log.ldf) • 以 SQL 查詢『台北銷售紀錄』,列出『月份』、『產品編號』、『產品名稱』三個欄位 • 以 SQL 查詢『台中銷售紀錄』,列出『月份』、『產品編號』、『產品名稱』三個欄位 • 以 UNION ALL 指令將上述查詢結果合併成一筆 • 改以 UNION 指令將上述查詢結果合併成一筆
進階SQL語法 • 複合條件(Compound Condition) • AND、OR、NOT(且、或、否) • 述詞(Predicate) • BETWEEN ... AND(資料值介於…之間) • IN(在集合內) • EXISTS(交集不是空集合) • IS NULL(是空值,空值不能用等號比對) • LIKE(長得像…,模糊比對) • 萬用字元 • % 任何長度的任何字,沒有也可以 • _ 一個字,任何字皆可(Access 用 ?)