MySQL 單表操作介紹
今天我將詳細的爲大家介紹 MySQL 中單表操作的相關知識,希望大家能夠從中收穫多多!
數據操作
複製表結構和數據
1)複製已有的表結構
在開發時,需要創建一個與已有數據表相同的表結構的數據表時,可以通過下述語法來完成表結構的複製。
基本語法格式:
#複製已有的表結構法1:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名 LIKE 舊錶名;
#複製已有的表結構法2:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 表名(LIKE 舊錶名);
語法說明:
-
該方法僅能從舊錶名中複製一份相同的表結果,而不會複製表中保存的數據。
-
完成創建步驟後可以利用 “SHOW CREATE TABLE 表名” 查看新數據表的表結構。
爲了更好理解已有的表結構複製操作,現舉例說明:
2)複製已有的表數據
數據複製也可稱爲蠕蟲複製,是新增數據的一種方式,它是從已有的數據表中獲取數據,並將此數據插入到對應的數據表中。
此種方式獲取數據與插入數據的數據表的表結構要相同,否則可能會出現插入不成功的情況。
複製已有的表數據的語法格式:
INSERT [INTO] 數據表名1 [(字段列表)] SELECT [(字段列表)] FROM 數據表名2;
語法說明:
-
數據表名 1 是數據複製到的數據表(目的地);數據表名 2 是複製的數據的數據來源(出發點)。
-
數據表 1 和數據表 2 通常使用同一個數據表,從而在短期內快速添加表的數據量,測試表的壓力及效率等。
-
若數據表中含有主鍵,而主鍵具有唯一性,所以在數據複製時還要考慮主鍵衝突問題。若重複添加數據,系統會報主鍵重複的錯誤。
爲了更好理解已有的表數據複製操作,現舉例說明:
3)擴展:臨時表的使用
臨時表指的是一種僅在當前會話中可見,並在當前會話關閉時自動刪除的數據表,主要用於臨時存儲數據。
臨時表創建的語法格式:
#創建臨時表方法1:
CREATE TEMPORARY TABLE 表名(字段名 字段類型);
#創建臨時表方法2:
CREATE TEMPORARY TABLE 表名 SELECT (字段列表) FROM 已有數據表的表名;
語法說明:
-
創建臨時表時指定的數據庫可以是 MySQL 服務器中存在的數據庫,也可以是不存在的數據庫。
-
若數據庫不存在,操作臨時表時必須使用 “數據庫. 臨時表” 指定臨時表所在的數據庫。
-
臨時表中的數據操作與普通表相同,都可以進行 SELECT,INSERT,UPDATE 和 DELETE 操作。
-
SHOW TABLES 不能查看指定數據數據庫中有哪些臨時表,並且臨時表的表名必須使用 ALTER TABLE 修改,而不能使用 RENAME TABLE …
爲了更好理解臨時表的使用,現舉例說明:
解決主鍵衝突
1)主鍵衝突
當你在數據庫表中設置一字段爲主鍵時,這意味着該字段的值是唯一的,不能重複。如果你試圖在表中插入一條新記錄,並且主鍵字段的值已經存在,就會發生主鍵衝突,進而導致你試圖插入的新記錄無法成功插入。
例如,假設你有一張學生信息表,其中有個名爲 "id" 的字段被設爲主鍵時,那麼在表中不能有兩條記錄的 id 值相同。如果你試圖插入一條新記錄,其 id 值已經存在於表中,就會發生主鍵衝突,進而導致記錄插入失敗。
爲了更好理解何爲主鍵衝突,現舉例說明:
1,學生表準備
2,主鍵衝突演示
3,主鍵衝突的解決
如果你在嘗試向數據庫表中插入一條新記錄時遇到主鍵衝突問題,若要解決這問題,可以使用 MySQL 所提供了兩種方式,即爲主鍵衝突更新和主鍵衝突替換。
主鍵衝突更新
主鍵衝突更新是指當插入數據時發生主鍵衝突,"更新" 操作會在表中查找發生主鍵衝突的記錄,然後用新記錄中的值更新該記錄中的值。
INSERT [INTO] 表名稱 [字段列表] {VALUE|VALUES} (值列表)
ON DUPLICATE KEY UPDATE 字段名1 = 新值1 [,字段名2 = 新值2, ...];
主鍵衝突替換
主鍵衝突替換是指當插入數據時發生主鍵衝突,” 替換 “操作會在表中查找發生主鍵衝突的記錄,然後將該記錄完全刪除,並用新記錄代替
REPLACE [INTO] 表名稱 [字段列表] {VALUE|VALUES} (值列表);
清空數據
MySQL 中不僅可以使用 DELETE 語句進行刪除數據,還可以使用 TRUNCATE 清空指定表的全部數據,其基本語法格式如下:
#清空數據法1:
DELETE FROM 表名稱;
#清空數據法2:
TRUNCATE [TABLE] 表名稱;
爲了更好理解這兩種清空數據方法的使用,現舉例說明:
1,操作表準備
2,刪除數據操作
擴展:TRUNCATE 與 DELETE 的區別
儘管 TRUNCATE 操作與 DELETE 操作在使用來清空數據時非常相似,但這兩者之間存在本質區別。
區別歸納如下:
-
- 實現方式不同:TRUNCATE 本質上先執行刪除(DROP)數據表的操作,然後再根據有效的表結構文件(.frm)重新創建數據表的方式來實現數據清空操作;而 DELETE 語句則是逐條的刪除數據表中保存的記錄。
-
- 執行效率不同:在針對大型數據表(如千萬級的數據記錄)時,TRUNCATE 清空數據的實現方式,決定了它比 DELETE 語句刪除數據的方式執行效率更高。
-
- 對自增約束的字段影響不同:TRUNCATE 清空數據後,再次向表中添加數據,自動增長字段會從默認的初始值重新開始,而使用 DELETE 語句刪除表中的記錄時,則不影響自動增長值。
-
- 刪除數據的範圍不同:TRUNCATE 語句只能用於清空表中的所有記錄,而 DELETE 語句可通過 WHERE 指定刪除滿足條件的部分記錄。
-
- 返回值含義不同:TRUNCATE 操作的返回值一般是無意義的,而 DELETE 語句則會返回符合條件被刪除的記錄數。
-
- 所屬 SQL 語言的不同組成部分:DELETE 語句屬於 DML 數據操作語句,而 TRUNCATE 通常被認爲是 DDL 數據定義語句。
爲了更好的理解這兩者的區別,實例如下:
1,操作表準備
TRUNCATE 與 DELETE 語句在刪除數據的區別具體如下:
5,TRUNCATE 與 DELETE 操作說明
-
TRUNCATE 的返回值表示有 0 條記錄受影響,而 DELETE 的返回值表示有 10 條記錄受影響;說明這兩種方法的實現操作不同。
-
刪除數據記錄後,再次新增數據記錄,經 TRUNCATE 操作刪除的表 id 從 1 開始,而經 DELETE 操作刪除的表 id 從 11 開始, 說明它們對自增約束的字段影響不同。
-
TRUNCATE 與 DELETE 執行清空數據操作的時間不同,說明這兩種方法的執行效率不同。
-
一般情況下,針對大型數據表(如千萬級的數據記錄)時,使用 TRUNCATE 清空數據的執行效率高於使用 DELETE 清空數據的執行效率。
-
一般情況下,針對小型數據表(如上述實例的數據記錄)時,使用 DELETE 清空數據的執行效率高於使用 TRUNCATE 清空數據的執行效率。
-
因此,在實際開發中具體使用何種方式進行刪除數據操作,需要根據實際需求進行合理的選擇。
去除重複記錄
有時出於對數據記錄的分析需求,需要去除查詢記錄中的重複記錄,例如,想查看班級學生的民族種類數,就需要去除重複的民族記錄。
MySQL 中提供使用 SELECT 語句的選項進行去除重複記錄操作,其基本語法如下:
SELECT select選項 字段列表 from 表名稱;
語法說明:
-
1.select 選項默認爲 ALL,表示保存所有查詢到的數據記錄。
-
- 當 select 選項設置爲 DISTINCT 時,表示去除重複數據記錄,只保留一條數據記錄。
-
- 當查詢記錄的字段有多個時,必須所有的字段的值完全相同時纔會被認爲是重複記錄。
爲了更好地理解去除重複記錄操作的使用,舉例如下:
排序
在實際開發時,爲了使查詢到的數據結果滿足用戶的需求,通常會對查詢到的數據進行升序或者降序的排序方式。
例如,用戶在進行網絡購物的時候,通常會對想買的商品數據進行排序的處理,例如以商品銷量或者以商品的綜合評價進行排序,讓滿足要求的商品數據放在前面,方便用戶進一步操作。
在 MySQL 中,針對不同的開發需求提供了兩種排序的方式,分別爲單字段排序和多字段排序。
單字段排序
單字段排序指的是在查詢時僅按照一個指定字段對查詢到的數據進行升序或者降序排序。其基本語法如下:
SELECT * | {字段列表} FROM 表名稱 ORDER BY 字段名 [ASC|DESC];
語法注意事項:
ASC 表示 升序 ,DESC 表示 降序,而 ORDER BY 默認爲 ASC ,即對錶數據進行排序操作,默認升序。
爲了更好地理解單字段排序,實例如下:
多字段排序
多字段排序指的是在查詢時按照多個指定字段對查詢到的數據進行升序或者降序排序。其基本語法如下:
SELECT * | {字段列表} FROM 表名稱 ORDER BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC], ...;
語法注意事項:
-
- 多字段排序先按照字段 1 對數據進行排序操作,當表中存在字段 1 值相同的記錄時,再按照字段 2 對這些記錄進行排序,依次類推。
-
- 在按照指定字段進行排序操作時,如果某條記錄的字段值爲 NULL,那麼系統會將 NULL 看作是最小的值,從而將其顯示在查詢結果中的首條位置或者末尾位置。
爲了更好地理解多字段排序,實例如下:
擴展:中文字段排序
1,面臨問題
在默認情況下 ,MySQL 使用的字符集是拉丁字符集,因此對於中文字符串的排序,默認不會按照中文拼音的順序排序,而是以區位碼來進行排序中文字符串,進而出現不同於你所期望的情況。
2,問題緣由
區位碼可以用來對中文字符串進行排序,但並不是每個字符的區位碼都是按照字母順序排列的。
在 Unicode 編碼系統中,中文字符的區位碼是按照筆畫順序排列的,而不是按照字母順序。
例如,字符 的
的區位碼是 U+7684
,字符 一
的區位碼是 U+4E00
,所以在使用區位碼排序中文字符串時,的
會排在 一
的前面。
3,解決方案
爲了避免這種情況,你可以使用 utf8mb4
字符集,或者使用拼音排序算法。
在不改變數據表結構的前提下,可以使用 MySQL 的 ORDER BY CONVERT(字段名 USING gbk)
函數來強制讓指定的字段按照中文拼音順序進行排序。
限量
數據查詢的排序與限量
對於一次性查詢出的大量數據記錄,不僅不便於閱讀查看,還會浪費系統資源。
爲了解決上述問題,MySQL 中提供了一個關鍵字 LIMIT,不僅可以限定記錄的數據,還可以指定查詢記錄從哪條記錄開始。
SELECT [select選項] {*|字段列表} FROM 表名 [WHERE 條件表達式] [ORDER BY 字段 ASC|DESC] LIMIT [OFFEST,] 記錄數;
語法說明:
-
- 記錄數表示限定獲取的最大記錄數量,就相當於在記錄數大於數據表中符合要求的實際記錄數時,以實際記錄數爲準。
-
2.OFFSET 表示偏移量,用於設置從哪條數據記錄開始獲取。MySQL 中默認第 1 條數據的偏移量值爲 0,依次類推。
-
3.LIMIT 後僅含記錄數,無 OFFSET 偏移量時,表示從數據表中的第 1 條數據開始獲取。
爲了更好地理解數據查詢時的排序與限量使用,實例如下
1,成績表準備
實例:查找該學生成績表中的成績前三名的學生的全部信息。
2,限量記錄數
SELECT * FROM student ORDER BY score DESC LIMIT 3;
3,獲取指定區間記錄
SELECT * FROM student ORDER BY score DESC LIMIT 0,3;
數據更新的排序與限量
數據更新的排序與限量,基本語法:
UPDATE 表名稱 SET 字段 = 新值,... [WHERE 條件表達式] ORDER BY 字段 [ASC|DESC] LIMIT [OFFEST,] 記錄數;
語法說明:
數據更新操作時使用限量,只會對限量的數據進行更新操作,其它的數據不進行更新操作。
爲了更好地理解數據更新時的排序與限量使用,實例如下
實例:將前三名的成績都減少 5,求成績更新後成績爲前三的學生信息
UPDATE student SET SCORE = SCORE - 5 ORDER BY score DESC LIMIT 3;
UPDATE student SET SCORE = SCORE - 5 ORDER BY score DESC LIMIT 0,3;
數據刪除的排序與限量
數據刪除的排序與限量,基本語法:
DELETE FROM 表名稱 [WHERE 條件表達式] ORDER BY 字段 [ASC|DESC] LIMIT [OFFEST,] 記錄數;
語法說明:
數據刪除操作時使用限量,只會對限量的數據進行刪除操作,其它的數據不進行刪除操作。
爲了更好地理解數據刪除時的排序與限量使用,實例如下
實例:將前三名的成績刪除,求成績刪除後成績爲前三的學生信息
分組
在 MySQL 中,可以對數據記錄進行分組操作。也就是可根據一個字段或者多個字段對記錄進行分組,字段值相同的記錄爲一組。
爲了能夠更好地理解分組的相關操作及使用,接下來將對其進行逐一講解。
1,操作表的準備
分組統計
在查詢數據時,在 WHERE 條件後添加 GROUP BY 就可以根據指定的字段對記錄進行分組操作,基本語法如下:
SELECT [select選項] 字段列表 FROM 表名稱 [WHERE 條件表達式] GROUP BY 字段名;
語法注意事項:
-
1.SELECT 獲取的字段列表只能是 GROUP BY 分組的字段,或使用了聚合函數的非分組字段。
-
- 若在獲取非分組字段時未使用聚合函數,MySQL 會發報錯信息。
-
- 在一些老版本中,分組後獲取的字段列表,若非分組字段未使用聚合函數,默認情況下只保留每組中的第一條記錄。
爲了更好地理解分組統計的使用,實例如下:
實例:查詢每個成績分值的所佔人數
SELECT score,COUNT(*) FROM score GROUP BY score;
分組排序
在 MySQL 中,默認情況下爲分組操作的字段提供了升序排序的功能,在對記錄進行分組操作時,可以爲指定的字段進行升序和降序排序,其基本語法如下:
SELECT [select選項] 字段列表 FROM 表名稱 [WHERE 條件表達式] GROUP BY 字段名 [ASC|DESC];
語法注意事項:
GROUP BY 分組排序的實現不需要使用 ORDER BY,直接在分組字段後添加 ASC(升序,默認可省略),DESC(降序) 即可。
爲了更好地理解分組排序的使用,實例如下:
實例:查看各個成績段的學生信息,成績由高到低排序
SELECT score.GROUP_CONCAT(name) FROM score GROUP BY score DESC;
多分組統計
在對數據進行分組統計時,MySQL 還支持數據按照某一個字段進行分組後,對已經分組的數據進行再次分組的操作,從而實現對數據的多分組統計。其基本語法如下:
SELECT [select選項] 字段列表 FROM 表名稱 [WHERE 條件表達式] GROUP BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC],...;
語法注意事項:
查詢出的數據首先按照字段 1 進行分組排序,再將字段 1 相同的記錄再按照字段 2 進行分組排序,依次類推。
爲了更好地理解多分組統計的使用,實例如下:
實例:查看各組學生的成績,成績由高到低,小組號由低到高
SELECT group_id,score FROM score GROUP BY group_id ASC, score DESC;
回溯統計
對數據進行分組統計時,MySQL 還支持回溯統計功能。回溯統計可簡單理解爲:在根據指定字段進行分組後,系統會自動對分組的字段進行一次新的統計併產生有關新的統計數據,且對應的分組字段值爲 NULL。其基本語法如下:
SELECT [select選項] 字段列表 FROM 表名稱
[WHERE 條件表達式] GROUP BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC],...WITH ROOLLUP;
語法注意事項:
-
- 分組操作根據 GROUP BY 後的字段從前往後一次執行,數據分組後系統再進行回溯統計,它與分組操作正好相反。
-
- 回溯統計從 GROUP BY 後最後一個指定的分組字段開始進行回溯統計,並將結果上報,然後根據上報結果依次向前一個分組字段進行回溯統計。
-
3.MySQL 中的同一個查詢語句中回溯統計(WITH ROLLUP)與排序(ORDER BY)僅能出現一個,不能同時存在。
爲了更好地理解回溯統計的使用,實例如下:
實例:
SELECT score,group_id,COUNT(*) FROM score GROUP BY group_id ASC,score DESC WITH ROLLUP;
統計篩選
在對查詢到的數據進行分組統計時,還可以利用 HAVING 根據條件進行數據的篩選操作。其基本語法爲:
SELECT [select選項] 字段列表 FROM 表名稱
[WHERE 條件表達式] GROUP BY 字段名1 [ASC|DESC],字段名2 [ASC|DESC],...[WITH ROOLLUP] HAVING 條件表達式;
語法注意事項:
-
- 通常情況下,HAVING 與 GROUP BY 一起使用,對分組後的結果進行篩選操作。
-
- 執行流程爲先對查詢到的數據進行分組操作,再對分組後的數據進行篩選操作。
-
- 雖然 WHERE 操作和 HAVING 操作都能起到對數據進行篩選功能,但要知道和理解這兩者的區別。
-
WHERE 操作是從數據表中獲取數據,將數據從磁盤存儲到內存中進行操作,而 HAVING 則是對已存儲到內存的數據進行操作。
-
WHERE 和 HAVING 所處位置不同。WHERE 位於 GROUP BY 子句之前,而 HAVING 位於 GROUP BY 子句之後。
-
WHERE 後不可以使用聚合函數,而 HAVING 後可以使用聚合函數。
爲了更好地理解統計篩選的使用,實例如下:
實例:查詢小組平均分高於 85 分的小組
SELECT group_id,AVG(score) FROM score GROUP BY group_id HAVING AVG(score)>=85;
聚合函數
在 MySQL 中,MySQL 所提供的聚合函數在查詢數據時能夠起一些特殊功能,查詢出更有價值的數據記錄。
常用的聚合函數
操作表的準備
COUNT 函數
SELECT COUNT(*) FROM 表名稱; //返回表中的總記錄數
SELECT COUNT(字段名) FROM 表名稱; //返回表中字段不爲null的記錄數
注意點說明:
-
1.COUNT() 函數適用於任何的數據類型。
-
- 區分 COUNT(1),COUNT(
*
),COUNT(字段名) 三者的區別,前兩種直接讀取行數,而第一種還要判斷記錄的字段值是否爲 NULL。
- 區分 COUNT(1),COUNT(
-
3.COUNT(
*
) 不能使用 COUNT(字段名) 代替,COUNT(*
) 會統計值爲 NULL 的記錄,而 COUNT(字段名) 不會統計該列值爲 NULL 的記錄。
爲了能夠更好地理解 COUNT 函數的使用,實例如下:
實例:查詢各個小組的小組成員人數
SELECT group_id,COUNT(*) FROM score GROUP BY group_id;
MIN 和 MAX 函數
SELECT MAX(字段名) FROM 表名稱; //返回表中該字段的最大值
SELECT MIN(字段名) FROM 表名稱; //返回表中該字段的最小值
注意點說明:
MIN() 和 MAX() 函數適用於任何的數據類型。
爲了能夠更好地理解 MIN 和 MAX 函數的使用,實例如下:
實例:查詢學生成績的最大值及最小值
SELECT MAX(score),MIN(score) FROM score;
SUM 和 AVG 函數
SELECT SUM(字段名) FROM 表名稱; //返回表中該字段的總和值
SELECT AVG(字段名) FROM 表名稱; //返回表中該字段的平均值
注意點說明:
SUM() 和 AVG() 函數只適用於數值型數據類型。
爲了能夠更好地理解 SUM 和 AVG 函數的使用,實例如下:
實例:查詢各個小組學生成績的總和及平均值
SELECT group_id,SUM(score),AVG(score) FROM score GROUP BY group_id;
GROUP_CONCAT 函數
SELECT GROUP_CONCAT(字段名) FROM 表名稱; //返回符合條件的參數字段的連續字符串
爲了能夠更好地理解 JSON_ARRAYAGG 函數的使用,實例如下:
實例:查詢各個小組的學生姓名信息
SELECT group_id,GROUP_CONCAT(name) FROM score GROUP BY group_id;
JSON_ARRAYAGG 函數
SELECT JSON_ARRAYAGG(字段名) FROM 表名稱; //將符合條件的參數字段作爲單個JSON數組返回
爲了能夠更好地理解 JSON_ARRAYAGG 函數的使用,實例如下:
實例:查詢各個小組的學生姓名信息
SELECT group_id,JSON_ARRAYAGG(name) FROM score GROUP BY group_id;
JSON_OBJECTAGG 函數
SELECT JSON_OBJECTAGG(鍵名字段,鍵值字段) FROM 表名稱; //將符合條件的參數字段作爲單個JSON對象返回
爲了能夠更好地理解 JSON_ARRAYAGG 函數的使用,實例如下:
實例:查詢各個小組的學生姓名及成績信息
SELECT group_id,JSON_OBJECTAGG(name,score) FROM score GROUP BY group_id;
擴展: 別名
在 MySQL 中,執行查詢操作時可以爲獲取的字段設置別名,從而來縮短字段的名稱長度和方便閱讀開發。
字段別名設置及使用
爲字段設置別名的基本語法如下:
SELECT 字段1 [AS] 字段別名1, 字段2 [AS] 字段別名2, ... FROM 表名稱;
語法注意事項:
-
1.AS 可以省略,用空格代替。
-
2.AS 用於爲前面的字段,函數,表達式等設置別名。
-
- 字段別名設置後,在操作時仍可以使用原來的字段名稱。
爲了更好地理解字段別名設置及使用,實例如下:
實例:查詢各個小組的成績最高分,將 MAX(score) 該字段設置別名爲 max_score
SELECT group_id,MAX(score) max_score FROM score GROUP BY group_id;
表別名設置及使用
爲表設置別名的基本語法如下:
SELECT 字段列表 FROM 表名稱 [AS] 表別名;
語法注意事項:
-
1.AS 可以省略,用空格代替。
-
- 表別名設置後,在操作時仍可以使用原來的表名稱。
-
- 表別名的設置及使用主要用於多表查詢中。
爲了更好地理解表別名設置及使用,實例如下:
1,操作表準備
2,實例操作
實例:查詢學生信息 (學號,姓名,班級號),將 student 表設置別名爲 s,class 表設置別名爲 c
SELECT s.id stu_id,s.name stu_name,c.name AS class_name FROM student s,class c WHERE s.class_id = c.id;
來源:https://blog.csdn.net/m0_64338546/
article/details/12865157
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/dymp8vWtJRjG1z1-8_WFZQ