跟著小郭郭一起學 SQL Server-17 Select(2)

時窮節乃見

在上一回,我們提到了 Select 語法的架構,以及最基本的 Select , 這次我們將會再加入新的元素:Where
在這之前,我們一樣要先建立資料表與輸入資料:

繼續閱讀 “跟著小郭郭一起學 SQL Server-17 Select(2)"

跟著小郭郭一起學 SQL Server-16 Select(1)

當你覺得因為挫敗自己很糟時,想想如果是你最親愛的人如此,
你會不會覺得他就因此不值得你的喜愛了?
如果不會,那代表你應該也還是值得被喜愛的。

在上次我們介紹了如何對資料欄位建立約束,搭配之前的資料表建立與修改,我們其實已經對如何定義自己想要儲存的資料有個基本的認識,接下來我們將開始介紹如何在這些資料表中查詢、新增、修改、刪除資料,讓我們開始吧。

首先是 Select (查詢),他的結構如下:

Select 欄位名稱
From 資料表名稱
Where 查詢條件
group by 彙整單位(當需要將查詢結果以特定欄位的資料為單位彙整時使用)
Having 彙整查詢條件(當需要將查詢結果以特定欄位的資料為單位彙整時使用)
order by 排序條件

這個結構的順序無法互換,有一個比較簡單的記法:
當你看著 qwerty 型的英文鍵盤時,就會發現鍵盤上從左到右分別是
S W F G H O
只要將 F 跟 W 的順序對調就是整個結構的順序。
我們先從最基本的開始,不過在這之前,我們得先建立資料表。

請打開 New Query 後,複製下列文字並按下 F5 執行:

Create Table Test_OF_Select
(
	Student_ID int Not Null ,
	Course_ID  nvarchar(50) Not Null,
	Score CHAR(5)
	
);

INSERT INTO Test_OF_Select (Student_ID,Course_ID,Score)Values
('1001','0020','A'),
('1002','0020','B'),
('1003','0020','C'),
('1004','0020','C'),
('1005','0020','C'),
('1006','0020','C'),
('1007','0020','C'),
('1008','0020','C'),
('1009','0020','C'),
('1010','0020','C')

建立完成之後,對著已建立好的資料表點選右鍵:Select Top 1000 rows

就可以看到一個最基本的 Select

SELECT TOP (1000) [Student_ID]
      ,[Course_ID]
      ,[Score]
  FROM [TEST001].[dbo].[Test_OF_Select]

這段語法的中文是這樣說的:
從 [TEST001].[dbo].[Test_OF_Select] 這張表中選取 前1000筆 的資料中的 [Student_ID] ,[Course_ID] ,[Score] 欄位。

這就是今天的內容,下次我們將介紹的是 Where 條件。

跟著小郭郭一起學 SQL Server-15 Foreign Key(1)

三折肱而成良醫

在上回我們介紹了 Primary Key 約束是什麼,以及如何建立、檢視與刪除 Primary Key,
接下來我們將介紹什麼是 Foreign Key。


Foreign Key 約束會將能進入一個欄位的資料局限於是一個會另一張表的特定欄位裡所有的資料的約束,當我們輸入資料時, SQL Server 就會參照另一個欄位,確認那個欄位有這筆資料才會成功,沒有這筆資料時,該筆資料就沒辦法輸入。而我們稱被參照的來源資料表為 Parent,實際套用約束的資料表則是稱為 Child
所以當我們要建立與測試 Foreign Key 約束前,我們要先建立這個約束要參照資料表與欄位,這個欄位必須是該資料表的 Primary Key,並且這兩個資料型態必須相同。
請打開 New Query 後,複製下列文字並按下 F5 執行:

Create Table Foreign_Key_test_Parent
(
	Student_ID int Not Null Primary Key,
	Student_Name nvarchar(50),
	Date_of_Birth date
)

INSERT INTO Foreign_Key_test_Parent (Student_ID,Student_Name,Date_of_Birth)Values

('1001','Jeff','2022/02/13'),
('1002','Lily','2022/02/14'),
('1003','Tochter','2022/02/15')
SELECT TOP (10) * From Foreign_Key_test_Parent

這樣我們就可以確認資料表已經建立,並且裡面的 Student_ID 有 1001~1003了。

接下來,我們來建立實際使用 Foreign Key 約束的資料表,並在建立資料表時對欄位加入Foreign Key 約束,加入的格式如下:
欄位名稱 資料類型 是否允許 NUll

Constraint 約束名稱 Foreign Key References 資料表(欄位)

請打開 New Query 後,複製下列文字並按下 F5 執行:

Create Table Foreign_Key_test_Child
(
	Student_ID int Not Null 
	Constraint Foreign_Key_Student_ID Foreign Key References Foreign_Key_test_Parent(Student_ID),
	Course_ID  nvarchar(50) Not Null,
	Score CHAR(5)
	
);

INSERT INTO Foreign_Key_test_Child (Student_ID,Course_ID,Score)Values
('1001','0020','A'),
('1002','0020','B'),
('1003','0020','C'),

SELECT TOP (10) * From Foreign_Key_test_Child 

這樣就可以看到 1001~1003 的資料都有被成功寫入。接下來我們輸入一筆不存在於 Parent 資料表的欄位的資料。

請打開 New Query 後,複製下列文字並按下 F5 執行:

INSERT INTO Foreign_Key_test_Child (Student_ID,Course_ID,Score)Values

('1004','0020','D')

就會看到被擋下來的錯誤訊息。

接下來則是如何檢視已經被建立的 Foreign Key,一種方式是直接到資料表的 Keys 中檢視。


另一種則是透過 information schema 查詢,請打開 New Query 後,複製下列文字並按下 F5 執行:

Select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE

刪除 Foreign Key 則是使用 Alter table 資料表名稱 Drop constraint Foreign Key 名稱,

請打開 New Query 後,複製下列文字並按下 F5 執行:

Alter table Foreign_Key_test_Child
Drop constraint Foreign_Key_Student_ID

INSERT INTO Foreign_Key_test_Child (Student_ID,Course_ID,Score)Values

('1004','0020','D')

SELECT TOP (10) * From Foreign_Key_test_Child 

就可以看到約束消失,剛才因為約束無法被 insert 的資料可以成功insert 了。

而同樣使用 Alter Table 指令則可以再把 Foreign Key 加回來,
請打開 New Query 後,複製下列文字並按下 F5 執行:

Delete Foreign_Key_test_Child 

Alter table Foreign_Key_test_Child
ADD constraint Foreign_Key_Student_ID
Foreign Key(Student_ID)  References Foreign_Key_test_Parent(Student_ID);
INSERT INTO Foreign_Key_test_Child (Student_ID,Course_ID,Score)Values

('1004','0020','D')

OK,這就是今天的內容,接下來我們將會開始講解如何在資料表中查詢/新增/修改/刪除資料。

跟著小郭郭一起學 SQL Server-13 Primary Key (1)

定義問題的本質,界定影響的範圍,追尋造成的原因,規劃解決的方法。

在上次,我們介紹了 Null 以及 Check 兩種對資料內容的約束,在這次我們要介紹的是 Primary Key (PK) 約束的性質。

Primary Key 通常由一到數個欄位組成,這些欄位內的資料不能重複,一個資料表只能有一個 Primary Key,這樣的資料約束可以確保資料表內應該代表同一筆紀錄的資料不會被重複寫入。

舉例來說,如果 Application 在寫入資料到資料表的過程中因為各式各樣的原因傳送到一半失敗了,在重新寫入的時候就可以透過 Primary Key 約束的設定避免同樣的資料,像是訂單,被重新寫入兩次。

而在建立 Primary Key 的同時也會對資料表內的資料建立索引,如果在做對資料的查詢時,有使用到 Primary Key 的欄位,就可以加快查詢速度,因此理想的狀況是資料庫裡的每一張資料表都有自己對應的 Primary Key 約束。

在下次,我們將介紹如何建立、檢視、修改、以及刪除 Primary key 約束。

跟著小郭郭一起學 SQL Server-12 資料預設值與資料檢查(2)

歲月你別催,該來的我不推,該還的還,該給的我給

———————————————————————————-

上次我們介紹的內容是在建立資料表的當下連帶建立欄位的預設值與對欄位資料的條件檢查,
這次我們要介紹的是為現有的資料表加上這些條件限制。

而要為現有的資料表加上欄位的資料限制,則需要用到以下的語法:
ALTER TABLE [資料表名稱]
ADD CONSTRAINT 限制的名稱 限制的類型 限制的內容

請開啟一個 new query,並執行以下的語法:

-------------新增一個資料表
CREATE TABLE [dbo].[table_data_constraint_test_3](
	[student_no] [nvarchar](10) NOT NULL,
	[student_name] [nvarchar](50) NULL,
	[date_of_birth] [date] NULL
) ON [PRIMARY]
GO
-------------新增一個資料表
------新增與前一篇相同的限制
ALTER TABLE [table_data_constraint_test_3] 

ADD 
	CONSTRAINT age_above_18_2 CHECK ([date_of_birth]<'2003/08/25'),


	CONSTRAINT  default_as_test_2  DEFAULT  'test' For student_name

------新增與前一篇相同的限制


在執行成功之後,就可以在資料表[table_data_constraint_test_3]下的Constraints 中看到新增的限制名稱。

但對已經建立的資料表設立限制之前,最好先檢查一下現在的資料表內有沒有不符合這些限制的資料,不然就有可能失敗。

請開啟一個 new query,並執行以下的語法:

------建立新的資料表
CREATE TABLE [dbo].[table_data_constraint_test_4](
	[student_no] [nvarchar](10) NOT NULL,
	[student_name] [nvarchar](50) NULL,
	[date_of_birth] [date] NULL
) ON [PRIMARY]
GO
------建立新的資料表
------插入不符合限制規範的資料

INSERT INTO [table_data_constraint_test_4]
	([student_no],[student_name],[date_of_birth])
	values('002','SIX','2005/01/01')
------插入不符合限制規範的資料
------新增與前一篇相同的限制
ALTER TABLE [table_data_constraint_test_4] 

ADD 
	CONSTRAINT age_above_18_3 CHECK ([date_of_birth]<'2003/08/25'),

	CONSTRAINT  default_as_test_3  DEFAULT  'test' For student_name
 ------新增與前一篇相同的限制

——新增與前一篇相同的限制

就會看到錯誤訊息,顯示目前資料表裡已有的資料與欲建立的內容產生衝突:

而如果要解除這些已經建立的限制,則需要用到以下的語法:

ALTER TABLE [資料表名稱]
DROP CONSTRAINT 限制的名稱

請開啟一個 new query,並執行以下的語法:

------刪除既有的限制
ALTER TABLE [table_data_constraint_test_3] 

DROP 
	CONSTRAINT age_above_18_2,
	CONSTRAINT  default_as_test_2
------刪除既有的限制

這樣就可以刪除目前已經建立的限制。

可以與第一張圖比較,就會發現 [table_data_constraint_test_3] 底下的 Constraints 中,原有的限制已經消失。

這就是這次的內容,在下一次我們會講解 Primary 與 Foreign Key 資料限制。

跟著小郭郭一起學 SQL Server-11 資料預設值與資料檢查(1)

遵守與實行信條並不足以稱為善,只有實行與遵守的結果為善的才足以稱為信條

在上次介紹了資料表的建立、修改欄位以及刪除之後,這次我們要介紹的內容是對欄位內的資料設定預設值,以及對寫入欄位內的資料進行檢查。

我們可以在建立資料表時就對欄位設定預設值以及對欄位內的資料進行檢查。

這些對資料內容的規範是透過 建立對資料的約束 (constraint) 達成的,大致的結構如下,


constraint [約束名稱] 約束類型 約束條件

像這次要介紹的預設值,約束類型是 default ,對資料進行檢查則是 check ,

兩者的結構如下:

為欄位設置預設值: constraint 約束名稱 default 預設內容

檢查資料內容是否符合條件: constraint 約束名稱 CHECK(檢查條件)


請開啟一個 new query,並執行以下的語法:



USE [TEST001]
GO
--建立資料表
CREATE TABLE [dbo].[table_data_constraint_test_2]

(
[student_no] nvarchar(10) NOT NULL,
[student_name] nvarchar(50) CONSTRAINT default_as_test DEFAULT 'test' NULL ,

[date_of_birth] [date] NULL,
CONSTRAINT age_above_18
CHECK ([date_of_birth]<'2003/08/25') 
) ON [PRIMARY]
GO

--插入資料與檢視
INSERT INTO [table_data_constraint_test_2]
([student_no],[student_name],[date_of_birth])
values('001',NULL,'2000/01/01')

SELECT * FROM [table_data_constraint_test_2]

在建立這張表的過程中,我們透CONSTRAINT  default_as_test DEFAULT ‘test’ 這段對 [student_name] 欄位設置了一個名為預設值的限制,就算我們在建立完後插入資料時,沒有特別註明 [student_name] 應該要輸入什麼資料,實際也會寫入test。

另外我們透過CONSTRAINT age_above_18 CHECK ([date_of_birth]<‘2003/08/25’

 這段對[date_of_birth] 欄位中的資料進行檢查,確認資訊不得晚於2003/08/25

而當我們試圖寫入的資料沒有通過檢查時,就會回報錯誤, 開啟一個 new query,並執行以下的語法:

--插入不符合條件檢查的資料
INSERT INTO [table_data_constraint_test_2]
([student_no],[student_name],[date_of_birth])
values('002','SIX','2005/01/01')

在回報的錯誤中,我們就可以看到該次寫入資料違反的約束名稱、發生的資料庫、資料表與欄位名稱。

下一次,我們會說明如何對已經建立的資料表建立這些約束。

跟著小郭郭一起學 SQL Server-10 修改與刪除資料表

“選擇將自己活成悲劇英雄的人往往在最後留下的只有悲劇,沒有英雄。"

0812更新:我發現wordepress 在我貼上語法時會把單引號轉換成奇怪的符號,如果你的語法執行上有出現錯誤,請將文字前後的單引號刪除並重新輸入。

在上次我們透過了以下語法去建立了資料表,

USE [TEST001]
GO

CREATE TABLE [dbo].[table_create_test]

(
[student_no] nvarchar(10) NOT NULL,
[student_name] nvarchar(50) NULL,
[date_of_birth] [date] NULL
) ON [PRIMARY]
GO

這些資料表在被建立之後,是可以被調整,或是刪除的,
調整的方式是透過 Alter table 敘述,
Alter table 敘述可以做到以下三件事情:

1. 新增欄位
Alter table [Schema 名稱].[資料表名稱]
ADD [欄位名稱] 資料類型

2. 刪除現有欄位
Alter table [Schema 名稱].[資料表名稱]
DROP COLUMN [欄位名稱];

3. 修改現有欄位資料類型
Alter table [Schema 名稱].[資料表名稱]
ALTER COLUMN [欄位名稱] 資料類型

首先,先讓我們示範加入欄位,
請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。



USE[TEST001]
GO

ALTER TABLE [table_create_test]
ADD [add_column_test] datetime

執行結束之後,就可以看到原本的資料表多了我們需要的欄位。

接下來示範如何把這個新增的欄位砍掉XD
請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

USE[TEST001]
GO
ALTER TABLE [table_create_test]
DROP Column [add_column_test]


再次對該張資料表點選右鍵-重新整理
就可以看到該欄位已經消失了。

再來則是修改欄位格式,
請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

USE[TEST001]
GO

ALTER TABLE [table_create_test]
ALTER Column [student_no] nvarchar(10) null



再來試試我們上次試著插入但因為 Not NULL 欄位條件限制而插入的值:

insert into [table_create_test]
([student_no],[student_name],[date_of_birth])
values (NULL,’Michael’,sysdatetimeoffset())


就會發現這次是執行成功的,因為我們已經將 [student_no] 改為 NULL了。


最後則是刪除這張資料表,

USE[TEST001]
GO
DROP TABLE [table_create_test]


執行完再次重新整理,就可以看到 [table_create_test] 已經消失了。




這就是我們這次的內容,在下次我們要介紹的是如何為欄位加入預設值、以及限制輸入資料內容。


跟著小郭郭一起學 SQL Server-09 建立資料表

當你享受著免費的商品或服務的時候,很有可能你就是商品。

0812更新:我發現wordepress 在我貼上語法時會把單引號轉換成奇怪的符號,如果你的語法執行上有出現錯誤,請將文字前後的單引號刪除並重新輸入。

在前幾次的說明中,我們提到了資料表、欄位的資料類型以及 NULL ,這些就是我們在建立資料表時要知道的基礎知識,所以這次我們就開始建立資料表吧。

在 SMSS 裡,有很多像這樣建立物件的動作其實都可以透過使用者介面進行,但可以的話我們還是用寫的,
一來這樣看起來比較厲害 ,二來了解指令怎麼寫會讓你了解工程師需要聽到關鍵字,從而加速溝通過程。

一串最簡單的建立資料表的指令如下:


USE [資料庫名稱]
GO

Create table [Schema名稱].[資料表名稱]
(
[欄位1名稱] 欄位1資料型態 NULL或是 NOT NULL,
[欄位2名稱] 欄位2資料型態 NULL或是 NOT NULL,
[欄位3名稱] 欄位3資料型態 NULL或是 NOT NULL
)
ON[資料群組名稱]

GO

這段裡的 NULL或是 NOT NULL 代表的是該欄位能不能輸入空值,
NULL 代表可以,NOT NULL代表不行。

以淡藍色標記的字樣代表的是不一定要寫,沒有寫 [Schema名稱] 則預設為 [dbo]
沒有 NULL或是 NOT NULL 則是預設為 NULL,
ON[資料群組名稱] 沒有寫 則預設 Primary。

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

USE [TEST001]
GO

CREATE TABLE [dbo].[table_create_test]

(
[student_no] nvarchar(10) NOT NULL,
[student_name] nvarchar(50) NULL,
[date_of_birth] [date] NULL
) ON [PRIMARY]
GO


在欄位的命名上,為了確保不管是周遭的其他活人還是電腦都能正確地理解你所設計的欄位,
請記得以下這幾個最基本的命名原則:
1. 請用小寫英文或數字組成欄位名稱,其他語言的文字請盡量避免。

2. 不要使用-或空白來分隔單字,使用_

3. 請讓欄位名稱看起來有意義,column_1 並不是有意義的名稱,沒有人可以從這個名稱猜到裡面是什麼。

4. 同一資料表內欄位名稱不可重複,如果不同資料表內要儲存同樣的資訊,則請確保他們的名稱與資料類型都是相同的。

在建立好資料表之後,我們來介紹插入資料的語法:

insert into [資料表名稱]
(
[資料欄位1],
[資料欄位2],
[ 資料欄位3]
)
values
(
欄位1的資料,
欄位2的資料,
欄位3的資料
)

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

insert into [table_create_test]
([student_no],[student_name],[date_of_birth])
values (001,’Michael’,sysdatetimeoffset())


會看到成功插入了一列資料的提示說明。這時對資料表右鍵- Select top 1000 rows 就可以看到已經被儲存的資料。


接下來,我們來示範 NULL與 NOT NULL 的欄位規範如何作用,

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

insert into [table_create_test]
([student_no],[student_name],[date_of_birth])
values (NULL,’Michael’,sysdatetimeoffset())



應該會看到插入失敗的錯誤訊息,因為我們在建立資料表時已經將 [student_no] 欄位設定為 NOT NULL ,也就是不可為空了,所以當我們想插入 values (NULL,’Michael’,sysdatetimeoffset()) 時就會被擋下來。

在下次,我們將介紹如何修改資料表中的欄位、以及如何刪除資料表內資料、以及刪除資料表。


跟著小郭郭一起學 SQL Server-08 空值

“長距離騎乘考驗的是耐心,你必須找到屬於自己的步調,一點一點地把該走的路走完,即使目標看似遙遠,山頂看似遙不可及,只要保持耐心,終究都會抵達,Every pedal stroke counts.

0812更新:我發現wordepress 在我貼上語法時會把單引號轉換成奇怪的符號,如果你的語法執行上有出現錯誤,請將文字前後的單引號刪除並重新輸入。

在上次我們講完了在 SQL server 裡面我們最常花時間處理的三種資料類型:
數字、文字與時間。
這次我們要介紹的是一個概念:空值,null。

NULL 值代表的含意就是空,沒有這個值,但不代表 0,更類似未決定,有點類似在團購飲料時,
如果我們還沒問到某個人,當然就不會知道他要喝幾杯飲料,也還不能確定是 0 杯飲料。

NULL 是沒辦法被用於計算或比較的, NULL 只能被判斷。

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

DECLARE @NULL_TEST INT
SET @NULL_TEST =NULL

SELECT @NULL_TEST+1 AS ‘NULL+1’

SELECT @NULL_TEST-1 AS ‘NULL-1’

SELECT @NULL_TEST*2 AS ‘NULL*2′

SELECT @NULL_TEST/2 AS ‘NULL/2’

SELECT @NULL_TEST/0 AS ‘NULL/0’



可以在結果中看到的是,即使被以 int 的類型儲存, NULL 再怎麼被計算也還是 NULL,

另外, NULL 也沒辦法被比較,

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行 。

DECLARE @NULL_TEST INT
SET @NULL_TEST =NULL

IF @NULL_TEST>1
SELECT ‘Greater than 1’
ELSE
SELECT’NO’ AS Greater

IF @NULL_TEST<1
SELECT ‘Less than 1’
ELSE
SELECT’NO’ AS Less

IF @NULL_TEST=1
SELECT ‘Equals to 1’
ELSE
SELECT’NO’ AS Equals

IF @NULL_TEST<>1
SELECT ‘NOT Equals to 1’
ELSE
SELECT’NO’ AS NOT_Equals

上面的

IF @NULL_TEST>1
SELECT ‘Greater than 1’
ELSE
SELECT’NO’ AS Greater
這段是 IF 的判斷式,如果 @NULL_TEST 變數大於1,
則會回傳 Greater than 1 的字串給我們,如果不是則回傳 NO,
底下三段判斷也是做一樣的事情,<>則用於表達不等於。



所以我們從這四段的內容中可以知道 NULL 不是大於 1 ,不是小於 1 ,不是等於1 ,也不是 不等於 1 。

那 NULL 等不等於 NULL 呢?

請打開一個 New Query,在輸入以下的指令之後,以 F5 執行 。

DECLARE @NULL_TEST INT
SET @NULL_TEST =NULL

IF @NULL_TEST =NULL
SELECT ‘Equals to NULL’
ELSE
SELECT’NO’ AS ‘=NULL’

所以…… NULL 也不是等於 NULL。

NULL 只能被判斷是不是 NULL ,

Here’s an example, 請打開一個 New Query,在輸入以下的指令之後,以 F5 執行。

DECLARE @NULL_TEST INT
SET @NULL_TEST =NULL

IF @NULL_TEST IS NULL
SELECT ‘IS NULL’ AS ‘IS NULL’
ELSE
SELECT’NO’


所以我們知道了,NULL 可以被判斷為 NULL。

這就像如果班上還有兩個人還沒填飲料單,你可以說他們兩個都還沒訂,兩者皆為 NULL ,但不能因此認為他們都會訂一樣的飲料,兩個 NULL 並不相等。
在做資料的彙整跟分析時, 處理 NULL 將會是很重要的事情,而在設計資料庫跟資料表時,如何規範資料中的 NULL 也是相當重要的部分。

看起來前置的基礎知識都已經備齊了,下次我們將會開始講解如何建立資料表、決定欄位名稱與資料類型,以及這些欄位對 NULL 的處理方式。



跟著小郭郭一起學 SQL Server-07 資料類型-時間

你怎麼會不喜歡戌神ころね?
https://www.youtube.com/watch?v=F_0k3z8Kx3Q

在前兩次我們介紹了文字與數字的資料類型,這次要介紹的則是時間/日期的資料類型,
這次則是相對單純,一張官方的表格就能完成解釋:

資料類型格式範圍最高精確度大小自定義精準度支援時區
time(n)hh:mm:ss[.nnnnnnn]00:00:00.0000000 through 23:59:59.9999999100 nanoseconds3 to 5YesNo
dateYYYY-MM-DD0001-01-01 through 9999-12-311 day3NoNo
smalldatetimeYYYY-MM-DD hh:mm:ss1900-01-01 through 2079-06-061 minute4NoNo
datetimeYYYY-MM-DD hh:mm:ss[.nnn]1753-01-01 through 9999-12-310.00333 second8NoNo
datetime2 (n) YYYY-MM-DD hh:mm:ss[.nnnnnnn]0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999100 nanoseconds6 to 8YesNo
datetimeoffset (n) YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 (in UTC)100 nanoseconds8 to 10YesYes
https://docs.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver15

其中, 自定義精準度 指的就是能不能由n來決定要顯示到小數點後幾位的秒數,當不輸入時預設為7。

Here’s an example. 請打開一個 New Query,在輸入以下的指令之後,以F5執行:

DECLARE @Time_data_type Time
set @Time_data_type =sysdatetimeoffset()
select @Time_data_type as Time類型


DECLARE @Date_data_type Date
set @Date_data_type =sysdatetimeoffset()
select @Date_data_type as Date類型


DECLARE @Smalldatetime_data_type Smalldatetime
set @Smalldatetime_data_type =sysdatetimeoffset()
select @Smalldatetime_data_type as Smalldatetime類型


DECLARE @Datetime_data_type Datetime
set @Datetime_data_type =sysdatetimeoffset()
select @Datetime_data_type as Datetime類型


DECLARE @Datetime2_data_type Datetime2
set @Datetime2_data_type =sysdatetimeoffset()
select @Datetime2_data_type as Datetime2類型


DECLARE @Datetimeoffset_data_type Datetimeoffset
set @Datetimeoffset_data_type =sysdatetimeoffset()
select @Datetimeoffset_data_type as Datetimeoffset類型



–其中的 sysdatetimeoffset() 函數用於叫出現在於 SQL server 中的系統時間。

這樣就可以看得出各個資料類型在儲存同樣資料時的差別了。

以上就是我們的資料類型的所有內容,這些內容的目的並不只是說明各資料欄位的存在,
也說明嘞他們的特性,在設計資料表時,試著比較這些特性設計出最簡潔、最符合使用者需求且最節首空間的資料表結構會是系統規劃上的必修課,一旦決定了資料表內的欄位與資料類型並投入系統開發,要修改就不是像 Excel 改格式那麼簡單了,所以一定要留意。

從下次開始,我們將會說明資料表的建立,以及如何在建立資料表時,套用各種限制條件。