1.建立資料庫與使用者帳號
使用 MySQL 的 root
管理者帳號登入:
mysql -u root -p
在 MySQL中新增資料庫:
# 新增資料庫
CREATE DATABASE `my_db`;
這樣就會新增一個新的 my_db 資料庫。
新增一個 MySQL 資料庫使用者 my_user,並將密碼設定為 my_password:
# 新增使用者,設定密碼
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_password';
授予 my_user
帳號在 my_db
資料庫上面的所有權限,也就是讓 my_user
可以對 my_db
資料庫進行任何操作:
# 設定使用者權限
GRANT ALL PRIVILEGES ON my_db.* TO 'my_user'@'localhost';
使用 GRANT
設定好帳號的權限之後,馬上就會生效。接著就可以離開 MySQL 資料庫,重新以新的帳號登入使用了:
mysql -u my_user -p
2.建立資料表與測試資料
登入之後,選擇剛建立的資料庫:
use my_db;
🐷 建立資料表(table):
use my_db;
CREATE TABLE products ( # 新增產品資料表
id INT NOT NULL AUTO_INCREMENT, # 產品 ID
name varchar(50) NOT NULL, # 名稱
descr varchar(200), # 說明
price INT NOT NULL, # 價格
PRIMARY KEY(id) # 主要索引
);
🐷 插入測試資料:
# 插入資料
INSERT INTO products (name, descr, price)
VALUES (“BDV 東方玫瑰淡香水”, “清新、甜美”, 990);
🐷查詢資料:
# 查詢資料
SELECT * FROM products;
🐷 刪除 name 為 BDV 東方玫瑰淡香水的資料:
Delete的資料是可以RollBack
因為刪除的機制是每次刪除一行資料,並且將對應的刪除動作記錄在日誌中,以便於進行回滾的操作
# 刪除資料
DELETE FROM products WHERE name = “BDV 東方玫瑰淡香水”;
🐷刪除整個 products 資料表:
刪除整個表
# 刪除資料表
DROP TABLE products;
🐷 重複值
表中會有重複值,需要返回唯一不同的值,就會需要distinct 關鍵字處理,用於返回唯一不同的值,會將重複的值過濾!!重複值不顯示於查詢中
select * from emp where
name in
(select name from emp group by name
having count(1)>=2);//查詢emp 表中的name ,返回唯一的名字
select distinct name from emp;
🐷Select (取數)
從表中選取資料, 結果會被儲存在一個結果表中(結果集)
3. SQL 基礎語句
在實際用到這些語句,我還是常常忘記怎麼用,介紹並記錄這些必學的用法!!
🐺AVG() 平均數
NULL值不包括在計算中
select AVG (chengji) as avg_chengji from emp;//找出成績高於平均成績的nameselect name from emp where chengji >(select avg(chengji) as avg_chengji from emp);
🐺COUNT()
COUNT() 函數用於返回匹配指定條件的行數
//COUNT(COUNT_NAME)
//返回指定列的值的數目,null 值不算
SELECT count(chengji) from emp;
//count(*)
//返回表中的紀錄值
select count(*) from emp;
🐺MAX()
MAX() 函數返回指定列的最大值,null 布包括在計算中
//AGE 最小
select MIN(age) from emp;
🐺SUM()
sum() 函數返回指定列的總數
select SUM(chengji) as SUM FROM emp;
🐺FORMAT()
FORMAT()函數用於欄位的顯示進行格式化
SELECT FORMAT(column_name,format) FROM table_name;
4. MySQL 配合用法
🐳 MySQL 修改資料表欄位-ALTER TABLE
TABLE內新增欄位
欄位必須加入INDEX並且設定DEFAULT值
ALTER TABLE 資料表名稱 ADD COLUMN 欄位名稱 形態(長度), ADD INDEX(欄位名稱);
移除INDEX
ALTER TABLE 資料表名稱 DROP INDEX 欄位名稱;
移除欄位
ALTER TABLE 資料表名稱 DROP COLUMN 欄位名稱;
🐳Limit 限制傳回的資料筆數
select * from emp limit 3;
使用SQL的LIMIT語句時通常會伴隨著「ORDER BY」,以 id 的欄位做排序,限制取回六筆資料
select * from emp order by id limit 6
以 id 的欄位做排序,限制從第4筆資料開始取回的五筆資料
select * from emp order by id limit 4,5
我自己比較習慣用 offset 去表達上面的結果
select * from emp order by id limit 5 offset 4
🐳LIKE 搜尋條件中的指定模式
LIKE 用於WHERE 中,搜尋匹配欄位中的指定內容
【NOT】是相反的意思,即代表選擇 column 中不包括pattern 的 資料
WHERE column LIKE pattern
WHERE column NOT LIKE pattern
LIKE 通常跟【%】一起用,用以表示 pattern 中未出現的內容
尋找LastName 中以【李】字元為開頭,而後面可以是任意字元
select * from emp WHERE LastName LIKE '小%'
meanwhile, 【%李】表示以【李】字元為結尾,【%李%】表示包含【李】字元,有包括前面兩個情況
select * from emp WHERE LastName LIKE ’%李’
select * from emp WHERE LastName LIKE ’%李%’
* BINARY區分大小寫
BINARY 會按照二進制的 方式去區分大小寫,以下兩條查詢的內容是不同的
select * from emp WHERE FirstName LIKE BINARY '%aZZ%
select * from emp WHERE FirstName LIKE BINARY '%azz%
中文字元有時候也會返回許多不相干的資料,可能會需要加上BINARY 去比較
select * from emp WHERE LastName LIKE BINARY ’%李’
**中英文混合+需要忽略英文大小寫
🐜UPPER() : 將英文字串變大寫,同 UCASE()
🐜CONCAT() : 將多個字串連成一個字串
UPPER(STR)
CONCAT(STR1,STR2)
SQL:
將搜尋的內容都轉換大寫英文,再進行二進制匹配
SELECT * FROM emp WHERE UPPER(FirstName) LIKE BINARY CONCAT ('%',UPPERR('a中文b','%')
效率看下來不是太高, 資料量大可能要漸漸少用LIKE ,但我沒用過大資料量...也還不用優化....
🐳IN
找出LastName 中為 【Peter】【Katt】的所有數據
select * from emp WHERE LastName IN ('Peter','Katt')
🐳JOIN
JOIN 用於將兩個或兩個以上的表進行關聯,並從這些資料表中查詢資料
對於連表,可以通過使用primary key and foreign key 建立連接
SELECT e.name,e.age,o.orderNo
from emp as e,orders as o where e.id=o.e_id;
//as 用法就當作為這個表起一個別名
可讀性高一點的寫法是用【INNER JOIN】 【JOIN】
SELECT e.name,e.age,o.orderNo
from emp e INNER JOIN order o ON e.id=o.e_id ORDER BY name;
{以後記得回來補其他連接方式,有用到的話...}
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
🐳UNION
UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料類型。同時,每條 SELECT 語句中的列的順序必須相同。
UNION和UNION ALL命令幾乎是等效的,不過加了“ALL”,就會列出所有的值。
注意:因為其也具有“唯一性”,容易和PRIMARY KEY混淆。面試或筆試常考兩者的不同,在這裡說明一下:
與PRIMARY KEY不同的是,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
為表添加UNION,這裡給出使用的SQL語法。
基礎的用法永遠學不完
學了新的又覺得是基礎,忘了舊的又需要過來重新複習