---
# System prepended metadata

title: SQL
tags: [SQL]

---

# SQL



## 【高併發問題】

READ_UNCOMMITTED：允許讀取未提交的數據更改。 
READ_COMMITTED：只能讀取已提交的數據更改。 REPEATABLE_READ：在同一事務內多次讀取相同數據時，保證讀取的數據始終相同。 SERIALIZABLE：完全禁止並發，以確保事務的串行執行。

### [樂觀鎖/悲觀鎖]


### [MVCC]
https://www.51cto.com/article/719614.html

## 【mySQL和PostgreSQL差異】
https://aws.amazon.com/tw/compare/the-difference-between-mysql-vs-postgresql/

Ｑ：使用了Queue我們還需要上鎖的原因？是因為可能會開很多條Queue？也可能有Queue之外的請求要處理嗎？

### 【資料分片】(data sharding)
將資料庫分割成在其他的shard，讓撈取資料變的較有效率，例如：航班的資料表，若可以將資料表分成國際航班＆國內航班，會是比較有效率的管理方式，也可以因應當國內航班的資料庫掛了，國際得還可以使用。

https://www.explainthis.io/zh-hant/interview-guides/system-design/database-sharding-replication

## 資料庫創建函數


## Transaction
當資料進入transaction後，就要保證裡面的程式碼一起成功，不然就恢復原狀(一起失敗)。也就是為了為戶資料庫的一致性(transcation的四大特性ACID之一)。
https://ithelp.ithome.com.tw/articles/10247034

有看過一個問題，是問說transaction裡面的事要一起做完才會一起commit，若有報錯會rollback，既然沒有commit代表事情還沒確定做了，那為什麼需要rollback? 



## Primary Key選擇
資料庫理論中的《不在一個 table 中使用兩個具有重覆屬性的欄位》比如個人資料 table 中，身份證號已經可以當 PK，但你又加一個 auto increment 的欄位來做為 PK，就可能浪費了，但有些人的經驗是，身分證理論上是有唯一性，但實務上不是唯一，所以以系統的PK當作唯一可能較為保險

效能來說，uuid較低，但安全性較高：
https://inf.news/technique/31802cf48d25f1e2361090606a4a6b1d.html

從架構上去選擇：
https://medium.com/%E9%96%92%E8%AB%87%E8%BB%9F%E9%AB%94%E6%9E%B6%E6%A7%8B/%E9%96%92%E8%AB%87%E8%BB%9F%E9%AB%94%E6%9E%B6%E6%A7%8B-uuid-2748df80aa7e


## Connection pool
連線池，DB前的緩衝區，也就是用完DB查詢後，不馬上切斷連線，等有其他連線的時候，可以從連接池中獲取連線。
https://vocus.cc/article/5f800406fd89780001365d17

https://blog.darkthread.net/blog/sql-conn-pooling-experiment/


## Join
較常用：
innerJoin
leftJoin

差別：
https://www.fooish.com/sql/inner-join.html


## Join和子查詢

https://navicat.com/cht/company/aboutus/blog/1729-joins

### 子查詢
https://www.developerastrid.com/zh-tw/sql/sql-subqueries/

## PostgreSQL
jsonb相較於json是用二進制儲存
https://help.aliyun.com/document_detail/48147.html#section-kfx-uem-o8c

## 待處理疑問
SQL裡面的資料表的關聯，跟ORM裡面設定ManyToOne之類的這種關聯是一樣的意思嗎？
這是不是要找一下 join和子查詢的差別與關係



## 未整理
學習資源：
https://www.1keydata.com/tw/sql/sqlgroupby.html

SELECT column FROM table name

SELECT DISTINCT column FROM table name

SELECT column FROM table name WHERE num >5  可以放  AND  或是  OR
 
*sequelize op.or

SELECT column FROM table name WHERE  column  IN 5 

BETWEEN

*萬用字母 %  _

LIKE 萬用字母

ORDER BY  ASC DESC

函數
AVG
COUNT(常與DISTINCT 合起來用 )SELECT COUNT (DISTINCT Store_Name)FROM

"IS NOT NULL"

MIN()
MAX()
SUM()

In 
Not
