# **【Part2 - Mysql 是什麼?Mysql 優勢、指令】** :::info * [Part1](https://hackmd.io/@workcata/BJtzg-kyT) * Mysql 基礎操作 - 資料搜尋 : REGEXP (包含...) - 模糊搜尋 (% 無限字元、_ 單一字元、LIKE、NOT LIKE) - 練習正則表達式 - 資料倒裝 : REVERSE - 資料連接 : CONCAT - 資料連接 : GROUP_CONCAT - 分組顯示 GROUP BY...HAVING + 條件 - 取字串 SUBSTRING - 綜合應用 ::: ### ☑️ 資料搜尋 : REGEXP (包含...) REGEXP (正規表達式操作符),可以查找符合特定模式的字串,通常比 = 慢 ```= SELECT * FROM <table_name> WHERE username REGEXP 'catalina'; SELECT * FROM <table_name> WHERE email REGEXP 'catalina*06'; -- 後面跟著 零個或多個 a,然後再跟著 06 SELECT * FROM <table_name> WHERE email REGEXP 'catalina.*06'; -- 包含 catalina,後面跟著任意字符零次或多次(可以是什麼都沒有),然後是 06 SELECT * FROM your_table WHERE your_column LIKE 'catalina%06'; -- 以 catalina 開頭,後面跟著任意字符零次或多次(可以是什麼都沒有),然後是 06 SELECT * FROM <table_name> WHERE first_date REGEXP '2023-10'; ``` 如果我想搜尋2023/10/15後入職的 ```= SELECT * FROM <table_name> WHERE first_date REGEXP '2023-10-1[6-9]|2023-10-[2-3][0-9]'; = SELECT * FROM <table_name> WHERE first_date < '2023-10-15'; ``` ### ☑️ 模糊搜尋 (% 無限字元、_ 單一字元、LIKE、NOT LIKE) % 無限字元  _ 單一字元 LIKE ![](https://hackmd.io/_uploads/HJp6QTbJ6.png) NOT LIKE ![](https://hackmd.io/_uploads/SyDaYJzy6.png) ### ☑️ 練習正則表達式 找出 前面有一個字+o 的字串 ```= SELECT * FROM <table_name> WHERE username REGEXP '.o'; ``` 找出開頭為 john的字串 ```= SELECT * FROM <table_name> WHERE email REGEXP '^john'; ``` 找出開頭有字符 + 第二個字為a or b or c 的字串 ^ 開頭 . 點號 (period) 是一個萬用字元,類似配合like的_,可以匹配任何單一字元,除了換行符 ```= SELECT * FROM <table_name> WHERE username REGEXP '^.[abc]'; ``` 找出前面有字符 + a or b or c 結尾的字串 $ 結尾 ```= SELECT * FROM <table_name> WHERE username REGEXP '.[abc]$' ``` > PS 如果裡面也有^, '^.[^a-f]'; 代表第二個字不是a-f 找出結尾為 gmail.com 的字串 ```= SELECT * FROM <table_name> WHERE email REGEXP 'gmail\.com$'; ``` 找出當中含有 d or y 的字串 ```= SELECT * FROM <table_name> WHERE email REGEXP '[d,y]'; ``` 找出當中含有 d or 字符+y 的字串 ```= SELECT * FROM <table_name> WHERE email REGEXP '[d,.y]'; ``` 找出當中含有 一個字符+y 的字串,.{1}表示前面的字符只能出現一次 ```= SELECT * FROM <table_name> WHERE email REGEXP '.{1}[.]y'; ``` 找出當中含有 一個A-Z字符 + 一個數字 1-2之間 + 八個數字 0-9之間 ```= SELECT * FROM <table_name> WHERE id_number REGEXP '^[A-Z][1-2][0-9]{8}$' ``` 郵箱的規則,大小寫英文、數字、符號 + @gmail.com 或 @qmail.com 結尾 ```= SELECT * FROM <table_name> WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@gmail.com|@qmail.com$' ``` 郵箱的規則,包含至少一個數字一個字母 + @gmail.com 或 @qmail.com 結尾 ```= SELECT * FROM <table_name> WHERE email REGEXP '^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9._%+-]+@(gmail\.com|qmail\.com)$' ``` ### ☑️ 資料倒裝 : REVERSE ```= SELECT REVERSE ('Hello World!'); # !dlroW olleH SELECT CONCAT('hello',REVERSE('hello')); # helloolleh SELECT CONCAT('name',REVERSE('name')) FROM unique_cats; ``` ### ☑️ 資料連接 : CONCAT 顯示新欄位 ```= SELECT CONCAT(name,'-', age) AS cat_name_age FROM unique_cats; = SELECT CONCAT_WS('-', name, age) AS cat_name_age FROM unique_cats; ``` > 永久性增加欄位 > ALTER TABLE unique_cats ADD COLUMN cat_name_age VARCHAR(100); >UPDATE unique_cats SET cat_name_age = CONCAT(name, '-', age); ### ☑️ 資料連接 : GROUP_CONCAT ```= SELECT customer_id, GROUP_CONCAT(product_name SEPARATOR ', ') AS ordered_products FROM orders GROUP BY customer_id; ``` ```= 承上,原始資料 | customer_id | product_name | | ----------- | ------------ | | 1 | Product A | | 1 | Product B | | 2 | Product C | | 2 | Product D | | 2 | Product E | 結果 | customer_id | ordered_products | |-------------|----------------------| | 1 | Product A, Product B | | 2 | Product C, Product D, Product E | ``` ### ☑️ 分組顯示 GROUP BY...HAVING + 條件 ![](https://hackmd.io/_uploads/SknO3X4kp.png) ### ☑️ 取字串 SUBSTRING ```= SELECT SUBSTRING('Hello World', 1, 4); (第1個字開始,取到第4個字) SELECT SUBSTRING('Hello World', -4, 5); SELECT SUBSTRING('Hello World', 7); (第七個字取到結束) SELECT SUBSTR(name, 1, 3) AS name_abbr FROM unique_cats; (表中的name欄位,第一個字開始1,取到第3個字) ``` <br/> WITH ROLL UP 新增一個欄位,為自動加總行 ![](https://hackmd.io/_uploads/BJ9f6mVkT.png) ```= SELECT CONCAT( SUBSTR(name, 1, 3), SUBSTR(age,1), ) AS name_age FROM unique_cats; ``` <br/> ### ☑️ 綜合應用 <br/> 這樣會顯示錯誤!!! 因為 emp_birth_date 表格還不在TABLES中 ![](https://hackmd.io/_uploads/Hy1W5c-Ja.png) 先建立新表單 CREATE TABLE,抓取資料,才會對! ![](https://hackmd.io/_uploads/H1ql59Zya.png)