Transcript 學習SQL 語言
熟悉資料庫系統的SQL查詢語言。
透過實例來學習SQL的語法。
安裝與設定MySQL。
利用MySQL測試SQL語法。
SQL是什麼 ?
SQL有什麼用途 ?
這是一個腦力激盪的園地!
relational data model與
programming language
的computation model不
同的特性也稱為
impedance mismatch。
資料查詢語言(DQL, Data Query Language)
資料定義語言(DDL, Data Definition
Language)
Create table, alter table
資料處理語言(DML, Data Manipulation
Language)
Select
Insert, Update, Delete
資料控制語言(DCL, Data Control Language)
Begin transaction, commit
將汽車銷售範例資料庫(EX5.mdf,EX5_log.ldf)
Attach(附加)到 MS SQL 資料庫伺服器
查出[台北銷售紀錄]之中,RAV4的銷售數量
查出產品編號 04 的產品名稱
查出 Yaris 的售價與庫存量
使用汽車銷售範例資料庫
USE EX5
結合台北銷售紀錄與產品基本資料,列出台北銷
售月報表,欄位包括:產品編號 ,產品名稱,數量,
售價
序前題,將售價改稱為[單價],並計算『小計』
用 AS 更改欄位名稱
欄位可以直接加減乘除
-- 建立資料表
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', '02999-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?
SELECT [DISTINCT|ALL] {*|欄位名稱}
FROM 表格名稱
[WHERE 條件設定]
[GROUP BY 欄位名稱]
[HAVING 條件設定] /*針對GROUP BY */
[ORDER BY 欄位名稱]
關聯運算(relational operator)
作用
=
比較是否相等(equal)
<>
比較是否不相等(not equal)
>
比較是否大於
<
比較是否小於
>=
比較是否大於等於
<=
比較是否小於等於
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');
AVG() 計算平均值 Average
SUM() 計算加總 Summation
COUNT() 計算個數
MAX() 求最大值
MIN() 求最小值
如何算出總銷售量(total quantity)?
如何算出產品I03總共賣出多少個?
如何算出產品I01共有幾張訂單?
用 AS 幫欄位取別名
用 AS 幫資料表取別名
AS 可以省略!
FIRST() 第一個
LAST() 最後一個
UCASE() 轉成大寫英文字母
LCASE() 轉成小寫英文字母
MID() 擷取字串中間的一段字
MID(column_name,start[,length])
從 1 開始數
LEN() 計算字串長度
ROUND() 四捨五入
ROUND(column_name, 小數點以下的位數)
NOW() 現在日期與時間
MS SQL 用 GetDate()
資料集VIEW,在微軟的系統中翻譯成『檢視』或『檢視表』
是一種虛擬的資料表
儲存的是SQL敘述,不是資料!
提昇資料存取使用的彈性
安全性
只要記一個名字,不必記憶複雜的整串SQL
可以隱藏不想讓特定人士看到的資料
一致性
一致的資料表示法
資料表 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);
資料表 EMPLOYEE
虛擬表格 DepEmp
CREATE VIEW DepEmp
AS
SELECT DepNo, EmpNo, Name, Salary
FROM Employee;
SELECT * FROM DepEmp ORDER BY DepNo, Salary;
有時候查詢所得到的資料很多,經過排序
(sorting)與分組(grouping)以後,會比較容易瀏
覽
資料記錄的排序可以用「order by」的語法,然
後以關鍵字「asc」代表升冪(Ascending)的
排序,以「desc」代表降冪(Descending)的
排序
以SQL列出各項產品(item)的總銷售量
以SQL列出各項產品被下訂的次數(訂單量)
SUM(quantity)
GROUP BY item
COUNT(order_no)
GROUP BY item
請將上面兩個結果合成一個
試計算各項產品的『平均訂單銷售量』,
平均訂單銷售量=總銷售量/訂單量
試比較使用VIEW和不用VIEW的差異
設計一個SQL敘述,列出各部門的平均薪資,依
照平均薪資的高低排列,薪資水準高的排前面。
AVG(Salary)
GROUP BY DepNo
以設計好的SQL製作一個名為 DepSalaryLevel
的 VIEW
合併
自然合併 JOIN … ON
兩邊資料表都有的才留下
LEFT OUTER JOIN … ON
左邊資料表有的都必須留下,右邊對不上的資料顯示
null
RIGHT OUTER JOIN … ON
右邊資料表有的都必須留下,左邊對不上的資料顯示
null
聯集
UNION
SELECT …
FROM T1, T2
WHERE T1.F1=T2.F2;
相當於
SELECT …
FROM T1 INNER JOIN T2 ON
T1.F1=T2.F2;
SELECT …
FROM T1 LEFT OUTER JOIN T2
ON
T1.F1=T2.F2;
SELECT …
FROM T1 RIGHT OUTER JOIN
T2 ON
T1.F1=T2.F2;
使用 ch6-ex3.sql
以 SQL 列出員工名單,包含員工所屬的部門名
稱。
製作一個VIEW,名稱為EmpDept,列出『所有
的』員工,包含員工所屬的部門名稱。
製作一個VIEW,名稱為DeptEmp,列出『所有
的』部門,以及歸屬於該部門的員工。
SELECT …
UNION
SELECT …
將兩個(以上) SQL 查詢的結果合併起來
個別 SQL 語句所產生的資料必須
欄位數量相同
資料型別相同
順序相同
UNION只返回不同值的資料列
如同 SELECT DISTINCT
SELECT …
UNION ALL
SELECT …
UNION ALL 列出所有的資料
重複列出相同的資料
使用汽車銷售範例資料庫(EX5.mdf
EX5_log.ldf)
以 SQL 查詢『台北銷售紀錄』,列出『月份』、
『產品編號』、『產品名稱』三個欄位
以 SQL 查詢『台中銷售紀錄』,列出『月份』、
『產品編號』、『產品名稱』三個欄位
以 UNION ALL 指令將上述查詢結果合併成一
筆
改以 UNION 指令將上述查詢結果合併成一筆
複合條件(Compound Condition)
AND、OR、NOT(且、或、否)
述詞(Predicate)
BETWEEN ... AND(資料值介於…之間)
IN(在集合內)
EXISTS(交集不是空集合)
IS NULL(是空值,空值不能用等號比對)
LIKE(長得像…,模糊比對)
萬用字元
% 任何長度的任何字,沒有也可以
_ 一個字,任何字皆可(Access 用 ?)
將一個結果塞入另一個資料表
INSERT INTO 表格名稱
SELECT …
使用汽車銷售範例資料庫(EX5.mdf
EX5_log.ldf)
把『台北銷售紀錄』和『台中銷售紀錄』合併,
存入『銷售紀錄』
查出售價介於160000和260000之間的產品
列出產品名稱之中有『a』字的產品
列出產品名稱以『C』開頭的產品
列出產品名稱以『s』結尾的產品
列出產品名稱第二個字是『i』的產品
『次查詢』或『子查詢』
以SELECT敘述產生一個集合
外層再包一個SQL敘述,以WHERE的條件與集
合內的資料進行比對
IN 在集合內
EXISTS 集合運算的結果不是空的
NOT EXISTS 集合運算的結果是空的
= 相等,必須確定集合運算的結果只有一個元素
括號裡頭限定只
能出現一個值!
SELECT DepNo AS 部門代碼, Name AS 部門名稱
FROM DEPARTMENT
WHERE Manager = (
SELECT EmpNo
FROM EMPLOYEE
WHERE Name='Marty'
);
SELECT D.DepNo AS 部門代碼, D.Name AS 部門名稱, E.Name AS 經理姓名
FROM DEPARTMENT D INNER JOIN EMPLOYEE E ON D.Manager=E.EmpNo
WHERE E.Name='Marty';
用 Subquery 查出來的資訊,大部份也都可以用 JOIN 查出來!?
SELECT EmpNo AS 員工代碼, Name AS 員工姓名
FROM EMPLOYEE
WHERE DepNo IN (
SELECT D.DepNo
FROM DEPARTMENT D INNER JOIN EMPLOYEE E
ON D.Manager=E.EmpNo
WHERE E.Name='Marty'
);
把括號裡的資料當成『集合』。
以另一個 SQL 產生一個資料集合,用 IN 判斷所需的資料是否在這個集合內!
如何列出 Marty 下屬們的『部門名稱』?
使用 ch6-ex3.sql
以 SQL 查出薪水比 Marty 高的人是誰?
全公司的平均薪資是多少錢?
列出薪水高於平均薪資的人
那一個部門的平均薪資最高?
那一位經理的部門平均薪資最高?
使用汽車銷售範例資料庫(EX5.mdf
EX5_log.ldf)
查出台北賣得最好(銷售金額最高)的產品
查出台中賣得最好的產品
以排序+TOP達成目的
以 MAX 達成目的
查出台北有賣,台中沒賣的產品
查出台中有賣,台北沒賣的產品
Adventure Works Cycles 商務案例
AdventureWorks 結構描述
MySQL:
`關鍵字`
MS SQL:
[關鍵字]
MySQL的取得
MySQL的安裝
MySQL使用的練習
建立使用環境與資料庫的指令
資料維護的指令
查詢的指令
進階的查詢指令
與系統相關的指令
更改資料庫結構的指令
列出所有的資料庫
建立資料庫
create database mydb;
使用資料庫
show databases;
use mydb;
列出資料庫中的表格
show tables;