---
# System prepended metadata

title: SQL  mysql and posSql 安裝
tags: [MySql]

---

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

![](https://i.imgur.com/Saa6ELr.png)


## SQL 用戶權限相關
https://learnku.com/articles/58035


## mysql cli
-p要注意 不用空白

## 介紹
他是聲明式語言
不會關心如何完成
只關注如何想要甚麼結果

sql已經40年，所有資料庫都用，另外他不區分大小寫，是關鍵字就會幫你轉，雖然條件都是有空白ex  UNIQUE TEXT,但遇到
像primary key 或 NOT NULL 同一個單字，卻一樣空白分開，要注意

## 基本

![](https://i.imgur.com/VHLWVNW.png)

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一樣會給他基本的設定，不然建立會錯誤
![](https://i.imgur.com/yMHRjrE.png)

ex
```
CREATE TABLE testTable(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(255) NOT NULL UNIQUE,
	bio TEXT,
	country VARCHAR(2)
);
```

## insert
記住 INTO後面不要;號 還沒結束
![](https://i.imgur.com/SrFgXpi.png)

## select

![](https://i.imgur.com/KquJfWs.png)

like  結合萬用字
![](https://i.imgur.com/tOGbzx4.png)

### 不重複  distinct
![](https://i.imgur.com/xFtUCvU.png)

## index
使用索引的代价

索引需要占用数据表以外的物理存储空间。
创建索引和维护索引要花费一定的时间。
当对表进行更新操作时，索引需要被重建，这样降低了数据的维护速度。
创建索引的列

主键
外键或在表联接操作中经常用到的列
在经常查询的字段上最好建立索引

**搜索會變快，但整個資料庫會速度變慢，跟要額外的內存，所以不要濫用**
![](https://i.imgur.com/ZwLt506.png)


## 關聯 

要指定自己的primary key和foreign key references 哪個表的欄位
![](https://i.imgur.com/MnVBdrV.png)

## 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 合并不去重


## 開始
![](https://i.imgur.com/etsB1cm.png)
![](https://i.imgur.com/Va3nNGS.png)

**inner**
![](https://i.imgur.com/JuWPyFt.png)
抓交集的

**left**
只要左邊有的就去抓，不管右邊有沒有，
ex
Users那邊有id 1,2
但右邊只有id一的關聯四筆，沒有user_id = 2 的資料，
但她還是會去查詢，只是User_id
![](https://i.imgur.com/fg3rKkh.png)
![](https://i.imgur.com/eT1DUV2.png)

## right

同left

## full outer
在mysql中不支持

## as
轉換名字 這樣對使用.的語言比較好
![](https://i.imgur.com/u3bNkun.png)


## 中間表(多對多的中間那個)
![](https://i.imgur.com/h0HIiSN.png)

![](https://i.imgur.com/RhZR3o9.png)

## drop 刪除
![](https://i.imgur.com/ZpT6Ti4.png)


## 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() 子查詢
![](https://i.imgur.com/WgTvcM7.png)

## ondelete
![](https://i.imgur.com/7LiStW4.png)
一樣有set null casede之類的


## if
![](https://i.imgur.com/T1EF2aV.png)
sum可以用 0 的去用

## 聚合function
![](https://i.imgur.com/T1EF2aV.png)
可以用預設0去防呆


## grant revoke
授權 和 撤銷授權
授權 grant on
撤銷 revoke form
![](https://i.imgur.com/8QGVzoN.png)
![](https://i.imgur.com/VfwcvCm.png)


![](https://i.imgur.com/Z8JYVjI.png)

## commit
![](https://i.imgur.com/ehimyKH.png)
當你執行DCL操做 insert update delete那種
你要最後用commit 才能保存到資料庫
不然別的使用者看不到
如果做錯
可以rollback



## shell
mysql 用mysql shell

js模式連線
JS語法連結
![](https://i.imgur.com/Ktb4QCx.png)

SQL語法
![](https://i.imgur.com/nGy31TT.png)

POS SQL

![](https://i.imgur.com/A34rXQY.png)

## 連線
mysql加密方法用最新的 要給他改變
你可以用新增使用者給他全部權限
不然就是 直接改root
![](https://i.imgur.com/Oo6IKkV.png)
![](https://i.imgur.com/l7RUGgx.png)


###### tags: `MySql`