Try   HackMD

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

同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