2011年8月7日 星期日

[SQL] SQL語法教學

一般而言,資料庫的語法 ( SQL ) 分為三大類別:

1. DDL ( Data Definition Language ):定義資料庫物件使用的語法,常看到的關鍵字有:

Create:建立資料庫的物件。

Alter:變更資料庫的物件。

Drop:刪除資料庫的物件。

2. DCL ( Data Control Language ):控制資料庫物件使用狀況的語法,常看到的關鍵字有:

Grant:賦予使用者使用物件的權限。

Revoke:取消使用者使用物件的權限。

Commit:Transaction 正常作業完成。

Rollback:Transaction 作業異常,異動的資料回復到 Transaction 開始的狀態。

3. DML ( Data Manipulation Language ):維護資料庫資料內容的語法,常看到的關鍵字有:

Insert:新增資料到 Table 中。

Update:更改 Table 中的資料。

Delete:刪除 Table 中的資料。

Select:選取資料庫中的資料。



SQL語法範例


建立資料檔

CREATE TABLE <table name> (<column name> <column type> [NOT NULL]

{,<column name> <column type> [NOT NULL]})

範例:建立家庭作業資料檔 "abc"

欄位:id(學號) 資料格式:字元(最大長度為8)

欄位:hw(作業編號) 資料格式:小整數

欄位:score (分數) 資料格式:小整數

CREATE TABLE "abc" ( "id" varchar(8) , "hw" smallint , "score" smallint )     TOP              


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

刪除資料檔

DROP TABLE <table name>

範例:刪除家庭作業資料檔 "pub.demo.homework"

DROP TABLE "pub.demo.homework"


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

增加欄位

ALTER TABLE <table name> ADD <column name> <column type>

範例:在資料檔中增加一個欄位:note (說明) 資料格式:字元(最大長度為80)

ALTER TABLE "table name" ADD "note" varchar(80)


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

查詢記錄

SELECT [DISTINCT] <attribute list>

FROM <table name>

WHERE <condition>

ORDER BY <column name>

範例:從資料檔中找出第3次作業分數大於60分的全部記錄,且依學號由小到大排序。

SELECT *

FROM "table name"

WHERE score > 60

ORDER BY id


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

增加記錄

INSERT INTO <table name>[(<column name>{,<column name>})]

VALUES ( <constant value>,{<constant value>})|<select statement>

範例:在資料檔中增加一筆記錄(學號:7654321 作業編號:2 分數:89)

INSERT INTO "table name" (id, hw, score)

VALUES ('1234567', 2, 89)


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

刪除記錄

DELETE FROM <table name>

[WHERE <selection condition>

範例:刪除學生1234567的所有記錄

DELETE FROM "table name"

WHERE id like '1234567'

沒有指定WHERE,則所有紀錄都會被刪除,請注意小心使用!!


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

更改記錄

UPDATE <table name>

SET <column name> = <value expression>{,<column name> = <value expression>}

[WHERE <select condition>]

範例:更改學生7654321第2次作業成績分數為95分

UPDATE "table name"

SET score=95

WHERE id like '7654321' and hw=2

 若不使用WHERE,則所有紀錄都會更新,請注意小心使用!!


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

設定索引鍵

CREATE INDEX <index name>

ON <table name>(<column name>[<order>]{,<column name>[<order>]})

[CLUSTER]

範例:在資料檔中設定欄位學號與作業編號為一索引鍵(複合鍵)homework_index

CREATE INDEX homework_index

ON "table name" (id, hw)


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

刪除索引鍵

DROP INDEX <index name>

範例:刪除索引鍵homework_index

DROP INDEX homework_index


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

建立VIEW

CREATE VIEW <view name>[(<column name>{,<column name>})]

AS <select statement>

範例:略。


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

刪除VIEW

DROP VIEW <view name>

範例:略。


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

隨機查詢10筆的資料

SELECT * FROM Table WHERE 條件 ORDER BY RAND() LIMIT 10


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

僅查詢欄位名稱

範例:查詢某一個資料表的所有"欄"的名稱,但不想要細部的資料
SELECT * FROM "tablename"  WHERE 1=2

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

SubString

SubString(expr,start,lenght)
解釋:傳回expr中,第start字元開始lenght長度的字串


範例:查3月份,CallerID為遠傳者的明細,且依CallinTime最為排序
SELECT CallerID,CallinTime,HangupTime,BillingTime,PagerNo
FROM BrokerTotalServiceLog03
WHERE SubString(CallerID,1,4)='0916' or SubString(CallerID,1,4)='0917' or SubString(CallerID,1,4)='0926' or SubString(CallerID,1,5)='09540' or SubString(CallerID,1,4)='0955' or SubString(CallerID,1,5)='09605' or SubString(CallerID,1,5)='09606' or SubString(CallerID,1,4)='0930' or SubString(CallerID,1,4)='0936' or SubString(CallerID,1,5)='09310' or SubString(CallerID,1,5)='09311' or SubString(CallerID,1,5)='09312' or SubString(CallerID,1,5)='09313'
ORDER BY CallinTime


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

雜項

1. 重覆CallerID指出現一次
方法一:SELECT DISTINCT CallerID
方法二:在結尾處加入GROUP BY CallerID



2. select * from 學生

3. select * from 成績表 order by 學號 (排序)

4. select * from 成績表 order by 學號 desc (遞減排序)

5. select 學號,名字 from 學生

6. select * from 成績表 where 學號='1'
p.s. 字串要加' ' ,若是數字則不加,日期格式為#1998/11/19#

7. select * from 成績表 where 成績>=60 and 成績<=70 (大於60小於70)

8. select * from 成績表 where 成績 between 60 and 70 (介於60 和 70之間)

9. select * from 成績表 where 成績 not between 60 and 70 (不是介於 60 和70之間)

10. select * from 學生 where 學號 in ('1','3','5') (in 做為指定查詢)

11. select * from 學生 where 名字 like '陳%' (like 用來查詢字串中部份符合, '%'表零到任意多個字元,'_'表一個字元

12. select 學號, avg(成績) as 平均成績 from 成績表 group by 學號 order by avg(成績) desc
p.s.計算平均成績,其中" as 平均成績 "為設定欄位名稱," group by 學號"為同一學號為一組作計算, desc 為遞減排列, avg為計算平均值,sum則為計算總成績

13. select 學生.學號,學生.名字,成績表.科目編號,成績表.成績 from 學生,成績表 where 學生.學號=成績表.學號 order by 學生.學號 (多張資料表的結合查詢)

14. insert into 學生(學號,名字,地址) values ('5','王子','台東縣')
p.s.新增一筆學生資料

15. update 學生 set 名字='小王子' where 學號='5'
p.s.將學號'5'的名字改為'小王子'

16. update 成績表 set 成績=(成績^0.5)*10 where 學號='5'
p.s.將學號'5'的成績設為開根號乘以10

17. delete from 學生 where 學號='5'
p.s.將學號'5'的資料刪除    


轉錄ebook

沒有留言:

張貼留言