MySQL 學習紀錄
目錄
影片進度
通用
- mysql -u 帳號 -p密碼
- show databases;
- use 資料庫名;
- show tables( from 資料庫名);
- select database();
- desc tableName;
-
- select version();
基礎查詢
- select columnName as "alias" from tableName;
- selct distinct columnName from tableName;
- MySQL中+(加號)只有運算的功能
- 不能轉換成數值的會視為0(零)
- 如果其中有null,結果必為null
- select CONCAT('a欄字串','b欄字串') from tableName;
- 在MySQL中連接字串可使用CONCAT('a欄字串','b欄字串')
- select IFNULL(可能為null的欄位, 當為null時要變換成的值) from tableName;
- select * from tableName where columnName LIKE '%包含的字串%';
- 模糊查詢
- %代表任意多個字元,包括0個
- _(下劃線)代表單個字元
- ex:'__a_b%' 代表第三個字是a,第五個字是b,後面長度任意的字串
- 可用\轉譯
- ex:'__a_b' 第二個的_會被直接讀取,不會被認為是單個任意字元
- 可用ESCAPE轉譯
- ex:… LIKE '_&_a_b' ESCAPE '&'; ESCAPE後面的字元代表轉譯符號
- 字串要用''(單引號)包起來
- select * from tableName where columnName BETWEEN startValue AND endValue;
- where … BETWEEN … AND …
- ~= where … >= … AND … <= …;
- select * from tableName where columnName IN('符合的字元', …);
- selct columnName from tableName where columnName IS NULL;
- NULL 用=(等號)、<>無法判斷
- 要用IS NULL、IS NOT NULL來判斷
- 僅用來判斷NULL值
- selct columnName from tableName where columnName <=> NULL;
- NULL 可用<=>(安全等於)判斷
- <=>(安全等於) 大概等於 =(等於)
- 可判斷NULL值,也可以判斷一般數值
排序查詢
- select * from tableName ORDER BY columnName (ASC);
- select * from tableName ORDER BY columnName DESC;
- select LENGTH(columnName) as 欄位字元長度 from employees order by LENGTH(columnName) desc;
- select LENGTH(columnName) as 欄位字元長度 from employees order by 欄位字元長度 desc;
- 可取得括號內字元長度
- select * from tableName ORDER BY column1 ASC, column2 DESC;
常用函數
- UPPER(columnName)
- LOWER(columnName)
- SUBSTR()、SUBSTRING()
- SUBSTR(要改變的字串, 要保留的起始點INT)
- SUBSTR(要改變的字串, 要保留的起始點INT, 要保留的長度INT)
- INSTR(要被查找的母體字串, 要找尋的字串)
- TRIM(包含空白的字串)
- TRIM('字串A' FROM 左右包含字串A的母體字串)
- LPAD(母體字串, 個數INT, '字串A')
- RPAD(母體字串, 個數INT, '字串A')
- 用母體字串左(右)方加上'字串A',補齊至個數INT
- 個數INT比母體字串小時,母體字串會從個數INT後面開始砍字
- ex: LPAD('abc',2,'*') 結果會是 'ab'
- REPLACT(母體字串, 要被換的字, 換成的字);
數學函數
- ROUND(浮點數)
- ROUND(浮點數, 取幾位數INT)
- CEIL(浮點數)
- FLOOR(浮點數)
- TRUNCATE(浮點數, 從小數點第幾位後開始捨棄INT)
- MOD(被除數, 用這個去除INT)
- 取餘數
- (知道就好) MOD(A,B) => A-A/B*B
日期函數
- NOW()
- CURDATE()
- CURTIME()
- YEAR(時間)
- MONTH(時間)
- MONTHNAME(時間)
- DAY()
- STR_TO_DATE(要被轉換的日期, 轉換成的格式)(
- DATE_FORMAT(要被轉換的日期, 轉換成的格式)
- DATEDIFF(日期1,日期2)
流程控制函數
- IF(表達式, TRUE的返回值, FALSE的返回值)
- 類似三元運算

- CASE
- 在SELECT中使用方法1

- 此例中從CASE…END會對應該COLUMN WHEN、ELSE的判斷來返回處理過的COLUMN
- 在END後可用AS 取別名
- 等於在SELECT中的特定欄位可另外經過CASE…END處理
- 在SELECT中使用方法2

分組函數
- SUM(columnName)
- AVG(columnName)
- MAX(columnName)
- MIN(columnName)
- COUNT(columnName)
- 可以搭配DISTINCT使用 ex:SUM(DISTINCT columnName)
分組後查詢
- GROUP BY
- select count(*), department_id from employees GROUP BY department_id HAVING count(*)>2;
- 在GROUP BY(分組)後的篩選要用HAVING 條件
- 在from employees後面使用where 是代表在employees這張表中查詢
- 這次的例子是要在分組後的結果中查詢,所以where不適合
- HAVING 後面接的是分組函數,是使用分組函數做判斷
連接查詢
- 等值連接
- SQL-92標準
- select NAME, boyName from beauty,boys where beauty.boyfriend_id=boys.id;
- 非等值連接
- 自連接
SQL99語法
- 非等值連接

- 非等值連接加篩選

- 自連接加篩選

- 外連接
- 用來查詢一個表中有、另一個表中沒有的紀錄
- 左外連接和右外連接交換順序的話可以達成一樣的結果
- 全外連接
- FULL OUTER JOIN
- MySQL不支援,但可用UNION取得相同結果
- 交叉連接
- 圖示
子查詢
- 定義
- 出現在其他語句內部的select語句
- 內部嵌套其他select語句的查詢,稱為外查詢或主查詢
- 位置可用的子查詢
- SELECT後面
- FROM後面
- WHERE(HAVING)後面 : 最常用
- 標量子查詢
- 列子查詢
- 行子查詢
- 特點
- 子查詢放在小括號內
- 子查詢一般放在條件的右側
- 標量子查詢,一般搭配著單行操作符使用
- 列子查詢,一般搭配著多行操作符使用
- EX : IN/NOT IN、ANY/SOME、ALL
- 子查詢的執行優先於主查詢執行,主查詢的條件用到了子查詢的結果
- EXISTS後面 : 稱為相關子查詢
- 表子查詢
- EXISTS(完整的查詢語句)
- return 1 : 有資料,非null
- return 0 : 無資料,null
- 按結果集的行列數不同
- 標量子查詢 : 結果集只有一行一列
- 列子查詢 : 結果集只有一列多行
- 行子查詢 : 結果集只有一行多列
- 表子查詢 : 結果集一般為多行多列
- 練習題

- 第三題兩種解法

分頁查詢
刪除ROW
- DELETE (ALIAS) FROM TableName (AS ALIAS) WHERE 條件
修改編碼
- 修改已經存在的 database 預設編碼
- ALTER DATABASE `example_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
- 要table、column 都一起被調整編碼
- ALTER TABLE `example_db`.`example_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
- 參考網址
優化資料庫的方法
MySQL資料庫優化的八個方式
- 選取最適用的欄位屬性,儘可能減少定義欄位寬度,儘量把欄位設定NOTNULL,例如'省份'、'性別'最好適用ENUM
- 使用連線(JOIN)來代替子查詢
- 適用聯合(UNION)來代替手動建立的臨時表
- transaction
- 鎖定表、優化transaction
- 適用外來鍵,優化鎖定表
- 建立索引
- 優化查詢語句
記錄一次MySQL兩千萬資料的大表優化解決過程,提供三種解決方案
MySQL 交易功能 Transaction 整理
- MySQL 常用的兩個資料表類型:MyISAM、InnoDB
- MyISAM 不支援Transaction,所以Transaction的整理,均是針對 InnoDB 而言。
- XYZ的筆記本
- 中國好像把Transaction叫作事務
MySQL 調優,大表處理探索
WITH … AS …
Laradock 的 mysql 用法
CMD 使用步驟
- docker-compose exec –user=laradock mysql bash
- 在 laradock 路徑下使用此指令進入 CMD
- mysql -u root -proot
- CREATE DATABASE
laravel
/*!40100 COLLATE 'utf8mb4_general_ci' */;
- 建立 laravel 資料庫,編碼是 utf8mb4_general_ci
優化相關
- title : 花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!