[MySQL初階]MySQL(4)基本查詢

標題:[MySQL初階]MySQL(4)基本查詢
@水墨不寫bug

在這里插入圖片描述

文章目錄

  • 一. 數據表設計
  • 二、對數據表的操作
    • 1. Create 操作(插入數據)
      • 查看最近受影響的行數:
    • 2. Retrieve 操作(讀取數據)
      • (1)基本查詢的用法:
      • (2)where子句詳解
        • i. 基本語法
        • ii. 常用運算符
          • 比較運算符
          • 邏輯運算符
          • 模糊匹配(LIKE)
          • NULL 值比較
      • (3)order by子句詳解
        • i. 基本語法
        • ii. 核心用法
          • 單列排序
          • 多列排序
      • (4)limit子句
        • i. 基本語法
        • ii. 核心用法
          • (1) 獲取前 N 條記錄
          • (2) 分頁查詢
    • 3. Update 操作(更新數據)
    • 4. Delete 操作(刪除數據)
  • 三、總結


本文講解MySQL數據庫的表的基本查詢操作(CURD操作):CRUD : Create(創建), Retrieve(讀取),Update(更新),Delete(刪除)
在這里,我將首先創建一個數據表,然后對這個表一邊操作,一邊講解。

一. 數據表設計

首先,我們設計一個用戶管理系統,以它內部的 users 表為例,表結構如下:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT COMMENT '員工ID',username VARCHAR(50) NOT NULL UNIQUE COMMENT '名字',email VARCHAR(100) NOT NULL UNIQUE COMMENT '郵箱',password_hash CHAR(60) NOT NULL COMMENT '密碼',created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '創建賬戶時間',last_login DATETIME COMMENT '最后一次登錄時間',is_active BOOLEAN DEFAULT 1 COMMENT '用戶是否活躍'
);

二、對數據表的操作

1. Create 操作(插入數據)

插入數據語法

  • 單行數據+全列插入:

一次插入一行數據,每次全列插入

insert into users(id,username,email,password_hash,created_at,last_login,is_active) values (1,'zhangsan','123@qq.com','60個字符',NOW(),NOW(),TRUE);

在這里插入圖片描述

  • 多行數據+指定列插入:
-- 插入多行數據,指定 username、email、password_hash、is_active 列
INSERT INTO users (username, email, password_hash, is_active)
VALUES ('lisi', '000@ex.com', '$2a$10$abc...', 1),  -- 顯式指定 is_active('sunwukong', 'wukong@xe.com', '$2a$10$xyz...', 0);

為了方便起見,這里我們假設插入一個較小的數據表。

  • 插入沖突是否更新:
insert into tb_name(name,qq) values('zhangsan','123') on duplicate key update name = 'lisi',qq = '234';

插入數據:

嘗試插入一條記錄,name 為 ‘zhangsan’,qq 為 ‘123’。

沖突處理:

如果插入的數據與表中已有的 主鍵或唯一鍵 沖突(例如 name 或 qq 字段有唯一約束),則執行 UPDATE 操作。

將沖突記錄的 name 更新為 'lisi',qq 更新為 '234'。

  • 替換
replace into tb_name (name, qq) values ('zhangsan', '123');

插入數據:

嘗試插入一條記錄,name 為 ‘zhangsan’,qq 為 ‘123’。

沖突處理:

如果插入的數據與表中已有的 主鍵或唯一鍵 沖突(例如 name 或 qq 字段有唯一約束),則會 先刪除沖突的行,再插入新行。

注意:REPLACE INTO 是 先刪除再插入,而不是更新。

查看最近受影響的行數:

select row_count();

可以查看最近受影響的行數。

2. Retrieve 操作(讀取數據)

語法

SELECT column1, column2, ... FROM table_name [WHERE ...];

這是最基本的查詢方式,在最基本的語句之間,我們可選擇加上一些選項。比較豐富的選項可以如下所示:

select distinct(是否去重) */列名 from tb_name where 查詢條件 order by 列名稱 asc/desc(排序條件) limit(限定查詢出來的數據的條目數);

(1)基本查詢的用法:

  • 全列查詢:
select * from tb_name;

一般不推薦全列查詢會輸出整張表的所有內容,對一個數據庫,數據量動輒上百萬,盲目全列查詢會占用網絡帶寬,并且導致刷屏或者機器死機,一般需要用limit指定查詢數據條目數。

  • 指定列查詢:
select 列名稱 from tb_name;

指定某一列內容輸出。

  • 列間關系運算

查詢的時候,可以進行列間運算

select name,math+chinese+english as total from tb_name;

顯示出來的是3列成績的綜合。其中as 代表重命名,每一列都可以重命名

select name 姓名,math 數學,english 英語,math + chinese + english 總分 from tb_name;
  • 結果去重
select distinct math from tb_name;

如果查詢結果有重復,比如有多個人得分95,只顯示一次95


(2)where子句詳解

MySQL 的 WHERE 子句用于在查詢中篩選符合特定條件的記錄。它是 SELECTUPDATEDELETE 等語句的核心組成部分,select幫助你選擇了某一張表,而where則是進一步選擇表中符合要求的數據;更直觀的來說,where字句類似于if條件判斷。


i. 基本語法
SELECT 列名 FROM 表名 WHERE 條件;
UPDATE 表名 SET=WHERE 條件;
DELETE FROM 表名 WHERE 條件;

ii. 常用運算符
比較運算符
  • =,<=>:等于
  • 注意:"="NULL不安全(無法參與NULL比較),如果想要與NULL值比較,需要用NULL安全的 <=> 例如:NULL <=> NULL 結果為TRUE。
    SELECT * FROM users WHERE age = 25;
    SELECT * FROM users WHERE address <=> NULL;
    
  • <>!=:不等于
    SELECT * FROM products WHERE price <>(或者!=100;
    
  • ><>=<=:關系比較
    SELECT * FROM orders WHERE sum_amount > 1000;
    
  • BETWEEN ...AND...:在范圍內(閉區間)
    SELECT * FROM employees WHERE salary BETWEEN 300 AND 1000;
    
  • IN:匹配列表中的任意值
    SELECT * FROM customers WHERE country IN ('China', 'Canada', 'Mexico');
    

邏輯運算符
  • AND:同時滿足多個條件
    SELECT * FROM students WHERE age >= 18 AND grade = 'A';
    
  • OR:滿足任意一個條件
    SELECT * FROM products WHERE category = 'aaa' OR price < 50;
    
  • NOT:否定條件
    SELECT * FROM employees WHERE NOT department = 'HR';
    
  • 注意優先級AND 優先級高于 OR,建議用括號明確邏輯:
    SELECT * FROM table 
    WHERE (condition1 OR condition2) AND condition3;
    

模糊匹配(LIKE)
  • %:匹配任意多個字符(包括零個)
    SELECT * FROM books WHERE title LIKE 'The%'; -- 以 "The" 開頭
    
  • _:匹配單個字符
    SELECT * FROM users WHERE username LIKE 'user_'; -- 如 "user1", "userA"
    

一句話總結, % 可以代表一個或者多個字符, _ 只能代表一個字符


NULL 值比較
  • IS NULL:檢查空值
    SELECT * FROM orders WHERE shipped_date IS NULL;
    
  • IS NOT NULL:檢查非空值
    SELECT * FROM contacts WHERE phone IS NOT NULL;
    

(3)order by子句詳解


MySQL 的 ORDER BY 子句用于對查詢結果進行排序,可以按單列、多列或表達式排序,并支持升序(ASC)降序(DESC)排列。它是優化數據展示和分析的重要工具。


i. 基本語法
SELECT 列名 
FROM 表名 
[WHERE 條件] 
ORDER BY 排序列1 [ASC|DESC], 排序列2 [ASC|DESC], ...;
  • 位置ORDER BY 必須位于 WHERE 子句之后,LIMIT 子句之前。
  • 默認排序:如果不指定 ASCDESC,默認為 ASC(升序)。

ii. 核心用法
單列排序
-- 按工資升序排列
SELECT name, salary FROM employees ORDER BY salary;-- 按入職日期降序排列
SELECT name, hire_date FROM employees ORDER BY hire_time DESC;
多列排序

按優先級依次排序,用逗號分隔:

-- 先按部門升序,再按工資降序
SELECT name, department, salary 
FROM employees 
ORDER BY department ASC, salary DESC;

表示先按照部門排序,部門一樣的再按照薪資排序。


(4)limit子句

MySQL 的 LIMIT 子句常與 ORDER BY 結合使用,用于在排序后的結果中篩選出特定范圍的數據(如分頁查詢、獲取前 N 條記錄)。以下是兩者的協同用法和關鍵細節:


i. 基本語法
SELECT 列名 
FROM 表名 
[WHERE 條件] 
ORDER BY 排序列 [ASC|DESC] 
LIMIT [偏移量,] 行數;
  • 執行順序
    WHEREORDER BYLIMIT
    (先過濾數據,再排序,最后截取結果)

  • 典型場景

    • 分頁查詢(如每頁 10 條)
    • 獲取前 N 名(如銷量最高的前 5 個商品)

ii. 核心用法
(1) 獲取前 N 條記錄
-- 獲取工資最高的前 3 名員工
SELECT name, salary 
FROM employees 
ORDER BY salary DESC 
LIMIT 3;
(2) 分頁查詢
-- 每頁 10 條,查詢第 3 頁(偏移量 = (頁碼-1)*每頁行數)
SELECT * 
FROM products 
ORDER BY price ASC 
LIMIT 20, 10; -- 偏移量為 20 條,取接下來的 10 條

3. Update 操作(更新數據)

對查詢到的結果進行列值更新
語法

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE ...
ORDER BY ... 
LIMIT ...;

實際場景

  1. 修改用戶郵箱

    UPDATE users 
    SET email = 'new@qq.com'
    WHERE id = 1; -- 明確指定條件,避免全表更新!
    

    不指明條件導致全表更新是致命的!

  2. 記錄用戶最后登錄時間

    UPDATE users 
    SET last_login = NOW() 
    WHERE username = 'ddsm';
    
  3. 批量禁用長時間未登錄用戶

    UPDATE users 
    SET is_active = 0 
    WHERE last_login < '2020-01-01';
    

4. Delete 操作(刪除數據)

語法

DELETE FROM table_name WHERE ... ORDER BY ... LIMIT ...;

實際場景:用戶注銷賬號

-- 物理刪除(謹慎操作!)
DELETE FROM users WHERE id = 1;-- 實際項目中更推薦軟刪除,如果誤刪還可以找回數據
UPDATE users SET is_active = 0 WHERE id = 1;

建議

  1. 生產環境優先使用軟刪除(通過 is_activedeleted_at 標記)。
  2. 刪除前檢查關聯數據(如用戶訂單需級聯處理,這涉及到外鍵約束,在以后的講解中會逐漸詳解)。

注意:

  • 沒有where子句的刪除,將刪除整張表的數據;但是表的結構不變;此外auto_increment不會歸0;
  • 刪除表內數據的另一種方法是
truncate tb_name;

特點是只能對整張表進行操作,不能對部分數據操作。由于mysql不對數據操作,因而比delete更快。truncate在刪除的時候,并不會經過真正的事務,所以無法回滾。此外auto_increment會被重置


三、總結

  • CreateINSERT 實現數據寫入,注意唯一性約束。
  • RetrieveSELECT 靈活組合DISTINCTWHEREORDER BYLIMIT 滿足查詢需求。
  • UpdateUPDATE 配合精確條件,避免誤操作。
  • Delete:優先軟刪除,物理刪除需事務+備份。


轉載請注明出處

在這里插入圖片描述

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

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

相關文章

小米智能音箱Pro搭載“超級小愛”,支持遠程控車

大家好,今天我要給大家好好嘮嘮小米智能音箱Pro,尤其是它搭載的“超級小愛”,那功能可太強大了,還支持遠程控車,真的是給我們的生活帶來了超多便利和驚喜。 先來說說這小米智能音箱Pro的外觀。它的設計非常簡約時尚,整體造型方方正正,線條流暢,放在家里任何一個角落都…

react中的useContext--為什么使用(一)

React 的數據傳遞流程 在 React 中&#xff0c;數據傳遞通常是自上而下的&#xff0c;也就是父組件把數據通過 props 傳遞給子組件&#xff0c;子組件無法直接修改父組件的數據。 例子&#xff1a;父組件向子組件傳遞數據 const Parent () > {const user { name: &quo…

如何使用 LLM 生成的術語自動在搜索應用程序上構建 autocomplete 功能

作者&#xff1a;來自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通過使用 LLM 生成的詞匯&#xff0c;為搜索應用增強自動補全功能&#xff0c;實現更智能、更動態的搜索建議。 自動補全是搜索應用中的一項關鍵功能&#xff0c;它通過在用戶輸入時實…

MAVEN手動配置(阿里云)全教程

介于網上各種各樣的MAVEN配置過程中方法大致相同卻細節參差不齊&#xff0c;我總結了我遇見的一些問題&#xff0c;來完全的解決MAVEN手動配置的全過程&#xff0c;以及分享解決小毛病的經驗。 所需材料&#xff1a; MAVEN3.9.9&#xff08;下載適合自己的版本即可&#xff09…

DeepSeek 3FS:端到端無緩存的存儲新范式

在 2025 年 2 月 28 日&#xff0c;DeepSeek 正式開源了其高性能分布式文件系統 3FS【1】&#xff0c;作為其開源周的壓軸項目&#xff0c;3FS 一經發布便引發了技術圈的熱烈討論。它不僅繼承了分布式存儲的經典設計&#xff0c;還通過極簡卻高效的架構&#xff0c;展現了存儲技…

HarmonyOS:如何將圖片轉為PixelMap并進行圖片緩存策略

前言&#xff1a;在HarmonyOS項目開發中&#xff0c;我們使用Ark-Ts語言開發項目。我們有個功能是拍照&#xff0c;除了正常顯示出來&#xff0c;并且上傳服務器。我在開發過程中&#xff0c;遇到的問題是&#xff0c;如果離開這個頁面再回到當前頁面仍要顯示圖片&#xff0c;那…

2025.3.9機器學習筆記:文獻閱讀

2025.3.9周報 一、文獻閱讀題目信息摘要Abstract創新點網絡架構實驗結論不足以及展望 一、文獻閱讀 題目信息 題目&#xff1a; Time-series generative adversarial networks for flood forecasting期刊&#xff1a; Journal of Hydrology作者&#xff1a; Peiyao Weng, Yu …

linux固定IP并解決虛擬機無法ping其他電腦問題

linux固定IP并解決虛擬機無法ping其他電腦問題 1.找到網卡文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 2.編輯文件信息 BOOTPROTO 這個dhcp改為static#添加以下內容IPADDR<你的IP地址>NETMASK<子網掩碼>&#xff0c;例如255.255.255.0。GATEWAY<網…

Spring實戰spring-ai運行

目錄 1. 配置 2 .搭建項目 3. 查看對應依賴 3.1 OpenAI 依賴 3.2 配置 OpenAI API 密鑰 application.properties application.yml 4. openai實戰 5. 運行和測試 6. 高級配置 示例&#xff1a;配置模型和參數 解釋&#xff1a; 7. 處理異常和錯誤 示例&#xff1a;…

docker:配置 Docker 鏡像加速器

1 鏡像加速器介紹 默認情況下&#xff0c;將來從docker hub&#xff08;https://hub.docker.com/&#xff09;上下載docker鏡像&#xff0c;太慢。一般都會配置鏡像加速器&#xff1a; USTC&#xff1a;中科大鏡像加速器&#xff08;https://docker.mirrors.ustc.edu.cn&…

[內網安全] Windows 本地認證 — NTLM 哈希和 LM 哈希

關注這個專欄的其他相關筆記&#xff1a;[內網安全] 內網滲透 - 學習手冊-CSDN博客 0x01&#xff1a;SAM 文件 & Windows 本地認證流程 0x0101&#xff1a;SAM 文件簡介 Windows 本地賬戶的登錄密碼是存儲在系統本地的 SAM 文件中的&#xff0c;在登錄 Windows 的時候&am…

算法-圖-dijkstra 最短路徑

理論知識 dijkstra三部曲 樸素版dijkstra 模擬過程 堆優化版dijksra 經典模版例題 Dijkstra求最短路 I 參加科學大會&#xff08;第六期模擬筆試&#xff09;--模版題 網絡延遲 ref 理論知識 最短路是圖論中的經典問題即&#xff1a;給出一個有向圖&#xff0c;一…

Qt添加MySql數據庫驅動

文章目錄 一. 安裝MySql二.編譯mysql動態鏈接庫 Qt版本&#xff1a;5.14.2 MySql版本&#xff1a;8.0.41 一. 安裝MySql 參考這里進行安裝&#xff1a;https://blog.csdn.net/qq_30150579/article/details/146042922 將mysql安裝目錄里的bin&#xff0c;include和lib拷貝出來…

淺論數據庫聚合:合理使用LambdaQueryWrapper和XML

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、數據庫聚合替代內存計算&#xff08;關鍵優化&#xff09;二、批量處理優化四、區域特殊處理解耦五、防御性編程增強 前言 技術認知點&#xff1a;使用 XM…

Ubuntu 22.04安裝NVIDIA A30顯卡驅動

一、安裝前準備 1.禁用Nouveau驅動 Ubuntu默認使用開源Nouveau驅動&#xff0c;需要手動禁用&#xff1a; vim /etc/modprobe.d/blacklist-nouveau.conf # 添加以下內容&#xff1a; blacklist nouveau options nouveau modeset0 # 更新內核并重啟&#xff1a; update-initr…

Docker Desktop 4.38 安裝與配置全流程指南(Windows平臺)

一、軟件定位與特性 Docker Desktop 是容器化應用開發與部署的一體化工具&#xff0c;支持在本地環境創建、管理和運行Docker容器。4.38版本新增GPU加速支持、WSL 2性能優化和Kubernetes 1.28集群管理功能&#xff0c;適用于微服務開發、CI/CD流水線搭建等場景。 二、安裝環境…

音視頻入門基礎:RTP專題(15)——FFmpeg源碼中,獲取RTP的視頻信息的實現

一、引言 通過FFmpeg命令可以獲取到SDP文件描述的RTP流的視頻壓縮編碼格式、色彩格式&#xff08;像素格式&#xff09;、分辨率、幀率信息&#xff1a; ffmpeg -protocol_whitelist "file,rtp,udp" -i XXX.sdp 本文以H.264為例講述FFmpeg到底是從哪個地方獲取到這…

深度學習---卷積神經網絡

一、卷積尺寸計算公式 二、池化 池化分為最大池化和平均池化 最常用的就是最大池化&#xff0c;可以認為最大池化不需要引入計算&#xff0c;而平均池化需要引出計算&#xff08;計算平均數&#xff09; 每種池化還分為Pooling和AdaptiveAvgPool Pooling(2)就是每2*2個格子…

netty中Future和ChannelHandler

netty中的Future&#xff0c;繼承自 jdk中的Future&#xff0c;&#xff0c; jdk中的Future&#xff0c;很垃圾&#xff0c;只能同步阻塞獲取結果&#xff0c;&#xff0c;&#xff0c; netty中的Future進行了升級&#xff0c;&#xff0c;可以addListener()異步獲取結果&…

java 初學知識點總結

自己總結著玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//類名用大寫字母開頭 } 2.輸入&#xff1a; (1)Scanner:可讀取各種類型&#xff0c;字符串相當于cin>>; Scanner anew Scanner(System.in); Scan…