MySQL增刪改查操作 -- CRUD

個人主頁:顧漂亮

目錄

1.CRUD簡介

2.Create新增

使用示例:

注意點:

3.Retrieve檢索

使用示例:

注意點:

4.where條件查詢

前置知識:-- 運算符

比較運算符

使用示例:?

注意點:

5.Order by 排序

使用示例:

注意點:

6.分頁查詢

使用示例:

注意點:

7.Update修改

使用示例:

注意點:

8.Delete刪除

使用示例:

注意點:

9.截斷表

使用示例:

注意點:

10.插入查詢結果

使用示例:

注意點:

11.聚合函數

常見聚合函數:

12.group by分組查詢

使用示例:

注意點:


?

1.CRUD簡介

  • Create(創建)

  • Retrieve(讀取)

  • Update(更新)

  • Delete(刪除)

2.Create新增

使用示例:

use ghr;
-- create新增
drop table if exists users; -- 在創建之前添加一層校驗
create table users(id bigint primary key auto_increment, -- 為id列設置自增主鍵name varchar(20) not null  -- 為name列設置不為空條件
);-- 顯示表   -- 使用該語句前必須先使用use 語句,進入一個數據庫中!!!!
show tables;-- 單行數據全插入  values 中的數據順序必須要與列的順序一致
insert into users values (1, '張三');  -- 注意:MySQL中的字符串需要用單引號包裹-- 單行數據指定列插入  -- values中的數據 必須要與users后面括號中的順序一致
insert into users(id, name) values (3, '王五'); -- 多行數據指定列插入  多個數據中間用 , 分開即可 
insert into users(id, name) values (4, '趙六'), (5, '錢七');select * from users; 

注意點:

  1. 一次插入一條數據的效率高還是一次插入多條數據的效率更高?

  • 執行所有的SQL語句都會有網絡開銷

  • MySQL數據庫在保存數據的時候也會有磁盤開銷

  • 每執行一條SQL語句都需要開啟一個事務,事務的開啟到關閉也需要消耗資源

  • 因此:一次提交多條數據在一個可控范圍內的時候,比一次提交一次數據的效率可以高一點!!

3.Retrieve檢索

使用示例:

-- 檢索查詢
use ghr; -- 使用ghr數據庫-- 首先創建表
drop table if exists exam; -- 添加校驗
create table exam(id bigint primary key auto_increment,name varchar(20) not null, chinese float,math float,english float 
);-- 插入測試數據insert into exam(id, name, chinese, math, english) values 
(1, '唐三藏', 67, 98, 56),(2, '孫悟空', 87, 78, 77),(3, '豬悟能', 88, 98, 90),(4, '曹孟德', 82, 84, 67),(5, '劉玄德', 55, 85, 45),(6, '孫權', 70, 73, 78),(7, '宋公明', 75, 65, 30);-- 全列查詢select * from exam;-- 指定列查詢select name, chinese from exam;
select chinese, name from exam; -- 要查詢的列只要在表中存在,與順序無關-- 查詢字段為表達式
# 把所有語文成績+10
select id, name, chinese+10 as sum from exam;  -- 可以為表達式起一個別名 可以加 as 不加也可以
# 計算總成績
select id, name, chinese + math + english as 總分 from exam;-- 為結果去重查詢
select distinct math from exam;

注意點:

  • select返回的查詢結果是根據查詢列表中字段和表達式生成的一個臨時表,并不會真正修改數據表中的值

  • select后面的查詢列表中指定希望查詢的列,可以是一個也可以是多個,中間用逗號隔開。指定列的順序與表的結構無關

  • 使用disctinct去重時候,只有查詢列表中所有列的值相同的時候才會判定為重復

  • 查詢不加限制條件會返回表中的所有結果,如果表中的數據量過大,會把服務器的資源消耗殆盡

  • 在生產環境下,一定注意謹慎使用不加限制條件的查詢

4.where條件查詢

前置知識:-- 運算符

比較運算符

運算符

說明

>,>=,<, <=

與Java/c等用法相同

=

等于,對于NULL的比較不安全,比如NULL = NULL的結果還是NULL

<=>

等于,對于NULL的比較是安全的, 比如NULL <=> NULL 結果為1

!=, <>

不等于

Between A and B

匹配范圍[A,B]

Value in(A, B, ....)

如果value在in中返回1,不再返回0

Is null

判斷是NULL

Is not null

判斷不是NULL

like

模糊匹配

運算符

說明

or

任意一個條件

and

多個條件必須同時成立

not

類似于!取反操作

使用示例:?

-- where條件查詢use ghr;-- 基本查詢
# 英語成績小于60
select name, english from exam where english <= 60;
# 總成績200分以下 -- 注意where語句中不可以使用別名
select name, chinese+math+english as 總分 from exam where chinese + math+english < 200;-- and和or    優先級 -- not > and > as 如果三者混合使用,建議加()
select * from exam where chinese > 80 and english > 80;select * from exam where chinese > 80 or english > 80;-- 范圍查詢select name, chinese from exam where chinese between 80 and 90;select name, math from exam where math in(78, 79, 98, 99);-- 模糊查詢select * from exam where name like '孫%';
# 注意二者區別
select * from exam where name like '孫_';-- NULL的查詢
# 構造數據
insert into exam values (8, '張飛', 27, 0, NULL);select * from exam where english is null;select * from exam where english is not null;# NULL 值與其他值運算結果為NULL
select name, chinese + math + english as sum from exam;

注意點:

  • where條件中可以使用表達式,但是不能使用別名

  • and優先級高于or,在同時使用的時候,建議使用小括號包裹優先執行的部分

  • NULL與任何值運算結果都為NULL

  • 過濾NULL時不要使用 =,!=,<>

5.Order by 排序

使用示例:

-- 前置知識:asc 為升序   desc為降序-- 按照英語成績降序
select name, english from exam order by english desc;-- 查詢總分,從高到低
select name, chinese + math + english as 總分 from exam order by 總分 desc; # 可以使用別名進行查詢-- 去除有NULL值的排序
-- 所有英語成績不為NULL的同學,按照語文成績從高到低
select name, chinese, math, english from exam where english is not null order by chinese desc;

注意點:

  • 查詢中若沒有oder by 子句,返回的順序是未定義的,永遠不要依賴這個順序

  • Order by子句中可以使用列的別名進行排序,注意與where進行區分

  • NULL進行排序的時候,視為比任何值都小,升序出現在最上面,降序出現在最下面

6.分頁查詢

使用示例:

-- 分頁查詢   -- 三種方案,以下三種方案查詢結果都是相同的select * from exam order by id asc limit 3; -- 默認從偏移量0位置開始,查詢3行數據select * from exam order by id asc limit 0,3; -- 從偏移量0位置開始查詢,查詢3條數據select * from exam order by id asc limit 3 offset 0;-- 從偏移量0位置開始查詢,查詢3條數據

注意點:

  • 分頁查詢可以有效控制一次返回的記錄條數

  • 可以有效減少數據庫服務器的壓力,同時對于用戶也比較友好

  • 在工作中,一定注意多使用分頁查詢

7.Update修改

使用示例:

-- 將孫悟空同學數學成績變為80update exam set math=80 where name='孫悟空';-- 將總成績倒數前3的數學成績加上5分# 先查看原始數據
select name, chinese+math+english as sum from exam where chinese+math+english is not null order by sum asc limit 3;# 注意 where語句中不可以隨意起別名
-- 錯誤示范select name, chinese+math+english from exam where chinese+math+english as sum is not null order by sum asc limit 3;
update exam set math=math+5 where chinese + math + english is not null order by chinese + math + english  asc limit 3;# 查看查詢結果
select name, chinese+math+english as sum from exam where name in ('宋公明', '劉玄德', '唐三藏') order by sum asc;

注意點:

  • 在原值的基礎上做變更時,不能使用math+=30這樣的語法

  • 不加where條件時,會導致全表數據被更新,謹慎操作

  • 一般情況下類似于這樣的更新update exam set math=80 where name='孫悟空';最為合適,先用where語句過濾,再進行更新

8.Delete刪除

使用示例:

-- 刪除表中一項數據
# 刪除表中孫悟空的成績
delete from exam where name = '孫悟空';-- 刪除整張表的數據
# 準備一個測試表作為備份
create table if not exists t_delete(id int,name varchar(20)
);
# 插入被測數據
insert into t_delete(id,name) values (1, 'A'), (2, 'B'), (3, 'C');#刪除表格中的數據
delete from t_delete;

注意點:

  • 如果執行delete操作不加限制條件,會將整個表中的數據全部刪除,謹慎使用

  • MySQL服務如果開啟了二進制日志,每一次的insert、update、delete操作都會記錄在二進制日志里,如果需要恢復數據,可以讀取日志中的記錄,再進行反操作即可、

  • 注意delete只是刪除表中的數據,并不會刪除表,刪除表需要用到表的操作中的drop,注意不要搞混淆

9.截斷表

使用示例:

-- 創建測試表
# 檢查判斷
drop table if exists t_truncate;
create table t_truncate(id bigint primary key auto_increment,name varchar(20)
);# 插入測試數據
insert into t_truncate(name) values ('A'), ('B'), ('C');-- 顯示建表結構 -- 以下是在命令行窗口中進行 AUTO_INCREMENT=4
mysql> show create table t_truncate;
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                   |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_truncate | CREATE TABLE `t_truncate` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)-- 截斷表 
mysql> truncate table t_truncate;
Query OK, 0 rows affected (0.03 sec)
-- 顯示截斷后表的結構 發現AUTO_INCREMENT 被重置為0
mysql> show create table t_truncate;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table|
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_truncate | CREATE TABLE `t_truncate` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-- 繼續寫入數據 AUTO_INCREMENT為1
insert into t_truncate(name) values('d');

注意點:

  • 只能對整表操作,不能像delete一樣對部分數據刪除

  • 執行truncate操作時會把表的狀態重置為初始狀態,表中的數據也會被清除

  • 執行truncate不對數據操作所以比delete更快,truncate在刪除數據的時候,不經過真正的事務,所以無法回滾

  • 會重置auto_increment

10.插入查詢結果

使用示例:


-- 刪除表中的重復數據
#首先創建測試表
drop table if exists t_record;
create table t_record(id int,name varchar(20)
);#插入測試數據
insert into t_record(id,name) values
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');# 創建一張新表,表結構與t_record相同
drop table if exists t_record_new;
create table t_record_new like t_record;# 原來表中的數據去重之后copy進入新表
insert into t_record_new select distinct * from t_record;   -- 核心步驟#新表與原來表重命名
rename table t_record to t_record_old, t_record_new to t_record; 

注意點:

  • 對于重命名表和數據表的遷移一般是由數據庫管理員DBA來操作

  • 原始表中的數據一般都不會主動刪除,但是真正查詢時不需要重復的數據,如果每次查詢都使用distinct進行去重操作,會嚴重影響效率。可以創建一張與t_record表結構相同的表,把去重的記錄寫入新表中,以后查詢都從新表中查,這樣真實數據不會丟失,同時也能保證查詢效率

11.聚合函數

常見聚合函數:

-- count統計exam表中某一列數據的量
select count(*) from exam;
select count(math) from exam;-- 語文成績小于50 的學生人數
select count(chinese) from exam where chinese < 50;-- sum統計某一列數據的總和
select sum(math) from exam;# 無法統計非數值列的和
select sum(name) from exam;-- avg統計某一列的平均數
select avg(math) from exam;# 統計總分平均分
select round(avg(chinese + math + english),2) as 總分 from exam ;-- 類比max、min用法與上述例子類似,此處不再一一贅述

12.group by分組查詢

使用示例:

-- 準備測試表
drop table if exists emp;
create table emp(id bigint primary key auto_increment,name varchar(20) not null,role varchar(20) not null,salary decimal(10,2) not null
);# 插入測試用例
insert into emp values (1, '馬云', '老板', 1500000.00);
insert into emp values (2, '馬化騰', '老板', 1800000.00);
insert into emp values (3, '鑫哥', '講師', 10000.00);
insert into emp values (4, '博哥', '講師', 12000.00);
insert into emp values (5, '平姐', '學管', 9000.00);
insert into emp values (6, '瑩姐', '學管', 8000.00);
insert into emp values (7, '孫悟空', '游戲角色', 956.8);
insert into emp values (8, '豬悟能', '游戲角色', 700.5);
insert into emp values (9, '沙和尚', '游戲角色', 333.3);-- 統計每個角色的人數
select role, count(*) as sum from emp group by role;-- 統計每一個角色的最高、最低工資、平均工資
select role, avg(salary), min(salary), max(salary) from emp group by role;-- 顯示平均工資低于1500的角色和它的平均工資  -- having 語句支持別名
select role, avg(salary) as avg from emp group by role having avg < 1500; 
--  having 與 group by的順序不可以顛倒

注意點:

  • 使用group by進行分組處理之后,對分組的結果進行過濾的時候,不能使用where子句,而要使用having子句

  • Having 用于對分組結果的條件過濾

  • where用于對表中真實數據的條件過濾

  • 在group by執行之前,where已經執行過了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73266.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式C++

針對一些經典的常見的場景, 給定了一些對應的解決方案&#xff0c;這個就叫設計模式。 設計模式的作用&#xff1a;使代碼的可重用性高&#xff0c;可讀性強&#xff0c;靈活性好&#xff0c;可維護性強。 設計原則&#xff1a; 單一職責原則&#xff1a;一個類只做一方面的…

STM32上實現簡化版的AUTOSAR DEM模塊

文章目錄 摘要摘要 在一些可以不使用AUTOSAR的項目中,往往也有故障檢測和DTC存儲的需求,開發一套類似于AUTOSAR DEM模塊的軟件代碼,能夠滿足DTC的檢出和存儲,使用FalshDB代替Nvm模塊,輕松構建持久化存儲,如果你也有這樣的需求,請閱讀本篇,希望能夠幫到你。 /*********…

html css網頁制作成品——糖果屋網頁設計(4頁)附源碼

目錄 一、&#x1f468;?&#x1f393;網站題目 二、??網站描述 三、&#x1f4da;網站介紹 四、&#x1f310;網站效果 五、&#x1fa93; 代碼實現 &#x1f9f1;HTML 六、&#x1f947; 如何讓學習不再盲目 七、&#x1f381;更多干貨 一、&#x1f468;?&#x1f…

Postman下載安裝及簡單入門

一&#xff0e;Postman簡介 Postman是一款API測試工具&#xff0c;可以幫助開發、測試人員發送HTTP請求&#xff0c;與各種API進行交互&#xff0c;并分析響應 二&#xff0e;下載與安裝 訪問Postman官網&#xff08;https://www.postman.com/&#xff09;&#xff0c;下載適…

免費blender模型網站推薦

前言:博主最近在玩blender建模,有時為了節省時間想用現成的模型,網上零零碎碎的大多多需要付費,自己找了些好用且免費的blender素材庫網站,希望對你有幫助 綜合資源網站 Blender布的 網址:https://blenderco.cn/ 簡介:提供上萬個Blender模型、插件、貼圖資源,更新頻率高…

基于C語言的簡單HTTP Web服務器實現

1. 概述 本案例使用C語言實現了一個簡單的HTTP服務器&#xff0c;能夠處理客戶端的GET請求&#xff0c;并返回靜態文件&#xff08;如HTML、圖片等&#xff09;。在此案例中案例&#xff0c;我們主要使用的知識點有&#xff1a; Socket編程&#xff1a;基于TCP協議的Socket通信…

大型語言模型與強化學習的融合:邁向通用人工智能的新范式

1. 引言 大型語言模型&#xff08;LLM&#xff09;在自然語言處理領域的突破&#xff0c;展現了強大的知識存儲、推理和生成能力&#xff0c;為人工智能帶來了新的可能性。強化學習&#xff08;RL&#xff09;作為一種通過與環境交互學習最優策略的方法&#xff0c;在智能體訓…

langchain--LCEL

文章目錄 介紹優勢運行接口 介紹 LCEL的全稱是Lang Chain Expression Language。其實他的用處就是使用“|”運算符鏈接LangChain應用的各個組件。 是一種聲明式的方法來鏈接Langchain組件。LCEL從第一天起就被設計為支持將原型投入生產&#xff0c;無需代碼更改&#xff0c;從…

PyQt基礎——簡單的窗口化界面搭建以及槽函數跳轉

一、代碼實現 import sysfrom PyQt6.QtGui import QPixmap from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox from PyQt6.uic import loadUi from PyQt6.QtCore import Qtclass LoginWindow(QWidget):def __init__(self):sup…

Android 11.0 監聽某個app啟動或者退出功能實現

1.前言 在進行11.0的系統定制開發中,在某些app的定制過程中,需要知道某個app的啟動記錄和退出記錄, 所以就需要監聽某個app的啟動和退出的過程,需要在Activity的生命周期中來實現監聽功能 2.監聽某個app啟動或者退出功能實現的核心類 frameworks\base\core\java\android…

再談 Multiscale deformable attention

文章目錄 DCN 可變形卷積單尺度 deformable attention多尺度&#xff08;multiscale&#xff09; deformable attention精華代碼&#xff1a;deformbale attentionattention 計算&#xff1a;獲取不同尺度參考點&#xff1a; DCN 可變形卷積 deformable attention 靈感來源可變…

Java 大視界 -- Java 大數據在智慧文旅虛擬導游與個性化推薦中的應用(130)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

多源 BFS_多源最短路(十八)542. 01 矩陣 中等 超級源點思想

542. 01 矩陣 給定一個由 0 和 1 組成的矩陣 mat &#xff0c;請輸出一個大小相同的矩陣&#xff0c;其中每一個格子是 mat 中對應位置元素到最近的 0 的距離。 兩個相鄰元素間的距離為 1 。 示例 1&#xff1a; 輸入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 輸出&#xff…

Ubuntu24.04 LTS 版本 Linux 系統在線和離線安裝 Docker 和 Docker compose

一、更換軟件源并更新系統 在 Ubuntu 24.04 LTS 中&#xff0c;系統引入了全新的軟件源配置格式。現在的源配置文件內容更加結構化且清晰&#xff0c;主要包含了軟件類型 (Types)、源地址 (URIs)、版本代號 (Suites) 以及組件 (Components) 等信息。 # cat /etc/apt/sources.li…

c++介紹智能指針 十二(2)

智能指針share_ptr,與unique_ptr不同&#xff0c;多個shar_ptr對象可以共同管理一個指針&#xff0c;它們通過一個共同的引用計數器來管理指針。當一個智能指針對象銷毀時&#xff0c;計數器減一。當計數器為0時&#xff0c;會將所指向的內存對象釋放。 #include<memory>…

react和vue 基礎使用對比

1.實現功能&#xff08;ts&#xff09; 0.基礎屬性使用 1.組件直接的通信 2.useState 動態修改值 3.循環遍歷功能 4.實現類型vue 的 watch &#xff0c;filter&#xff0c;computed 屬性功能 5.實現類似vue2的生命周期 5.類型vue v-if功能的實現 2.文件結構圖 3.具體代碼 in…

深度學習 常見優化器

一、基礎優化器 隨機梯度下降&#xff08;SGD&#xff09; ? 核心&#xff1a;?θJ(θ) η * ?θJ(θ) ? 特點&#xff1a;學習率固定&#xff0c;收斂路徑震蕩大 ? 適用場景&#xff1a;簡單凸優化問題 ? 改進方向&#xff1a;動量加速 二、動量系優化器 2. SGD with…

監控快手關注列表更新以及去視頻水印視頻

def printData(self):if len(self.UpdateDataList) > 0:self.UpdateDataList sorted(self.UpdateDataList, keylambda x: x[minutes]) # 先更新的在前sucess 0for index, video in enumerate(self.UpdateDataList):minutes video[minutes]if minutes > self.updateIn…

前端 JavaScript 中快速發起多個下載請求時,解決瀏覽器的并發下載連接限制

為什么會漏掉鏈接&#xff1f; 當你在前端 JavaScript 中快速發起多個下載請求時&#xff0c;瀏覽器可能無法同時處理所有請求&#xff0c;導致一些請求被忽略。這通常與瀏覽器的并發連接限制有關&#xff0c;例如 Chrome 可能限制每秒下載 10 個文件。 如何避免漏掉鏈接&…

如何修改桌面圖標——文件夾圖標(Windows 10)

修改文件夾圖標 EX&#xff1a;新建文件夾&#xff0c;程序創建文件夾等 修改桌面文件夾圖標&#xff0c;打開右鍵菜單功能項&#xff0c;點擊“屬性” 在屬性窗口頁面找到并單擊自定義&#xff0c;然后點擊“更改圖標” 從列表中選擇喜歡的圖標&#xff0c;或點擊瀏覽選擇個…