SQL指令練習(非12/17上課用喔)

張貼日期:Dec 16, 2013 5:22:40 PM

CREATE DATABASE MIS4G2A;

USE MIS4G2A;

CREATE TABLE 書籍(

登錄號 VARCHAR(20),

書名 VARCHAR(40) NOT NULL,

作者 VARCHAR(20),

出版社 VARCHAR(20),

出版日期 DATETIME,

專家書評 REAL,

PRIMARY KEY(登錄號),

CHECK(專家書評>=0 AND 專家書評<=10)

);

CREATE TABLE 學生(

學號 INT,

姓名 VARCHAR(20) NOT NULL,

電子郵件 VARCHAR(40),

科系 VARCHAR(20),

年齡 INT,

PRIMARY KEY(學號),

UNIQUE(電子郵件),

CHECK(年齡 >= 15 AND 年齡 <= 50)

);

CREATE TABLE 借書記錄(

學號 INT,

登錄號 VARCHAR(20),

借書日期 DATETIME DEFAULT GETDATE(),

到期日 DATETIME DEFAULT GETDATE()+60,

歸還日期 DATETIME NULL,

PRIMARY KEY(學號,登錄號),

FOREIGN KEY(學號) REFERENCES 學生(學號),

FOREIGN KEY(登錄號) REFERENCES 書籍(登錄號)

);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C165076','會計學原理','汪亞平','新文京開發','1999/05/25',7.9);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C165077','會計學原理','汪亞平','新文京開發','1999/05/25',7.9);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C141516','自慢','何飛鵬','商周/城邦文化','1997/06/26',8);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C142315','自慢','何飛鵬','商周/城邦文化','1997/06/26',8);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C171211','自慢/聰明糊塗心','何飛鵬','商周/城邦文化','1999/07/01',8.4);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C153636','專業/你的唯一生存之道','大前研一','天下遠見','1998/05/22',9);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C154949','再起動/職場絕對生存手冊','大前研一','天下遠見','1998/09/14',9.5);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C171050','中國大趨勢:八大支柱起經濟強權','約翰.奈思比','天下遠見','1999/07/01',9);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C063073','會計學原理','嚴玉珠','五南','1994/06/29',8.6);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C006113','總體經濟學','趙鳳培','三民','1979/09/01',8.5);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C006114','總體經濟學','趙鳳培','三民','1979/09/01',8.5);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C006055','經濟學概要','趙鳳培','三民','1987/03/01',8);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C006056','經濟學概要','趙鳳培','三民','1987/03/01',8);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C006117','總體經濟學','張慶輝','三民','1977/07/01',9);

INSERT INTO 書籍(登錄號,書名,作者,出版社,出版日期,專家書評)

VALUES('C130420','成本會計','嚴玉珠','五南','1993/02/27',8.5);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95433131,'陳智遠','95433131@yahoo.com.tw','資訊管理系',22);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95433121,'石智瑋','95433121@yahoo.com.tw','資訊管理系',28);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95433107,'林治勝','95433107@hotmail.com','資訊管理系',23);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95433114,'王勝為','95433114@gmail.com','資訊管理系',24);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95418107,'陳精鋒','95418107@hotmail.com','金融系',24);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95418133,'彭正敏','95418133@gmail.com','金融系',22);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95418104,'張建明','95418104@gmail.com','金融系',20);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(95418112,'張嘉浩','95418112@hotmail.com','金融系',22);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(97435137,'陳彥風','97435137@gmail.com','行銷系',18);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(97435125,'陳冠任','97435125@yahoo.com.tw','行銷系',19);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(97435122,'麥格倫','97435122@yahoo.com.tw','行銷系',18);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(97435132,'林治平','97435132@yahoo.com.tw','行銷系',19);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(96434208,'詹治堯','96434208@yahoo.com.tw','企管系',20);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(96434211,'高智崗','96434211@yahoo.com.tw','企管系',21);

INSERT INTO 學生(學號,姓名,電子郵件,科系,年齡)

VALUES(96434230,'庫倫','96434230@yahoo.com.tw','企管系',22);

INSERT INTO 借書記錄(學號,登錄號,借書日期,到期日,歸還日期)

VALUES(95433131,'C171050','1998/09/21','1998/09/21','1998/10/01');

INSERT INTO 借書記錄(學號,登錄號,借書日期,到期日,歸還日期)

VALUES(95433131,'C063073','1998/06/30','1998/09/30','1998/08/18');

INSERT INTO 借書記錄(學號,登錄號,借書日期,到期日,歸還日期)

VALUES(97435137,'C141516','1998/05/24','1998/08/24','1998/07/29');

INSERT INTO 借書記錄(學號,登錄號,借書日期,到期日,歸還日期)

VALUES(97435122,'C142315','1997/07/05','1997/10/05','1997/10/07');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(95433131,'C165076');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(97435137,'C165077');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(97435122,'C130420');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(97435122,'C171211');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(97435125,'C153636');

INSERT INTO 借書記錄(學號,登錄號)

VALUES(97435132,'C154949');

----刪除已建立的表格

DROP TABLE 借書記錄;

DROP TABLE 學生;

DROP TABLE 書籍;

----複製「學生」表格的內容成為另一個表格,名稱為student_bk

SELECT *

INTO student_bk

FROM 學生;

----新增限制式:主鍵

ALTER TABLE student_bk

    ADD CONSTRAINT CS999 PRIMARY KEY (學號);

----刪除限制式:主鍵

ALTER TABLE student_bk

    DROP CONSTRAINT CS999;

----通式:依條件撈出所需欄位及符合條件的紀錄

SELECT 欄位清單

FROM 表格名稱

WHERE 條件;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 專家書評 > 8.5;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 出版社 = '五南'  

   OR 出版社 = '天下遠見' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 出版社 = '三民' 

  AND 專家書評 > 8.8;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 出版社 <> '三民' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '%會計%' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '會計%' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '%會計' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '_經濟%' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '__經濟%' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '%經濟_' ;

----範例

SELECT 登錄號, 書名, 出版社

FROM 書籍

WHERE 書名 LIKE '%經濟__' ;

----範例(兩端點紀錄都會包括在內)

SELECT *

FROM 借書記錄

WHERE 借書日期 BETWEEN '1998-06-30' AND '1998-12-31';

----範例

SELECT *

FROM 借書記錄

WHERE 借書日期 > '1998-06-30' 

  AND 借書日期 < '1998-12-31';

----通式:降冪排序

SELECT 欄位清單

FROM 表格名稱

ORDER BY 欄位 DESC;

----通式:升冪排序

SELECT 欄位清單

FROM 表格名稱

ORDER BY 欄位 ASC;

----範例

SELECT *

FROM 借書記錄

ORDER BY 借書日期 ASC;

----範例

SELECT *

FROM 借書記錄

ORDER BY 借書日期 DESC;

----範例

SELECT *

FROM 借書記錄

ORDER BY 借書日期 ;

----SUM()    加總

----AVG()    平均

----MAX()    最大

----MIN()    最小

----COUNT()  計數

SELECT SUM(年齡)

FROM 學生;

 

SELECT AVG(年齡)

FROM 學生;

 

SELECT MAX(年齡)

FROM 學生;

 

SELECT MIN(年齡)

FROM 學生;

 

SELECT COUNT(年齡)

FROM 學生;

 

SELECT COUNT(*)

FROM 學生;

---- DISTINCT 可區別的

 

SELECT DISTINCT(書名)

From 書籍;

 

SELECT DISTINCT(科系)

From 學生;

 

SELECT DISTINCT(學號)

From 借書記錄;

 

SELECT DISTINCT(登錄號)

From 借書記錄;

----- 前 n 筆記錄

SELECT TOP 5 *

From 書籍;

SELECT TOP 3 書名, 出版社

From 書籍;

----找出最舊的三本書

SELECT TOP 3 書名, 出版社, 出版日期

From 書籍

ORDER BY 出版日期 ASC;

----- 前 n% 筆記錄

SELECT TOP 50 PERCENT *

From 書籍;

 

-----------------------------

SELECT 分組欄位,運算式

FROM 表格

GROUP BY 分組欄位;

 

SELECT 科系

FROM 學生

GROUP BY 科系;

 

SELECT 科系, COUNT(學號)

FROM 學生

GROUP BY 科系;

SELECT 科系, COUNT(學號) AS 人數

FROM 學生

GROUP BY 科系;

 

SELECT 科系, COUNT(*)

FROM 學生

GROUP BY 科系;

 

SELECT 科系, MAX(年齡)

FROM 學生

GROUP BY 科系;

 

SELECT 出版社, AVG(專家書評)

FROM 書籍

GROUP BY 出版社;

 

SELECT 出版社, COUNT(*)

FROM 書籍

GROUP BY 出版社;

 

SELECT 學號, COUNT(登錄號)

FROM 借書記錄

GROUP BY 學號 ;

 

-----------------------------

SELECT 分組欄位,運算式

FROM 表格

GROUP BY 分組欄位

HAVING 分組條件 ;

-----------------------------

SELECT 出版社, AVG(專家書評)

FROM 書籍

GROUP BY 出版社

HAVING AVG(專家書評) > 8.5 ;

 

SELECT 學號, COUNT(登錄號)

FROM 借書記錄

GROUP BY 學號 

HAVING COUNT(登錄號) > 2 ;

---- 聯集 

SELECT pname

FROM store1

UNION

SELECT pname

FROM store2;

 

---- 交集 

SELECT pname

FROM store1

INTERSECT

SELECT pname

FROM store2;

 

---- 差集 

SELECT pname

FROM store1

EXCEPT

SELECT pname

FROM store2;

 

---- 差集 

SELECT pname

FROM store2

EXCEPT

SELECT pname

FROM store1;

--差集、交集

--有借過書的學生

SELECT DISTINCT(學號)

FROM 借書記錄;

--沒借過書的學生

SELECT 學號

FROM 學生

EXCEPT

SELECT 學號

FROM 借書記錄;

--有借過書的學生

SELECT 學號

FROM 學生

INTERSECT

SELECT 學號

FROM 借書記錄;

---VIEW是什麼? VIEW的用途?

CREATE VIEW StuView(No,Name,Department)

AS

SELECT 學號,姓名,科系

FROM 學生;

SELECT * 

FROM StuView;

SELECT No,Department 

FROM StuView;

DROP VIEW StuView;

-------------------------------------

CREATE VIEW StuViewIM(No,Name,Department)

AS

SELECT 學號,姓名,科系

FROM 學生

WHERE 科系='資訊管理系';

SELECT * 

FROM StuViewIM;

SELECT No,Department 

FROM StuViewIM;

---- 另一個左右合併的例子

DROP TABLE store1;

DROP TABLE store2;

 

CREATE TABLE store1

(

pname char(12) PRIMARY KEY,

amount int

);

 

INSERT INTO store1

VALUES ('平板電腦',300);

 

INSERT INTO store1

VALUES ('個人電腦',2000);

 

INSERT INTO store1

VALUES ('液晶螢幕',150);

 

INSERT INTO store1

VALUES ('筆記型電腦',1000);

 

CREATE TABLE store2

(

pname char(12) PRIMARY KEY,

amount int

);

 

INSERT INTO store2

VALUES ('個人電腦',1000);

 

INSERT INTO store2

VALUES ('筆記型電腦',500);

 

INSERT INTO store2

VALUES ('數位相機',1200);

 

INSERT INTO store2

VALUES ('燒錄器',100);

----等位合併

SELECT * 

FROM store1, store2

WHERE store1.pname = store2.pname;

----左合併

SELECT *

FROM store1 LEFT OUTER JOIN store2

ON store1.pname = store2.pname ;

----右合併

SELECT * 

FROM store1 RIGHT OUTER JOIN store2

ON store1.pname = store2.pname;

----------------------------------------------------------

---- 批次宣告T-SQL變數@balance且指定變數為1000,使用PRINT指令顯示結果。

DECLARE @balance int

SET @balance = 1000

PRINT @balance

---- 宣告資料表變數後,使用指令插入記錄資料後,最後在使用指令查詢資料表內容。

DECLARE @students table( std_no char(4), name varchar(12) )

INSERT @students

SELECT 學號, 姓名 FROM 學生

WHERE 性別 = '男'

SELECT * FROM @students

---- 使用IF條件判斷[教授]資料表是否有存在記錄

IF (SELECT COUNT(*) FROM 教授) >= 1

BEGIN 

PRINT 'Professors table not empty!'

PRINT '執行這裡?'

END

ELSE

PRINT 'Professors table empty!'

---- 使用迴圈計算從1加到100的總和。

DECLARE @counter int, @total int

SET @counter = 1

SET @total = 0

WHILE @counter <= 100

BEGIN

SET @total = @total + @counter

SET @counter = @counter + 1

END

PRINT '1 Add TO 100 = ' + CAST(@total AS char)

---- 建立預存程序"課程資料報表",並且執行預存程序。

CREATE PROCEDURE 課程資料報表 

AS

BEGIN

    SELECT 課程編號, 名稱, 學分

    FROM 課程

END

EXEC 課程資料報表

---- 建立參數為[薪水查詢]的預存程序,參數是薪水salary,可以顯示員工資料。

CREATE PROCEDURE 薪水查詢

@salary money

AS

BEGIN

    SELECT 姓名, 薪水

    FROM 員工

    WHERE 薪水 > = @salary

END

EXEC 薪水查詢 @salary=20000

---- 宣告名為[學生_資料指標]的資料指標,並將資料一一顯示出來。

DECLARE 學生_資料指標 CURSOR

FOR SELECT 學號, 姓名, 電話 FROM 學生

WHERE 性別 = '男'

DECLARE @id char(5)

DECLARE @name varchar(10)

DECLARE @tel varchar(15)

OPEN 學生_資料指標

FETCH NEXT FROM 學生_資料指標 INTO @id, @name, @tel

PRINT @id + ' ' + @name + ' ' + @tel

FETCH NEXT FROM 學生_資料指標 INTO @id, @name, @tel

PRINT @id + ' ' + @name + ' ' + @tel

FETCH NEXT FROM 學生_資料指標 INTO @id, @name, @tel

PRINT @id + ' ' + @name + ' ' + @tel

FETCH NEXT FROM 學生_資料指標 INTO @id, @name, @tel

PRINT @id + ' ' + @name + ' ' + @tel

FETCH NEXT FROM 學生_資料指標 INTO @id, @name, @tel

CLOSE 學生_資料指標

DEALLOCATE 學生_資料指標

---- 在[教務系統]資料庫的[員工]資料表建立名為員工管理的觸發程序。

CREATE TRIGGER 員工管理

ON 員工

AFTER DELETE, UPDATE

AS 

    INSERT INTO 員工_1

    SELECT * FROM Deleted

DELETE FROM 員工

WHERE 身份證字號='A123456789'

---- 建立索引:主要為加速查詢的動作

---- 在表格的schema中加PRIMARY KEY或UNIQUE的限制條件,則系統會自動產生對應索引

CREATE INDEX books_idx1

ON books(bookname);

DROP INDEX books_idx1 ON books(bookname);

---- 異動管理(交易管理)Transaction Management

---- 轉帳、提款的例子

ROLLBACK 撤回 or 取消

COMIT 提交 or 確認