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

news2024/11/16 1:32:02

 

目录

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】表的基本约束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Orcad导出BOM的两种方式比较

两种方法&#xff0c;各有优缺点。推荐使用第二种。一、Capture CIS特有的导BOM方式&#xff0c;用Capture 就没有这个选项点击Stanard,然后可以在左框中select ,add进右边的框&#xff0c;这样导就会导出你想要的属性&#xff0c;同时右下方有个Key选项&#xff0c;你选择outp…

适用于电脑的 5 款免费好用的 PDF 阅读器

PDF 阅读器是任何可以打开PDF 文件的软件&#xff0c;它可能是世界上最知名的文档格式。您可下载的银行对账单、学校的时事通讯——它们可能都是 PDF 格式的。 越来越多的操作系统、智能手机和其他设备包含显示 PDF 文件的内置功能&#xff1b;甚至您的网络浏览器也可能处理它…

Vue2和Vue3响应式的区别

数据响应式是什么&#xff1f; ​所谓 数据响应式 就是建立 响应式数据 与 依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作&#xff0c;可以是DOM…

基于ubuntu的STM32嵌入式软件开发(三)——基于官方标准函数库的软件工程移植

本文基于st官方提供的标准库搭建应用软件工程&#xff08;即非cube方式、非寄存器方式&#xff09;&#xff0c;采用标准库搭建的工程具有软件可移植性高、可读性好、符合软件设计人员思维方式。本文描述官方下载标准库及标准库的移植过程&#xff0c;具体流程如下所述&#xf…

不妙,2023年浙大mpa的复试形势比想象的更严峻,又在突突突涨……

都知道浙大MPA项目卷&#xff0c;但都没想到这么卷&#xff01; 很多浙大mpa的考生在一开始的备考初期因为对该项目的认知了解不够清晰从而会导致联考过后功亏一篑。因为是在职类考生群体&#xff0c;因此不少考生会认为以自己的实力和基础应该能够鱼跃龙门榜上有名&#xff0c…

视频会议系统异常中断故障分析案例

1. 背景 某电气化局的用户反馈&#xff0c;近期视频系统在使用过程中出现频繁中断的情况&#xff0c;这种情况影响到用户的视频体验和工作效率。 针对此问题&#xff0c;我们将NetInside流量分析系统部署到电气化局机房&#xff0c;使用流量分析系统提供实时和历史原始流量。…

【Linux】P1 Linux 基础命令(1)

Linux 基础命令&#xff08;1&#xff09;Linux 目录结构Linux 命令ls 展示命令cd 目录切换命令pwd 查看当前工作目录mkdir 创建新的文件夹其他补充知识前言 本节内容&#xff1a;Linux 基本命令&#xff08;1&#xff09;。 下节内容&#xff1a;Linux 基本命令&#xff08;2&…

二进制与十进制转换(包括整数和小数的转换)

二进制与十进制转换&#xff08;包括整数和小数的转换&#xff09; 二进制转十进制 首先要先了解二进制的含义&#xff0c;与十进制相似&#xff0c;二进制代表的是以2的次幂在每一位上的0/1表示&#xff0c;平时我们经常接触的都是整数的二进制&#xff0c;是从2的0次幂开始的…

从WebRtc学习RTP协议

1、TCP为何不适用于实时音视频可靠性是以牺牲实时性为代价的。按照TCP原理&#xff0c;当出现极端网络情况时&#xff0c;理论上每个包的时延可达到秒级以上&#xff0c;而且这种时延是不断叠加的。这对于音视频实时通信来说是不可接受的。TCP为了实现数据传输的可靠性&#xf…

【2223sW2】LOG1

写在前面 好好学习&#xff0c;走出宿舍&#xff0c;走向毕设&#xff01; 一些心路历程记录&#xff0c;很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧&#xff0c;还是不要给自己的查重挖坑罢了 23.2.27 文件批量重命名 为了给学姐先整出来一批训练数据&…

Element中树形控件在项目中的实际应用

文章目录1、使用目的2、官网组件3、组合使用组件案例4、在项目中实际应用4.1 组合组件的使用4.1.2 代码落地4.1.3 后台接口数据4.1.4 实际效果官网连接直达&#xff1a;Tree树形控件的使用 1、使用目的 用清晰的层级结构展示信息&#xff0c;可展开或折叠。 2、官网组件 <…

【YoloV5】Deepin系统使用Gpu进行YoloV5训练

Deepin系统使用Gpu进行YoloV5训练&#xff0c;显卡RTX30701.配置环境1.1英伟达的驱动安装2. pytorch安装2.1pytorch环境配置2.2 验证Gpu3.使用Yolo5进行Gpu模型训练3.1 准备需要训练的数据集和标注数据集1.配置环境 1.1英伟达的驱动安装 查看当前自己系统的显卡信息 lspci |…

paddleInfer

一、安装GCC 5.4https://blog.csdn.net/weixin_64064486/article/details/123940266二、安装pycudahttps://blog.csdn.net/zong596568821xp/article/details/86077553/更改的地方是&#xff0c;安装pycuda用的是&#xff1a;pip install pycuda三、安装TensorRT 1、TensorRT下载…

DataGear 制作基于Vue前端框架渲染的数据可视化看板

DataGear 在4.3.0版本新增了dg-dashboard-code特性&#xff0c;并在4.4.0版本进行了改进和增强&#xff0c;结合看板API&#xff0c;可以很方便地制作完全由Vue、React等前端框架渲染的数据可视化看板。 本文基于Vue2、Element UI前端框架的<el-container>、<el-head…

对“车辆销售配置器”的认识与理解

概述 中国汽车市场转为存量阶段后&#xff0c;各车企开始从”以产品为中心“转型到”以客户为中心“&#xff0c;产品的个性化配置需求日益丰富。随着竞争的加剧&#xff0c;车企们不仅要提供出色的产品&#xff0c;而且需要提供更加个性化的产品配置和服务&#xff0c;例如&am…

【Hello Linux】程序地址空间

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍下进程地址空间 程序地址空间程序地址空间语言中的程序地址空间矛盾系统中的程序地址空间为什么要有进程地址空间思维导图总结…

Java经典面试题——String、StringBuffer、StringBuilder有什么区别?

典型回答 String 是Java 语言非常基础和重要的类&#xff0c;提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类&#xff0c;被声明成为 final class &#xff0c;所有属性也都是 final 的。也由于它的不可变性&#xff0c;类似拼接、裁剪字符串等动作&#xff…

机器学习100天(三十五):035 贝叶斯公式

《机器学习100天》完整目录:目录 机器学习100天,今天讲的是:贝叶斯公式! 好了,上一节介绍完先验概率、后验概率、联合概率、全概率后,我们来看这样一个问题:如果我现在挑到了一个瓜蒂脱落的瓜,则该瓜是好瓜的概率多大? 显然,这是一个计算后验概率的问题,根据我们之…

基于DSP的三相开关霍尔永磁同步电机控制

0 前言 本文本应该是一篇 记录我使用DSP28377D控制一个基于三相开关霍尔传感器的高速永磁同步电机全过程的长文&#xff0c;但大部分零散的知识点我都已经写成单独的博客了&#xff0c;所以本文更像是一个知识框架的梳理。本文最终目的是实现高速PMSM的电流-速度双闭环&#x…

[LK光流法,disflow using Dense Inverse Search, VariationalRefinement变分优化 原理和代码]

文章目录1.Fast Optical Flow using Dense Inverse Search1.1 W的含义&#xff1a;1.2 LK光流模型1.3 LK光流模型求解&#xff08;不含迭代&#xff09;1.4 LK光流模型迭代求解1.5 dis_flow方法中的 LK光流模型1.6 disflow代码分析2.0 disflow中的VariationalRefinement方法2.0…