
2024/1/18
MySQL SQLMySQL-關聯資料表查詢
inner join、outer join、子查詢
inner join
解釋: 用來查詢兩個表格中有關聯的資料,分成兩種寫法
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
相當於取交集的意思
範例
-- 建立資料
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int ,
constraint fk_emp_dept foreign key(dep_id)
references dept(id)
);
insert into dept (dep_name,addr) values
("RD","台北"),
("ME","台中");
insert into emp (NAMe,age,dep_id) values
("AAA",20,1),
("BBB",20,1),
("CCC",20,1),
("DDD",20,2),
("EEE",20,2),
("FFF",20,2);
-- 連接語法開始
select * from emp , dept where emp.dep_id = dept.id;
-- 另外一種寫法
-- SELECT * FROM emp JOIN dept ON dept.id = emp.dep_id;
outer join
解釋: 用來查詢兩個表格中有關聯的資料,並且會把沒有關聯的資料也查詢出來,又分成左外連結、右外連結、全外連結
left join
解釋: 用來查詢兩個表格中有關聯的資料,並且會把沒有關聯的資料也查詢出來,但是以左邊的表格為主
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
取左邊表格的資料,並且把右邊表格的資料也查詢出來,如右邊沒有資料則顯示 null
範例
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int
);
insert into dept (dep_name,addr) values
("RD","台北"),
("ME","台中");
insert into emp (NAMe,age,dep_id) values
("AAA",20,1),
("BBB",20,1),
("CCC",20,1),
("DDD",20,2),
("EEE",20,2),
("FFF",20,2),
("GGG",23,3);
select * from emp left join dept on emp.dep_id=dept.id;
right join
解釋: 用來查詢兩個表格中有關聯的資料,並且會把沒有關聯的資料也查詢出來,但是以右邊的表格為主
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
取右邊表格的資料,並且把左邊表格的資料也查詢出來,如左邊沒有資料則顯示 null
範例
create table dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int
);
insert into dept (dep_name,addr) values
("RD","台北"),
("ME","台中"),
("QA","高雄"),
("EE","台南");
insert into emp (NAMe,age,dep_id) values
("AAA",20,1),
("BBB",20,1),
("CCC",20,1),
("DDD",20,2),
("EEE",20,2),
("FFF",20,2),
("GGG",23,3);
select * from emp right join dept on emp.dep_id=dept.id;
子查詢
解釋:重點是利用( )去包住查詢結果,並進一步的在外面加上查詢語法
基本語法
SELECT * FROM table1 WHERE table1.id IN (SELECT table2.id FROM table2);

2024/1/18
MySQL SQLMySQL-SQL語法介紹-DQL 資料查詢語言
DQL(Data Query Language) 資料查詢語言
基礎查詢資料
查詢資料
SELECT 欄位名1, 欄位名2, ... FROM 資料表名 WHERE 條件;
去除重複資料
SELECT DISTINCT 欄位名1, 欄位名2, ... FROM 資料表名 WHERE 條件;
取別名
SELECT 欄位名1 AS 別名1, 欄位名2 AS 別名2, ... FROM 資料表名 WHERE 條件;
條件查詢
基本語法
SELECT 欄位名1, 欄位名2, ... FROM 資料表名 WHERE 條件;
條件查詢關鍵字表格
關鍵字 | 說明 |
---|---|
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
= | 等於 |
!= | 不等於 |
<> | 不等於 |
BETWEEN…AND… | 在…之間 |
IN(…) | 在…群組之中 |
LIKE | 模糊查詢 |
IS NULL | 為空值 |
IS NOT NULL | 不為空值 |
AND | 且 |
OR | 或 |
NOT | 非 |
條件查詢範例
SELECT * FROM 資料表名 WHERE 欄位名1 > 100;
SELECT * FROM 資料表名 WHERE 欄位名1 BETWEEN 100 AND 200;
SELECT * FROM 資料表名 WHERE 欄位名1 IN(100, 200, 300);
SELECT * FROM 資料表名 WHERE 欄位名1 LIKE 'A%';
SELECT * FROM 資料表名 WHERE 欄位名1 IS NULL;
SELECT * FROM 資料表名 WHERE 欄位名1 IS NOT NULL;
SELECT * FROM 資料表名 WHERE 欄位名1 > 100 AND 欄位名2 < 200;
SELECT * FROM 資料表名 WHERE 欄位名1 > 100 OR 欄位名2 < 200;
SELECT * FROM 資料表名 WHERE NOT 欄位名1 > 100;
like 模糊查詢介紹
XX%XX 代表任意長度的字串
SELECT * FROM 資料表名 WHERE 欄位名1 LIKE '%A%';
XX_XX 代表任意一個字元
SELECT * FROM 資料表名 WHERE 欄位名1 LIKE 'A_';
排序查詢
排序查詢語法
SELECT 欄位名1, 欄位名2, ... FROM 資料表名 WHERE 條件 ORDER BY 欄位名1 ASC/DESC, 欄位名2 ASC/DESC, ...;
如果有多個欄位,會先以第一個欄位排序,如果第一個欄位有相同的值,再以第二個欄位排序,以此類推
聚合函數語法
聚合函數 | 說明 |
---|---|
COUNT(欄位名) | 計算欄位名的總數 |
SUM(欄位名) | 計算欄位名的總和 |
AVG(欄位名) | 計算欄位名的平均值 |
MAX(欄位名) | 計算欄位名的最大值 |
MIN(欄位名) | 計算欄位名的最小值 |
所有聚合函數都會忽略 NULL 值
聚合函數範例
SELECT COUNT(欄位名1), SUM(欄位名2), AVG(欄位名3), MAX(欄位名4), MIN(欄位名5) FROM 資料表名;
分組查詢語法
SELECT 欄位名1, 聚合函數1, 聚合函數2, ... FROM 資料表名 GROUP BY 欄位名1;
分組查詢範例(搭配 where)
SELECT 欄位名1, 聚合函數1, 聚合函數2, ... FROM 資料表名 WHERE 條件 GROUP BY 欄位名1;
分組查詢範例(搭配 having)
SELECT 欄位名1, 聚合函數1, 聚合函數2, ... FROM 資料表名 GROUP BY 欄位名1 HAVING 條件;
執行順序: WHERE -> 聚合函數 -> HAVING
分頁查詢語法
SELECT 欄位名1, 欄位名2, ... FROM 資料表名 LIMIT 起始位置, 查詢筆數;
起始索引計算方式= (頁數 - 1) * 每頁筆數
分頁查詢範例
SELECT * FROM 資料表名 LIMIT 0, 10;
LIMIT 是 MySQL 的語法,不是標準 SQL 語法,不同的資料庫可能會有不同的寫法
DQL 小結
SELECT 欄位名1, 欄位名2, ...
FROM 資料表名
WHERE 條件
GROUP BY 欄位名1
HAVING 條件
ORDER BY 欄位名1 ASC/DESC, 欄位名2 ASC/DESC, ...
LIMIT 起始位置, 查詢筆數;

2024/1/18
MySQL SQLMySQL-SQL語法介紹-DML 資料定義語言

2024/1/18
MySQL SQLMySQL-SQL語法介紹-DDL 資料定義語言
DDL(Data Definition Language) 資料定義語言
操作資料庫
####查詢資料庫
SHOW DATABASES;
####新增資料庫
CREATE DATABASE 資料庫名;
####刪除資料庫
DROP DATABASE 資料庫名;
####使用資料庫
USE 資料庫名;
####查看目前使用的數據庫
SELECT DATABASE();
操作資料表
查詢所有資料表
SHOW TABLES;
查詢資料表結構
DESC 資料表名;
新增資料表
CREATE TABLE 資料表名(
欄位名1 資料型態1,
欄位名2 資料型態2,
...
);
刪除資料表
DROP TABLE 資料表名;
修改資料表
####修改資料表名稱
ALTER TABLE 資料表名 RENAME 新資料表名;
####新增欄位
ALTER TABLE 資料表名 ADD 欄位名 資料型態;
####修改資料類型
ALTER TABLE 資料表名 MODIFY 欄位名 新資料型態;
####修改資料表欄位名稱和資料類型
ALTER TABLE 資料表名 CHANGE 欄位名 新欄位名 新資料型態;
####刪除欄位
ALTER TABLE 資料表名 DROP 欄位名;

2024/1/11
React HookReact Hook-useMemo
前言
根據 React 官方文件中的說明,useMemo 會在渲染期間記住傳入的函式,並且在渲染期間避免重複執行該函式。
什麼時候使用 useMemo
官方文件也強調你應該僅僅把 useMemo 作為性能優化的手段。如果沒有它,你的程式碼就不能正常運作,那麼請先找到潛在的問題並修復它。然後再添加 useMemo 以提高性能。
useMemo 的使用方式
useMemo(calculateValue, dependencies)
calculateValue:裡頭帶一個 callback 並寫入需要處理的函式
dependencies:依賴的值,當這個值改變時,useMemo 才會重新執行
const result = useMemo(() => {
add(countA);
}, [countA]);
useMemo 的使用場景
如下方的例子,如果沒有使用 useMemo,當我們點擊 countB 按鈕時,同樣會執行 add 函式,但是我們只想要 countA 改變時才執行 add 函式,因為我們只在乎 result 的結果而在下方範例中 result 又只有跟 countA 有關係,這時候就可以使用 useMemo 來避免重複執行 add 函式。
但是附帶一提,其實沒有使用 useMemo 也不會有什麼問題,因為 就頂多是重複執行 add 函式而已,但是如果 add 函式是一個很耗時的函式,那麼就會造成效能上的問題,這時候就可以使用 useMemo 來避免重複執行 add 函式。
function add(n) {
console.log("我被執行了");
return n * n;
}
function App() {
const [countA, setCountA] = useState(0);
const [countB, setCountB] = useState(0);
const result = useMemo(() => {
add(countA);
}, [countA]);
return (
<>
<button
onClick={() => {
setCountA((countA) => countA + 1);
}}
>
count is {countA}
</button>
<button
onClick={() => {
setCountB((countB) => countB + 1);
}}
>
count is {countB}
</button>
<p>{result}</p>
</>
);
}
