SQL Literature
SQL運行在資料庫管理系統(Database Management System),如MySQL,Postgre SQL,Microsoft SQL Server, Oracle,etc。
SQL練習平臺:https://sqliteviz.com/
EXAMPLE
SQL 語法
Basis
SELECT * FROM “students”;
- SELECT: 選取
- *: 全部
- FROM “students” : 從 students表格查詢,表格名稱需要用""來做標注。
限制columns屬性
如果不需要全部的columns,只需要部分,那么可以單獨說明需要哪些columns,如:
SELECT 姓名,班級,成績 FROM “students”;
限制rows屬性
- 限制rows的數目,如只需要看5行,i.e. 前1-5行
SELECT 姓名,班級,成績 FROM “students” LIMIT 5;
若看完這前5行,想繼續往后看之后的5行,i.e. 前6-10行
SELECT 姓名,班級,成績 FROM “students” LIMIT 5 OFFSET 5;
OFFSET x像是將前x行屏蔽,再進行LIMIT y操作
因此,若是要看第11-15,OFFSET 10, LIMIT 5
SELECT 姓名,班級,成績 FROM “students” LIMIT 5 OFFSET 10;
WHERE
文字比對
WHERE 是用來設定查詢時的篩選條件
例如,在顯示成績時,只顯示1年2班:
SELECT 姓名,班級,成績 FROM “students”;
WHERE 班級 = '1年2班'
或者,在顯示成績時,就不顯示1年2班,(不等于<>)
SELECT 姓名,班級,成績 FROM “students”;
WHERE 班級 <> '1年2班'
ORDER BY
現在若是想要將同班的同學放在一起,可以使用ORDER BY,ORDER BY會針對一個column或多個columns進行排序。
單個column排序,e.g.
SELECT 姓名,班級,成績 FROM “students”;
WHERE 班級 <> '1年2班'
ORDER BY 班級
這樣就可以使得將同班同學放在一起,以排序
多個columns排序,e.g.
SELECT 姓名,班級,成績 FROM “students”;
WHERE 班級 <> '1年2班'
ORDER BY 班級, 成績;
這樣就可以先按班級排序,再在班級內部按照成績正序排序。
若是要按照成績逆序排序,需要在成績后添加DESC
SELECT 姓名,班級,成績 FROM “students”;
WHERE 班級 <> '1年2班'
ORDER BY 班級, 成績DESC;
單個人
現在只想查看某一個學生的信息:
SELECT 姓名,班級,成績 FROM “students”;
WHERE 姓名 = '張小婷'
但如若忘記該學生姓名,只記得部分,可以使用如下查詢:
1.
SELECT 姓名,班級,成績 FROM “students”;
WHERE 姓名 LIKE '張%'
其中的“%”表示萬用字元,表示單個或多個字元。如此系統會將所有張姓同學列出。 一定記得要將=改為LIKE!!!
SELECT 姓名,班級,成績 FROM “students”;
WHERE 姓名 LIKE '張_'
其中的“_”表示1個字元。如此系統會將所有張姓且名字只包含兩個字的同學列出。
數字大小判斷
SELECT 姓名,班級,成績 FROM “students”;
WHERE 成績 >= 80 AND 成績< 90;
或者
SELECT 姓名,班級,成績 FROM “students”;
WHERE 成績 BETWEEN 80 AND 90;
AND 還可以更復雜的使用,如
SELECT 姓名,班級,成績 FROM “students”;
WHERE 成績 BETWEEN 80 AND 90 AND (班級 = '1年1班' OR 班級 = '1年2班');
也可以使用 IN來簡化
SELECT 姓名,班級,成績 FROM “students”;
WHERE 成績 BETWEEN 80 AND 90 AND (班級 in ('1年1班' OR '1年2班'));
利用函數對多筆資料進行匯總和計算
常見函數
- AVG 求平均值
- SUM 求和
- MAX 求最大值
- MIN 求最小值
- COUNT 計算數量
AVG
直接將Average函數套用在成績column,查出所有同學的平均分數
SELECT AVG(成績) FROM “students”;
PS.
- 可利用上述函數得到的值命名為新的值
SELECT AVG(成績) AS 成績平均, MAX(成績) AS 最高分
FROM “students”;
- 對于所求值四舍五入
SELECT ROUND(AVG(成績))
FROM “students”;
ROUND(AVG(成績)) 四舍五入保留整數位
ROUND(AVG(成績), 1) 四舍五入并保留小數1位
- 想分類的并不是全班同學的平均,而是各班的平均
SELECT ROUND(AVG(成績))
FROM “students”;
GROUP BY 班級;
ORDER BY 成績平均 DESC; //引入排序
注意,如果使用了GROUP BY分組后的資料,要使用WHERE篩選,需要改為HAVING
SELECT ROUND(AVG(成績)) AS 平均分
FROM “students”;
GROUP BY 班級;
HAVING 平均分 >= 80;
ORDER BY 成績平均 DESC; //引入排序
關鍵字還需要以一定順序進行書寫:
COUNT
- 計算整個表格的總行數
SELECT COUNT(*)
FROM “students”;
- 計算表格中某個column的行數
SELECT COUNT(社團)
FROM “students”;
數字不同是因為,COUNT在針對單一column進行計數時,會自動忽略null。
- COUNT 與DISTINCT 進行配合
DISTINCT用于排除表格中重復的資料
SELECT COUNT(DISTINCT(社團))
FROM “students”;
此時,代碼表示學校共有四種不同的社團。
SELECT DISTINCT(社團)
FROM “students”;
這樣就能顯示出不同社團的名字
UNION 聯集
可以將兩個搜索結果合并在一起。
先分別將連個部分結果選出,再在中間加入“UNIOIN”
SELECT `name` FROM `clubs`;
UNION
SELECT `name` FROM `student`;
還可以合并多個,使用多個UNIOIN。注意:使用UNIOIN,所涉及屬性類別以及數目需要完全一致。
用SQL如何建立表格
首先創建資料庫
創建和刪除資料庫
CREATE DATABASE sql_tutorial;
SHOW DATABASES; // show所有的資料庫
DROP DATABASE sql_tutorial;
表格的創立
在某個資料庫中,創建表格,可以用SQL來補齊表格的相關信息
USE sql_tutorial;
CREATE TABLE clubs(
社團編號 INT PRIMARY KEY,
社團名稱 VARCHAR(15),
);
對于PRIMARY KEY有兩種寫法:
USE sql_tutorial;
CREATE TABLE clubs(
社團編號 INT,
社團名稱 VARCHAR(15),
PRIMARY KEY (社團編號)
);
6種常見的屬性(資料形態):
- INT: 整數
- DECIMAL(m,n): 表示浮點數,m表示一共有幾個數字,n表示其中小數占幾位。e.g. 2.33: DECIAML(3,2)
- VARCHAR(n): 字串,其中n表示最多能存放幾個字元
- BLOB: Binary large object,用于存放圖片,影像,檔案等…
- DATE: 存放日期 ‘YYYY-MM-DD’
- TIMESTAMP: 記錄具體時間精確到秒,格式’YYYY-MM-DD HH:MM:SS’
屬性的限制:
CREATE TABLE clubs( 社團編號 INT PRIMARY KEY,社團名稱 VARCHAR(10) NOT NULL
);
CREATE TABLE clubs( 社團編號 INT PRIMARY KEY,社團名稱 VARCHAR(10) UNIQUE
);
對于屬性的預設值:
CREATE TABLE clubs( 社團編號 INT PRIMARY KEY,社團名稱 VARCHAR(10) DEFAULT `aaa`
);
如果要求編號遞增,不想手寫:
CREATE TABLE clubs( 社團編號 INT PRIMARY KEY AUTO_INCREMENT,社團名稱 VARCHAR(10) DEFAULT `aaa`
);
創建表格流程:
1.創建CREATE 表格TABLE
2.在其中補充需要的column:如社團編號,社團名稱
7. 并需要指定column儲存的資料是什么類型,在這里INT表示整數,VARCHAR表示字符串,對于VARCHAR需要指出字數上限
8. 表格內需要指定一個column為 PRIMARY KEY(就像是身份證號,不可以重復!!也不可以是NULL)用于識別每一筆的資料,如這里指定社團編號為PRIMARY KEY。 可以設定多個PRIMARY KEY,例如不同銷售人員對不同客戶對應的銷售額。
9. FOREIGN KEY (外鍵) 對應到另一張表格的PRIMARY KEY。
P.S. 如何刪除表格,使用DROP
DROP TABLE clubs2;
創建完畢后檢查表格
DESCRIBE clubs;
增刪屬性
增加一個屬性
ALTER TABLE `student` ADD gpa DECIMAL(3,2);
增加FOREIGN KEY屬性
ALTER TABLE `student` ADD FOREIGN KEY(`社團編號`) REFERENCES `branch`(`社團編號`) ON DELETE SET NULL;
ALTER TABLE `student` ADD FOREIGN KEY(`社團編號`) REFERENCES `branch` (`社團編號`) ON DELETE CASCADE;
刪除屬性
ALTER TABLE `student` DROP column gpa;
表格中資料存儲
使用 INSERT INTO 表格名(需要插入資料的column標題)
INSERT INTO clubs (社團編號,社團名稱)
現在開始輸入資料,使用VALUE (),注意括號內的順序必須要和表格的所有屬性相互對應,對于字符串要用單或雙引號。這里是按照創建表格時的屬性順序存儲。
INSERT INTO clubs
VALUES (101, 'Guitar Club'), (102, 'Piano Clube');
也可以按照自定義屬性順序存儲:
INSERT INTO clubs (社團名稱,社團編號) VALUES ('Guitar Club', 101), ('Piano Clube', 102);
更新表格中的資料 UPDATE
注意,在更新表格時,要用WHERE說明更新哪一筆記錄,若未設定會導致所有社團名稱都UPDATE。
UPDATE clubs;
SET 社團名稱 = 'Dance Club'
WHERE 社團編號 = 101;
同樣,對于刪除表格中某一筆記錄
DELETE
FROM clubs;
WHERE 社團編號 = 101
SQL跨表格查詢
SELECT students.姓名, students.社團, clubs.社團名稱
FROM students //先引入1個表格
LEFT JOIN clubs //加入另一個表格
On students.社團 = clubs.社團編號
WHERE 班級 = '1年1班'
表格之間如何連接,此處是用students的社團連接上clubs的社團編號
- INNER JOIN
只返回兩個表中匹配的記錄 - LEFT JOIN
以左表為中心,返回左表的所有數據,即使右表中沒有匹配;右表沒有匹配時用 NULL 填充。 - RIGHT JOIN
以右表為中心,返回右表的所有數據,即使左表中沒有匹配。 - FULL JOIN
返回兩個表的所有記錄,不匹配的部分用 NULL 填充。
Subquery
子查詢 subquery 在一個查詢語句中篩入另一個查詢。
注意::一定要搞清楚 子查詢返回的是什么內容!!
SELECT `name` FROM `employee`
WHERE `emp_id` = (SELECT `manager_id` FROM `branch`WHERE `branch_name` = '研發'
);
SELECT * FROM `works_with`;SELECT `name` FROM `employee`
WHERE `emp_id` IN (SELECT `emp_id` FROM `works_with`WHERE `total_sales` > 50000
);
ON DELETE
- ON DELETE SET NULL一旦對應的內容刪掉,就設置為NULL
- ON DELETE CASCADE一旦對應的內容刪掉,就刪掉整筆資料
注意:有些刪掉后對應的內容若是PRIMARY KEY則不可以用ON DELETE SET NULL