跟著小郭郭一起學 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')

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

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

跟著小郭郭學統計:06-機率(1)

好想要去福隆騎腳踏車吃便當

在上次我們說明了敘述性統計的方式,而在進入推論性統計前,我們要說明的是機率。
在我們要說明何謂機率時,我們就需要一些道具,比如說,一顆六面骰子。

在我們投擲一顆六面骰子並紀錄出現的點數,在這個過程中,結果是沒辦法被事先確定的,並且一次投擲只會產生一次點數,像這樣的過程我們稱之為實驗 (experiment)。

每一次擲六面骰子時,我們可以預期他的結果就是
1點、2點、3點、4點、5點、6點這六種結果的其中一個。
我們就稱這些結果為樣本點 (sample point)。

而這些樣本點會組成樣本空間 (sample space)。
所以我們可以這樣說:
在擲單顆六面骰子的實驗中,樣本空間內共有六個樣本點,也就是1點、2點、3點、4點、5點、6點。

而對於這樣的實驗中,各樣本點的機率,我們是這樣表示的:
如果我們稱實驗結果為下列任一樣本點的機率 (Probability) 為 Pi
則這些 Pi 的值會在0與1之間,


這些在樣本空間中各樣本點的 Pi 加總會等於1,


而我們把特定樣本點的集合稱為事件 (event),如果一個事件中只包含一個樣本點,比如點數為1,我們稱之為單純事件 (simple event),當一個事件中包含多個樣本點,如 點數小於三的事件中會包含點數為1或2,我們稱之為 複合事件(compound event)

一個事件的機率則等於所有屬於該事件的樣本點的機率相加。

OK,這就是我們今天的內容,在下次我們會開始講複合事件中的交集與聯集。

跟著小郭郭一起學 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()) 時就會被擋下來。

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