Window :
建議用 Installer 下載安裝 : MySQL Installer 5.7.26
中間跳過的步驟默認就好
Execute
就好Check
P.S.後來在另一台電腦一直無法安裝,有閃退的情況,後來安裝 8.0.16 就正常了
macOS :
show databases;
: 顯示目前有哪些 Database
create database <name>;
: 創建 Database
drop database <name>;
: 刪除 Database
use <database name>;
: 切換 Database
select database();
: 查看目前正在使用的是哪個 Database
delimiter <結束符號>
: 預設結束符號是 ;
,這行命令可以做修改 ( 不建議 )
show warnings;
: 查看錯誤訊息
SQL 大小寫都可運行,建議關鍵字大寫
有三種大分類 : Numeric、String、Date
CREATE TABLE person
(
name VARCHAR(20),
phone VARCHAR(20),
age INT
);
show tables
: 顯示目前有哪些 Table
show columns from <table name>
: 顯示 Table 的每個 columns
desc <table name>
: 描述 Table 的資訊 ( 顯示跟上面的命令一樣,可以用這條命令就好 )
drop table <table name>
: 刪除 Table
insert into <table_name>(<column1_name>, <column2_name>)
values(<column1_data>, <column2_data>),
(<column1_data>, <column2_data>);
SELECT * from <table_name>;
SELECT <column_name> from <table_name>;
NULL 和 NOT NULL :
<column name> <data type> NOT NULL
,NULL 就會變 NODefault Value :
<column name> DEFAULT <value>
PRIMARY KEY :
<column name> <data type> PRIMARY KEY
PRIMARY KEY(<column1 name>, <column2 name>)
UNIQUE :
<column name> <data type> UNIQUE
AUTO_INCREMENT :
<column name> <data type> <PRIMARY KEY or UNIQUE> AUTO_INCREMENT
,常用在 ID 之類,不填值時會累加test.sql
source <SQL 文件路徑 EX : /Users/user/SQL-training/test.sql>;
注意分隔要 /
CREATE TABLE IF NOT EXISTS person
(
name VARCHAR(20),
phone VARCHAR(20),
age INT
);
IF NOT EXISTS
可以在創建 Table 時,查看 Table 是否存在,不存在就創建,存在則否SELECT <column_name> as <別名> from <table_name>;
SELECT * from <table_name> WHERE <column1_name> = "想找到的資料" <AND 或 OR> <NOT> <column2_name> = "想找到的資料";
UPDATE <table_name> set <column_name> = "想改成這個資料" WHERE ...;
通常會加上 WHERE 來過濾要改的資料
較安全步驟為
DELETE from <table_name> WHERE ...;
CONCAT :
SELECT CONCAT(<column1_name>, <column2_name>) as <別名> from <table_name>;
<column1_name><column2_name>
CONCAT_WS :
SELECT CONCAT_WS("<間格符>", <column1_name>, <column2_name>, <column3_name>) as <別名> from <table_name>;
<column1_name><間格符><column2_name><間格符><column2_name>
SUBSTRING :
SUBSTRING("Hello World", 7)
: 從前面數,輸出為 World
SUBSTRING("Hello World", -3)
: 從後面數,輸出為 rld
SUBSTRING("Hello World", 1, 4)
: 第 n 個到第 m 個,輸出為 Hell
REPLACE :
REPLACE("Hello World", "World", "MySQL")
: 替換,輸出為 Hello MySQL
REVERSE("Hello World")
: 反轉,輸出為 dlroW olleH
CHAR_LENGTH("Hello World")
: 字串長度,輸出為 11
LOWER("Hello World")
: 轉小寫UPPER("Hello World")
: 轉大寫SELECT * from <table_name> ORDER BY <column_name>;
column_name
進行升序排序ORDER BY <column_name> desc
SELECT <column1_name>, <column2_name>, <column3_name> from <table_name> ORDER BY 3, 1;
column3_name
與 column1_name
進行排序column3_name
相同才按照 column1_name
排序SELECT * from <table_name> ORDER BY <column_name> LIMIT 3;
LIMIT 2, 4
: 顯示從 2 開始後 4 筆資料LIMIT 2, 18446744073709551615
: 顯示從 2 開始後的所有資料SELECT * from <table_name> WHERE <column_name> LIKE "%i%";
i
的%
代表任意字符_
代表一個任意字符%
或 _
,可以寫成 \%
和 \_
SELECT COUNT(*) from <table_name>;
SELECT DISTINCT <column_name> from <table_name>;
column_name
內重複的資料去除後顯示出來SELECT COUNT(<column_name>) from <table_name> GROUP BY <想合併的 column_name>;
想合併的 column_name
分組後算出每組 column_name
的資料數量MAX(<column_name>)
: column_name
的最大值MIN(<column_name>)
: column_name
的最小值SUM(<column_name>)
: column_name
的和AVG(<column_name>)
: column_name
的平均值WHERE
只能對原始資料過濾,假如要對 GROUP BY
之後的資料過濾就要用到 HAVING
SELECT COUNT(<column_name>) from <table_name> GROUP BY <想合併的 column_name> HAVING <column1_name> = "想找到的資料";
整數 ( Integer ) - 準確的
標準類型 :
擴充類型 :
後面加 UNSIGNED
表示為無負號
定點數 ( Fixed-Point ) - 準確的
DECIMAL ( 用於金錢 )
DECIMAL(m, d)
:
NUMERIC : 跟 DECIMAL 是一樣的
浮點數 ( Floating-Point ) - 不準確的
FLOAT
FLOAT(m, d)
:
DOUBLE : 用法跟 FLOAT 是一樣的,差別在於 DOUBLE 可存字節較多
位 ( Bit-Value )
BIT
BIT(m)
:
插入方法 :
insert into <table_name> values(b'1010')
b'1010'
為二進位顯示方法 :
SELECT <column_name>+0 from <table_name>
<column_name>+0
: 顯示十進位數值bin(<column_name>+0)
: 顯示二進位數值oct(<column_name>+0)
: 顯示八進位數值hex(<column_name>+0)
: 顯示十六進位數值DATE
1000-01-01
~ 9999-12-31
20181001
,也可不需 -
"20181001"
,但不可缺少年月日TIME
時間 ( HH:MM:SS )
範圍 : -838:59:59
~ 838:59:59
,小時範圍那麼大的原因是,也可以表示時間差
插入規則同 DATE,但可缺少時分秒
12:10
為 12:10:00
1210
為 00:12:10
10
為 00:00:10
YEAR
年,為四個字符
範圍 : 1901
~ 2155
插入兩位 INT :
1
~ 69
為 2001
~ 2069
70
~ 99
為 1970
~ 1999
0
為 0000
插入兩位 STRING :
"0"
~ "69"
為 2000
~ 2069
"70"
~ "99"
為 1970
~ 1999
DATETIME
1000-01-01 00:00:00
~ 9999-12-31 23:59:59
TIMESTAMP
"1970-01-01 00:00:01" UTC
~ "2038-01-19 03:14:07" UTC
SELECT NOW()
: 查看系統當前時間
CREATE TABLE <table_name>(<column_name> TIMESTAMP)
CREATE TABLE <table_name>(<column_name> TIMESTAMP DEFAULT NOW() ON UPDATE NOW())
timezone
show variables LIKE "%time_zone%"
: 查看包含 time_zone 字串的變量SET time_zone = "-12:00"
: 更改 time_zone,根據 UTC 時間減 12 小時SET time_zone = "system"
: 更改 time_zone 為系統當前時區CHAR 與 VARCHAR
後面帶的數字代表字串長度
CHAR : 適用於固定長度
VARCHAR : 適用於不固定長度
BINARY 與 VARBINARY
後面帶的數字代表 bytes 長度
BINARY : 適用於固定長度
\0
VARBINARY : 適用於不固定長度
BLOB 與 TEXT
SET max_sort_length = n
: 設置此變量後,排序時只對前 n 個字符排序ENUM
ENUM("F", "M")
SET
ALTER TABLE <table_name> MODIFY <column_name> <想更改成的資料類型>
<column_name> = 3000
<column_name> != 3000
或 NOT <column_name> = 3000
<column_name> > 3000
<column_name> < 3000
>=
、<=
<column_name> BETWEEN 1000 and 3000
<column_name> IN (5000, 6000, 7000, 8000)
<column_name> NOT IN (5000, 6000, 7000, 8000)
SELECT <column_name>,
case
when <column_name> >= 7000 then "high"
else "low"
end as <別名>
from <table_name>;
SET PASSSWORD = PASSSWORD('ABC123')
CREATE TABLE customers(
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(100),
email VARCHAR(100)
);
INSERT INTO customers(first_name, last_name, email) VALUES
('Robin', 'Jackman', 'roj@gmail.com'),
('Taylor', 'Edward', 'taed@gmail.com'),
('Vivian', 'Dickens', 'vidi@gmail.com'),
('Harley', 'Gilbert', 'hgi@gmail.com');
CREATE TABLE orders(
id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
amount DECIMAL(8,2),
customer_id INT
);
INSERT INTO orders(order_date, amount, customer_id) VALUES
('2001-10-12', 99.12, 1),
('2001-09-21', 110.99, 2),
('2001-10-13', 12.19, 1),
('2001-11-29', 88.09, 3),
('2001-11-11', 205.01, 4);
customer_id
與客戶訊息的 id
做關聯SELECT * from orders WHERE customer_id = (SELECT id from customers WHERE email = "roj@gmail.com");
FOREIGN KEY (customer_id) REFERRENCES customers(id)
customer_id
與客戶訊息的 id
使用 JOIN 合併關聯表
SELECT * from customers INNER JOIN orders WHERE customers.id = orders.customer_id;
WHERE
可改成 ON
SELECT * from customers LEFT JOIN orders WHERE customers.id = orders.customer_id;
IFNULL(SUM(amount), 0)
: 如果值為 NULL 則顯示 0
SELECT * from customers RIGHT JOIN orders WHERE customers.id = orders.customer_id;
ON DELETE CASCADE
兩張多對多的 Table 會有一張 Table 把他們關聯起來
MySQL 5.7 Command Line Client
不支援中文,所以必須以其他方式插入中文資料MySQL Workbench
、VS code
都可以CREATE database <database_name> DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;
ALTER database <database_name> CHARSET = utf8 COLLATE = utf8_general_ci;
ALTER table <table_name> CONVERT TO CHARACTER SET utf8;
筆記
程式語言
SQL
資料庫
MySQL