【MySQL】查询操作(基础篇)

目录
1、查询操作(Retrieve)
1.1 全列查询
1.2 指定列查询
1.3 查询字段为表达式
1.4 别名
1.5 去重:DISTINCT
1.6 排序:ORDER BY
1.7 条件查询:WHERE
1.8 分页查询
1、查询操作(Retrieve)
查询操作算的上是 SQL 中最复杂的操作了,这里我们以基础的为主要。
1.1 全列查询
查询表里的所有的列,是我们初学阶段比较常见的一个操作:
-- select * from 表名;
select * from student;
+------+--------+------+
| id | name | sex |
+------+--------+------+
| 1 | 张三 | 男 |
| 2 | 小美 | 女 |
| 3 | 赵六 | 男 |
| 4 | 李四 | NULL |
+------+--------+------+
-- 4 rows in set (0.00 sec)
通过 select * from 表名; 的方式来查询,* 表示为通配符,代表了所有的列,无论表中是啥样的,里面有几列,啥名字都没关系,都可以用 * 来表示所有。
对于我们学习阶段来说,这个操作还好,但是在公司里,特别是生产环境上,可不能随便执行 select * 这样的操作,进行这个操作就相当于我们的 MySQL 服务端给服务器发送了一条指令,服务器给我们返回对应指令查询到的结果,如果数据量非常大,以 TB 为单位的话,此处的查询操作就会遍历所有的数据,把数据从服务器硬盘上读出来,通过网卡进行发送回客户端。在数据量特别大的时候,就会把硬盘 IO 吃满或者网络带宽也吃满了!此时外面其他的用户想要访问这个服务器,因为这个查询操作把带宽或IO吃满了,就可能出现无法正常使用的情况!
1.2 指定列查询
这个查询不用按照表中列的顺序来查询,只要表中包含该列即可:
select name, id from student;
+--------+------+
| name | id |
+--------+------+
| 张三 | 1 |
| 小美 | 2 |
| 赵六 | 3 |
| 李四 | 4 |
+--------+------+
-- 4 rows in set (0.00 sec)
这里其实也就是把 * 改成了我们想要查询的指定列,每个列中间用英文的逗号来隔开!
1.3 查询字段为表达式
这里我们为了更好的演示接下来的操作,我们重新创建一张表,包含更合理的字段:
drop table student;
create table student (id int,name varchar(10), sex varchar(1), java float(5, 2),python float(5, 2));
insert into student value(1, '张三', '男', 88.2, 87.9),(2, '李四', '男', 92.5, 78.2),(3, '小美', '女', 80.9, 68.6),(4, '小花', '男', 97.0, 71.3);
我们先来看一下新创造出的这张表中全部的数据:
select * from student;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 78.20 |
| 3 | 小美 | 女 | 80.90 | 68.60 |
| 4 | 小花 | 男 | 97.00 | 71.30 |
+------+--------+------+-------+--------+
-- 4 rows in set (0.00 sec)
这里可以发现各位同学的 java 考试分数都很不错啊,为了防止他们骄傲,Java 老师决定不给他们公开真实的分数,而是给每位同学展示 java 扣 10 分后的结果,于是可这样写 SQL :
select id, name, sex, java - 10 from student;
+------+--------+------+-----------+
| id | name | sex | java - 10 |
+------+--------+------+-----------+
| 1 | 张三 | 男 | 78.20 |
| 2 | 李四 | 男 | 82.50 |
| 3 | 小美 | 女 | 70.90 |
| 4 | 小花 | 男 | 87.00 |
+------+--------+------+-----------+
-- 4 rows in set (0.00 sec)
这里我们要注意的是,select 只是查询,并不会修改原来表中的数据,而查询的结果是一个 "临时表",这个查询出来的表是不会写到硬盘里面去的。
注意:select 只是查询,并不会修改原来的数据!
如果现在是班主任,想统计一下每个同学的总分,也就是 java+python 的分数,当然也是可以的,SQL 可以这样去写:
select id, name, sex, java + python from student;
+------+--------+------+---------------+
| id | name | sex | java + python |
+------+--------+------+---------------+
| 1 | 张三 | 男 | 176.10 |
| 2 | 李四 | 男 | 170.70 |
| 3 | 小美 | 女 | 149.50 |
| 4 | 小花 | 男 | 168.30 |
+------+--------+------+---------------+
-- 4 rows in set (0.00 sec)
而这些表达式查询呢,只能针对每一行,对应的列进行运算,是无法做到行于行之间的运算的,比如我要求 java 考试分数的总和,这个我们到后面进阶篇会讲解。
上述的表达式查询,可能有不少小伙伴发现了,给每个同学的 java 分数减少 10 分,这一列的列名居然是 java - 10,那这一下子不就露馅了吗?都知道老师给自己扣了 10 分,这可不行啊,于是我们可以给字段起一个别名!
1.4 别名
为查询中的指定列指定别名,返回的结果集中,以别名作为该列的名称,例如还是每位同学 java 扣 10 分:
select id, name, sex, java - 10 as java from student;
+------+--------+------+-------+
| id | name | sex | java |
+------+--------+------+-------+
| 1 | 张三 | 男 | 78.20 |
| 2 | 李四 | 男 | 82.50 |
| 3 | 小美 | 女 | 70.90 |
| 4 | 小花 | 男 | 87.00 |
+------+--------+------+-------+
-- 4 rows in set (0.00 sec)
这样就万无一失了,我们通过 as 来指定该列的别名,其实这个 as 可以省略掉,中间用空格隔开就行,但建议还是带上 as ,这样 SQL 的可读性就更高了!
1.5 去重:DISTINCT
这里为了看到效果,我们来插入两条数据:
insert into student value(5, '李四', '男', null, null),(6, '小花', '女', null, null);
先不去重来查询下 name 这一列:
select name from student;
+--------+
| name |
+--------+
| 张三 |
| 李四 |
| 小美 |
| 小花 |
| 李四 |
| 小花 |
+--------+
-- 6 rows in set (0.00 sec)
通过查询结果能发现,小李和小花重复出现了一次,如何去掉一列中重复出现的数据呢?
select distinct name from student;
+--------+
| name |
+--------+
| 张三 |
| 李四 |
| 小美 |
| 小花 |
+--------+
-- 4 rows in set (0.00 sec)
注意:这里的 distinct 是要给哪列去重就加在哪列的前面即可,中间用空格隔开! 当然也能指定多列,但是就要满足指定列都相同才算重复!
1.6 排序:ORDER BY
比如现在我们有个需求,需要按照总成绩从高到低排序,这里就可以使用 order by 了:
select id, name, sex, java + python as 总分 from student order by 总分;
+------+--------+------+--------+
| id | name | sex | 总分 |
+------+--------+------+--------+
| 5 | 李四 | 男 | NULL |
| 6 | 小花 | 女 | NULL |
| 3 | 小美 | 女 | 149.50 |
| 4 | 小花 | 男 | 168.30 |
| 2 | 李四 | 男 | 170.70 |
| 1 | 张三 | 男 | 176.10 |
+------+--------+------+--------+
-- 6 rows in set (0.00 sec)
order by 后面的总分,指的是对总分这一列排序,默认是升序,当然 order by 总分,也能换成 order by java + python, 也是可以的!
注意:在 SQL 中 NULL 和 任何值计算都是 NULL,而且 NULL 是最小的值!!!
既然默认是升序,那么我们也可以降序排序,只需要在后面加上 desc 就可以了,这里的 desc 和查看表结构的 desc 不同,一个是 describe,一个是 descend!
select id, name, sex, java + python as 总分 from student order by 总分 desc;
+------+--------+------+--------+
| id | name | sex | 总分 |
+------+--------+------+--------+
| 1 | 张三 | 男 | 176.10 |
| 2 | 李四 | 男 | 170.70 |
| 4 | 小花 | 男 | 168.30 |
| 3 | 小美 | 女 | 149.50 |
| 5 | 李四 | 男 | NULL |
| 6 | 小花 | 女 | NULL |
+------+--------+------+--------+
-- 6 rows in set (0.00 sec)
那么实际中会不会有这样一种情况?先是按照 java 分数从低到高排序,如果 java 分数一样,就按照 python 从高到低排序呢?当然是有的,这种我们称为指定多个列排序:
select id, name, sex, java, python from student order by java asc, python desc;
+------+--------+------+-------+--------+
| id | name | sex | java | python |
+------+--------+------+-------+--------+
| 5 | 李四 | 男 | NULL | NULL |
| 6 | 小花 | 女 | NULL | NULL |
| 3 | 小美 | 女 | 80.90 | 68.60 |
| 1 | 张三 | 男 | 88.20 | 87.90 |
| 2 | 李四 | 男 | 92.50 | 78.20 |
| 4 | 小花 | 男 | 97.00 | 71.30 |
+------+--------+------+-------+--------+
-- 6 rows in set (0.00 sec)
升序(默认):asc,降序:desc,升序是可以不写这个 asc,加上也无妨!
1.7 条件查询:WHERE
在了解条件查询之前,我们需要先了解 MySQL 中的一些运算符:
比较运算符:
| 运算符 | 说明 |
|---|---|
| >,>=,<,<= | 大于,大于等于,小于,小于等于 |
| = | 等于,NULL不安全,例如 NULL = NULL 的结果是 NULL |
| <=> | 等于,NULL安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
| !=,<> | 不等于(第一种用的偏多) |
| BETWEEN a0 AND a1 | 范围匹配,[a0,a1] 如果 a0 <= value <= a1 返回 TRUE(1) |
| IN (option,...) | 如果是 option 中的任意一个,返回 TRUE(1) |
| IS NULL | 是 NULL |
| IS NOT NULL | 不是 NULL |
| LIKE | 模糊匹配,% 表示任意多个(包括 0 个) 任意字符;_ 表示任意一个字符 |
逻辑运算符:
| 运算符 | 说明 |
|---|---|
| AND | 多个条件必须为 TRUE(1),结果才是 TRUE(1) |
| OR | 任意一个条件为 TRUE(1),结果为 TRUE(1) |
| NOT | 条件为 TRUE(1),结果为 FALSE(0) |
注意:WHERE 条件可以使用表达式,但不能使用别名。AND 优先级高于 OR 使用时需要用 () 包裹优先执行的部分。
通过 where 指定一个 "条件" ,把查询到的每一行,都带入到条件中,看为真还是为假,把满足条件的,即为真的,保留作为临时表的结果,条件不满足,即为假,则舍弃!
● 查询 java 成绩大于 90 分的同学:
select name, java from student where java > 90;
● 查询总成绩大于 160 分的同学
select name, java + python as 总分 from student where java + python > 160;
● 查询 java 成绩大于 90 或者 python 成绩大于 70 的同学:
select name, java, python from student where java > 90 or python > 70;
● 查询 python 成绩在 [80,90] 的同学:
select name, python from student where python between 80 and 90;
select name, python from student where python >= 80 and python <= 90;
-- 上述两种写法都可以
● 查询 java 成绩是 90分,83分,72分的同学:
select name, java from student where java in (90, 83, 72);
select name, java from student where java = 90 or java = 83 or java = 72;
-- 上述两种写法都可以
● 查询姓 '张' 的同学:
select name from student where name like '张%';
● 查询名字为三个字,中间一个字为 '小' 的:
select name from student where name like '_小_';
● 查询没有 java 成绩的同学:
select name from student where java <=> null;
-- 注意 null 值比较用 <=> 不能用 =
1.8 分页查询
上述说到 select * 是一个很危险的操作,那么 MySQL 引入了一个分页查询,限制了每次查询显示的最多为多少条数据,比如我们现在只查询俩条数据:
select * from student limit 2;
搭配 offset 就可以指定从第几条开始进行筛选了,offset 默认从 0 开始。
select * from student limit 2 offset 0;
select * from student limit 2 offset 2;
select * from student limit 2 offset 4;
数据的起始下标为 0,与数组下标有点类似。
下期预告:【MySQL】表的基本约束
相关文章:
【MySQL】查询操作(基础篇)
目录 1、查询操作(Retrieve) 1.1 全列查询 1.2 指定列查询 1.3 查询字段为表达式 1.4 别名 1.5 去重:DISTINCT 1.6 排序:ORDER BY 1.7 条件查询:WHERE 1.8 分页查询 1、查询操作(Retrieve) 查询操作算的上是 SQL 中最复杂的操作了…...
工程管理系统+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
MyBatisPlus Study Notes
文章目录1 MyBatisPlus概述1.1 MyBatis介绍1.2 MyBatisPlus特性2 标准数据层开发2.1 MyBatisPlus的CRUD操作API2.2 分页功能接口实现2.2.1 config(配置层)拦截器实现2.2.2 Dao(Mapper)数据访问层(CRUD)操作2.2.3 Junit单元测试进行…...
【Vu3 测试篇】自动化测试
一、为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一样,新的 Vue 应用可能会以多种方式崩溃,因…...
Android system实战 — Android R(11) 第三方apk权限
Android system实战 — 第三方apk权限问题0. 前言1. 源码实现1.1 主要函数1.2 修改思路和实现1.2.1 修改思路1.2.2 方案一1.2.3 方案二0. 前言 最近在调试时遇到了第三方apk申请运行时权限,以及signature级别 install 权限不允许赋予给第三方apk,虽然这是…...
面试总结1
这里写目录标题什么是ORM?为什么mybatis是半自动的ORM框架?动态sqlJDBC步骤:jdbc的缺点:JDBC,MyBatis的区别:MyBatis相比JDBC的优势缓存一级缓存一级缓存在下面情况会被清除二级缓存最近在面试,发现了许多自…...
【Hello Linux】程序地址空间
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍下进程地址空间 程序地址空间程序地址空间语言中的程序地址空间矛盾系统中的程序地址空间为什么要有进程地址空间思维导图总结…...
电脑崩溃蓝屏问题如何重装系统
电脑是我们日常生活和工作中必不可少的工具,但在使用过程中,难免会遇到各种问题,例如系统崩溃、蓝屏、病毒感染等,这些问题会严重影响我们的使用体验和工作效率。而小白一键重装系统可以帮助我们快速解决这些问题,本文…...
《商用密码应用与安全性评估》第一章密码基础知识1.2密码评估基本原理
商用密码应用安全性评估(简称“密评”)的定义:在采用商用密码技术、产品和服务集成建设的网络与信息系统中,对其密码应用的合规性、正确性、有效性等进行评估 信息安全管理过程 相关标准 国际:ISO/IEC TR 13335 中国:GB/T …...
【编程基础之Python】7、Python基本数据类型
【编程基础之Python】7、Python基本数据类型Python基本数据类型整数(int)基本的四则运算位运算比较运算运算优先级浮点数(float)布尔值(bool)字符串(str)Python数据类型变换隐式类型…...
Kakfa详解(一)
kafka使用场景 canal同步mysqlelk日志系统业务系统Topic kafka基础概念 Producer: 消息生产者,向kafka发送消息Consumer: 从kafka中拉取消息消费的客户端Consumer Group: 消费者组,消费者组是多个消费者的集合。消费者组之间互不影响,所有…...
图解LeetCode——剑指 Offer 12. 矩阵中的路径
一、题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相…...
particles在vue3中的基本使用
第三方库地址 particles.vue3 - npm 1.安装插件 npm i particles.vue3 npm i tsparticles2.在main.js中引入 import Particles from particles.vue3 app.use(Particles) // 配置相关的文件常用 api particles.number.value>粒子的数量particles.number.density粒子的稀密…...
04 Android基础--RelativeLayout
04 Android基础--RelativeLayout什么是RelativeLayout?RelativeLayout的常见用法:什么是RelativeLayout? 相对布局(RelativeLayout)是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。 根据父容器定位 在相…...
python基础命令
1.现在包的安装路径 #pip show 包名 2.pip讲解 相信对于大多数熟悉Python的人来说,一定都听说并且使用过pip这个工具,但是对它的了解可能还不一定是非常的透彻,今天小编就来为大家介绍10个使用pip的小技巧,相信对大家以后管理和…...
用 Real-ESRGAN 拯救座机画质,自制高清版动漫资源
内容一览:Real-ESRGAN 是 ESRGAN 升级之作,主要有三点创新:提出高阶退化过程模拟实际图像退化,使用光谱归一化 U-Net 鉴别器增加鉴别器的能力,以及使用纯合成数据进行训练。 关键词:Real-ESRGAN 超分辨率 视…...
数据结构预备知识(模板)
模板 功能上类比C的重载函数,可以使用一种通用的形式,去代替诸多数据类型,使得使用同一种函数的时候,可以实现对于不同数据类型的相同操作。增强类和函数的可重用性。 使用模板函数为函数或类声明一个一般的模式,使得…...
SWM181按键控制双通道PWM固定占空比输出
SWM181按键控制双通道PWM固定占空比输出📌SDK固件包:https://www.synwit.cn/kuhanshu_amp_licheng/ 🌼开发板如下图: ✨注意新手谨慎选择作为入门单片机学习。目前只有一个简易的数据手册和SDK包,又没有参考手册&am…...
pygame函数命令
pygame.mixer.music.load() —— 载入一个音乐文件用于播放 pygame.mixer.music.play() —— 开始播放音乐流 pygame.mixer.music.rewind() —— 重新开始播放音乐 pygame.mixer.music.stop() —— 结束音乐播放 pygame.mixer.music.pause() —— 暂停音乐播放 pygame.mixer.mu…...
异步循环
业务 : 批量处理照片 , 批量拆建 , 裁剪一张照片需要异步执行等待 , 并且是批量 所以需要用到异步循环 裁剪图片异步代码 : 异步循环 循环可以是 普通 for 、 for of 、 for in 不能使用forEach ,这里推荐 for…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
