[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.mzph.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…