11月 03, 2010

SQL 快攻手冊

# (DDL) 針對 Table 架構運作的指令 - CREATE / DROP / ALTER
# (DML) 針對 值組 運作的指令 - INSERT / DELETE / UPDATE

# 建立一張表內含兩個欄位
create table myTab
(sn char(10),
name char(10)
)

# 在 myTab 加入一筆資料
INSERT INTO myTab
VALUES ('1', 'jack');

# 在 myTab 中異動加入一個新的欄位 tel
alter table myTab
add tel char(20);

# 把 myTab 整張表砍了
drop table myTab

# 建立一個新的 view 資料來源 Orders
create view myView as
select *
from Orders

# 在 myTab 中將 name 欄位為 JACK 的人改成 jack
update myTab set name='jack'
where name='JACK'

# 更新一個原本為 NULL 的欄位,要用 is 這個字!!
update myTab set tel='5251234'
where tel is NULL

# DQL (Data Query Language)
SELECT 等同π (白話:想秀出什麼資料,可以當作 printf)
FROM 等同×
WHERE 等同σ

[聚合函數,將輸入處理後回傳一個值]

# 使用 count 函數算出薪水超過一千的人數
# 注意 count(*) 輸入為星號 * 表示
select count(*) as my_Total
from myTab
where salary >1000

# 如果 female 有三筆資料,該查詢會全都列出
select *
from myTab
where sex='female'

# 如果 female 有三筆資料,用了 count 後只會回傳 "3"
select count(*)
from myTab
where sex='female'

Group by 登場


# 用了 Group 指令則 select 時的對象:
1. 在 Group 中出現的欄位
2. 聚合函數(sum,avg...)

聚合函數要針對什麼欄位做運算就不限定了
# 用性別分群,並計算各群內的成員總數(令為 sum欄)
select sex, count(*) as sum
from myTab
group by sex

結果:
sex sum
male 3
female 1

# 使用 in 語法條列各狀況
select *
from myTab
where dept in ('IT', 'PM');

# 注意下面這兩個用法,前者是要秀出共出現了多少[不同]部門
# 但若將 distinct 與 group 合用這是沒意義的,因為員工已經被分化到各部門了
select dept, count(distinct dept)
from myTab

/* 沒意義 因為員工已經被撥到各群了*/
select dept, count(distinct dept)
from myTab
group by dept
# 重點提示:count 配 group,每次就是以一個 group 為計數範圍
# 去算 IT 部門內有多少人、HR 部門有多少人
# having 增加條件限制,部門人數超過 2人的才列出
select dept, count(*) as people
from myTab
group by dept
having people>=2

join 登場


[表格有兩張 myTab 與 dept]
dept(dept_no, dept_name)
myTab(no, name, dept, tel, money, sex)

# 以各部門為group,計算總薪水
select D.dept_name , sum(E.money)
from dept D, myTab E
where D.dept_name = E.dept
group by (D.dept_name)
# 先將 卡式積(myTab, dept) 產生後,去撈薪水超過三萬者。並且以 dept_name 為群組,計算每組內的人數,人數超過一人者才列出
select D.dept_name, count(*)
from myTab E, dept D
where E.money>30000 and D.dept_name=E.dept
group by D.dept_name
having count(*) >1

資料庫整合性限制


# 定義屬性規則
NationalID_T char(10) /* 如同用 typedef */
Salary_T INT /* typedef Salary_T INT */
Create Table Emp
( NID NationalID_T NOT NULL, /* NID 型別為 NationalID_T */
Name CHAR(20)
Salary Salary_T CHECK(Salary>0) /* 新加資料時會檢查 Salary>0 */
)
# 定義約束(每次 Insert 時都會檢查)
新增資料到 Emp 表格內時,都會檢查 Salary 的值要為正數。
CREATE ASSERTION Sal_Check
CHECK NOT EXIST
( select * from Emp where Salary<0)

沒有留言:

張貼留言