文章目錄
- 📕1. Create 新增
- ??1.1 單行數據全列插入
- ??1.2 單行數據指定列插入
- ??1.3 多行數據指定列插入
- 📕2. Retrieve 檢索
- ??2.1 全列查詢
- ??2.2 指定列查詢
- ??2.3 查詢字段為表達式
- ??2.4 為查詢結果指定別名
- ??2.5 結果去重查詢
- 📕3. WHERE條件查詢
- ??3.1 基本查詢
- ??3.2 AND和OR
- ??3.3 AND和OR的優先級
- ??3.4 范圍查詢
- ??3.5 模糊查詢
- ??3.6 NULL的查詢
- ??3.7 ORDER BY 排序
- ??3.8 分頁查詢
- 📕4. Update 修改
- 📕5. Delete 刪除
- ??5.1 普通Delete刪除
- ??5.2 截斷表
- ??5.3 插入查詢結果
- 📕6. 聚合函數
- 📕7. Group by 分組查詢
- ??7.1 HAVING子句
- 📕8. 內置函數
- ??8.1 日期函數
- ??8.2 字符串處理函數
- ??8.3 數學函數
- ??8.4 其他常用函數
📕1. Create 新增
INSERT INTO name(filed1,filed2……) VALUE(value1,value2……);
- INSERT INTO 是插入關鍵字
- INTO 一般都要寫,也可以省略
- name為表名字
- filed是要插入的列
- value是要插入的值
??1.1 單行數據全列插入
值的數量必須和定義表的列的數量及順序一致
-- 創建一個用于演示的表
CREATE TABLE IF NOT EXISTS users(id BIGINT,`name` VARCHAR(20) COMMENT'用戶名稱'
);-- 全列插入
INSERT INTO users VALUE(1,'張三');
INSERT INTO users VALUE(2,'李四');
??1.2 單行數據指定列插入
-- 指定了要插入的列
INSERT INTO users(id,`name`) VALUE(3,'艾米');
??1.3 多行數據指定列插入
INSERT INTO users(id,`name`) VALUE(5,'孫悟空'),(6,'豬八戒'),(7, '唐僧');
📕2. Retrieve 檢索
SELECT 列名1,列名2 FROM 表名;
- SELECT 為查詢關鍵字
- 列名處是 * 的時候是查詢所有列(一般不建議,數據過多時會很慢)
??2.1 全列查詢
SELECT * FROM 表名;
??2.2 指定列查詢
SELECT 指定列名稱 FROM 表名;
??2.3 查詢字段為表達式
- 常量表達式
SELECT 10 FROM 表名;
- 把所有學生的語文成績加10分
SELECT Chinese+10 FROM 表名;
- 計算所有學生語文、數學和英語成績的總分
SELECT chinese+nath+english FROM 表名;
??2.4 為查詢結果指定別名
SELECT 列名1+列名2 【AS】 別名 FROM 表名;
AS可以省略,別名如果包含空格必須用單引號包裹
??2.5 結果去重查詢
SELECT DISTINCT 列名1,列名2 FROM 表名;
使用DISCTINCT去重時,只有查詢列表中所有列的值都相同才會判定為重復
📕3. WHERE條件查詢
SELECT 列名1,列名2 FROM 表名 WHERE 條件……;
比較運算符
邏輯運算符
??3.1 基本查詢
- 查詢英語不及格的同學及英語成績 ( < 60 )
SELECT id,name,english FROM exam WHERE english < 60;
- 查詢語文成績高于英語成績的同學
SELECT id,name,chinese,math FROM exam WHERE chinese > math;
- 總分在 200 分以下的同學
SELECT id,name,chinese+math+english FROM exam WHERE chinese+math+english < 200;
??3.2 AND和OR
- 查詢語文成績大于80分且英語成績大于80分的同學
SELECT id,name FROM exam WHERE chinese > 80 AND english > 80;
- 查詢語文成績大于80分或英語成績大于80分的同學
SELECT * FROM exam WHERE chinese > 80 OR english > 80;
??3.3 AND和OR的優先級
select * from exam where chinese > 80 or math > 70 and english > 70;
select * from exam where (chinese > 80 or math > 70) and english > 70;
注意:AND的優先級高于OR,括號的優先級高于AND和OR。
??3.4 范圍查詢
- 語文成績在 [80, 90] 分的同學及語文成績
SELECT name,chinese FROM exam WHERE chinese >= 80 AND chinese <= 90;
SELECT name,chinese FROM exam WHERE BETWEEN chinese 80 AND 90;
- 數學成績是 78 或者 79 或者 98 或者 99 分的同學及數學成績
SELECT name,math FROM exam WHERE math = 78 OR math = 79 OR math = 98 OR math = 99;
SELECT name,math FROM exam WHERE IN (78,79,98,99);
??3.5 模糊查詢
- 查詢所有姓孫的同學
SELECT * FROM exam WHERE name LIKE '孫%';
- 查詢姓孫且姓名共有兩個字同學
SELECT * FROM exam WHERE name LIKE '孫_';
??3.6 NULL的查詢
- 查詢英語成績為NULL的記錄
SELECT * FROM exam WHERE english IS NULL;
- 查詢英語成績不為NULL的記錄
SELECT * FROM exam WHERE english IS NOT NULL;
💡💡💡💡💡💡💡💡💡💡💡💡注意事項💡💡💡💡💡💡💡💡💡💡💡
- WHERE條件中可以使用表達式,但不能使用別名
- AND的優先級高于OR,在同時使用時,建議使用小括號()包裹優先執行的部分
- 過濾NULL時不要使?等于號(=)與不等于號(!= , <>)
- NULL與任何值運算結果都為NULL
??3.7 ORDER BY 排序
-- ASC 為升序(從?到?
-- DESC 為降序(從?到?)
-- 默認為ASC
SELECT 列名1,列名2 FROM 表名 WHERE 條件 ORDER BY 列名 DESC/ASC;
- 按數學成績從低到高排序(升序)
SELECT * FROM exam ORDER BY math ASC;
- 查詢同學各門成績,依次按數學降序,英語升序,語文升序的方式顯示
SELECT * FROM exam ORDER BY math DESC,english ASC,chinese ASC;
- 查詢同學及總分,由高到低排序,可以使用列的別名進行排序
SELECT math+english+chinese AS 總分 FROM exam ORDER BY 總分 DESC;
- 所有英語成績不為NULL的同學,按語文成績從高到低排序
SELECT * FROM exam WHERE english IS NOT NULL ORDER BY chinese DESC;
💡💡💡💡💡💡💡💡💡💡💡💡注意事項💡💡💡💡💡💡💡💡💡💡💡
- 查詢中沒有ORDER BY子句,返回的順序是未定義的,永遠不要依賴這個順序
- ORDER BY 子句中可以使用列的別名進行排序
- NULL 進行排序時,視為比任何值都小,升序出現在最上面,降序出現在最下面
??3.8 分頁查詢
-- 起始下標為 0
-- 從 0 開始,篩選 num 條結果
SELECT 列名 FROM 表名 ((WHERE 條件)(ORDER BY 列名 ASC/DESC)LIMIT num;
-- 從 start 開始,篩選 num 條結果
SELECT 列名 FROM 表名 (WHERE 條件)(ORDER BY 列名 ASC/DESC)LIMIT start,num;
-- 從 start 開始,篩選 num 條結果,?第?種?法更明確,建議使?
SELECT 列名 FROM 表名 (WHERE 條件)(ORDER BY 列名 ASC/DESC)LIMIT num OFFSET start;
Tips:
- 總頁數 = 數據的總條數 / 每頁要展示的數量,如果有余數則 + 1.
- start = (當前頁號 - 1)* 每頁要展示的數量
📕4. Update 修改
UPDATE 表名 SET 修改值 (WHERE 條件)(ORDER BY 列名 ASC/DESC)(LIMIT num);
對符合條件的結果進行列值更新
- 將孫悟空同學的數學成績變更為 80 分
UPDATE exam SET math = 80 WHERE name = '孫悟空';
- 將曹孟德同學的數學成績變更為 60 分,語文成績變更為 70 分
UPDATE exam SET math = 60,chinese = 70 WHERE name = '曹孟德';
- 將總成績倒數前三的 3 位同學的數學成績加上 30 分
UPDATE exam SET math = math + 30 WHERE chinese+math+english IS NOT NULL ORDER BY chinese+math+english ASC LIMIT 0,3
- 將所有同學的語文成績更新為原來的 2 倍
UPDATE exam SET Chinese= Chinese * 2;
💡💡💡💡💡💡💡💡💡💡💡💡注意事項💡💡💡💡💡💡💡💡💡💡💡
- 以原值的基礎上做變更時,不能使用math += 30這樣的語法
- 不加where條件時,會導致全表數據被列新,謹慎操作
📕5. Delete 刪除
??5.1 普通Delete刪除
DELETE FROM 表名 [WHERE 條件] [ORDER BY ...] [LIMIT count];
- 刪除孫悟空同學的考試成績
DELETE FROM exam WHERE name = '孫悟空';
💡💡💡💡💡💡💡💡💡💡💡💡注意事項💡💡💡💡💡💡💡💡💡💡💡
執行Delete時不加條件會刪除整張表的數據,謹慎操作
??5.2 截斷表
TRUNCATE TABLE 表名;
🌰例如:
-- 準備測試表
CREATE TABLE t_truncate (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);-- 插入新數據
INSERT INTO t_truncate (name) VALUES ('A'), ('B'), ('C');-- 此時查看建表結構,注意AUTO_INCREMENT=4-- 截斷表
TRUNCATE TABLE t_truncate;--繼續查看表結構,注意AUTO_INCREMENT已被重置為0
💡TRUNCATE 的注意事項:
- 只能對整表操作,不能像 DELETE ?樣針對部分數據
- 不對數據操作所以比DELETE更快,TRUNCATE在刪除數據的時候,不經過真正的事物
- 會重置 AUTO_INCREMENT 項,而DELETE不會
??5.3 插入查詢結果
INSERT INTO 表名 SELECT ...
🌰例如:刪除表中的重復記錄,重復的數據只能有一份
實現思路:原始表中的數據一般不會主動刪除,但是真正查詢時不需要重復的數據,如果每次查詢
都使用DISTINCT進行去重操作,會嚴重效率。可以創建一張與 t_recored 表結構相同的表,把去重的記錄寫入到新表中,以后查詢都從新表中查,這樣真實的數據不丟失,同時又能保證查詢效率
-- 創建測試表,并構造數據
CREATE TABLE t_recored (id int, name varchar(20));INSERT INTO t_recored VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');--創建?張新表,表結構與t_recored相同
create table t_recored_new like t_recored;-- 原表中的記錄去重后寫?到新表
insert into t_recored_new select distinct * from t_recored;
📕6. 聚合函數
常用聚合函數
📕7. Group by 分組查詢
GROUP BY 子句的作用是通過一定的規則將一個數據集劃分成若干個小的分組,然后針對若干個
分組進行數據處理,比如使用聚合函數對分組進行統計。
SELECT 列名 FROM 表名 GROUP BY 列名 HAVING 條件;
- 統計每個角色的人數
SELECT role,count(*) FROM emp GROUP BY role;
??7.1 HAVING子句
使用GROUP BY 對結果進行分組處理之后,對分組的結果進行過濾時,不能使用 WHERE 子句,而要使用 HAVING 子句
- 顯?平均工資低于1500的角色和它的平均工資
SELECT role,AVG(salary) FROM emp GROUP BY role HAVING AVG(salary) < 1500;
Having 與Where 的區別
?Having 用于對分組結果的條件過濾
? Where 用于對表中真實數據的條件過濾