CRUD 簡介
CRUD是對數據庫中的記錄進行基本的增刪改查操作
- Create(創建)
- Retrieve(讀取)
- Update(更新)
- Delete(刪除)
一、新增(Create)
語法:
INSERT [INTO] table_name [(colum [, column] ...)]
VALUES (value_list) [, (value_list)] ...
- INTO 可以省略但是一般不省略
- 表名后跟著要增加數據的列名,同時 數據的位置?也要對應 列的位置
示例:
2.1 單行數據 + 全列插入
-- 插入兩條記錄,value_list 數量必須和定義表的列的數量及順序一致
INSERT INTO EXAM
VALUES (1,'唐三藏',70,80,90);INSERT INTO EXAM
VALUES (2,'孫悟空',90,90,90);
2.2 多行數據 + 指定列插入
-- 插入兩條記錄,value_list 數量必須和指定列數量及順序一致
INSERT INTO EXAM(id,name,math) VALUES
(3,'豬八戒',60),
(4,'沙悟凈',70);
二、查詢(Retrieve)
語法:
SELECT[DISTINCT]select_expr [, select_expr] ...[FROM table_references][WHERE where_condition][GROUP BY {col_name | expr}, ...][HAVING where_condition][ORDER BY {col_name | expr } [ASC | DESC], ...][LIMIT {[offset,] row_count | row_count OFFSET offset}]
示例:
3.1 查詢表中所有的列
select * from 表名;
- select:表示查詢的關鍵字
- * :所有的列
- from 表名:要從哪個表中查詢數據
3.2 查詢指定列
select 列名1 [,列名2] from 表名;
3.3 查詢字段為表達式
常量表達式
查詢列表中的表達式可以是表中不存在的值或列,如果是字符串常量要寫到單引號中
算術表達式
可以通過加上 as 來修改臨時列名
所有的 select 操作,都會先從物理表(真實存在的表)中查詢對應的值,再計算表達式的值,合并結果后,通過臨時表返回。
3.4 去重查詢
通過 DISTINCT 關鍵字來對某列數據進行去重
3.5 條件查詢
比較運算符:
邏輯運算符:
- WHERE條件可以使用表達式,但不能使用別名
- AND的優先級高于OR,在同時使用時,需要使用小括號()包裹優先執行的部分
代碼示例:
插入數據:
INSERT INTO EXAM (id,name, chinese, math, english) VALUES(1,'唐三藏', 67, 98, 56),(2,'孫悟空', 87.5, 78, 77),(3,'豬悟能', 88, 98.5, 90),(4,'曹孟德', 82, 84, 67),(5,'劉玄德', 55.5, 85, 45),(6,'孫權', 70, 73, 78.5),(7,'宋公明', 75, 65, 30);
-- 查詢英語不及格的同學(<60)
SELECT name,english FROM EXAM WHERE english < 60;-- 查詢語文成績好于英語成績的同學
SELECT name,chinese,english FROM EXAM WHERE chinese > english;-- 查詢語文成績大于80分且英語成績大于80分的同學
SELECT * FROM EXAM WHERE chinese > 80 AND english > 80;-- 查詢語文成績大于80分或者英語成績大于80分的同學
SELECT * FROM EXAM WHERE chinese > 80 OR english > 80;-- 查詢語文成績在 [80,90] 之間的同學
SELECT name,chinese FROM EXAM WHERE chinese BETWEEN 80 AND 90;-- 也可以使用 AND
SELECT name,chinese FROM EXAM WHERE chinese >= 80 AND chinese <= 90;-- 查詢數學成績是 58 或 59 的同學
SELECT name,math FROM EXAM WHERE math IN (58,59);-- 模糊查詢
-- %匹配任意多個(包括0個)字符
SELECT name FROM EXAM WHERE name LIKE '孫%'; -- 匹配到孫悟空,孫權
-- _匹配嚴格的一個任意字符
SELECT name FROM EXAM WHERE name LIKE '孫_'; -- 匹配到孫權-- 查詢數學成績為空的人的數據
SELECT name,math FROM EXAM WHERE math is NULL;-- 查詢數學成績不為空的人的數據
SELECT name,math FROM EXAM WHERE math is NOT NULL;
3.6 排序
語法:
-- ASC 為升序(從小到大)
-- DESC 為降序(從大到小)
-- 默認為ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC | DESC], ... ;
- 查詢中沒有 ORDER BY 子句返回的順序永遠是未定義的
- ORDER BY 子句中可以使用列的別名進行排序
- NULL 進行排序時,視為比任何值都小
3.7 分頁查詢
像前面提到的 SELECT * FROM 表名 不能有效限制結果集的大小,是不安全的查詢,有可能把服務器的資源耗盡,通過分頁查詢可以有效減少服務器的壓力,同時也有較好的用戶體驗
-- 起始下標為0,
-- 從 0 開始,篩選 n 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;-- 從 s 開始,篩選 n 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s,n;-- 從 s 開始,篩選 n 條結果,用法比第二種更明確
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
三、修改(Updata)
語法:
Update 表名 set 列名 = 值 [,列名=值]... WHERE 條件;
- 以原值的基礎上做變更時,不能使用 math += 30 這樣的語法
- 不加 WHERE 條件時,會導致全表數據被列新
四、刪除(Delete)
語法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
代碼示例:
-- 刪除孫悟空同學的考試成績
DELETE FROM EXAM WHERE name = '孫悟空';-- 刪除整表數據
DELETE FROM EXAM;
- 不加 WHERE 條件時,會導致全表數據被刪除
五、截斷表
?讓表恢復到最開始創建的狀態
語法:
TRUNCATE [TABLE] tbl_name;
- 只能對整表進行操作,不像 DELETE 一樣針對部分數據
- 不對數據操作所以比 DELETE 更快,TRUNCATE 在刪除數據時不經過真正的事務,所以無法回溯
- 會重置 AUTO_INCREMENT 項
AUTO_INCREMENT 是創建列時添加的關鍵字,可以讓數據庫幫我們對這個列的數據進行自增,像 ID 這樣,每次插入數據都會自動 + 1
六、插入查詢結果
把一個查詢獲取的值插入到另一個表中
語法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
- 查詢出來的列要與插入的列一一對應
當我們需要刪除表中的數據,重復的數據只能有一份時,如果每次查詢都使用 DISTINCT 進行去重操作會嚴重影響效率。可以通過創建一個與 要被去重的表 結構相同的表,把去重的記錄寫到新表中,以后查詢都從新表中查,這樣真實的數據不丟失,又能保證查詢效率。
七、聚合函數
7.1 常用函數
可以通過 COUNT(*) 來獲取表中數據的數量,這個是 SQL 語言級別的標準,對于所有的軟件都通用。
在 MYISAM 存儲引擎中有一個變量記錄了表中的記錄數,獲取記錄可以通過這個變量直接讀取,效率極高,但是不同數據庫讀取方式可能不同,要酌情使用
八、Group by 分組查詢
?GROUP BY 可以將一個數據集分為若干個小組,方便進行其他數據處理
語法:
SELECT {col_name | expr} ,...,aggregate_function (aggregate_expr) -- 查詢列表FROM table_referencesGROUP BY {col_name | expr}, ... -- 分組條件[HAVING where_condition] -- 針對分組之后的結果進行過濾
- 查詢列表中如果要寫列名,列必須是group by中的列,或是包含在聚合函數中
- aggregate_function:聚合函數,比如COUNT(),SUM(),AVG()...
Having 子句
使用 GROUP BY 對結果進行處理之后,對分組的結果進行過濾時,不能使用 WHERE 子句,而要使用 HAVING 子句
Having 與 Where 的區別
- Having 用于對分組結果的條件過濾
- Where 用于對表中真實數據的條件過濾
九、內置函數
在現在互聯網項目中使用很少,因為可能對數據庫的性能造成影響,一般把對數據的處理放在應用中
日期函數:
字符串函數:
數學函數: