# SQL mysql and posSql 安裝
https://www.youtube.com/watch?v=Cz3WcZLRaWc

## SQL 用戶權限相關
https://learnku.com/articles/58035
## mysql cli
-p要注意 不用空白
## 介紹
他是聲明式語言
不會關心如何完成
只關注如何想要甚麼結果
sql已經40年,所有資料庫都用,另外他不區分大小寫,是關鍵字就會幫你轉,雖然條件都是有空白ex UNIQUE TEXT,但遇到
像primary key 或 NOT NULL 同一個單字,卻一樣空白分開,要注意
## 基本

DDL
做事情 資料庫定義語言
create drop之類的
DML
數據操作
selcte
insert
update
delete(drop是對整個表 delete是對某幾個資料 當然也能全刪)
DCL
給權限
TCL
交易權限語言
rollback commit
### SQL 敘述句 (Statements)
我們利用 SQL 敘述句來跟資料庫溝通、下達指令,SQL 語言是由命令 (commands) 、子句 (clauses) 、運算子 (operators) 及 函數 (functions) 所組成,通常一個 SQL 敘述句由一段命令句開始描述您要對資料庫要求的動作,接著可能會接著條件語句,最後以分號 ";" 結束:
有些資料庫並不強制一定要加上結尾分號。
`SELECT * FROM customer;`
上面這條 SQL 敘述句表示從 customer 資料表取出所有資料。
SQL 語句不區分大小寫 (case-insensitive),如 select * from customer; 和上例是相同的結果。
什麼是命令 (Commands)
建立新的資料庫、資料表、欄位及、索引等,或建立查詢表、排序、過濾資料、查詢、修改、新增及刪除資料等動作。(即 CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE 等命令)
**例子**
**SelectRaw**
```
$orders = DB::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();
WhereRaw / orWhereRaw
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();
```
**HavingRaw / orHavingRaw**
```
$orders = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();
```
**OrderByRaw**
```
$orders = DB::table('orders')
->orderByRaw('updated_at - created_at DESC')
->get();
```
### 什麼是子句 (Clauses)
子句是用來設定及操作你的 SQL query,例如:
子句 說明
FROM 指定作用的資料表
WHERE 設定查詢條件
GROUP BY 設定分組條件
ORDER BY 設定輸出的排序
什麼是運算子 (Operators)
運算子用來幫助 SQL 語句處理數值、字串或進行邏輯運算及比較條件。
### 什麼是函數 (Functions)
SQL 語言內建許多函數可以直接在 SQL 語句裡面使用,像是取得某欄位加總後數值、取得某欄位內最大或最小值等等。
## 萬用字
% (百分比符號):代表零個、一個、或數個字母。
_ (底線):代表剛好一個字母。
萬用字元是與 **LIKE** 關鍵字一起使用的。
以下是幾個萬用字元的例子:
* 'A_Z': 所有以 'A' 起頭,另一個任何值的字原,且以 'Z' 為結尾的字串。 'ABZ' 和 'A2Z' 都符合這一個模式,而 'AKKZ' 並不符合 (因為在 A 和 Z 之間有兩個字元,而不是一個字元)。
* 'ABC%': 所有以 'ABC' 起頭的字串。舉例來說,'ABCD' 和 'ABCABC' 都符合這個模式。
* '%XYZ': 所有以 'XYZ' 結尾的字串。舉例來說,'WXYZ' 和 'ZZXYZ' 都符合這個模式。
* '%AN%': 所有含有 'AN'這個模式的字串。舉例來說, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合這個模式。
* '_AN%': 所有第二個字母為 'A' 和第三個字母為 'N' 的字串。舉例來說,'SAN FRANCISCO' 符合這個模式,而 'LOS ANGELES' 則不符合這個模式。
**;都沒再用**
## create
create時記得要給設置
int 或 varchar或 text之類的
就跟你migrate一樣會給他基本的設定,不然建立會錯誤

ex
```
CREATE TABLE testTable(
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
bio TEXT,
country VARCHAR(2)
);
```
## insert
記住 INTO後面不要;號 還沒結束

## select

like 結合萬用字

### 不重複 distinct

## index
使用索引的代价
索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。
创建索引的列
主键
外键或在表联接操作中经常用到的列
在经常查询的字段上最好建立索引
**搜索會變快,但整個資料庫會速度變慢,跟要額外的內存,所以不要濫用**

## 關聯
要指定自己的primary key和foreign key references 哪個表的欄位

## join 用於關聯
left join 常用于过滤,取A表有但B表没有的,
在需求上 查询所有商品的所有信息(這就要left join了)
如果单纯看逻辑运算数量,inner join会比left join更优,因为inner join会返回两表的交集,而left join会返回左表的全部记录。并且inner join会默认使用较小的表作为主表进行循环。
但是有时候inner join也会比left join 慢,具体原因需要具体分析,这里举个例子:大表的连接字段没有建索引,小表建索引了,然后left join中左表是大表,在循环查找会使用小表的索引,而inner join会自动使用小表作为主表,然后循环查找大表(无法使用索引),所以就会很慢
如果需要取的表中的字段信息为必须不为空字段,则用inner join;如果可为空,或者可有可没有,则用left join;right join 用法和left join 类似,不常用;union 合并去重;union all 合并不去重
## 開始


**inner**

抓交集的
**left**
只要左邊有的就去抓,不管右邊有沒有,
ex
Users那邊有id 1,2
但右邊只有id一的關聯四筆,沒有user_id = 2 的資料,
但她還是會去查詢,只是User_id


## right
同left
## full outer
在mysql中不支持
## as
轉換名字 這樣對使用.的語言比較好

## 中間表(多對多的中間那個)


## drop 刪除

## join on 還有.(來自誰)
連結表格
然後接on 是連接的條件
a要連結b
然後a的id = b的id
所以a join b
on id = id
但這樣id都一樣 屬性一樣欄位名稱衝突怎辦
可以用
on 'a'.'id' = 'b'.'id'
前面加上表格名稱然後用.
其他地方也一樣
## lEFT Join
一樣是join
只是差在on的條件有沒有成立
有成立
左邊回傳全部 右邊會回傳符合條件的資料
沒成立呢
左邊的(主表)回傳全部資料 右邊就回傳null
如何分辨左右呢
join左邊就是左邊的表格
**注意問題**
https://learnku.com/articles/35567
過濾要用on 不要用where
如果想对右表进行限制,则一定要在 on 条件中进行,若在 where 中进行则可能导致数据缺失,导致左表在右表中无匹配行的行在最终结果中不出现,违背了我们对 left join 的理解
**重點**
在 left join 语句中,左表过滤必须放 where 条件中,右表过滤必须放 on 条件中
进行多表查询,在执行到where之前,会先形成一个临时表
而on就是临时表中的条件筛选,使用left join则不管条件是否为真,都会查询出左边表的数据,条件为假的,则显示为null
## right join
left join 完全倒過來
## where in() 子查詢

## ondelete

一樣有set null casede之類的
## if

sum可以用 0 的去用
## 聚合function

可以用預設0去防呆
## grant revoke
授權 和 撤銷授權
授權 grant on
撤銷 revoke form



## commit

當你執行DCL操做 insert update delete那種
你要最後用commit 才能保存到資料庫
不然別的使用者看不到
如果做錯
可以rollback
## shell
mysql 用mysql shell
js模式連線
JS語法連結

SQL語法

POS SQL

## 連線
mysql加密方法用最新的 要給他改變
你可以用新增使用者給他全部權限
不然就是 直接改root


###### tags: `MySql`