# 數據分析|MariaDB
## 裝置基礎設定
#### 看IP位址
```
apt install net-tools
ifconfig
```
#### 裝maraidb
```
sudo su
sudo apt update
sudo apt install mariadb-server
netstat -aptn
# 查看 3306port 是否有被啟動
```
#### 線到自己本地端的Mariadb Server
```
mysql
```
```sql
show databases;
```
#### 用戶端連線指令
```
mariadb # mysql
exit # 離開用戶端
Ctrl + C # 離開用戶端
```
#### 給予一個管理者權限
```
GRANT ALL
ON *.*
TO 'admin'@'localhost'
IDENTIFIED BY '123456'
WITH GRANT OPTION;
```
#### 透過管理者登入
```
mariadb -uadmin -p123456
```
#### 查看權限
```sql
show grants;
```
#### 修改mariadb的埠號
```jsx
vi /etc/mysql/my.cnf
/port (/是搜尋,如果沒有看到可以按n找下一筆)
esc:wq
```
- 資料庫存放的路徑在
/var/lib/mysql 底下
## 資料庫結構
### 資料庫操作
```sql
show databases;
create database newdb ;
show databases;
use newdb;
```
#### 資料表 table 操作
```sql
# 顯示
show tables;
```
#### 顯示資料庫
```sql
show databases;
```
#### 進入
```sql
use newdb;
```
### 資料表 table 操作
#### 顯示
```sql
show tables;
```
#### 新增
```sql
create table tep_1(
id int,
id_2 int
);
```
#### 再顯示(確認是否新增成功)
```sql
show tables;
```
#### 查看資料表欄位
```sql
describe tep_1;
```
#### 資料操作
- 寫入資料
語法:insert into [資料表] values(值1,值2);
```sql
insert into tmp_1 values(1,10);
```
- 搜尋資料
-
```sql
select [欄位]] from tep_1;
select * from tep_1;
```
## client 指令的常見參數介紹
-u:使用者—預設當前系統使用者
-p:密碼—預設無密碼
-h:host—預設 localhost
-P:埠—預設 3306
```
mysql -uadmin -p123456 -hlocalhost -P3306
```
#### 牛刀小試:
建立一個班級成績資料表
座號、英文、數學、中文`
- 單行註解
- 正確的單行註解
```sql
select * from tmp_1 ; # 註解
```
```sql
select * # 註解
from tmp_1 ;
```
- 錯誤的單行註解
select * # 註解 from tmp_1 ;
- 多行註解
```sql
/*
多行註解
多行註解
*/
```
### MySQL 資料型態
[參考網址](https://www.itread01.com/study/mysql-data-types.html)
- 整數 型態操作
```sql
create table int_test (
i1 tinyint,
i2 smallint ,
i3 int ,
i4 bigint
);
```
- 寫入四個正確值
```
insert into int_test values(1,1,1,1);
```
- 浮點位數 型態操作
float(m,n)
m 數值的總長度
n 浮點位數的長度
float(10,5)
00000.00000
```sql
create table float_test (
f1 float,
f2 float(10,3)
);
insert into float_test values(1.11111111,1.11111111);
```
- 字串 型態操作
CHAR -> 儲存單一名詞、內容 (短文字)
TEXT -> 一系列內容 (長文字)
CHAR -> CHAR(最大長度) 、 VARCHAR(最大長度)
CHAR(最大長度)
CHAR(10) -> 固定長度的字串
CHAR 儲存空間大 效率高
'a----------'
'abcdddddddd'
VARCHAR(10) -> 非固定儲存長度
VARCHAR 儲存空間小 效率差
'a'
'abcdddddddd'
- `建立一個char 、varchar最大長度為10的表格`
```sql
create table char_test (
c1 char(10),
c2 varchar(10)
);
insert into char_test values( # 成功
'1234567890',
'1234567890'
);
insert into char_test values( # 錯誤
'12345678901',
'12345678901'
);
```
- 字串 型態操作
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
- 建立一個TEXT
```sql
create table text_test (
t1 TINYTEXT,
t2 TEXT,
t3 MEDIUMTEXT,
t4 LONGTEXT
);
insert into text_test values('','聲請意旨略以:受刑人前因強制性交等案件,經法院判刑確定並移送執行。茲受刑人業經法務部於民國113年1月5日法矯署教字第11201895390號核准假釋在案,依刑法第93條第2項之規定,在假釋中付保護管束,爰依刑事訴訟法第481條第1項第2款規定聲請裁定等語。','','');
```
- 時間 型態操作
DATE
TIME
YEAR
```sql
create table dt_test (
t1 DATE ,
t2 TIME,
t3 YEAR
);
insert into dt_test
values( '2024-01-09',
'18:35:00',
'2022');
insert into dt_test
values( '2024!01!09',
'18:35',
'2022');
```
DATETIME
TIMESTAMP
```sql
create table dt2_test (
t1 DATETIME ,
t2 TIMESTAMP
);
describe dt2_test ;
# 寫入資料
insert into dt2_test
values( '2024!01!09 18:35:00',
'2024!01!09 18:35:00');
# 對timestamp 寫入空值則會自動寫入系統時間
insert into dt2_test
values('2024!01!09 18:35:00',
null);
insert into dt2_test values(
'2024!01!09 18:35:00',
current_timestamp()
);
```
### 欄位屬性
- 屬性1 非空值
```sql
create table k_daily(
Date date,
Open float NOT NULL
);
# 從描述可以看到非空的屬性
describe k_daily;
# 寫入空資料
insert into k_daily values(null,null);
insert into k_daily values(null,30000);
# 檢查資料
select * from k_daily;
```
- 屬性2 無符號
```sql
create table test_unsigned(
u1 tinyint ,
u2 tinyint unsigned
);
# 錯誤,不可有負值
insert into test_unsigned values(-1,-1);
# 正確,因為雖然一般範圍是(-128,127),但因為屬性所以範圍也改為(0,255)
[詳見](https://www.itread01.com/study/mysql-data-types.html)此
insert into test_unsigned values(-1,200);
```
- 屬性3 唯一值
亦即該欄位的值不可重複
```sql
create table test_unique(
id1 tinyint unsigned unique,
id2 tinyint unsigned
);
# 正確
insert into test_unique values(1,1);
# 錯誤,因為id1已設定為唯一值,故不可再次出現value為1
insert into test_unique values(1,1);
```
- 屬性4 預設值
```sql
create table k_daily(
Date date,
Open float NOT NULL DEFAULT 3000
);
insert into k_daily values(null,null); # 不能指定null值
# insert into 資料表 (指定欄位, ...)
# values (值, ....)
insert into k_daily(Date) values(null);
select * from k_daily;
```
### 修改欄位
- 修改一個欄位
輸入格式:
`ALTER TABLE 資料表 MODIFY COLUMN 欄位`
```
ALTER TABLE k_daily
MODIFY COLUMN Open double not null default 200;
```
- 刪除資料
- 刪除一個欄位
輸入格式:
`ALTER TABLE 資料表 DROP COLUMN 欄位`
```sql
ALTER TABLE k_daily
DROP COLUMN Volume;
```
- 刪除特定資料
```sql
DELETE from employee
where name = 'jack';
```
- 刪除所有資料
DELETE from 資料表
```sql
DELETE from employee;
```
- 格式化資料表
TRUNCATE TABLE 資料表
```sql
TRUNCATE TABLE employee;
```
#### 新增資料
- 新增一個欄位
輸入格式
`ALTER TABLE 資料表 ADD COLUMN 欄位 型態`
```sql
# 新增一個最高價欄位
ALTER TABLE k_daily
ADD COLUMN High ;
```
```sql
# 新增一個最低價欄位 預設為0
ALTER TABLE k_daily
ADD COLUMN Low float DEFAULT 0;
```
```sql
# 新增一個欄位在low欄位後面 [after|before]
ALTER TABLE k_daily
ADD COLUMN Volume float DEFAULT 0 AFTER Low;
```
- 新增欄位資料
格式:
INSERT INTO 資料表(欄位)VALUES (值)
```sql
insert into employee values
(null,'jack',30,'M','RD',30000,'2024-01-10');
表格索引
```
或是
```sql
insert into employee
(name,age,gender,department,salary,hire_date)
values
('jack',30,'M','RD',30000,'2024-01-10');
```
- 從其他資料表複製資料過來
格式:
INSERT INTO <資料表> (欄名,欄名...)
SELECT (對應欄位) FROM (資料表);
先建立一個新資料表
```sql
CREATE TABLE employee_new (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
gender ENUM('M', 'F'),
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);
```
從原先的資料表複製過來
```sql
INSERT INTO employee_new
SELECT * FROM employee;
```
- PRIMARY KEY:意即該值不可重複
有兩種建立方式,分別為
```sql
# 只有id不可重複
CREATE TABLE employee (
id INT ,
name VARCHAR(50) NOT NULL,
age INT,
gender ENUM('M', 'F'),
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE,
PRIMARY KEY(id)
);
```
```sql
# id和name要同時重複才會報錯
CREATE TABLE employee (
id INT ,
name VARCHAR(50) NOT NULL,
age INT,
gender ENUM('M', 'F'),
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE,
PRIMARY KEY(id,name)
);
```
## 更新及刪除資料
- 更新欄位
- 更新所有該欄位的資料
語法:
update 資料表
set 欄位 = (值)
```sql
UPDATE employee
SET hire_date = '2024/01/10';
```
把部門後面的ing刪除
```sql
UPDATE employee
SET department = replace (department, 'ing',' ');
```
- 更新指定欄位的資料
語法:
UPDATE table
SET 欄位 = 值
WHERE 條件
```sql
UPDATE employee
SET gender = 'M'
WHERE name = 'jack';
```
- 刪除欄位
語法:DELETE FROM (資料表) WHERE (搜尋條件)
刪除全部資料:
```sql
DELETE FROM employee ;
```
刪除特定資料
```sql
DELETE FROM employee
WHERE gender = 'M';
```
## 資料匯入/匯出
- 資料匯入
- 從CMD匯入
```lua
LOAD DATA LOCAL INFILE 匯入檔案 INTO TABLE 表格名稱 FIELDS TERMINATED BY ' ,'ENCLOSED BY ' "' LINES TERMINATED BY '\r\n'
```
- 從mysql匯入
```sql
LOAD DATA LOCAL INFILE '/tmp/NVDA.csv'
INTO TABLE NVDA
FIELDS TERMINATED BY ',' # 欄位分隔
LINES TERMINATED BY '\n' ; # 換行
```
- 資料匯出
- 從SQL匯出
```sql
SELECT * FROM 資料表
INTO OUTFILE 檔案路徑
FIELDS TERMINATED BY ' ,'
ENCLOSED BY ' "'
LINES TERMINATED BY '\r\n';
```
```sql
SELECT * FROM NVDA
WHERE Date > '2023-01-01'
INTO OUTFILE '/tmp/NVDA_2023.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
```
- 從CMD匯出
```sql
mysql -uroot -p123456 -D newdb -e "select * from NVDA"
```
sed -> 置換文字的指令
's/\t/,/g' -> 's/被取代的文字/要取代的文字/g' -> g (global)
\t 是縮排 \n 換行
```sql
mysql -uroot -p123456 -D newdb -e "select * from NVDA" | sed 's/\t/,/g'
```
- 寫到檔案中
> 導向 -> 把標準輸出(螢幕輸出)導向到特定檔案
```lua
mysql -uroot -p123456 -D newdb -e "select * from NVDA" | sed 's/\t/,/g'> NVDA_CMD.txt
```
## 搜尋資料
- 建立一個索引
create index 欲建立的索引名稱 on 資料庫(欄位,欄位);
```lua
# 建立單一索引
create index future_date on future_k(date);
# 建立多個索引
create index future_date on future_k(date,time);
```
```
# 容量建立索引前後 64M -> 84M
# 耗時:0.001 sec
# 透過 explain 指令可以查看是否使用到索引
explain select * from future_k
where date = '2017-01-06' and time > '10:45:00';
```
- 設定成primary key 容量跟搜尋效率的差別
```sql
create table future_k1(
date date,
time time,
open smallint,
high smallint,
low smallint,
close smallint,
volume tinyint,
primary key (date,time)
);
```
```sql
# 解釋查詢細節
explain select * from future_k1 where date = '2017-01-06' and time > '10:45:00';
```
```sql
# 寫入資料
LOAD DATA LOCAL INFILE '/tmp/future_k.csv'
INTO TABLE future_k1
FIELDS TERMINATED BY ',' # 欄位分隔
LINES TERMINATED BY '\n' ; # 換行
```
- 結論:
1. primary key > index
2. 建立primary key資料表 > 建立無key的資料表
- 搜尋唯一值
語法:
SELECT DISTINCT (欄位名) FROM (資料表);
```sql
select distinct age from employee_age;
select distinct age,id from employee_age;
```
- 特殊查詢
or 其中之一
```sql
select * from employee
where department = 'Marketing'
or department = 'Engineering' ;
```
in 其中之一
```sql
select * from employee
where department in ('Marketing' ,'Engineering') ;
```
between 在......區間
```sql
select * from future_k1
where date between '2010-01-01' and '2010-12-31' ;
```
特殊字元
%:包含0~無限個字元
```sql
# M開頭
select * from employee
where name like 'M%';
# 內容包含v
select * from employee
where name like '%v%';
```
_:包含1個字元
```sql
# M後面有5個字元
select * from employee
where name like 'M_____';
# M後面有3個字元
select * from employee
where name like 'M___';
```
判斷 id_number 第一個字元為英文字母
- 正則表達式
1. 使用 .(句點)匹配任何單個字符
2. 使用 *(星號)匹配前面的字符零次或多次
3. 使用 +(加號)匹配前面的字符一次或多次
4. 使用 ?(問號)匹配前面的字符一次
5. 使用 ^(插入符號)匹配字符串的開始
6. 使用 $(美元符號)匹配字符串的結尾
7. 使用 [](方括號)匹配方括號中的任意字符
8. 使用 [^](否定方括號)匹配不在方括號中的任何字符
9. 使用 |(管道符號)匹配多個表達式之一
10. 使用 \(反斜線)轉義特殊字符
- 檢查台灣身分證字號格式是否正確
```sql
SELECT * FROM member
WHERE id_number REGEXP '^[A-Z][1-2][0-9]{8}$';
```
- 搜尋所有以 '[gmail.com](http://gmail.com/)' 結尾的電子郵件
```sql
SELECT * FROM member
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@gmail.com$';
```
- 刪除索引
drop index 欲刪除的索引名稱 on 資料庫(欄位,欄位);
- 限制筆數的用法
```sql
select *
from employee
limit 2,1;
```
## 常見函數
- AVG
• 求群組中數值的平均值
• 計算員工薪資的平均值
SELECT AVG(salary) AS avg_salary FROM employee;
- COUNT
• 計算指定的欄位中值有多少列的函數
• 計算員工總數
SELECT COUNT(*) AS total_employees FROM employee;
- MAX
• 求指定欄位中最大值
• 找出最高薪資
SELECT MAX(salary) AS max_salary FROM employee;
- MIN
• 求指定欄位中最小值
• 找出最低薪資
SELECT MIN(salary) AS max_salary FROM employee;
- STDDEV
• 求群組中數值的標準差
• 計算員工薪資的標準差
SELECT STDDEV(salary) AS salary_stddev FROM employee;
- SUM
• 求數值式的總和的函數
• 計算員工薪資總和
SELECT SUM(salary) AS total_salary FROM employee;
- VARIANCE
• 求指定數值的變異數值的函數
• 計算員工薪資的方差
SELECT VARIANCE(salary) AS salary_variance FROM employee;
- CONCAT
• 連接兩個或多個字符串
• SELECT CONCAT(name, ' is in the ', department, ' department')
AS info FROM employee;
- LENGTH
• 返回字符串的長度
• SELECT name, LENGTH(name) AS name_length FROM employee;
- LOWER、LCASE
• 將字符串轉換為小寫
• SELECT LOWER(name) AS name_lower FROM employee;
- UPPER、UCASE
• 將字符串轉換為大寫
• SELECT UPPER(department) AS department_upper FROM
employee;
- SUBSTRING
• 返回字符串的一部分
• SELECT SUBSTRING(name, 1, 3) AS name_substr FROM
employee;
- REPLACE
• 替換字符串中的一部分
• SELECT REPLACE(department, 'Sales', 'Sales and Marketing') AS
dept_replaced FROM employee;
- TRIM
• 去掉字符串的空格
• SELECT TRIM(name) AS name_trimmed FROM employee;
- INSERT
• 在字符串中插入另一個字符串
• SELECT INSERT(name, 2, 0, 'a') AS name_inserted FROM
employee;
- INSTR
• 返回一個字符串在另一個字符串中的位置
• SELECT name, INSTR(name, 'oh') AS position FROM employee;
- REVERSE
• 反轉字符串
• SELECT name, REVERSE(name) AS name_reversed FROM
employee;
- LEFT
• 返回字符串的左側一部分
• SELECT LEFT(name, 3) AS name_left FROM employee;
- RIGHT
• 返回字符串的右側一部分
• SELECT RIGHT(name, 2) AS name_right FROM employee;
- SPACE
• 返回由指定數量的空格字符組成的字符串
• SELECT SPACE(5) AS space_string FROM employee;
- NOW
• 回傳當前系統日期與時間
• SELECT NOW();
- YEAR
• 回傳日期中的年份
• SELECT YEAR(hire_date) FROM employee;
- MONTH
• 回傳日期中的月份
• SELECT MONTH(hire_date) FROM employee;
- DAY
• 回傳日期中的日
• SELECT DAY(hire_date) FROM employee;
- HOUR
• 回傳時間中的小時
• SELECT HOUR(NOW());
- MINUTE
• 回傳時間中的分鐘
• SELECT MINUTE(NOW());
- SECOND
• 回傳時間中的秒數
• SELECT SECOND(NOW());
- DATEDIFF
• 回傳兩個日期之間的天數差
• SELECT DATEDIFF('2022-05-01', '2022-03-15')
- DATE_FORMAT
• 將日期或時間格式化為指定格式的字串
• SELECT DATE_FORMAT(hire_date, '%Y年%m月%d日') FROM
employee;
- CURRENT_DATE
• 回傳當前系統日期
• SELECT CURRENT_DATE();
- CURRENT_TIME
• 回傳當前系統時間
• SELECT CURRENT_TIME();
- CURRENT_TIMESTAMP
• 回傳當前系統日期與時間
• SELECT CURRENT_TIMESTAMP();
- LAST_DAY
• 取得指定日期所在月份的最後一天日期
• 找出員工入職當月的最後一天
SELECT name, hire_date, LAST_DAY(hire_date) AS
last_day_of_month FROM employee;
- ADDDATE 、SUBDATE
• 將日期加上一定的時間間隔,例如天數、周數或月數
• 將員工 Peter 的入職日期往後延長 1 年
UPDATE employee
SET hire_date = ADDDATE(hire_date, INTERVAL 1 YEAR)
WHERE name = 'Peter';
## SQL群組化
- 抓出每個部門的平均薪資
```sql
select department,avg(salary)
from employee
group by department;
```
- 抓出每個年齡層的最低薪資(10y) round(age/10)
```sql
select round(age/10) age_range,min(salary)
from employee
group by round(age/10);
```
- 抓出每個月份到職的員工人數 year(hire_date)
```sql
select month(hire_date) hire_month,count(*) employ_num
from employee
group by month(hire_date);
```
- 篩出高所得職員(<100000)
然後統計每個部門有幾位
使用where
```sql
select name, salary , count(salary) from employee
where salary>70000
group by department;
```
- 篩出高平均所得的部門(>70000)
使用having
```sql
select department, avg(salary) from employee
group by department
having avg(salary)>70000;
```
## 外部鍵
```sql
CREATE TABLE member (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
join_date DATE,
id_number VARCHAR(10) NOT NULL,
email VARCHAR(50) NOT NULL,
url VARCHAR(100) NOT NULL
);
```
```sql
INSERT INTO member (username, password, join_date, id_number, email, url)
VALUES
('john123', 'password123', '2022-01-01', 'A123456789', 'john123@gmail.com', 'https://www.example.com/john123'),
('mary456', 'password456', '2022-01-15', 'B234567890', 'mary456@gmail.com', 'https://www.example.com/mary456'),
('david789', 'password789', '2022-02-01', 'C345678901', 'david789@gmail.com', 'https://www.example.com/david789'),
('lisa111', 'password111', '2022-02-15', 'D456789012', 'lisa111@gmail.com', 'https://www.example.com/lisa111'),
('kevin222', 'password222', '2022-03-01', 'E567890123', 'kevin222@gmail.com', 'https://www.example.com/kevin222');
```
```sql
CREATE TABLE purchase (
id INT PRIMARY KEY AUTO_INCREMENT,
member_id INT NOT NULL,
product_name VARCHAR(50) NOT NULL,
price DECIMAL(8, 2) NOT NULL,
purchase_date DATE
);
```
```sql
INSERT INTO purchase (member_id, product_name, price, purchase_date)
VALUES
(1, 'T-shirt', 20.99, '2022-01-02'),
(2, 'Jeans', 39.99, '2022-01-17'),
(3, 'Sneakers', 79.99, '2022-02-03'),
(4, 'Dress', 59.99, '2022-02-18'),
(5, 'Jacket', 99.99, '2022-03-03'),
(1, 'Jeans', 29.99, '2022-03-05'),
(3, 'Dress', 89.99, '2022-03-20'),
(2, 'Handbag', 49.99, '2022-04-01');
```
- 新增一筆不存在的資料再刪除
```sql
INSERT INTO purchase (member_id, product_name, price, purchase_date)
VALUES
(7, 'Handbag', 46.99, '2022-07-01');
delete from purchase where member_id = 7;
```
- 新增外部鍵 (建立以後再重複上述動作)
```sql
ALTER TABLE purchase
ADD CONSTRAINT fk_member_id
FOREIGN KEY (member_id)
REFERENCES member(id);
```
## 子查詢
- 搜尋會員名稱
```sql
select username
from member;
```
- 搜尋購買過牛仔褲的紀錄
```sql
select member_id
from purchase
where product_name = 'Jeans';
```
- 搜尋購買過牛仔褲的會員名稱
```sql
select username
from member
where id in (
select member_id
from purchase
where product_name = 'Jeans'
```
- 交叉查詢
- 查詢有購買過商品的紀錄 包含會員基本資料
```sql
select *
from member m,purchase p
where m.id = p.member_id;
select m.username,
p.product_name,
p.price,
p.purchase_date
from member m,purchase p
where m.id = p.member_id;
```
- 內部查詢
- 查詢有購買過商品的紀錄 包含會員基本資料
```sql
select m.username,
p.product_name,
p.price,
p.purchase_date
from member m
inner join purchase p
on m.id = p.member_id;
```
- 左(右)外部查詢
```sql
SELECT m.username,
p.product_name,
p.price
FROM member m
LEFT JOIN purchase p
ON m.id = p.member_id
```
- 內部查詢與左(右)外部查詢的差異
1. 先在會員資料中輸入一筆資料
```sql
INSERT INTO member
(username, password, join_date, id_number, email, url)
VALUES
('jack999', 'password999', '2021-01-01', 'R123456789', 'jack999@gmail.com', 'https://www.example.com/jack999');
```
1. 再分別使用內部查詢與左外部查詢
內部查詢:
```sql
select m.username,
p.product_name,
p.price,
p.purchase_date
from member m
inner join purchase p
on m.id = p.member_id;
```
左外部查詢:
```sql
SELECT m.username,
p.product_name,
p.price
FROM member m
LEFT JOIN purchase p
ON m.id = p.member_id
```
## 視圖應用
語法:CREATE VIEW View名稱 AS SELECT 查詢句;
- 建立一個簡單的職員資料表
```sql
CREATE VIEW employee_simple AS
select name,age,gender,department
from employee ;
# 顯示表格
show tables;
# 顯示完整的表格資料
show full tables;
```
- 實際案例
- 牛刀小試1:建立一個 > 30歲的職員資料表
```sql
CREATE VIEW employee_2 AS
select *
from employee
where age > 30;
```
- 牛刀小試2:future_k1 是台指期的K線資料
日盤 08:45~13:45 夜盤 15:00~05:00
請依照日夜盤 分成兩個View
```sql
create view future_k1_day as
select * from future_k1
where time between '08:45:00' and '13:45:59';
CREATE VIEW future_night AS
select *
from future_k1
where time >= '15:00:00' or time <= '05:00:01';
```
- 牛刀小試3:建立購買紀錄以及會員名稱的表格
```sql
CREATE VIEW purchase_member_name AS
select m.username,
p.product_name,
p.price,
p.purchase_date
from member m
inner join purchase p
on m.id = p.member_id;
```
## 資料庫備份與還原
指令:`mysqldump -hlocalhost -u root -p密碼 資料庫 > 備份檔案`
- 退出mySQL,建立資料庫備份檔
```lua
mysqldump -uroot -p123456 newdb > /tmp/newdb.bak
```
- 登入資料庫 刪除整個資料庫
```lua
mysql
drop database newdb;
```
- 進入mySQL建立空資料庫
```sql
create database newdb_2;
```
- 還原備份檔進入剛剛建好的database
```lua
mysql -uroot -p123456 -D newdb_2 < /tmp/newdb.bak
```
## 常規變數
常規變數的定義
```sql
set @var1 = 66 ;
select select @var1;
```
搜尋結果 寫到 常規變數
DELIMITER //
CREATE PROCEDURE 預存程序([IN 帶入參數 型態,OUT 回傳參數 型態])
BEGIN
{自訂SQL語句}
END;
// DELIMITER
- 建立一個查詢特定部門職員的stored procedure
```sql
DELIMITER //
CREATE PROCEDURE GetEmployeesInDepartment(IN deptName VARCHAR(50))
BEGIN
SELECT * FROM employee WHERE department = deptName;
END;
// DELIMITER ;
```
- 執行該procedure
```sql
CALL GetEmployeesInDepartment('Sales');
```