2016年1月21日 星期四

SQL練習題

CREATE TABLE STUDENT

(SNO VARCHAR(3) NOT NULL, 

SNAME VARCHAR(4) NOT NULL,

SSEX VARCHAR(2) NOT NULL, 

SBIRTHDAY DATETIME,

CLASS VARCHAR(5))ENGINE=MyISAM AUTO_INCREMENT=348 DEFAULT CHARSET=utf8 ;;

CREATE TABLE COURSE

(CNO VARCHAR(5) NOT NULL, 

CNAME VARCHAR(10) NOT NULL, 

TNO VARCHAR(10) NOT NULL)ENGINE=MyISAM AUTO_INCREMENT=348 DEFAULT CHARSET=utf8 ;;

CREATE TABLE SCORE 

(SNO VARCHAR(3) NOT NULL, 

CNO VARCHAR(5) NOT NULL, 

DEGREE NUMERIC(10, 1) NOT NULL)ENGINE=MyISAM AUTO_INCREMENT=348 DEFAULT CHARSET=utf8 ;;

CREATE TABLE TEACHER 

(TNO VARCHAR(3) NOT NULL, 

TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, 

TBIRTHDAY DATETIME NOT NULL, PROF VARCHAR(6), 

DEPART VARCHAR(10) NOT NULL)ENGINE=MyISAM AUTO_INCREMENT=348 DEFAULT CHARSET=utf8 ;;

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾華' 

,'男' ,1977-09-01,95033);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' 

,'男' ,1975-10-02,95031);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王麗' 

,'女' ,1976-01-23,95033);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李軍' 

,'男' ,1976-02-20,95033);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' 

,'女' ,1975-02-10,95031);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陸君' 

,'男' ,1974-06-03,95031);

INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'計算機導論',825);

INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系統' ,804);

INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'數據電路' ,856);

INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等數學' ,100);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);

INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);

INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 

VALUES (804,'李誠','男','1958-12-02','副教授','計算機系');

INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 

VALUES (856,'張旭','男','1969-03-12','講師','電子工程系');

INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)

VALUES (825,'王萍','女','1972-05-05','助教','計算機系');

INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) 

VALUES (831,'劉冰','女','1977-08-14','助教','電子工程系');

題目:

1、 查詢Student表中的所有記錄的Sname、Ssex和Class列。

2、 查詢教師所有的單位即不重複的Depart列。

3、 查詢Student表的所有記錄。

4、 查詢Score表中成績在60到80之間的所有記錄。

5、 查詢Score表中成績為85,86或88的記錄。

6、 查詢Student表中「95031」班或性別為「女」的同學記錄。

7、 以Class降序查詢Student表的所有記錄。

8、 以Cno升序、Degree降序查詢Score表的所有記錄。

9、 查詢「95031」班的學生人數。

10、查詢Score表中的最高分的學生學號和課程號。

11、查詢『3-105』號課程的平均分。

12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。

13、查詢最低分大於70,最高分小於90的Sno列。

14、查詢所有學生的Sname、Cno和Degree列。

15、查詢所有學生的Sno、Cname和Degree列。

16、查詢所有學生的Sname、Cname和Degree列。

17、查詢「95033」班所選課程的平均分。

18、假設使用如下命令建立了一個grade表:

create table grade(low number(3,0),upp number(3),rank char(1));

insert into grade values(90,100,』A』);

insert into grade values(80,89,』B』);

insert into grade values(70,79,』C』);

insert into grade values(60,69,』D』);

insert into grade values(0,59,』E』);

commit;

現查詢所有同學的Sno、Cno和rank列。

19、查詢選修「3-105」課程的成績高於「109」號同學成績的所有同學的記錄。

20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。

21、查詢成績高於學號為「109」、課程號為「3-105」的成績的所有記錄。

22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。

23、查詢「張旭「教師任課的學生成績。

24、查詢選修某課程的同學人數多於5人的教師姓名。

25、查詢95033班和95031班全體學生的記錄。

26、查詢存在有85分以上成績的課程Cno.

27、查詢出「計算機系「教師所教課程的成績表。

28、查詢「計算機系」與「電子工程系「不同職稱的教師的Tname和Prof。

29、查詢選修編號為「3-105「課程且成績至少高於選修編號為「3-245」的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。

30、查詢選修編號為「3-105」且成績高於選修編號為「3-245」課程的同學的Cno、Sno和Degree.

31、查詢所有教師和同學的name、sex和birthday.

32、查詢所有「女」教師和「女」同學的name、sex和birthday.

33、查詢成績比該課程平均成績低的同學的成績表。

34、查詢所有任課教師的Tname和Depart.

35 查詢所有未講課的教師的Tname和Depart. 

36、查詢至少有2名男生的班號。

37、查詢Student表中不姓「王」的同學記錄。

38、查詢Student表中每個學生的姓名和年齡。

39、查詢Student表中最大和最小的Sbirthday日期值。

40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。

41、查詢「男」教師及其所上的課程。

42、查詢最高分同學的Sno、Cno和Degree列。

43、查詢和「李軍」同性別的所有同學的Sname.

44、查詢和「李軍」同性別並同班的同學Sname.

45、查詢所有選修「計算機導論」課程的「男」同學的成績表

參考答案:

1. SELECT SNAME,SSEX,CLASS FROM STUDENT;

2. SELECT DISTINCT DEPART FROM TEACHER;

3. SELECT * FROM STUDENT;

4. SELECT * FROM SCORE WHERE DEGREE BETWEEN 60 AND 80;

5.SELECT * FROM SCORE WHERE DEGREE IN (85,86,88);

6. SELECT * FROM STUDENT WHERE CLASS='95031' OR SSEX='女';

7.SELECT * FROM STUDENT ORDER BY CLASS DESC;

8.SELECT * FROM SCORE ORDER BY CNO ASC,DEGREE DESC;

9.SELECT COUNT(*) FROM STUDENT WHERE CLASS='95031';

10.SELECT SNO,CNO FROM SCORE WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE);

SELECT SNO,CNO FROM SCORE ORDER BY DEGREE DESC LIMIT 1;

11.SELECT AVG(DEGREE) FROM SCORE WHERE CNO='3-105';

12.select avg(degree),cno

from score

where cno like '3%'

group by cno

having count(sno)>= 5;

13.SELECT SNO FROM SCORE GROUP BY SNO HAVING MIN(DEGREE)>70 AND MAX(DEGREE)<90;

14.SELECT A.SNAME,B.CNO,B.DEGREE FROM STUDENT AS A JOIN SCORE AS B ON A.SNO=B.SNO;

15.SELECT A.CNAME, B.SNO,B.DEGREE FROM COURSE AS A JOIN SCORE AS B ON A.CNO=B.CNO ;

16.SELECT A.SNAME,B.CNAME,C.DEGREE FROM STUDENT A JOIN (COURSE B,SCORE C)

ON A.SNO=C.SNO AND B.CNO =C.CNO;

17.SELECT AVG(A.DEGREE) FROM SCORE A JOIN STUDENT B ON A.SNO = B.SNO WHERE B.CLASS='95033';

18.SELECT A.SNO,A.CNO,B.RANK FROM SCORE A,GRADE B WHERE A.DEGREE BETWEEN B.LOW AND B.UPP

ORDER BY RANK;

19.SELECT A.* FROM SCORE A JOIN SCORE B WHERE A.CNO='3-105' AND A.DEGREE>B.DEGREE AND

B.SNO='109' AND B.CNO='3-105';

另一解法:SELECT A.* FROM SCORE A WHERE A.CNO='3-105' AND A.DEGREE>ALL(SELECT DEGREE FROM

SCORE B WHERE B.SNO='109' AND B.CNO='3-105');

20.SELECT * FROM score s WHERE DEGREE<(SELECT MAX(DEGREE) FROM SCORE) GROUP BY SNO HAVING

COUNT(SNO)>1 ORDER BY DEGREE ;

21.見19的第二種解法

22。SELECT SNO,SNAME,SBIRTHDAY FROM STUDENT WHERE YEAR(SBIRTHDAY)=(SELECT YEAR(SBIRTHDAY)

FROM STUDENT WHERE SNO='108');

ORACLE:select x.cno,x.Sno,x.degree from score x,score y where x.degree>y.degree and

y.sno='109'and y.cno='3-105';

select cno,sno,degree from score where degree >(select degree from score where sno='109'

and cno='3-105')

23.SELECT A.SNO,A.DEGREE FROM SCORE A JOIN (TEACHER B,COURSE C)

ON A.CNO=C.CNO AND B.TNO=C.TNO

WHERE B.TNAME='張旭';

另一種解法:select cno,sno,degree from score where cno=(select x.cno from course x,teacher y

where x.tno=y.tno and y.tname='張旭');

根據實際EXPLAIN此SELECT語句,第一個的掃描次數要小於第二個

24.SELECT A.TNAME FROM TEACHER A JOIN (COURSE B, SCORE C) ON (A.TNO=B.TNO AND B.CNO=C.CNO)

GROUP BY C.CNO HAVING COUNT(C.CNO)>5;

另一種解法:select tname from teacher where tno in(select x.tno from course x,score y where

x.cno=y.cno group by x.tno having count(x.tno)>5);

實際測試1明顯優於2

25。select cno,sno,degree from score where cno=(select x.cno from course x,teacher y where

x.tno=y.tno and y.tname='張旭');

26。SELECT CNO FROM SCORE GROUP BY CNO HAVING MAX(DEGREE)>85;

另一種解法:select distinct cno from score where degree in (select degree from score where

degree>85);

27。SELECT A.* FROM SCORE A JOIN (TEACHER B,COURSE C) ON A.CNO=C.CNO AND B.TNO=C.TNO

WHERE B.DEPART='計算機系';

另一種解法:SELECT * from score where cno in (select a.cno from course a join teacher b on

a.tno=b.tno and b.depart='計算機系');

此時2略好於1,在多連接的境況下性能會迅速下降

28。select tname,prof from teacher where depart='計算機系' and prof not in (select prof from

teacher where depart='電子工程系');

29。SELECT * FROM SCORE WHERE DEGREE>ANY(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER

BY DEGREE DESC;

30。SELECT * FROM SCORE WHERE DEGREE>ALL(SELECT DEGREE FROM SCORE WHERE CNO='3-245') ORDER

BY DEGREE DESC;

31.SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT

UNION

SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER;

32.SELECT SNAME AS NAME, SSEX AS SEX, SBIRTHDAY AS BIRTHDAY FROM STUDENT WHERE SSEX='女'

UNION

SELECT TNAME AS NAME, TSEX AS SEX, TBIRTHDAY AS BIRTHDAY FROM TEACHER WHERE TSEX='女';

33.SELECT A.* FROM SCORE A WHERE DEGREE<(SELECT AVG(DEGREE) FROM SCORE B WHERE A.CNO=B.CNO);

須注意********此題

34。解法一:SELECT A.TNAME,A.DEPART FROM TEACHER A JOIN COURSE B ON A.TNO=B.TNO;

解法二:select tname,depart from teacher a where exists

(select * from course b where a.tno=b.tno);

解法三:SELECT TNAME,DEPART FROM TEACHER WHERE TNO IN (SELECT TNO FROM COURSE);

實際分析,第一種揭發貌似更好,至少掃描次數最少。

35.解法一:SELECT TNAME,DEPART FROM TEACHER A LEFT JOIN COURSE B USING(TNO) WHERE ISNUL

(B.tno);

解法二:select tname,depart from teacher a where not exists

(select * from course b where a.tno=b.tno);

解法三:SELECT TNAME,DEPART FROM TEACHER WHERE TNO NOT IN (SELECT TNO FROM COURSE);

NOT IN的方法效率最差,其餘兩種差不多

36.SELECT CLASS FROM STUDENT A WHERE SSEX='男' GROUP BY CLASS HAVING COUNT(SSEX)>1;

37.SELECT * FROM STUDENT A WHERE SNAME not like '王%';

38.SELECT SNAME,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT;

39.select sname,sbirthday as THEMAX from student where sbirthday =(select min(SBIRTHDAY)

from student)

union

select sname,sbirthday as THEMIN from student where sbirthday =(select max(SBIRTHDAY) from

student);

40.SELECT CLASS,(YEAR(NOW())-YEAR(SBIRTHDAY)) AS AGE FROM STUDENT ORDER BY CLASS DESC,AGE

DESC;

41.SELECT A.TNAME,B.CNAME FROM TEACHER A JOIN COURSE B USING(TNO) WHERE A.TSEX='男';

42.SELECT A.* FROM SCORE A WHERE DEGREE=(SELECT MAX(DEGREE) FROM SCORE B );

43.SELECT SNAME FROM STUDENT A WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李軍');

44.SELECT SNAME FROM STUDENT A WHERE SSEX=(SELECT SSEX FROM STUDENT B WHERE B.SNAME='李軍' )

AND CLASS=(SELECT CLASS FROM STUDENT C WHERE c.SNAME='李軍');

45.解法一:SELECT A.* FROM SCORE A JOIN (STUDENT B,COURSE C) USING(sno,CNO) WHERE B.SSEX='男

' AND C.CNAME='計算機導論';

解法二:select * from score where sno in(select sno from student where

ssex='男') and cno=(select cno from course

where cname='計算機導論');

2016年1月13日 星期三

ASP.NET隨手筆記

ASP.NET 主版頁面可以讓您在應用程式頁面中建立一致的配置樣式。單一主版頁面會定義應用程式中所有頁面 (或頁面群組) 的外觀和標準行為。然後,您可以建立包含想要顯示內容的個別內容頁面。當使用者要求內容頁面時,它們就會跟主版頁面合併,以產生結合主版頁面配置與內容頁 面內容的輸出。
http://www.dotblogs.com.tw/rab/archive/2012/02/28/.net-masterpage-nestedmasterpage.aspx
Master Page,讓網頁設計師可以採用視覺編輯的方式設計網站中每一個網頁欲套用的樣版,再套用到網站中每一個網頁,達到風格一致的效果,縮短網頁的設計和維護的時間,提升網頁開發的生產力

.NET framework
NET Framework 是建置 Windows、Windows Phone、Windows Server 和 Microsoft Azure 應用程式的開發平台。
這是由通用語言執行平台 (CLR) 和 .NET Framework 類別庫 (包括支援各種技術的類別、介面和實值類型) 所組成。
.NET Framework 提供了受管理的(managed)執行環境,簡化了開發和部署,並與多種程式語言整合

記憶體管理
一般類型系統
大量類別庫
開發架構和技術
.NET Framework 包含特定應用程式開發領域所需的程式庫
Web 應用程式所需的 ASP.NET
資料存取所需的 ADO.NET
服務導向應用程式所需的 Windows Communication Foundation

語言互通性
版本相容性
並存執行

多目標

2016年1月11日 星期一

資料庫概念隨手筆記

Transaction
     commit
     全部sql執行成功將結果交給資料庫
     rollback
     其中一個sql執行失敗就必須還原全部動作

ACID
     完成姓A
     異動執行若非全部認可就是全部失敗
     一致性C
     遵守資料庫強制的規定,否則錯誤
     隔離性I
     異動執行不允許查詢
     耐久性D
     異動完成資料無法馬上變更

B-tree
     多欄位索引
定義除了繼承二元樹的定義外,二元搜索樹本身也有額外的定義,但可能會看到幾種不同的說法,而較多數人使用的定義如下:
  1. 左子樹不為空,則左子樹的所有節點的鍵值(Key)小於根節點的鍵值。
  2. 右子樹不為空,則右子樹的所有節點的鍵值(Key)大於根節點的鍵值。
  3. 左右子樹也都是二元搜索樹。
  4. 節點不會有重複的鍵值。
這個定義是樹中的節點都具有Key-value pair情況,有時候可能會其他變化:
  1. 沒有鍵值,而用值(Value)來比較。
  2. 允許重複的資料,此時會出現等於的情況,則將定義1.改成小於等於或者定義2.改成大於等於。

unique
不允許重複值,也就是唯一值
primary
     不能為空值,也就是主鍵值

正規化

1.  第一 : 同一欄位不能有一筆以上的資料(單一值)    
錯誤:
交易
顧客日期數量
PeteMonday19.00
-28.20
PeteWednesday-84.00
SarahFriday100.00
150.00
-40.00

正確:
 
交易
顧客日期數量
PeteMonday19.00
PeteMonday-28.20
PeteWednesday-84.00
SarahFriday100.00
SarahFriday150.00
SarahFriday-40.00
 

2.  第二 : 同一個table應該是要相關的資料
錯誤:
元件來源
元件 ID (主鍵)價格供應商ID (主鍵)供應商名稱供應商住址
6559.991Stylized PartsVA
7320.001Stylized PartsVA
6569.992ACME IndustriesCA
正確:
供應商
供應商 ID (主鍵)名稱住址
2ACME IndustriesCA
1Stylized PartsVA

元件來源
元件 ID (主鍵)價格供應商 ID(主鍵、外來鍵)
6559.991
7320.001
6569.992

3.  第三 : 非主鍵欄位不能有依賴關係 ex 數量 單價 小計(x)

錯誤:

價格供應商名稱供應商住址
59.99ACME IndustriesCA
20.00ACME IndustriesCA
69.99Stylized PartsVA



Primary Key
主鍵 (Primary Key) 中的每一筆資料都是表格中的唯一值。換言之,它是用來獨一無二地確認一個表格中的每一行資料。主鍵可以是原本資料內的一個欄位,或是一個人造欄位 (與原本資料沒有關係的欄位)。主鍵可以包含一或多個欄位。當主鍵包含多個欄位時,稱為組合鍵 (Composite Key)。

主鍵可以在建置新表格時設定 (運用 CREATE TABLE 語句),或是以改變現有的表格架構方式設定 (運用 ALTER TABLE 語句)

MySQL:
CREATE TABLE Customer
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));
Oracle:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
SQL Server:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
以下則是以改變現有表格架構來設定主鍵的方式:
MySQL
ALTER TABLE Customer ADD PRIMARY KEY (SID);
Oracle
ALTER TABLE Customer ADD PRIMARY KEY (SID);
SQL Server
ALTER TABLE Customer ADD PRIMARY KEY (SID);

請注意,在用 ALTER TABLE 語句來添加主鍵之前,我們需要確認被用來當做主鍵的欄位是設定為 『NOT NULL』 ;也就是說,那個欄位一定不能沒有資料



FOREIGN KEY
外來鍵是一個(或數個)指向另外一個表格主鍵的欄位。外來鍵的目的是確定資料的參考完整性 (Referential Integrity)。換言之,只有被准許的資料值才會被存入資料庫內。
舉例來說,假設我們有兩個表格:一個 CUSTOMER 表格,裡面記錄了所有顧客的資料;另一個 ORDERS 表格,裡面記錄了所有顧客訂購的資料。在這裡的一個限制,就是所有的訂購資料中的顧客,都一定是要跟在 CUSTOMER 表格中存在。在這裡,我們就會在 ORDERS 表格中設定一個外來鍵,而這個外來鍵是指向 CUSTOMER 表格中的主鍵。這樣一來,我們就可以確定所有在 ORDERS 表格中的顧客都存在 CUSTOMER 表格中。換句話說,ORDERS 表格之中,不能有任何顧客是不存在於 CUSTOMER 表格中的資料。
這兩個表格的結構將會是如下:
CUSTOMER 表格
欄位名性質
SID主鍵
Last_Name
First_Name
ORDERS 表格
欄位名性質
Order_ID主鍵
Order_Date
Customer_SID外來鍵
Amount
在以上的例子中,ORDERS 表格中的 Customer_SID 欄位是一個指向 CUSTOMER 表格中 SID 欄位的外來鍵。
以下列出幾個在建置 ORDERS 表格時指定外來鍵的方式:
MySQL:
CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
PRIMARY KEY (Order_ID),
FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID));
Oracle:
CREATE TABLE ORDERS
(Order_ID integer PRIMARY KEY,
Order_Date date,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);
SQL Server:
CREATE TABLE ORDERS
(Order_ID integer PRIMARY KEY,
Order_Date datetime,
Customer_SID integer REFERENCES CUSTOMER (SID),
Amount double);
以下的例子則是藉著改變表格架構來指定外來鍵。這裡假設 ORDERS 表格已經被建置,而外來鍵尚未被指定:
MySQL:
ALTER TABLE ORDERS
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);
Oracle:
ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);

SQL Server:
ALTER TABLE ORDERS 
ADD FOREIGN KEY (Customer_SID) REFERENCES CUSTOMER (SID);




ALTER TABLE

在表格被建立在資料庫中後,我們常常會發現,這個表格的結構需要有所改變。常見的改變如下:
  • 加一個欄位
  • 刪去一個欄位
  • 改變欄位名稱
  • 改變欄位的資料種類
以上列出的改變並不是所有可能的改變。ALTER TABLE 也可以被用來作其他的改變,例如改變主鍵定義。
ALTER TABLE 的語法如下:
ALTER TABLE "table_name"
[改變方式];
[改變方式] 的詳細寫法會依我們想要達到的目標而有所不同。再以上列出的改變中,[改變方式] 如下:
  • 加一個欄位: ADD "欄位 1" "欄位 1 資料種類"
  • 刪去一個欄位: DROP "欄位 1"
  • 改變欄位名稱: CHANGE "原本欄位名" "新欄位名" "新欄位名資料種類"
  • 改變欄位的資料種類: MODIFY "欄位 1" "新資料種類"
以下我們用在CREATE TABLE 一頁建出的 Customer 表格來當作例子:
Customer 表格
欄位名稱資料種類
First_Namechar(50)
Last_Namechar(50)
Addresschar(50)
Citychar(50)
Countrychar(25)
Birth_Datedatetime
第一,我們要加入一個叫做 "Gender" 的欄位。這可以用以下的指令達成:
ALTER TABLE Customer ADD Gender char(1);
這個指令執行後的表格架構是:
Customer 表格
欄位名稱資料種類
First_Namechar(50)
Last_Namechar(50)
Addresschar(50)
Citychar(50)
Countrychar(25)
Birth_Datedatetime
Genderchar(1)
接下來,我們要把 "Address" 欄位改名為 "Addr"。這可以用以下的指令達成:
ALTER TABLE Customer CHANGE Address Addr char(50);
這個指令執行後的表格架構是:
Customer 表格
欄位名稱資料種類
First_Namechar(50)
Last_Namechar(50)
Addrchar(50)
Citychar(50)
Countrychar(25)
Birth_Datedatetime
Genderchar(1)
再來,我們要將 "Addr" 欄位的資料種類改為 char(30)。這可以用以下的指令達成:
ALTER TABLE Customer MODIFY Addr char(30);
這個指令執行後的表格架構是:
Customer 表格
欄位名稱資料種類
First_Namechar(50)
Last_Namechar(50)
Addrchar(30)
Citychar(50)
Countrychar(25)
Birth_Datedatetime
Genderchar(1)
最後,我們要刪除 "Gender" 欄位。這可以用以下的指令達成:
ALTER TABLE Customer DROP Gender;
這個指令執行後的表格架構是:
Customer 表格
欄位名稱資料種類
First_Namechar(50)
Last_Namechar(50)
Addrchar(30)
Citychar(50)
Countrychar(25)
Birth_Datedatetime


DROP TABLE 
有時候我們會決定我們需要從資料庫中清除一個表格。事實上,如果我們不能這樣做的話,那將會是一個 很大的問題,因為資料庫管理師 (Database Administrator - DBA) 勢必無法對資料庫做有效率的管理。 還好,SQL 有提供一個 DROP TABLE 的語法來讓我們清除表格。 DROP TABLE 的語法是:
DROP TABLE "表格名";
我們如果要清除在上一頁中建立的顧客表格,我們就鍵入:
DROP TABLE Customer;



TRUNCATE TABLE
有時候我們會需要清除一個表格中的所有資料。要達到者個目的,一種方式是我們在 上一頁看到 的 DROP TABLE 指令。不過這樣整個表格就消失,而無法再被用了。另一種方式就是運 用 TRUNCATE TABLE的指令。在這個指令之下,表格中的資料會完全消失, 可是表格本身會繼續存在。 TRUNCATE TABLE 的語法為下:
TRUNCATE TABLE "表格名";
所以,我們如果要清除在 SQL Create Table 那一頁建立的顧客表格之內的資料,我們就鍵入:
TRUNCATE TABLE Customer;




UPDATE 
我們有時候可能會需要修改表格中的資料。在這個時候,我們就需要用到UPDATE 指令。這個指令的語法是:
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";
最容易瞭解這個語法的方式是透過一個例子。假設我們有以下的表格:
Store_Information 表格
Store_NameSalesTxn_Date
Los Angeles150005-Jan-1999
San Diego25007-Jan-1999
Los Angeles30008-Jan-1999
Boston70008-Jan-1999
我們發現說 Los Angeles 在 1999 年 1 月 8 號的營業額實際上是 $500,而不是表格中所儲存的 $300,因此我們用以下的 SQL 來修改那一筆資料:
UPDATE Store_Information
SET Sales = 500
WHERE Store_Name = 'Los Angeles'
AND Txn_Date = 'Jan-08-1999';
現在表格的內容變成:
Store_Information 表格
Store_NameSalesTxn_Date
Los Angeles150005-Jan-1999
San Diego25007-Jan-1999
Los Angeles50008-Jan-1999
Boston70008-Jan-1999
在這個例子中,只有一筆資料符合 WHERE 子句中的條件。如果有多筆資料符合條件的話,每一筆符合條件的資料都會被修改的。
我們也可以同時修改好幾個欄位。這語法如下:
UPDATE "表格"
SET "欄位1" = [值1], "欄位2" = [值2]
WHERE "條件";



DELETE FROM
在某些情況下,我們會需要直接由資料庫中去除一些資料。這可以藉由 DELETE FROM 指令來達成。它的語法是:
DELETE FROM "表格名"
WHERE "條件";
以下我們用個實例說明。假設我們有以下這個表格:
Store_Information 表格
Store_NameSalesTxn_Date
Los Angeles150005-Jan-1999
San Diego25007-Jan-1999
Los Angeles30008-Jan-1999
Boston70008-Jan-1999
而我們需要將有關 Los Angeles 的資料全部刪除。在這裡我們可以用以下的 SQL 來達到這個目的:
DELETE FROM Store_Information
WHERE Store_Name = 'Los Angeles';
現在表格的內容變成:
Store_Information 表格
Store_NameSalesTxn_Date
San Diego250Jan-07-1999
Boston700Jan-08-1999