# 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`