【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作



Retrieve 检索
示例
1. 构造数据
创建表结构
create table exam1(id bigint, name varchar(20) comment'同学姓名', Chinesedecimal(3,1) comment '语文成绩', Math decimal(3,1) comment '数学成绩', English decimal(3,1) comment '英语成绩'
);
插入测试数据
insert into exam1(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);
2. Select
2.1 全列查询

select*from exam1;
+------+-----------+---------+------+---------+
| id | name | Chinese | Math | English |
+------+-----------+---------+------+---------+
| 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 *是一个很危险的操作:

- 只要涉及到硬盘操作和网络操作,就会消耗一定的硬盘带宽和网络带宽;
- 意味着硬盘和网卡的读写速度都是存在上限的,一旦触发大规模的 select * 意味着很可能就把 硬盘/网卡带宽给吃满了(堵车);
- 其他的客户端尝试访问数据库,访问操作就无法正常进行了;
- 如果针对公司的生产环境进行select*,就很可能使其他的用户访问数据库的时候,出现访问失败的情况;
- 当前阶段,数据库中,没啥数据,select*就无所谓了;以后再工作中,尤其是"生产环境",一定要慎重!!
2.2 指定列查询
语法
select 列名, 列名...... from 表名;

select id , name , Chinese from exam1; # 查询指定列select English, math, Chinese, name, id from exam1; # 按照指定的顺序查询
mysql 是一个客户端-服务器结构的程序,如果使用 select* 会消耗大量的硬盘带宽和网络带宽,这些带宽往往是比较稀缺的资源;因此,使用指定列查询,得到的数据量就比全列查询要少很多,查询要查询的列即可,没有必要一次性查询所有列;
2.3 查询字段为表达式
把所有学生的语文成绩加10分
select name, Chinese + 10 from exam1;
执行 select 就会遍历每一行,取出需要的列,把列代入到表达式中;
这样的结果,只是数据库查询过程中生成的临时表,数据库本体(数据库服务器硬盘上的数据)是没有任何改变的。
desc exam1;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | bigint | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| Chinese | decimal(3,1) | YES | | NULL | |
| Math | decimal(3,1) | YES | | NULL | |
| English | decimal(3,1) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
根据上述表结构我们可以发现, 如果Chinese +20,就意味着有些成绩的结果就会超出decimal(3,1) 类型约定的范围.
我们尝试一下查询 Chinese +20 操作,看看数据库查询超出类型范围会如何处理:
select name, Chinese + 20 from exam1;
+-----------+------------+
| name | Chinese+20 |
+-----------+------------+
| 唐三藏 | 87.0 |
| 孙悟空 | 107.0 |
| 猪悟能 | 108.0 |
| 曹孟德 | 102.0 |
| 刘玄德 | 75.0 |
| 孙权 | 90.0 |
| 宋公明 | 95.0 |
+-----------+------------+
7 rows in set (0.00 sec)
可以看到,虽然这个结果已经超出了 decimal(3,1) 的范围,但是依旧是可以查询,并且查询结果是正确的;所以我们需要明确:
- decimal(3,1) 这样的表的类型,是针对硬盘上存储的数据进行制约的;
- 但是我们当前的查询操作,得到的表中的计算结果,是临时的表数据,不会影响硬盘上的数据;,就可以不受 decimal(3,1) 这样的类型的约束;
- 换句话说,临时表的数据会尽可能保证查询结果是完整正确的,优先级高于类型约束;
在一个表达式中,还可以引入多个列参与运算
-- 总成绩查询select name , Chinese + math + English from exam1;
注意:表达式查询只能针对列和列之间进行运算,行和行之间的运算,后面会介绍聚合查询 ;
2.4 为查询结果指定别名
为总分这一列指定别名
如果表达式简单,一眼就能看明白;但是如果表达式比较复杂,就没法直观观察了;此处就可以给表达式取别名(别名只是针对临时表的列名产生修改),此时别名就是查询结果的列名:
select 表达式 as 别名from 表名;
select name , Chinese + math + English as total from exam1;

select name , Chinese + math + English total from exam1;
2.5 结果去重查询
语法
select distinct 列名 from 表名;
去重的意思,多个行的数据,如果出现相同的值,就会只保留一份
查询当前的数学成绩,并去除重复记录
-- 去重查询mysql> select distinct math from exam1;
去重查询对原来表中的数据无影响,再次查询得到的结果,依旧包含被上一次去重的数据;

3 Where 条件查询
语法
select 列名 from 表名 where 条件;
查询过程中,指定筛选条件,满足条件的记录就保留,不满足条件的就跳过.....
比较运算符

null 参与运算或者比较,得到的结果也是 null
mysql> insert into exam1 values(null, null , null, null, 90.0);
Query OK, 1 row affected (0.03 sec)select* from exam1;
+------+-----------+---------+------+---------+
| id | name | Chinese | Math | English |
+------+-----------+---------+------+---------+
| NULL | NULL | NULL | NULL | 90.0 |
+------+-----------+---------+------+---------+
8 rows in set (0.00 sec)select name, Chinese + math + English as total from exam1;
+-----------+-------+
| name | total |
+-----------+-------+
| NULL | NULL |
+-----------+-------+
8 rows in set (0.01 sec)
- null = null => null,此时的表达式的值是 null 的时候,条件就会判定为"不成立",也就相当于 false
- <=> 也是比较相等,能够针对 NULL 和 NULL 进行比较的.,NULL <=> NULL=> true
逻辑运算符

3.1 基本查询
遍历表的每个记录(每一行),把每一行的数据带入到条件中.
如果条件成立,这个记录就添加到结果集合中;如果不成立,就直接跳过.
查询英语不及格的同学及英语成绩
select name , English from exam1 where English < 60;
查询语文成绩大于英语成绩的同学
select name ,Chinese, English from exam1 where Chinese > English;
本次查询过程和刚刚一样,也是把每一条查询到的记录带入 where 后面的条件,把符合条件的记录添加到结果集,不满足条件的记录直接跳过;
别名无法作为 where 后面的条件
select name, Chinese + math + English as total from exam1 where total < 200;ERROR 1054 (42S22): Unknown column 'total' in 'where clause'
解析:这个错误其实是因为 SQL 语句执行顺序造成的:

虽然 where 是写在 SQL 语句末尾,但是执行顺序是在定义别名之前的 ,因此在执行 where 条件时,如果条件中有别名,该别名是未被定义的;
3.2 AND和OR
查询语文成绩大于80分且英语成绩大于80分的同学
select name , Chinese , English from exam1 where Chinese > 80 and English > 80;
查询语文成绩大于80分或英语成绩大于80分的同学
select name , Chinese , English from exam1 where Chinese > 80 or English > 80;
注意:
and 和 or 同时出现会有优先级,但是如果表达式比较复杂,包含多组 and 和 or,就给需要先运算的部分加括号即可;
3.3 范围查询
查询语文成绩在[80,90]分的同学及语文成绩
select name, Chinese from exam1 where Chinese between 80 and 90;

查询数学成绩是58 或者59 或者 98 或者99 分的同学及数学成绩
select name, math from exam1 where math in(58, 59, 98, 99);
总结
- 如果查询的区间是连续的,就使用 between....and;
- 如果查询的区间是离散的(某几个值),就使用 in() ;
3.4 模糊查询
不要求完全相等,只要满足一定的条件就可以了.

%匹配任意个数字符
-- 查询所有名字以孙开头的同学select* from exam1 where name like '孙%';-- 查询所有名字以孙结尾的同学select* from exam1 where name like '%孙';-- 查询所有名字有孙的同学select* from exam1 where name like '%孙%';
_匹配一个个数字符
select* from exam1 where name like '孙_'; -- 查询孙某select* from exam1 where name like '孙__'; -- 查询孙某某
想要查询名字中孙只在中间部分,不能在开头和结尾部分的需求,在数据库中实现有一定难度;
mysql 自带的模糊匹配功能相对比较弱;
如果后续要使用正则表达式,直接搜即可;在 sql 中,like 不能支持正则的,只能简单使用% 或者_来匹配;使用其他编程语言间接的操作 sql 即可;
3.5 NULL的查询
查询 id 为NULL的记录

select* from exam1 where id <=> null ; -- 使用 <=> 判断 id 是否为 nullselect* from exam1 where id is null; -- 使用 is 判断 id 是否为 null

4 Order by 排序
语法:
select 列名,列名.... from exam order by 列名 desc ; # 降序 (从高到低)select 列名,列名.... from exam order by 列名 asc ; # 升序 (从低到高)-- 注意:NULL被看做比任何值都小
注意:
- 数据库不会对于查询得到的结果集的顺序,做出任何承诺(不一定会根据序号,插入顺序...等等因素来决定结果集的顺序)除非 sql 中包含 order by
- 如果不写 order,得到的结果的顺序是不可预期的.....写代码就不能依赖这样的顺序;
按语文成绩从低到高排序(不指定顺序,默认从低到高)
select* from exam1 order by Chinese;
+------+-----------+---------+------+---------+
| id | name | Chinese | Math | English |
+------+-----------+---------+------+---------+
| 5 | 刘玄德 | 55.0 | 85.0 | 45.0 |
| 1 | 唐三藏 | 67.0 | 98.0 | 56.0 |
| 6 | 孙权 | 70.0 | 73.0 | 78.0 |
| 7 | 宋公明 | 75.0 | 65.0 | 30.0 |
| 4 | 曹孟德 | 82.0 | 84.0 | 67.0 |
| 2 | 孙悟空 | 87.0 | 78.0 | 77.0 |
| 3 | 猪悟能 | 88.0 | 98.0 | 90.0 |
+------+-----------+---------+------+---------+
7 rows in set (0.00 sec)
对语文进行排序后,每一行的数据也会以语文成绩为基准进行排序;
查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
select name, math, English, Chinese from exam1 order by
math desc,
English asc,
Chinese asc;+-----------+------+---------+---------+
| name | math | English | Chinese |
+-----------+------+---------+---------+
| 唐三藏 | 98.0 | 56.0 | 67.0 |
| 猪悟能 | 98.0 | 90.0 | 88.0 |
| 刘玄德 | 85.0 | 45.0 | 55.0 |
| 曹孟德 | 84.0 | 67.0 | 82.0 |
| 孙悟空 | 78.0 | 77.0 | 87.0 |
| 孙权 | 73.0 | 78.0 | 70.0 |
| 宋公明 | 65.0 | 30.0 | 75.0 |
+-----------+------+---------+---------+
7 rows in set (0.00 sec)

可以使用列的别名进行排序
select name, Chinese + Math + English as total from exam1 order by total desc;
+-----------+-------+
| name | total |
+-----------+-------+
| 猪悟能 | 276.0 |
| 孙悟空 | 242.0 |
| 曹孟德 | 233.0 |
| 唐三藏 | 221.0 |
| 孙权 | 221.0 |
| 刘玄德 | 185.0 |
| 宋公明 | 170.0 |
| NULL | NULL |
+-----------+-------+-- null 和任何数的计算结果都为 null

5 分页查询
- select *容易查询出太多的数据,导致机器挂掉;
- 通过指定列查询,虽然查到的结果是变少了很多,但是如果行数足够多的话,仍然是有可能会把机器搞出问题的;
- 此时更稳妥的做法,就是"分页查询",限制一次查询,最多能查到多少个记录;
5.1 查询第一页数据
select 列名 from 表名 limit num ;
5.2 使用LIMIT子句进行分页查询
-- 起始下标为 0-- 从0开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;-- 从 start 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;-- 从 start 开始,筛选 num条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;


相关文章:
【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作
Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…...
强大到工业层面的软件
电脑数据删不干净,简直是一种让人抓狂的折磨!明明已经把文件扔进了回收站,清空了,可那些残留的数据就像牛皮癣一样,怎么也除不掉。这种烦恼简直无处不在,让人从头到脚都感到无比烦躁。 首先,心…...
全面解析文件包含漏洞:原理、危害与防护
目录 前言 漏洞介绍 漏洞原理 产生条件 攻击方式 造成的影响 经典漏洞介绍 防御措施 结语 前言 在当今复杂的网络安全环境中,文件包含漏洞就像潜藏在暗处的危险陷阱,随时可能对防护薄弱的 Web 应用发起致命攻击。随着互联网的迅猛发展ÿ…...
基于Django的Boss直聘IT岗位可视化分析系统的设计与实现
【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言,利用Django这一高效、安全的W…...
SSM开发(三) spring与mybatis整合(含完整运行demo源码)
目录 本文主要内容 一、Spring整合MyBatis的三个关键点 二、整合步骤 1、创建一个Maven项目 2、在pom.xml文件中添加jar包的依赖 3、配置MyBatis 注解实现方式 XML配置文件实现 4、配置Spring 5、测试运行 本文主要内容 1. Spring + Mybatis整合; 2. MyBatis两种SQL…...
【Rust自学】14.6. 安装二进制crate
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包,它应…...
【Redis】hash 类型的介绍和常用命令
1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构,存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…...
低代码产品表单渲染架构
在React和Vue没有流行起来的时候,低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子: 产品层 用户通过打开表单,使用不同业务场景业务下的表单页面,中间的Render层就是技术实现。 每一个不同业务的表单…...
深入理解 C 语言基本数据类型:从常量变量到输入输出
深入理解 C 语言基本数据类型:从常量变量到输入输出 在 C 语言的世界里,数据是程序运行的核心,而对数据类型的掌握则是编写高效、准确程序的基础。今天,就让我们一起深入探讨 C 语言中的基本数据类型。 一、数据的表现形式 在 C …...
多线程-线程池的使用
1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么 Java 中的线程存在哪几种状态呢?Java 中的线程 状态被定义在了 java.lang.Thread.…...
计算机网络 IP 网络层 2 (重置版)
IP的简介: IP 地址是互联网协议地址(Internet Protocol Address)的简称,是分配给连接到互联网的设备的唯一标识符,用于在网络中定位和通信。 IP编制的历史阶段: 1,分类的IP地址: …...
Linux学习笔记——网络管理命令
一、网络基础知识 TCP/IP四层模型 以太网地址(MAC地址): 段16进制数据 IP地址: 子网掩码: 二、接口管命令 ip命令:字符终端,立即生效,重启配置会丢失 nmcli命令:字符…...
供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇
综述 我们之前在供应链系统设计-中台系统设计系列(五)- 供应链中台实践概述文章中针对中台到底是什么进行了描述,对于中台的范围也进行划分,如下图所示: 关于商品中心,我们之前用4篇文章介绍了什么是商品中…...
C++,STL 简介:历史、组成、优势
文章目录 引言一、STL 的历史STL 的核心组成三、STL 的核心优势四、结语进一步学习资源: 引言 C 是一门强大且灵活的编程语言,但其真正的魅力之一在于其标准库——尤其是标准模板库(Standard Template Library, STL)。STL 提供了…...
OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!
文本转语音(TTS)技术已经成为人工智能领域的重要一环,无论是语音助手、教育内容生成,还是音频文章创作,TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS,一款基于 Microsoft Edge 在线文本…...
手写instanceof、手写new操作符
文章目录 1 手写instanceof2 手写new操作符 1 手写instanceof instanceof:用于判断构造函数的prototype属性是否出现在对象原型链中的任何位置实现步骤: 获取类型的原型。获取对象的原型。一直循环判断对象的原型是否等于构造函数的原型对象,…...
29. C语言 可变参数详解
本章目录: 前言可变参数的基本概念可变参数的工作原理如何使用可变参数 示例:计算多个整数的平均值解析: 更复杂的可变参数示例:打印可变数量的字符串解析: 总结 前言 在C语言中,函数参数的数量通常是固定的ÿ…...
蓝桥杯python语言基础(5)——函数
目录 一、作业:四个函数 二、math 三、collections 1. Counter 2. deque 3. defaultdict 4. OrderedDict 四、heapq 五、functool partial偏函数 六、itertools 1.无限迭代器 2.有限迭代器 3.排列组合迭代器 一、作业:四个函数 计算最大公…...
node 爬虫开发内存处理 zp_stoken 作为案例分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言 主要说3种我们补环境过后如果用…...
006 LocalStorage和SessionStorage
JWT存储在LocalStorage与SessionStorage里的区别和共同点如下: 区别 数据有效期: • LocalStorage:始终有效,存储的数据会一直保留在浏览器中,即使窗口或浏览器关闭也一直保存,因此常用作持久数据。 • Se…...
USB鼠标的数据格式
USB鼠标的数据格式由HID(Human Interface Device)协议定义,通常包含3个字节的标准数据,具体格式如下: 字节内容描述第1字节按键状态Bit 0: 左键按下(1)<br>Bit 1: 右键按下(1…...
Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)
struct STRUCT(结构体)是一种复合数据类型,它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据,例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…...
冯诺依曼系统及操作系统
目录 一.冯诺依曼体系结构 二.操作系统 三.系统调用和库函数概念 一.冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系 截至目前,我们所认识的计算机,都是由一…...
E. Binary Search
题目链接:Problem - E - Codeforces 题目大意: 初始时有 l1,rn1。 如果当前 r−l1,退出二分查找,并且认定 l为二分查找的结果。定义 m⌊2lr⌋。如果 m≤x,将 l 赋值为 m,否则将 r 赋值为 m。 不断重复…...
P11468 有向树
有向树 题目描述 给定一棵 n n n 个结点的树,将树上所有的无向边变成给定方向的有向边,求所有简单路径的长度之和。 有向图中 a 1 a_1 a1 到 a x a_x ax 的简单路径是形如 a 1 → a 2 → a 3 → ⋯ → a x a_1 \rightarrow a_2 \rightarrow a…...
Scrapy如何设置iP,并实现IP重用, IP代理池重用
前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP 🔒 & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…...
Vue.js组件开发-使用Vue3如何实现上传word作为打印模版
使用Vue 3实现Word模板上传、解析和打印功能的完整解决方案: 一、实现步骤 安装依赖创建文件上传组件实现.docx文件解析创建打印预览组件实现打印功能样式优化 二、完整代码实现 1. 安装依赖 npm install mammoth axios2. 创建文件上传组件(FileUploa…...
HTML<kbd>标签
例子 在文档中将一些文本定义为键盘输入: <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…...
如何运用python爬虫爬取知网相关内容信息?
爬取知网内容的详细过程 爬取知网内容需要考虑多个因素,包括网站的结构、反爬虫机制等。以下是一个详细的步骤和代码实现,帮助你使用Python爬取知网上的论文信息。 1. 数据准备 首先,需要准备一些基础数据,如知网的URL、请求头…...
Codeforces Round 130 (Div. 2) E. Blood Cousins(LCA+DFS序+二分)【2100】
题目链接 https://codeforces.com/contest/208/problem/E 思路 此题有两个要点:第一,快速找到节点 u u u的 p p p级祖先。第二,在以节点 u u u为根的子树中找到与节点 u u u深度相同的节点的个数。 对于第一点,我们可以使用LC…...




