#資料庫的CRUD語句 ##INSERT語句 ###在指定列中插入數據 INSERT INTO 表名 (column1,column2,column3,...) VALUES (value1,value2,value3,...); INSERT INTO website (url,country) ...
資料庫的CRUD語句
INSERT語句
在指定列中插入數據
INSERT INTO 表名 (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
INSERT INTO website (url,country)
VALUES ('https://www.baid.com',CN)
在所有的列中插入數據
列相關信息可以省略,但是要求按順序給所有欄位指定要添加的值
INSERT INTO 表名
VALUES (value1,value2,value3,...);
INSERT INTO website
VALUES (1,'百度','https://www.baid.com',CN)
UPDATE語句
UPDATE 表名
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
修改 WHERE 確定的某些記錄的列數據,如果沒有 WHERE,將修改所有記錄
//修改所有記錄
UPDATE employee
SET salary = 15000
//使用WHERE過濾
UPDATE employee
SET salary = salary*1.2,birthday = '2022-7-13'
WHERE name = '楓原萬葉'
DELETE語句
DELETE FROM 表名
WHERE some_column=some_value;
刪除 WHERE 確定的某些記錄,如果沒有 WHERE,將刪除所有記錄
DELETE FROM employee
WHERE salary = 15000
註意: DELETE 語句是刪除一條記錄而不能刪除某一列的值,可以通過UPDATE 把值設置為 NULL 或 ' '。
SELECT語句
SELECT [DISTINCT] * | {column1,column2,..,} FROM 表名
- DISTINCT可選,表示是否去掉重覆數據。
- * 表示查詢所有列,如果沒有 * ,需要指定要查詢的列名
使用表達式查詢
可以使用表達式對查詢的列數據進行運算。
//統計學生總分
SELECT `name`, (chinese+english+math) FROM student;
使用as指定別名
可以對查詢的表達式或者其它欄位指定一個別名,執行查詢語句後的輸出結構將用別名代替欄位名。
SELECT `name` AS '名字', (chinese + english + math + 10) AS total_score
FROM student
使用where字句過濾查找
在where字句中使用的比較運算符
運算符 | 功能 |
---|---|
>,<,=,>=,<> | 大於,小於,等於,大於等於,不等於 |
BETWEEN ... AND ... | 查找在某一區間的值 |
IN(SET) | 查找在IN列表中的值 |
LIKE | 模糊查詢,%表示0到多個字元,_表示一個任意字元 |
IS NULL | 判斷是否為空 |
還有一些邏輯運算符,and、or、not |
-- 比較查找
SELECT * FROM student WHERE english > 90
-- 區間查找,註意是閉區間
SELECT * FROM student WHERE english BETWEEN 80 AND 90
-- IN列表查找
SELECT * FROM student WHERE math IN (89, 90, 91);
-- 模糊查詢,查找姓張的人
SELECT * FROM student WHERE `name` LIKE '張%'
-- 日期用於比較
SELECT * FROM emp WHERE hiredate>'1992-01-01'
使用order by對查詢結構排序
ORDER BY column asc|desc
- column 指定待排序的列名,列明也可以是之前as定義的別名
- asc是升序排列,也是預設情況,desc是降序
- 可以使用多次排序,即對前一個欄位相同的數據再根據後一個欄位進行排序
--降序排列
SELECT `name`, (chinese + english + math) AS total_score
FROM student
WHERE `name` LIKE '韓%' ORDER BY total_score desc;
-- 兩次排序
SELECT * FROM emp
ORDER BY deptno ASC,sal DESC;
統計函數
COUNT
返回符號條件的行數,即多少條符合條件的記錄
SELECT COUNT(*) | COUNT(列名) FROM 表名
如果指定了列名,COUNT 不會將空記錄計入到總數中。
//統計表中的所有記錄的條數
SELECT COUNT(*) FROM student;
//WHERE語句過濾
SELECT COUNT(*) FROM student WHERE math > 80;
SUM
求和函數,對符合的列數據相加求和,只能用於數值列
SELECT { SUM(列名), SUM(列名) ... } FROM 表名
SELECT SUM(math),SUM(english),SUM(chinese) FROM student;
AVG
對符合條件的列數據求平均值
SELECT {AVG(列名), AVG(列名) ...} FROM 表名
//各科成績求平均值
SELECT AVG(math + english + chinese) FROM student;
MAN/MIN
SELECT MAX(列名)/MIN(列名) FROM 表名
SELECT MAX(math), MIN(math) FROM student
分組查詢
使用GROUP BY分組
GROUP可以對數據按列進行分組,即列相同的放在同一組
-- 把員工按照部門進行分組,然後統計每個部門的平均薪資和最高工資
SELECT AVG(sal), MAX(sal) , deptno
FROM emp GROUP BY deptno
說明:GROUP BY分組後直接查詢獲得的是第一個該組成員,比如這裡部門號為10,如果有多個部門號為10的數據,只會輸出按照順序排第一的數據
使用HAVING過濾組
HAVING 對之前用GROUP BY分組得到的結果進行過濾
//對之前的分組過過濾掉平均薪資只有兩千的部門
SELECT AVG(sal), deptno
FROM emp GROUP BY deptno
HAVING AVG(sal) < 2000
字元串函數
使用字元串函數可以對查詢得到的字元串數據進行一些處理後輸出
函數 | 功能 |
---|---|
CONCAT(string2,..) | 連接列數據和指定的字元串 |
UCASE(string2) | 字元串轉大寫 |
LCASE(string2) | 字元串轉小寫 |
LENGHT(string) | string長度(位元組) |
REPLACE (str ,search_str ,replace_str ) | 在 str 中用 replace_str 替換 search_str |
數學函數
函數 | 功能 |
---|---|
ABS (num) | 求絕對值 |
CEILING (number2) | 向上取整 |
FLOOR (number2) | 向下取整 |
FORMAT (number,decimal_places ) | 保留小數位數(四捨五入) |
RAND(seed) | 返回隨機數 其範圍為 0 ≤ v ≤ 1.0 |
-
- 如果使用 rand(), 每次返回不同的隨機數 ,在 0 ≤ v ≤ 1.0
-
- 如果使用 rand(seed) 返回隨機數, 範圍 0 ≤ v ≤ 1.0, 如果 seed 不變,該隨機數也不不會變
時間日期函數
加密函數-MD5()
MD5信息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16位元組)的散列值(hash value),相同的數據MD5加密後是一樣的,不同的數據加密後理論上存在相同的可能。
MySQL提供函數 MD5(str),計算一個給定字元串的 MD5 摘要,並將結果作為一個 32 位的由十六進位字元 組成的字元串返回。一個十六進位數據可以由4個二進位數據表示,正好128位數據。
通常我們將用戶密碼寫入資料庫時,保存的不是密碼的原文,而是對密碼進行加密後再保存到資料庫中,這樣可以防止當資料庫泄漏後,對方拿到的不是密碼的原文,賬號就不會被盜走。當驗證登錄時,用戶輸入密碼,對其進行MD5加密後與資料庫中保存的MD5值進行比較,相同則登錄成功。
-- 插入數據,對密碼‘yjh123456’進行加密
INSERT INTO `user`
VALUES(100,'yjh',MD5('yjh123456'))
流程式控制制函數
主要由兩種,用來對不同的數據作不同的處理
IF語句
語法:IF(exp1,exp2,exp3)
說明:exp1為True時返回exp2,否則返回exp3
-- 從emp表中查找數據comm為空時顯示0.0,否則顯示本身
SELECT ename,IF(comm IS NULL,0.0,comm)
FROM emp
註意:這裡判斷是否為空,要使用 IS NULL,不為空使用 IS NOT NULL
CASE語句
相當於條件分支語句,可以對更多的可能情況做處理
語法:
SELECT CASE
WHEN exp1 THEN exp2
WHEN exp2 THEN exp2
END;
SELECT ename,(SELECT CASE
WHEN job = 'CLERK' THEN '職員'
WHEN job='MANAGER' THEN '經理'
WHEN job='SALESMAN'THEN'銷售人員'
ELSE job
END) AS'job'--對整列重命名
FROM emp;
分頁查詢
當我們查詢返回的記錄路條數過多,為了防止數據爆炸,可以使用分頁查詢,即查詢滿足條件的某幾條記錄
基本語法:
SELECT ...
LIMIT START ROWS;
作用,顯示從START + 1 開始的 ROWS 條記錄
多字句查詢
當查詢的要求比較複雜時,需要用到多條字句,這些字句的順序應該是:
SELECT column.. FROM table
WHERE exp
GROUP BY column
HAVING condition
ORDER BU colunm
LIMIT start, rows
多表查詢
有時候我們需要查兩個或兩個以上的表的數據,只需要在 FROM 後面多添加一個表名即可,在不作任何 WHRER字句過濾時,得到的是一個笛卡爾集,它將一個表的每一條記錄與其它表任何一條記錄組合,因此得到的總記錄數是每個表的記錄的乘積。
--使用where字句過濾多表查詢的結果
SELECT ename,sal,dname,emp.deptno
FROM emp,dept
WHERE emp.deptno = dept.deptno--出現相同欄位時,用表名.欄位
自連接
自連接是將同一張表當作兩張表來查詢,當我們需要兩次查詢一個欄位但是查詢的條件不一樣時我們可以使用自連接來解決問題。使用自連接由幾點需要註意:
- 因為是兩張一樣的表,所以我們要分別為這兩張表指定別名,跟在表名後即可
- 最後為列名也指定別名
--查詢員工的名字並且根據它的上級編號再查出上級的名字
SELECT worker.ename AS'職員名',boss.ename AS'上級名'
FROM emp worker,emp boss
WHERE worker.mgr = boss.empno;
子查詢
子查詢是指嵌入在其它 sql 語句中的 select 語句,也叫嵌套查詢,子查詢分為單行子查詢,多行子查詢,多列子查詢,同時子查詢結果還可以作為一張表使用。
單行子查詢
單行子查詢返回的是一行的查詢數據
-- 單行子查詢:顯示與 SMITH 同一部門的所有員工
SELECT *
FROM emp
WHERE deptno = (
SELECT deptno
FROM emp
WHERE ename = 'SMITH' )
多行子查詢
多行子查詢使用 IN 關鍵字
-- 如何查詢和部門 10 的工作相同的雇員的
SELECT ename, job, sal, deptno
FROM emp
WHERE job IN (
SELECT DISTINCT job
FROM emp
WHERE deptno = 10
) AND deptno <> 10
子查詢作為臨時表
可以把子查詢得到的結果作為一張表,然後進行多表查詢,這種查詢方式能夠解決很多複雜的查詢問題,目前展示一個見到那的的案例,以後有更多的體悟再來豐富一下。
--查詢 ecshop 中各個類別中,價格最高的商品
--先得到 各個類別中,價格最高的商品 max + group by cat_id, 當做臨時表
SELECT goods_id, ecs_goods.cat_id, goods_name, shop_price
FROM (SELECT cat_id , MAX(shop_price) AS max_price
FROM ecs_goods
GROUP BY cat_id) temp , ecs_goods
WhERE temp.cat_id = ecs_goods.cat_id
AND temp.max_price = ecs_goods.shop_price
註釋:關於這個查詢需求,一開始我以為直接用 MAX+分組就好了,但是輸出結果與目標不一致,這是因為這裡還要輸出商品號,商品號和這個最高價格不匹配,這是GROUP BY導致的,這裡的商品號其實是每一組第一個成員的商品號
多列子查詢
如果要求查詢結果對多個欄位有要求可以使用多列子查詢
-- 查詢與 allen 的部門和崗位完全相同的所有雇員(並且不含 allen 本人)
SELECT *
FROM emp
WHERE (deptno , job) = (
SELECT deptno , job
FROM emp
WHERE ename = 'ALLEN' ) AND ename != 'ALLEN
合併查詢
有時候為了多個查詢結構需要合併,可以使用集合操作符 UNION(去重), UNION ALL(不去重)
學習總結來源於韓順平老師一周學會MYSQL