2011年2月13日 星期日

SQL 語法組成要素

SQL 語法組成要素

  1. DDL 資料定義語言
  2. DML 資料維護語言
  3. DCL 資料控制語言
  4. TCL 事務控制語言
  5. DQL 數據查詢語言
  6. FCL 流量控制語言

DDL 資料定義語言

簡稱 全名
DDL Data Definition Language

種類 所有類型
DDL種類 CREATE,ALTER,DROP

DML 資料維護語言

簡稱 全名
DML Data Manipulation Language

種類 所有類型
DML種類 INSERT,UPDATE,DELEC

DCL 資料控制語言

簡稱 全名
DCL Data Contol Language

種類 所有類型
DCL種類 GRANT,REVOKE,DENY

TCL 事務控制語言

簡稱 全名
TCL Transactional Control Language

種類 所有類型
TCL種類 COMMIT,SAVEPOINT,ROLLBACK

DQL 數據查詢語言

簡稱 全名
DQL Data Query Language

種類 所有類型
DQL種類 SELECT

FCL 流量控制語言

簡稱 全名
FCL Flow Control Language

種類 所有類型
FCL種類 IF...ELSE,WHILE,BREAK

2011年2月9日 星期三

儲存特殊字元方法

特殊字元儲存方式

再存儲時有時會遇到特殊中文字,存入資料庫時,字元都變成??等情形解決方法如下。
程式碼部分
Create Table t2
(sid int,sname nvarchar(10))
Go
insert into t2 values(1,'楊堃菓')
insert into t2 values(2,N'楊堃菓')
顯示結果
編號 姓名
1 楊??
2 楊堃菓

SQL資料類型

  1. 數值類型
  2. 日期時間
  3. 字串類型

數值類型

數字類型 資料類型 位元組數
精確數值 tinyint(0~255) 1
smallint(-2^15~2^15-1) 2
int(-2^31~2^31-1) 4
bigint(-2^63~2^63-1) 8
近似數值 float[(n)]
-1.79E+308~-2.23E-308
0及2.23E-308~1.79E+308
n:科學記號標記法尾數的位元數目
n:1-24 佔4
n:25-53 佔8
real
-3.40E+38 ~ -1.18E-38
0及1.18E-38 ~ 3.40E+38
4
金融貨幣 money
-922,337,203,685,477.5808 ~
922,337,203,685,477.5807
8
smallmoney
-214,748.3648 ~
214,748.3647
4
其他數值 bit(1'0'NULL) 1

日期時間

日期時間資料類型 範圍與精準度 位元組數
datetime 1753:01:01 ~ 9999:12:31
精準度:0.00333秒
8
datetime2 0001-01-01 00:00:00.0000000 ~
9999-12-31 23:59:59.9999999
精準度:100奈秒
6到8
datetimeoffset 0001-01-01 00:00:00.0000000 ~
9999-12-31 23:59:59.9999999
(以UTC為單位)精準度:100奈秒
8到10
smalldatetime 1900:01:01 ~ 2079:06:06
精準度:1分鐘
4
date 1900:01:01 ~ 9999:12:31
精準度:1日
3
time 00:00:00.0000000 ~ 23:59:59.9999999
精準度:100奈秒
3到5

字串類型

字元字串類型 資料類型 位元組數
非UNICODE字元 char[(n)],固定長度1-8000 0-8000
varchar[(n)],可變長度1-8000 0-8000
varchar(max),可變儲存體 0-2GB
text,可變長度資料 0-2GB
UNICODE字元 nchar[(n)],固定長度1-4000 0-8000
nvarchar[(n)],可變長度1-4000 0-8000
nvarchar(max),可變儲存體 0-2GB
ntext,可變長度資料 0-2GB
使用UNICODE格式,每個字元都以16bit計算,包括英文,如果使用非UNICODE,如varchar(30),原本可存放30字元,但由於中文字必須耗掉2個byte空間,所以中文字只能存放15個字,這類情形。

2011年2月7日 星期一

Select 查詢方法總整理

  1. 基礎設定
  2. DATEPART 回傳時間指定部分如:時或分或年
  3. DATEDIFF 回傳開始與結束之間的差
  4. Between .. And .. 用來篩選資料範圍
  5. In 指定範圍
  6. 當遇到NULL時處理方式
  7. TSQL字元符號的使用
  8. Except 用來比較表格與表格之間,只回傳2個表格不相同部分
  9. Interset 用來比較表格與表格之間,只回傳2個表格相同部分
  10. Tablesample 用於亂數取出資料量,如果要用於採樣工作可以試試看
學習SQL語法,最基本不畏忽視SELECT,為了日後方便,整理一下
SELECT select_list
[INTO new_table_name]
FORM table_list | view_list
[WHERE search_conditions]
[GROUP BY group_by_list]
[HAVING search_conditions]
[ORDER BY order_list [ASC | DESC]]
[]:有或無都可以

Where DATEPART(datepart , date)
條件 說明
datepart

普遍使用條件

datepart 縮寫
year yyyy,yy
month mm,m
day dd,d
hour hh
minute mi,n
second ss,s
date 篩選條件必須是時間格式
範例
Select ID,date From TEST

Where DATEPART(MM,date) = 11 --找出11月份者
更詳細解說

Where DATEDIFF(datepart , startdate , enddate)
條件 說明
datepart

普遍使用條件

datepart 縮寫
year yyyy,yy
month mm,m
day dd,d
hour hh
minute mi,n
second ss,s
startdate 篩選條件必須是時間格式
enddate 篩選條件必須是時間格式
範例 Select ID,startdate,enddate From TEST
Where DATEDIFF(yyyy,startdate,enddate) < 20 ---找出年與年差未滿20年者
更詳細解說

Where id Between 1 And 5
說明 指定資料區間,常常會使用到,如年齡範圍,日期範圍,生日等等...
範例 Select ID From Test
Where ID Between 1 And 5

Where name In('Tom','Jack','Louis')
說明 搜尋清單中符合條件
範例 Select name From Test
Where name In('Tom','Jack','Louis')

當值為NULL時處理方式

尋找值為NULL
方法 說明
IS 或 IS NOT NULL 可以搜尋出NULL 或者 不是NULL的資料
name = NULL 竟可能不要使用這方法,但如果要使用必須要這樣做SET ANSI_NULLS OFFSelect name From
Where name=NULL (這樣就可以正常使用)
ISNULL() 這函式,可以幫忙解決如果是NULL則,以什麼方法顯示,如Where ISNULL(NAME,'N/A') 這樣如果NAME為NULL則以N/A字串顯示

T-SQL 字串處理方式

符號 說明
% 該符號代表1個字元以上的任意字元
_ 該符號代表任意單一字元
[-] 包含指定範圍字元 範例:'[S-V]'ing ,會搜尋出 Sing,Ting,Uing,Ving
[^] 包含不再指定範圍內 範例:'M[^c]',會搜尋第一字元為M,第二字元不為c的字串

Except 與 Interset使用方式

範例 Select name,title From Test
Except | Interset
Select name,title From Test2
多數用來比較資料表與資料表之間的不同

Tablesample 使用方式

基本語法 Select ... From ...
Tablesample (N ROWS | N PERCENT)
Repeatable(SEED)
這可以取得亂數,但卻有缺點,取得資料會是固定區塊 參考資料SQL2008 3-26頁
改良語法 Select Top 10 name,title,CHECKSUM(NEWID())
From Test
Order By CHECKSUM(NEWID())
這方法是靠NEWID()產生一組ID,在靠CHECKSUM()函式作計算,即可產生唯一數值,再靠Order By以及TOP ,就可產生完美亂數清單