[Day22] SQL server 資料庫備份與還原,使用bak - SQL Server資料庫入門

在這回主要介紹資料庫的備份方法。
避免哪天真的遇到不可測的失誤、資料庫毀損、硬碟壞掉。
在這篇中先介紹SQL server .bak檔案的備份與還原

完整備份

1.對資料表右鍵選到Back Up

2.Backup Type 選擇Full表示完整備份

3.備份成功會跳出訊息

4.可至資料夾找到完整備份的.bak
注意:.bak可能沒辦法向下兼容舊版資料庫,如果要向下兼容要用另一種SQL備份的方法。

完整備份還原

1.先把資料庫設定成離線狀態,Tasks>Take Offline。

2.勾選Drop All Active Connection,之後按下OK,讓資料庫進入離線模式。

3.之後對資料庫按右鍵Tasks>Restore>Datebase。

4.接下來選擇Device,從本地檔案去還原。

5.在跳出的框框選擇Add

6.選擇剛備份出來的.bak

7.返回原本視窗後按下OK

8.然後點OK,開始進行還原

9.跳出了還原成功

10.檢查可以發現資料表都回來了,裡面的資料也是

還原失敗可能情況

1.沒有Offline資料庫,就會造成無法匯入。
錯誤訊息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TITLE: Microsoft SQL Server Management Studio
------------------------------

Restore of database 'Orders' failed. (Microsoft.SqlServer.Management.RelationalEngineTasks)

------------------------------
ADDITIONAL INFORMATION:

System.Data.SqlClient.SqlError: Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)

For help, click: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.100.46437.65+(SMO-master-A)&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------

圖:

Ans:只要在還原前先把資料庫設定成離線狀態,Tasks>Take Offline即可。

結論

有還原檔案比沒有好,記得備份,以備不時之需。
下篇預計是用SQL方式去產可向下兼容的備份檔案。

[Day21] SQL server delete 資料刪除 - SQL Server資料庫入門

在這回簡易示範SQL server資料刪除。

DELETE

主要就是用delete搭配某表,以及條件。
此外,要注意條件要記得下,不然整張表資料被刪掉會很悲劇。

語法:

1
DELETE FROM table_name WHERE condition; 

測試資料

還是一樣,先放上資料表:

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:想要刪除產品PS4。

1
delete from products where name = 'PS4'

結果:

結論

成功的練習了DELETE,非常簡單的語法。
但這種反而要小心,DELETE跟UPDATE,因為如果where條件下錯,整張表就完了QQ。

(ps.目前我還沒想到如果沒備份要怎麼救,只能求助google了。)

下回預計是資料庫備份。

參考資料
https://www.w3schools.com/sql/sql_delete.asp
https://ithelp.ithome.com.tw/articles/10220412

[Day20] SQL server update 資料更新 - SQL Server資料庫入門

在這回簡易示範SQL server資料更新。

UPDATE

主要就是用update搭配set去設定資料數值。
此外,如果要針對某一條件修改請用where加上條件,否則將會每筆都改會很悲劇。(如果你又沒備份的話,記得每日備份阿。)

語法:

1
2
3
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

測試資料

還是一樣,先放上資料表:

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:想要更新客戶number為U002資料,把tel更新成09-00000000。

1
2
3
update customers
set tel='09-00000000'
where customers.number = 'U002'

結果:

結論

目前還沒犯過不小心更新全部表的失誤。但不知道哪天會很雖遇到(?)
所以,建議操作SQL前或是每日操作前都先備份,並且留存備份檔案,至少哪天有問題時還有機會救。
因為可能會有備份需求,所以先記著,之後會打篇資料備份。

(ps.目前我還沒想到如果沒備份要怎麼救,只能求助google了。)

下一回預計就是練習刪除語法。

參考資料
https://www.w3schools.com/sql/sql_update.asp
https://ithelp.ithome.com.tw/articles/10220040

[Day19] SQL server insert into 資料新增 - SQL Server資料庫入門

在前面已經把大量的常見查詢語法做過一次實踐了。
接下來就是比較簡單的語法了,這回講的是insert into用來在表中插入資料。

INSERT INTO

語法:

1
2
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

測試資料

還是一樣,先放上資料表:

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:想要新增一筆客戶資料。

1
insert into customers (number,name,tel) values('U003','Tom','09-15965423')

結果:

透過子查詢新增資料

算是另一種少見的做法,就是數值的部分是使用查詢來的數值。
雖然很少用,但就稍微嘗試一下這種寫法:

實作:我想把products的number、name、price添加到customers將他們視為number、name、tel。

1
2
insert into customers (number,name,tel) 
select number,name,price from products

結果:
就把products的資料加到customers了。(為了示範需求,因為真的超怪。

總結

簡易的操作了資料插入的語法。
下回就是更新update。

參考資料
https://ithelp.ithome.com.tw/articles/10220002
https://www.w3schools.com/sql/sql_insert.asp

[Day18] SQL server ANY與ALL用法 - SQL Server資料庫入門

在這回中要介紹我很少很少很少用到的any與all用法。
因為大部分搜尋條件都能靠前面介紹的那些組合度過了,並且更直覺。

ANY

用於子查詢
任意,一個條件符合就返回true

1
2
3
4
5
6
SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name
FROM table_name
WHERE condition);

ALL

用於子查詢
所有,全部條件滿足才返回true
在select、having、where都可能用到

1
2
3
4
5
6
SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name
FROM table_name
WHERE condition);

差異比較

使用 > 比較運算子來作例子,>ALL 代表大於每個數值;換句話說,就是大於最大值。例如, >ALL (1, 2, 3) 代表大於 3。>ANY 代表至少大於一個數值,也就是說大於最小值。因此 >ANY (1, 2, 3) 代表大於 1。

實際演練

還是一樣,先放上資料表:

*因為這次範例太難用原本訂單的表,於是建立一個測試的表

實作:在test表中比較類型為1數值大於所有類型為2的數值結果。

1
select * from test where type = '1' and number > all (select number from test where type = '2')

結果:
1的內容:[1,3,4,8]
2的內容:[2,5,4]
而以上方條件all等於找最大值,即number > 5 的結果。

實作:在test表中比較類型為1數值至少大於一個類型2數值的結果。

1
select * from test where type = '1' and number > any (select number from test where type = '2')

結果:
1的內容:[1,3,4,8]
2的內容:[2,5,4]
而以上方條件any,等於找最小值,即number > 2 的結果。

總結

用到機會連要擠出範例都很難@@…
之前的範例都能用原本建的資料表示範,而這回測試any、all時發現除非改動表的設計,否則要做出好的實驗數據太不容易了。
總之,all、any就只要求看懂就好。

參考資料
http://www.blueshop.com.tw/board/FUM20041006152735ZFS/BRD200309251806228LO.html
https://blog.csdn.net/xianglingchuan/article/details/51737330

[Day17] SQL server having用法 - SQL Server資料庫入門

在SQL查詢時對這個關鍵詞有印象,但非常陌生。
於是這次就來探討一下having。
他用來跟我們前面聊過的Group by搭配,因為where不能用在聚合函數

having

HAVING 子句是用來取代 WHERE 搭配聚合函數 (aggregate function) 進行條件查詢,因為 WHERE 不能與聚合函數一起使用。

聚合函數指的也就是 AVG()、COUNT()、MAX()、MIN()、SUM() 等這些內建函數。

語法:

1
2
3
4
5
6
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

實作

先列一下目前資料表狀態

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:統計訂單明細並得到總額大於50000的訂單。

1
2
3
Select order_number,sum(price*amount) as 訂單總額 
from order_details group by order_details.order_number
having sum(price*amount) > 50000

結果:
透過having來與聚合函數搭配。

總結

發現having用法也很直覺,沒想像中難。
最主要就是group by後想篩選資料時就使用它。

參考資料
https://www.fooish.com/sql/having.html
https://www.w3schools.com/sql/sql_having.asp

[Day16] SQL server exists用法 - SQL Server資料庫入門

這回探討SQL server exists用法。
之前有在子查詢的範例中使用到,但覺得不夠清楚所以拉出來探討看看。

Exists

EXISTS 運算子可以連接子查詢,用來判斷子查詢是否有返回的結果,如果有結果返回則為真、否則為假。若 EXISTS 為真,就會繼續執行外查詢中的 SQL;若 EXISTS 為假,則整個 SQL 查詢就不會返回任何結果。

語法

1
2
3
4
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

且exists跟in語法都可以達到相同效果。
如:

1
2
3
SELECT * FROM table_a
WHERE EXISTS
(SELECT * FROM table_b WHERE table_b.id=table_a.id);

等價於

1
2
3
SELECT * FROM table_a
WHERE id
in (SELECT id FROM table_b);

注意使用EXISTS條件,main query(外部查詢)和subquery(子查詢)一定要有連接,例如 table_b.id=table_a.id,如果沒有連結EXISTS條件使用是無效的

實作

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:尋找有下訂單的客戶

1
2
Select * from customers 
where exists (select * from orders where customers.number = orders.customer_number )

結果:
把結果符合customers.number = orders.customer_number的列都返回。
所以得到有下訂單的客戶。
此外發現exists子查詢的Select * from其實隨便指派一個欄位都可以,因為並不影響結果。

實作:尋找”沒”有下訂單的客戶

1
2
Select * from customers 
where not exists (select * from orders where customers.number = orders.customer_number )

結果:
在exists前加個not可以得到相反結果,即沒下訂單的客戶

總結

覺得還是用in會比較直覺,用exists時會突然覺得where竟然能直接接一個非欄位的用法。
但熟悉後可能又覺得還好了。

此外,似乎有in跟exists效能一說,目前就先記著,改日有空再找機會打一篇。

參考資料
https://www.w3schools.com/sql/sql_exists.asp
https://www.fooish.com/sql/exists.html
http://mylinoraclesql.blogspot.com/2013/07/exists.html
https://eeluck.pixnet.net/blog/post/27559378

[Day15] SQL server like用法 - SQL Server資料庫入門

在這回中將探討SQL server中like的使用方式。

Like

like被用在SQL語法中的where條件。
用來篩選模糊字串。

通常搭配這兩種運算子去實作模糊搜尋條件。

% 代表零或一個或更多的字符
_ 代表一個字符

語法:

1
2
3
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;

常見的模糊字串操作:

LIKE Operator Description
WHERE CustomerName LIKE 'a%' Finds any values that start with "a"
WHERE CustomerName LIKE '%a' Finds any values that end with "a"
WHERE CustomerName LIKE '%or%' Finds any values that have "or" in any position
WHERE CustomerName LIKE '_r%' Finds any values that have "r" in the second position
WHERE CustomerName LIKE 'a_%' Finds any values that start with "a" and are at least 2 characters in length
WHERE CustomerName LIKE 'a__%' Finds any values that start with "a" and are at least 3 characters in length
WHERE ContactName LIKE 'a%o' Finds any values that start with "a" and ends with "o"

範例實作

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實作:想取得產品名稱為P開頭的產品。

1
Select * from products where name like 'P%'

結果:

實作:實作訂單收或簽名為「X中間有一個字X」的人

1
Select * from orders where orders.customer_signature like 'X_X'

結果:
可得到XXX這個人的訂單明細。因為他X與X間隔一個字符。

結論

可以用like在資料庫內做簡易的模糊比對,將一些無法直接對應的數值用這種方式去篩選。

參考資料
https://www.w3schools.com/sql/sql_like.asp

[Day14] SQL server in與not in - SQL Server資料庫入門

在這回中將探討SQL server的in與not in 用法。

IN 與 NOT IN

1.可以使用在where中揀選多個值
2.其實就是多個or的簡化寫法

有點像是以下的感覺:

where 欄位值 in (‘A’,’B’,’C’)
欄位值==’A’ or 欄位值==’B’ or 欄位值==’C’

where 欄位值 not in (‘A’,’B’,’C’)
欄位值!=’A’ or 欄位值!=’B’ or 欄位值!=’C’

1.給予明確數值,篩選是否在這些值中。

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

2.可以用在子查詢上,篩選是否在子查詢的數值中

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);

範例實作

在此,提供一下目前資料表中的測試資料,作為核對。

customers 顧客

products 產品

orders 出貨單

order_details 出貨單明細

實驗

實作:想取得產品名稱為PS5和PS4的產品。

1
Select * from products where name in ('PS5','PS4')

結果:

實作:想取訂單明細中不包含PS4的訂單。

1
2
Select * from order_details 
where product_number not in (Select number from products where name = 'PS4' )

結果:
後方的子查詢結果是[‘P002’],之後因為條件下not in表示是不包含P002,not in (‘P002’)。
所以得到不含PS4的訂單明細。

結論

其實就把in拆成多個or去理解就好。

參考資料
https://www.w3schools.com/sql/sql_in.asp

適當的調整自己心態,不再當個完美主義者

為什麼這麼說呢?因為這社會本來就不是完美的。

完美是個理想狀況。

過往,我在做事總有個目標,就是一次做到最好。因為這樣可以省下未來很多修改的功夫。
但是現在往回看的話,會發現:「欸!這方法好像在現在不算好了,已經過時了。」

在工作上,就如面試,總想拿出很猛的作品,所以一直追加,但後來反而累死了自己。(真實)
(按:就像饒舌歌手都想把自己弄成很屌那樣)

所以,我想改變我的作法了,先規劃最低限度的東西
完美的這目標先擺在一旁,有時間,那就追求;沒時間,那就沒時間(誤)。

這邊講個例子

例子1
某公司開發A產品,公司目標是賺到錢,所以最低限度就是A產品做出來,完成交易。可以完成需求、對方能接受就好。
再來才是雙方提供交流再把他們變得更好。為了更好而畫蛇添足,也不見得帶來好結果。
所以不要一股腦的死做,差異是比較出來的。

例子2
某面試需要有作品集,但實際上不知道面試公司到底要的水平、程度。
就依照自己能力,先規劃出個能夠展示的作品吧!
比如,簡單的留言板、訂單,想追求完美那就再到複雜的電商。

例子3
想做一個遊戲,那就先把你想訴求的點先做出mockup吧!
可玩性還是角色?在做個類似分鏡的結構,最後再找特定領域的人把優化。
如把畫面變好要UI、把效能變好要程式、把角色變好要原畫師。

總結

足球不是一個人能踢的,山不是一日就能堆的,坑不是一次就能填的。

  1. 循序漸進,不然就只會被壓力轟炸而無法繼續下去。
  2. 講求比較實際的作法,嘗試再修正找到一條能通的路。

最後補充,其實寫這種非技術文章可能對技術提升沒什麼用。
但是,想到有人可能會跟我過去一樣執迷不悟,就自己現身說法,希望能改善到看這文章的各位。