# SQL 資料庫
###### tags: `Python/SQL商業資料分析` , `SQL` , `phpMyAdmin` , `Python`
[TOC]
## 前言
### SQL 基本概要和分類
SQL(Structured Query Language) 主要是以 keyword 關鍵字和資料表(table)名稱和欄位(column)名稱當作一段完整的語句進行關聯式資料庫(RDB)的操作。
### SQL 語法特性
- SQL 語法使用分號 ; 當作結尾
- 英文字母不區分大小寫(但一般比較常寫大寫便於閱讀)
- 單字間使用空白分隔
- 單行註解寫法 `--`
- 多行註解使用 `/* */` 包裹
### SQL 語法分類
一般 SQL(Structured Query Language)語法分為: DDL(Data Definition Language)資料定義語言、DML(Data Manipulation Language)資料操作語言和 DCL(Data Control Language)資料控制語言三類,以下分別介紹其特色:
- **DDL(Data Definition Language)資料定義語言**
能建立或刪除資料庫和資料表等用來儲存的單位。以下為常見的 DDL(Data Definition Language)指令:
- `CREATE`:建立資料庫(database)或資料表(table)
- `DROP`:刪除資料庫或資料表
- `ALTER`:修改資料庫或資料表欄位架構
- **DML(Data Manipulation Language)資料操作語言**
能查詢或修改資料表的紀錄,為一般商業資料分析師最常使用的指令類別為 SELECT。以下為常見的 DML(Data Manipulation Language)指令:
- `INSERT`:新增資料紀錄(record)進入資料表
- `SELECT`:查詢資料表中的資料
- `UPDATE`:更新資料表中的資料
- `DELETE`:刪除資料
- **DCL(Data Control Language)資料控制語言**
可以用來執行或取消對資料庫的操作。另外,也可以針對使用者的權限進行管理,一般資料分析師比較少會使用到權限管理的指令。
- `COMMIT`:提交對資料庫操作的變更
- `ROLLBACK`:取消對資料庫操作的變更
- `GRANT`:給予使用者操作權限
- `REVOKE`:取消使用者操作權限
# SQLite
## 資料常見型別(data type)
SQLite 資料常見型別:`INTEGER`、`TEXT`、`BLOB`、`REAL`、`NUMERIC`,同時 SQLite 在使用時也可以使用其他資料庫資料型別來對應到本身資料型別。
![](https://i.imgur.com/ELPRJif.png)
## DDL 資料定義語法
### CREATE 建立資料庫
- `CREATE`:創建資料庫
- `COLLATE`:指定資料庫的預設定序
- `IF NOT EXISTS`:判斷是否已有資料庫,若無才創建,避免重複創建資料庫錯誤
- `DROP`:刪除資料庫/資料表
- `ALTER`:修改資料表結構
```sql
CREATE DATABASE IF NOT EXISTS demo_shop
COLLATE utf8mb4_unicode_ci;
```
### CREATE 創建資料表
```sql
-- id 為主鍵,資料不可重複,整數型別,非 NOT NULL 值(不允許空值)
-- VARCHAR(長度) 為可變字串資料型別
-- INT 為整數
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY NOT NULL UNIQUE,
username VARCHAR(12) NOT NULL,
age INT,
gender VARCHAR(6)
);
```
### DROP 刪除資料庫/資料表
```sql
-- 刪除資料庫
DROP DATABASE demo_shop;
-- 刪除資料表
DROP TABLE users;
```
### ALTER 修改資料表結構
```sql
-- 新增欄位
ALTER TABLE users ADD profile TEXT;
-- 刪除欄位
ALTER TABLE users DROP age;
```
## DML 資料操作語法
- `INSERT`:插入資料
- `SELECT`:查詢資料
- `UPDATE`:更新資料
- `DELETE`:刪除資料
- `.mode column`:分隔設定(SQLite限定)
- `.headers on`:加上標頭(SQLite限定)
- `.separator`:顯示格式設定(補充)
### INSERT 插入資料
```sql
INSERT INTO users (id, username, age, gender) VALUES
(1, 'Jack', 20, 'Male'),
(2, 'Amy', 33, 'Female'),
(3, 'Tony', 55, 'Male')
;
-- 亦可簡化如下
INSERT INTO users VALUES
(1, 'Jack', 20, 'Male'),
(2, 'Amy', 33, 'Female'),
(3, 'Tony', 55, 'Male')
;
```
### SELECT 查詢資料
```sql
-- 星號 * 代表所有欄位
SELECT * FROM users;
-- 針對特定屬性選取
SELECT username, age
FROM users;
-- 條件
SELECT age
FROM users
WHERE age >= 50 AND gender == 'Female';
-- 排序
-- DESC 表由大到小descending order)
-- ASC 表由小到大(預設值)
SELECT * FROM users
ORDER BY age DESC;
-- 函式(彙總資料時可使用)
-- 數量 COUNT、加總 SUM、平均值 AVG、最大值 MAX 和最小值 MIN
SELECT COUNT(*)
FROM users;
```
### UPDATE 更新資料
更新資料可以使用 `UPDATE`,使用 `WHERE` 指定要刪除哪一筆資料。
```sql
UPDATE users
SET age = 18
WHERE username = 'Jack';
```
### DELETE 刪除資料
除資料可以使用 `DELETE FROM`,同時可以使用 `WHERE` 指定要刪除哪一筆資料。
```sql
DELETE FROM users
WHERE username = 'Jack';
```
### .mode column 分隔設定(SQLite限定)
```sql
-- 加上顯示格式設定使用分隔設定(注意在格式設定語法正後方不能加上註解,註解要放在上方或下方)
.mode column
-- 查詢特定欄位
SELECT username , age
FROM users;
```
結果:
```sql
Jack 20
May 10
Cindy 34
```
### .headers on 加上標頭(SQLite限定)
```sql
-- 加上顯示格式設定使用分隔設定
.headers on
-- 查詢特定欄位
SELECT username , age
FROM users;
```
結果:
```sql
username|age
Jack|20
May|10
Cindy|34
```
### 補充(格式設定)
- `.separator` :顯示格式設定
`.separator || "\n"`:每筆 row 資料可以透過 `||` 分隔(`||` 可以為任意符號,例如:#)並透過換行符號換行(\n 代表換行符號,若要換兩行則改為 \n\n)
```sql
-- 加上顯示格式設定
.separator || "\n"
-- 查詢特定欄位
SELECT username , age
FROM users;
```
結果:
```sql
Jack||20
May||10
Cindy||34
```
## 函式與排序
### 常用彙總函式
- `COUNT()`:用來計算資料表中的資料紀錄**筆數**
- `SUM()`:用來計算資料表中特定屬性欄位資料的**加總**
- `MAX()`:用來計算資料表中特定屬性欄位資料的**最大值**
- `MIN()`:用來計算資料表中特定屬性欄位資料的**最小值**
- `AVG()`:用來計算資料表中特定屬性欄位資料的**平均值**
```sql
-- 查詢 products 資料表中所有資料筆數
-- 在 SQL 語法 * 星號代表所有的意思,不會排除有 NULL 值資料
SELECT COUNT(*)
FROM products;
```
```sql
-- 查詢 products 資料表中 price > 10000 資料筆數。
SELECT COUNT(*)
FROM products
WHERE price > 10000;
```
### GROUP BY 資料分群
SQL 敘述撰寫順序:
- SELECT
- FROM
- WHERE
- GROUP BY
特別注意使用 GROUP BY 時 SELECT 後面欄位只能使用:
- 彙總函式
- 常數(固定數值)
- GROUP BY 指定的欄位名稱
```sql
-- 據 category 分類
SELECT category, COUNT(*), SUM(price)
FROM products
GROUP BY category;
```
### HAVING 指定條件
`HAVING `只能用在 aggregate (彙總函式) 下 ,也就是有` GROUP BY `的時候,並且` HAVING `要過濾的條件,要跟 GROUP BY 的彙總函數有關。
```sql
-- 只顯示 category 為 3C 且平均價格大於 10000 的資料
SELECT category, COUNT(*), SUM(price)
FROM products
WHERE category = '3C' -- 指定3c
GROUP BY category
HAVING AVG(price) > 10000; -- 指定價格大於 10000
```
### ORDER BY 結果排序
`ORDER BY` 進行排序,其中`ASC`是由小到大,`DESC`則是由大到小。
```sql
SELECT category, COUNT(*), SUM(price)
FROM products
GROUP BY category
HAVING AVG(price) > 10000
ORDER BY COUNT(*) DESC;
```
### View 檢視表
當我們查詢語法時常重複使用或是非常複雜時,我們可以創建 View 檢視表來簡化。可以想成是一個虛擬的資料表(Virtual table),只是 View 檢視表和 table 不同,不是儲存真實的資料,而是查詢的語法。
創建語法:
```sql
CREATE VIEW view_name (檢視表欄位名稱1, 檢視表欄位名稱2)
AS 查詢語法敘述;
```
刪除語法:
```sql
DROP VIEW view_name;
```
範例語法:
```sql
/* 創建 View 檢視表 */
CREATE VIEW high_avg_category_prod (category, num_count, sum_price)
AS
SELECT category, COUNT(*), SUM(price)
FROM products
GROUP BY category
HAVING AVG(price) > 10000;
/* 透過 View 取值 */
SELECT * FROM high_avg_category_prod;
```
### Subquery 子查詢
子查詢(Subquery)可以想成是拋棄式的 View 檢視表,當執行完查詢語法後即消失。透過 Subquery 子查詢可以讓我們組裝不同資料表的巢狀查詢。但由於 Subquery 子查詢查詢效能較不佳,若是資料量非常大的話使用上需要特別留意。
- 語法一(子查詢會回傳一筆筆資料,從子查詢查出的資料進一步查詢):
```sql
SELECT 欄位
FROM (子查詢) AS 別名;
```
- 語法二(純量子查詢,回傳的是單一值):
```sql
SELECT 欄位
FROM 資料表
WHERE 欄位 > (子查詢);
```
##### 範例語法一(從子查詢查出的資料進一步查詢):
```sql
SELECT name
FROM (
SELECT name, price FROM products
) AS only_name_price_product;
```
##### 執行結果:
上述執行順序會先執行:SELECT name, price FROM products 取得查詢資料後
執行:SELECT name FROM 查詢資料;
```sql
華速 intel i3 筆電
Mac Pro 筆電
微興電競筆電
戈林冰箱
三力冰箱
C 語言入門
python3 實戰
JavaScript 英雄
Java 資料分析
python 資料分析
```
##### 範例語法二(取得價格大於平均的產品名和價格):
```sql
SELECT name
FROM products
WHERE price > (SELECT AVG(price) FROM products);
```
## 常用基礎函式
- 彙總函式:在前一堂課程內容已經有介紹,彙總函式將資料進行彙總和基本統計。主要有 `COUNT`、`SUM`、`AVG`、`MAX` 和 `MIN`等函式
- 數學函式:計算數值的函式
- 字串函式:操作字串的函式
- 日期函式:操作日期的函式
- 轉換函式:資料型別和內容轉換函式
### 數學函式
數學函式主要是計算數值的函式,在大部分的關聯式資料庫系統(RDBS)中都有支援。
```sql
-- +、-、*、/ -> 加、減、乘、除
SELECT price + weight
FROM products;
```
- `ROUND`:四捨五入語法
- `ABS`:取絕對值語法(NULL 值會是空)
- `MOD`:取餘數語法(11 % 3 為 2)
```sql
SELECT ROUND(weight)
FROM products;
SELECT ABS(weight)
FROM products;
-- 需注意在 SQLite、MS SQL Server 等關聯式資料庫中取餘數需改用 % 來進行
SELECT price % weight
FROM products
WHERE weight > 1;
```
### 字串函式
- `CONCAT`:串接兩個子字串。
- `UPPER`、`LOWER`:轉成大小寫
- `LENGTH`:計算字串長度
- `SUBSTRING`:取得子字串
- `REPLACE`:替換字串
#### CONCAT:串接兩個子字串
此函式主要適用於 MySQL、MaraiDB 和新版本 MS SQL,於 SQLite、PostgreSQL 和 Oracle 則使用` || `串接字串。注意:單一個` | `為邏輯判斷 或 or 的意思。
```sql
-- CONCAT(欄位_1, 欄位_2)
-- 欄位_1 || 欄位_2
SELECT name || category
FROM products;
```
#### UPPER、LOWER:轉成大小寫
```sql
SELECT UPPER(name)
FROM products;
SELECT LOWER(category)
FROM products;
```
#### LENGTH:計算字串長度
```sql
SELECT LENGTH(name)
FROM products;
```
#### SUBSTRING:取得子字串
- 語法(MySQL、MariaDB、PostgreSQL 使用):
```sql
SUBSTR(文字字串欄位, 起始位置(索引位置由左從 1 開始), 取的字元數量)
SUBSTRING(文字字串欄位, 起始位置(索引位置由左從 1 開始), 取的字元數量)
```
- 或語法(SQL Server 使用):
```sql
SUBSTRING(文字字串欄位, 起始位置(索引位置由左從 1 開始), 取的字元數量)
```
- 或語法(Oracle、SQLite 使用):
```sql
SUBSTR(文字字串欄位, 起始位置(索引位置由左從 1 開始), 取的字元數量)
```
```sql
/* position index 從 1 開始(這部份和程式語言從 0 開始 index 不同),取長度為 3 */
SELECT SUBSTR(name, 1, 3)
FROM products;
```
#### REPLACE:替換字串
```sql
SELECT REPLACE(name, 'python', 'R 語言')
FROM products;
```
### 日期函式
- `CURRENT_DATE` :取得目前日期 `YYYY-MM-DD`
- `CURRENT_TIME` :取得目前時間 `hh:mm:ss`
- `CURRENT_TIMESTAMP` :`YYYY-MM-DD hh:mm:ss`
```sql
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_TIMESTAMP
```
### 轉換函式
- `COALESCE`:將 NULL 值換成特定值,常用於資料前處理和清洗
```sql
/* NULL 替換成 未分類 */
SELECT COALESCE(category, '未分類')
FROM products;
```
### 常用述詞
述詞(Predicate)是一個特殊的函式,其回傳值為是/否(TRUE/FALSE),常用於搭配 WHERE 過濾資料時使用。
> 相等 `=`(SQLite 和 MySQL 可以使用) 或 `==`(SQLite 可以使用)、不等於 `<>` 或 `!=`、大於 `>`、大於等於 `>=`、小於 `<`、小於等於 `<=`、`NOT` 否定。
- **LIKE 字串搜尋比較**
LIKE 用來比對字串是否為想要查詢的資料,後面接 % 加上比對字串,% 可以想成是代表任何字串的意思。
```sql
/* 開頭相同 */
SELECT name
FROM products
WHERE name LIKE 'py%';
/* 中間相同 */
SELECT name
FROM products
WHERE name LIKE '%thon%';
/* 結尾相同 */
SELECT name
FROM products
WHERE name LIKE '%分析';
```
- **IS NULL / IS NOT NULL**
```sql
SELECT name, category
FROM products
WHERE category IS NULL;
SELECT name, category
FROM products
WHERE category IS NOT NULL;
```
- **BETWEEN**
```sql
SELECT name, category
FROM products
WHERE price BETWEEN 100 AND 1000;
```
- **IN、NOT IN**
範例語法:
```sql
SELECT name, category
FROM products
WHERE category IN ('NB', 'Book');
SELECT name, category
FROM products
WHERE category NOT IN ('NB', 'Book');
```
執行結果:
```sql
/* IN ('NB', 'Book') */
華速 intel i3 筆電|NB
Mac Pro 筆電|NB
微興電競筆電|NB
C 語言入門|Book
python3 實戰|Book
JavaScript 英雄|Book
/* NOT IN ('NB', 'Book') */
戈林冰箱|3C
三力冰箱|3C
```
### CASE 運算式
範例語法:
```sql
/* category 轉換成中文字 */
SELECT
name,
CASE
WHEN category = 'NB' THEN '筆電類'
WHEN category = '3C' THEN '3C類'
WHEN category = 'Book' THEN '圖書類'
ELSE '未分類'
END
FROM products;
```
執行結果:
```sql
華速 intel i3 筆電|筆電類
Mac Pro 筆電|筆電類
微興電競筆電|筆電類
戈林冰箱|3C類
三力冰箱|3C類
C 語言入門|圖書類
python3 實戰|圖書類
JavaScript 英雄|圖書類
Java 資料分析|未分類
python 資料分析|未分類
```
### 集合運算概論
![](https://i.imgur.com/CB0Xfaf.png)
products_1 | products_2
3C | Food
Book | Cloth
NB | NB
- UNION 聯集
```sql
SELECT category
FROM products_1
UNION
SELECT category
FROM products_2;
-- 3C Book Cloth Food NB
```
- INTERSECT 交集
```sql
SELECT category
FROM products_1
INTERSECT
SELECT category
FROM products_2;
-- NB
```
- EXCEPT 差集
```sql
SELECT category
FROM products_1
EXCEPT
SELECT category
FROM products_2;
-- 3C Book
```
### JOIN 合併查詢
JOIN 合併查詢主要功能為橫向串接資料表的欄位(column/attribute),這部份和集合以縱向串連不同資料表的紀錄(record)資料值比較不同。不管是` Set 集合運算 `或是` JOIN 合併查詢 `都是 SQL 進階查詢語法中重要的元素。
![](https://i.imgur.com/9WYZcXD.png)
- INNER JOIN
###### INNER JOIN 為透過有相同的連結欄位合併不同資料表(可以多個)
```sql
SELECT *
FROM users INNER JOIN orders ON users.id = orders.customer_id;
```
```sql
/* 只有有出現在 customer_id 的 user 一起合併 */
1|Jack Hung|jackh32@gmail.com|20|1|2900|1|2020-07-29 08:23:51|1
3|Amy Chang|amychang@gmail.com|32|2|1400|3|2020-07-29 08:23:51|3
2|Tony Liu|tonykk@gmail.com|62|3|870|2|2020-07-29 08:23:51|2
```
- OUTER JOIN
###### OUTER JOIN 為不管有沒有相同的連結欄位都合併在一起,需要指定以哪一個資料表為主(目前 SQLite 主要支援 LEFT 以寫在左邊的資料表為主)。
```sql
SELECT *
FROM users LEFT OUTER JOIN orders ON users.id = orders.customer_id;
```
```sql
/* Kay Wang 為沒有在 orders 的使用者也一起合併 */
1|Jack Hung|jackh32@gmail.com|20|1|2900|1|2020-07-29 08:27:43
2|Tony Liu|tonykk@gmail.com|62|3|870|2|2020-07-29 08:27:43
3|Amy Chang|amychang@gmail.com|32|2|1400|3|2020-07-29 08:27:43
4|Kay Wang|kkkk@gmail.com|28||||
```
# MySQL
## 資料常見型別(data type)
![](https://i.imgur.com/7iliUvw.png)
# 建立 SQL 語法環境
> 如何在你的本機電腦建立 MySQL/MariaDB SQL 和 Python 開發環境,在前面章節我們使用 repl.it 這個網路雲端的編輯器,為的是更專注在 SQL 語法的學習而非一開始就處理環境的設定與建置。
>
> 但隨著我們陸續將進入應用開發的部分,我們會需要安裝一些第三方的套件並規劃在本機電腦執行我們的程式,所以就讓我們開始 Python/SQL 開發環境建置吧!
## 建立 SQL 語法環境
有些公司或是組織內部使用的是 `MS SQL`、`PostgreSQL`、`Spark SQL`、`Google Big Query` 和 `AWS Redshift SQL` 等不同的 SQL 指令環境。
但基本上 SQL 和關聯式資料庫語法概念是類似(或許有些語法撰寫上因支援度有所不同),所以本文專注在` MySQL/MariaDB `的環境上。
## 安裝 XAMPP
> XAMPP 是一個免費且易於安裝的 Apache 發行版本/懶人包(Apache 是一種網站伺服器),其中包含 MariaDB、PHP(一種主要用於網站開發的程式語言)和 Perl以及 phpMyAdmin(圖形化管理資料庫的工具)。簡單來說,可以想成一個安裝的懶人包,方便安裝資料庫系統來使用。
>
> 根據XAMPP 官方網站的說明自從 XAMPP 5.5.30 和 5.6.14 版本以後,懶人安裝包中的 MySQL 轉換成 MariaDB,但由於 MariaDB 是由前 MySQL 團隊所開發的開放原始碼關聯式資料庫,所以基本上操作和 MySQL 語法幾乎相容,所以可以直接使用。
### 安裝 XAMPP:Windows 環境
Windows 版本 XAMPP 下載安裝流程:
- **Step1.** 進入 XAMPP 官網,移動到下方 Windows 作業系統,點選更多下載:
- **Step1.** 至首頁根據作業系統[下載對應版本的 XAMPP 軟體](https://www.apachefriends.org/zh_tw/download.html)
![](https://i.imgur.com/HEOVt1K.png)
- **Step2.** 選擇 XAMPP Windows
![](https://i.imgur.com/mp6zcrw.jpg)
- **Step3.** 下載 XAMPP Windows (選擇 8.1.6 版本,若無則下載其他版本,但使用介面會有所不同)
![](https://i.imgur.com/AsBjR1L.png)
- **Step4.** 下載後按照指示,依照預設值下一步安裝完成
- **Step5.** 開啟 XAMPP 控制台
![](https://i.imgur.com/XlfX9FK.jpg)
- **Step6.** 確認伺服器設定(一開始可以使用預設設定,若有遇到 80 port 已經被佔用可以更改數字 ex. 8080,port 為伺服器的對外開口,可以想成是門牌號碼),啟動伺服器,分別啟動 Apache Web Server 和 MySQL Server
![](https://i.imgur.com/w1x0jGF.jpg)
![](https://i.imgur.com/TUQ1y8G.jpg)
- **Step7.** 確認資料庫伺服器啟動(一開始可以使用預設設定 3306 port,若有遇到 port 已經被佔用可以更改數字後儲存 ex. 改為 33060,重啟伺服器)
![](https://i.imgur.com/v7JGrFG.jpg)
![](https://i.imgur.com/9Ye4ccN.jpg)
![](https://i.imgur.com/WHdyS3d.jpg)
> 注意若有修改 MySQL Port 需要到 XAMPP 安裝所在的資料夾,開啟 `phpMyAdmin `資料夾,使用文字編輯器修改 `$cfg[‘Servers’][$i][‘port’] = 你修改的 port`; 這一行後儲存。這樣 phpMyAdmin 才能連線到資料庫伺服器進行操作,若無修改預設 port 則不用修改設定。
>
> 參考文件:[Change Port of Mysql Server in Phpmyadmin](https://stackoverflow.com/questions/28193713/change-port-of-mysql-server-in-phpmyadmin)
- **Step8.** 進入 phpMyAdmin 圖形化操作 SQL 資料庫介面
於瀏覽器使用 http://localhost/phpmyadmin/ 網址進入(若 Apache Web Server 使用非預設 80 port 前述網址會根據設定的 port 號碼有可能會有所不同,例如 8080 port 為 http://localhost:8080/phpmyadmin/) phpMyAdmin 資料庫操作介面
![](https://i.imgur.com/BcKsB1E.png)
### 安裝 XAMPP:MacOS 環境
MacOS 版本 XAMPP 下載安裝流程:
- **Step1.** 進入[ XAMPP ](https://www.apachefriends.org/zh_tw/download.html)官網,移動到下方 Mac 作業系統,點選更多下載:
![](https://i.imgur.com/iv2RKV4.png)
下載網址:https://sourceforge.net/projects/xampp/files/
- **Step2.** 選擇 XAMPP Mac OS X
![](https://i.imgur.com/SoaLwqB.png)
- **Step3.** 下載 XAMPP Mac OS X (選擇 8.1.6 版本,若無則下載其他版本,但使用介面會有所不同)
![](https://i.imgur.com/YuzJEBf.png)
![](https://i.imgur.com/t37TDVv.png)
- **Step4.** 根據指示下載後,點擊安裝(若出出現警示點選 Open 開啟,於隱私設定同意開啟該軟體)
![](https://i.imgur.com/MMk5oTs.png)
![](https://i.imgur.com/ySXyOQc.png)
- **Step5.** 根據指示下一步安裝至完成
![](https://i.imgur.com/BAij2Hc.png)
![](https://i.imgur.com/PpqKWII.png)
- **Step6.** 確認伺服器設定(一開始可以使用預設設定,若有遇到 port 已經被佔用可以更改數字,port 為伺服器的對外開口,可以想成是門牌號碼),啟動伺服器
![](https://i.imgur.com/t8nnKUF.png)
![](https://i.imgur.com/NVn68ZX.png)
- **Step7.** 確認資料庫伺服器啟動(一開始可以使用預設設定,若有遇到 port 已經被佔用可以更改數字)
![](https://i.imgur.com/Q6tBqmm.png)
![](https://i.imgur.com/0gazcy8.png)
- **Step8.** 進入 phpMyAdmin 圖形化操作 SQL 資料庫介面
於瀏覽器使用 http://localhost/phpmyadmin/ 網址進入(若 Apache Web Server 使用非預設 80 port 前述網址會根據設定的 port 號碼有可能會有所不同,例如 8080 port 為 http://localhost:8080/phpmyadmin/) phpMyAdmin 資料庫操作介面
![](https://i.imgur.com/GbxMQ9S.png)
# 使用圖形化介面操作 phpMyAdmin
除了下 SQL 指令外,我們也可以使用圖形化介面操作 SQL 資料庫:
## SQL 資料庫操作
- **新增資料庫**(database)
- **新增資料表**(table)
- **設定屬性欄位**
- **新增資料紀錄**(record)
- 或是**使用 SQL 指令**新增資料
- **查詢資料**
- **瀏覽資料**
### **新增資料庫**
這邊使用 `utf8mb4_unicode_ci` 這個編碼處理中文字排序。
![](https://i.imgur.com/XU3BWNZ.png)
### **新增資料表**
![](https://i.imgur.com/Ygv3XOH.png)
### **設定屬性欄位**
![](https://i.imgur.com/HM2F3Xf.png)
### **新增資料紀錄**
![](https://i.imgur.com/mK0bDtE.png)
### 或是**使用 SQL 指令**新增資料
![](https://i.imgur.com/PmI1vRb.png)
### **查詢資料**
![](https://i.imgur.com/gYfIOwG.png)
### **瀏覽資料**
![](https://i.imgur.com/nMV4xKc.png)
![](https://i.imgur.com/Sy0Ab3X.png)
## Windows/Mac 建立資料庫使用者
在啟動 XAMPP 開始操作資料庫前我們可以進入 phpmyadmin 後台新增除了 root 管理員外的資料庫使用者。
**Windows:點選 MySQL Admin 按鈕進入 phpmyadmin**
![](https://i.imgur.com/c50Xmrg.jpg)
**MacOS(伺服器位置和 Windows 不同):** http://192.168.64.2/phpmyadmin/
![](https://i.imgur.com/A9fpylQ.png)
![](https://i.imgur.com/DvEtwGw.png)
![](https://i.imgur.com/bs0Bf3H.png)
- 進入 phpmyadmin 管理後台
- 進入使用者管理分頁
- 新增使用者(自訂使用者名稱和密碼)
- 主機名稱設定為 `localhost`,若 Mac 則改設定為 % 因為 Mac 版本的伺服器位置不同,若設定為 `localhost` 會無法登入。
- 給予使用者查詢、新增、更新和刪除權限
- 執行新增使用者
- 可以使用該使用者帳號密碼登入資料庫
# 資料庫系統時區設定(timezone)
由於我們在處理資料時會常常遇到時間這個欄位,我們這邊順便學習 MySQL/MariaDB 設定時區方式(系統預設是 UTC+0,台灣時區是 UTC+8),這樣就可以就可以下 SQL 指令來調整時區(可以直接在 phpMyAdmin 進行使用)。
```sql
-- 查詢目前系統時區,系統預設是 UTC+0,我們要設定為 UTC+8。(global 為全域變數,代表整個系統參數設定,session 只代表這次連線。但只要設定 global 為 UTC+8 時區,重新整理或再次連線 global 和 session 時區就會一致)
SELECT @@global.time_zone, @@session.time_zone;
-- 設定時區
SET GLOBAL time_zone = '+08:00';
-- 再次查詢,觀看是否更新
SELECT @@global.time_zone, @@session.time_zone;
```
![](https://i.imgur.com/6EJkaxH.png)
# python環境建置
## 終端機常用指令碼
- 顯示目前所在工作目錄路徑 `cd`(Windows)或 `pwd`(MacOS/Linux)
- 列出目前工作資料夾下的所有檔案 `dir`(Windows 使用 dir 指令,MacOS/Linux 使用 ls 指令)
```sql
dir
```
- 建立新資料夾 `mkdir`
```sql
mkdir 資料夾名稱
```
- 移動工作資料夾 `cd`(檔案路徑規則根據作業系統有所不同,請參考檔案操作課程內容。例如斜線和反斜線差異:Windows C:\\desktop 或是 MacOS/Linux ~/desktop)
```sql
cd 資料夾名稱
```
- **重要** 執行 Python 程式檔案(根據環境不同有些使用 python3 為指令),若找不到檔案而無法執行成功請先確認是否目前所在工作資料夾下有該 Python 檔案(Windows 使用 dir 指令,MacOS/Linux 使用 ls 指令):
```sql
python 你的檔案名稱_盡量使用英文命名.py
```
## 使用 pip 管理第三方套件指令
開啟指令碼輸入環境:Windows 搜尋 Anaconda Navigator 程式開啟選擇 Enviroment 環境分頁開啟 Anaconda Prompt 指令碼環境程式。
![](https://i.imgur.com/Qo06fsQ.jpg)
或是於電腦應用程式中搜尋 Anaconda Prompt 指令碼環境程式
![](https://i.imgur.com/rM8zazq.jpg)
- 在指令碼環境輸入檢視指定虛擬工作環境下已安裝的套件清單指令:
```sql
pip list
```
- 在目前的虛擬工作環境安裝指定套件(PACKAGE_NAME 為套件名稱):
```sql
pip install PACAKGE_NAME
```
- 更新虛擬工作環境下 Python 套件(PACKAGE_NAME 為套件名稱):
```sql
pip install --upgrade PACKAGE_NAME
```
- 在目前的虛擬工作環境移除指定套件:
```sql
pip uninstall PACKAGE_NAME
```
- 安裝套件後可以在 python 程式或互動式環境(於指令列終端機輸入 python)可以引入使用:
![](https://i.imgur.com/GvomR2C.jpg)
## 常見問題:安裝套件在虛擬環境資料夾位置
一般在 anaconda 使用 pip 安裝第三方套件(其他程式設計師製作的非 Python 內建套件),會根據你目前所在的虛擬環境資料夾 安裝到該對應的第三方套件資料夾下,跟程式碼所在的專案資料夾沒有關係喔!
如截圖所示,若目前是在 base 預設的虛擬環境下,所以此時` pip install 套件` 會安裝到例如: C:\Users\USER\anaconda3\Lib\site-packages。
若今天建立了一個虛擬環境資料夾 my_env 並且進入該環境再次` pip install 套件`,則會看到套件被安裝到 my_env 下面。
例如:C:\Users\USER\anaconda3\env\my_env\Lib\site-packages。
至於什麼時候需要建立不同虛擬環境呢?當需要在不同專案使用不同版本的套件時,避免不同專案互相干擾,則可以建立不同的虛擬環境資料夾來管理不同版本的套件。
在 anaconda 中可以在 Anaconda Prompt 終端機輸入以下指令觀看目前電腦中有哪些虛擬環境資料夾,若沒有安裝過則會只有 base 虛擬環境資料夾。
- 列出目前電腦上有的虛擬環境資料夾清單:
```sql
conda env list
```
- 建立新的虛擬環境(名為` my_env `的 python 3.71 環境):
```sql
conda create --name my_env python=3.7.1
```
- 進入 `my_env` 虛擬環境中(指令碼左方從 (base) 變成 (my_env)):
```sql
conda activate my_env
```
- 安裝套件:
```sql
pip install requests
```
此時第三方套件就會安裝在:`C:\Users\USER\anaconda3\env\my_env\Lib\site-packages`
# 延伸閱讀
- [Python 基礎語法](https://hackmd.io/4FH3w4_pQP6_dsandd45LA)
- [Python 進階語法使用](https://hackmd.io/QYVYsxE8QyWNsnIhukt-2Q)
- [Python 網頁爬蟲](https://hackmd.io/JOc4g8AjSZiokS6vZckFSw?view)
- [Python 資料分析](https://hackmd.io/C5I9OzXzQCe6wJuZhwRV3Q)
- [Python 資料科學與探索式資料分析](https://hackmd.io/qSceMWZWQcWsMIA9QiO1Nw?view)
- [營收與使用者行為資料分析專案](https://hackmd.io/i6kRZN8JQsq57uDrKeKoLQ)
- [Python專案實作 資料分析與爬蟲](https://hackmd.io/oh18KsFvSxe5Eh3ECHDJOA?view)