【重学MySQL】十三、基本的 select 语句
【重学MySQL】十三、基本的 select 语句
- 基本结构
- 示例
- 检索所有列
- 检索特定列
- 带有条件的检索
- `dual`
- 列的别名
- 基本的列别名使用
- 别名在表达式中的使用
- 别名在聚合函数中的应用
- `distinct`
- 基本用法
- 注意事项
- 示例
- 空值参与运算
- 数学运算
- 字符串连接
- 比较运算
- 逻辑运算
- 处理NULL的函数
- 着重号
- 为什么使用着重号(反引号)?
- 示例
- 避免保留字冲突
- 支持特殊字符
- 注意事项
- 查询常数
- 注意
基本的SELECT
语句是SQL(Structured Query Language,结构化查询语言)中最常用的语句之一,用于从数据库表中检索数据。一个基本的SELECT
语句的结构非常直观,主要包括SELECT
关键字、要检索的列名(或表达式)、FROM
子句来指定数据来源的表名,以及可选的WHERE
子句来指定检索数据的条件。
基本结构
SELECT column1, column2, ...
FROM table_name
WHERE condition;
- SELECT:指定要从表中检索的列名。你可以指定一个或多个列名,或者使用星号(
*
)来检索表中的所有列。 - FROM:指定要从中检索数据的表名。
- WHERE(可选):指定用于过滤结果的条件。只有满足条件的行才会被检索出来。如果省略了
WHERE
子句,那么会检索表中的所有行。
示例
假设有一个名为Employees
的表,其中包含员工的ID、姓名、年龄和部门ID等信息。
检索所有列
SELECT * FROM Employees;
这条语句会检索Employees
表中的所有列和所有行。
检索特定列
SELECT EmployeeID, LastName, FirstName FROM Employees;
这条语句只会检索EmployeeID
、LastName
和FirstName
这三列的数据。
带有条件的检索
SELECT * FROM Employees WHERE DepartmentID = 5;
这条语句会检索Employees
表中所有DepartmentID
为5的行。
dual
在MySQL中,DUAL
是一个虚拟表,它主要用于那些不需要从任何表中检索数据但需要返回一个结果集的场合。DUAL
表允许你执行没有指定FROM子句的SELECT语句,这在一些情况下特别有用,比如当你只是想通过SELECT语句来执行一些计算或转换,而不是查询表中的数据时。
然而,值得注意的是,虽然DUAL
在Oracle数据库中是一个常见的概念,但在MySQL中,它并不是严格必需的,因为MySQL允许你执行没有FROM子句的SELECT语句。这意味着,在MySQL中,你可以直接写出一个只包含SELECT和可能的一些函数的查询,而不需要显式地引用DUAL
表。
例如,在Oracle中,你可能会这样写:
SELECT 5 * 10 FROM DUAL;
这条语句会返回50,因为Oracle要求所有的SELECT语句都必须指定一个FROM子句,即使你并不打算从任何表中检索数据。
但在MySQL中,你可以直接写:
SELECT 5 * 10;
这条语句同样会返回50,而不需要引用DUAL
表。
尽管MySQL不严格要求使用DUAL
,但在一些从Oracle迁移到MySQL的数据库项目中,你可能会遇到在代码中显式引用DUAL
的情况。在这种情况下,MySQL仍然能够处理这样的查询,因为MySQL会忽略这个DUAL
的引用,并直接执行SELECT语句中的计算或函数。
总的来说,DUAL
在MySQL中是一个可选的概念,主要用于与那些期望在所有数据库系统中都有DUAL
表的概念的代码兼容。但在实际使用中,你通常可以省略它,直接在MySQL中执行你的SELECT语句。
列的别名
在MySQL中,列的别名(Alias)是一个给查询结果集中的列指定的临时名称。使用列的别名可以使结果集更加易于理解,特别是在进行复杂的查询、连接(JOINs)、分组(GROUP BY)和聚合(如SUM、AVG等)操作时。
基本的列别名使用
在SELECT语句中,你可以通过在列名后紧跟AS
关键字和别名来指定列的别名。如果省略AS
关键字,MySQL也会识别紧随列名之后的标识符为别名,假如中间有空格,可以用一对双引号引起来,不要使用单引号。
示例1:使用AS
关键字
SELECT employee_name AS Name, salary AS Salary
FROM employees;
在这个例子中,employee_name
列的别名被指定为Name
,salary
列的别名被指定为Salary
。
示例2:省略AS
关键字
SELECT employee_name Name, salary Salary
FROM employees;
这个查询与上一个示例产生相同的结果,只是省略了AS
关键字。
别名在表达式中的使用
列的别名还可以在SELECT语句的表达式中使用,但需要注意的是,别名在定义它的SELECT列表中是不可见的,也就是说,你不能在同一个SELECT列表的另一个表达式中直接使用它。然而,你可以在HAVING子句、ORDER BY子句或外部查询中引用它(如果这是一个子查询或视图定义的一部分)。
示例:不能在同一个SELECT列表的表达式中直接使用别名
-- 错误的用法
SELECT salary AS Salary, Salary + 100 AS SalaryPlusBonus -- 这里Salary是未知的,因为别名是在它之后定义的
FROM employees;-- 正确的用法
SELECT salary, salary + 100 AS SalaryPlusBonus
FROM employees;
在ORDER BY子句中使用别名
SELECT employee_name AS Name, salary AS Salary
FROM employees
ORDER BY Salary DESC; -- 这里使用了别名Salary进行排序
别名在聚合函数中的应用
在使用聚合函数(如SUM、AVG、COUNT等)时,为结果列指定别名尤其有用,因为它可以清晰地表示该列包含的数据类型或含义。
示例:使用聚合函数并指定别名
SELECT AVG(salary) AS AverageSalary
FROM employees;
这个查询计算了employees
表中所有员工的平均薪水,并将结果列的别名指定为AverageSalary
。
distinct
在MySQL中,DISTINCT
关键字用于在查询结果中返回唯一不同的值。当你从表中检索数据时,如果表中有重复的行,并且你只希望看到每个唯一值一次,那么就可以使用DISTINCT
。
DISTINCT
通常与SELECT
语句一起使用,放在需要返回唯一值的列名之前。你也可以对多个列使用DISTINCT
,但这意味着MySQL会考虑这些列的组合作为唯一性的判断依据。
基本用法
单列使用DISTINCT
SELECT DISTINCT column_name
FROM table_name;
这个查询会返回column_name
中所有唯一的值。
多列使用DISTINCT
SELECT DISTINCT column1, column2
FROM table_name;
这个查询会返回column1
和column2
的组合中所有唯一的值对。只有当column1
和column2
的组合是唯一的时,它们才会出现在结果集中。
注意事项
DISTINCT
关键字作用于它之后的所有列,直到遇到下一个逗号或查询的结束。- 使用
DISTINCT
可能会影响查询的性能,因为它需要MySQL对结果集进行排序和去重。在大数据集上使用时尤其要注意这一点。 - 如果查询中包含了聚合函数(如
COUNT()
、MAX()
、MIN()
、SUM()
等),并且你想要基于某些列的唯一值来计算聚合结果,那么可能需要结合GROUP BY
子句来使用,而不是直接使用DISTINCT
。
示例
假设有一个名为employees
的表,其中包含department_id
和employee_name
两列。
返回所有唯一的department_id
SELECT DISTINCT department_id
FROM employees;
返回所有唯一的department_id
和employee_name
组合
注意:这实际上会返回所有行,因为假设每个员工都位于不同的部门或每个部门都有不同的员工名称(这通常不是真实情况,但用于说明)。
SELECT DISTINCT department_id, employee_name
FROM employees;
如果每个部门都有多个员工,但你想要按部门计算员工数,你应该使用GROUP BY
而不是DISTINCT
。
按部门计算员工数
SELECT department_id, COUNT(employee_name) AS employee_count
FROM employees
GROUP BY department_id;
空值参与运算
在MySQL中,空值(NULL)参与运算时,结果通常会根据运算的类型和上下文而有所不同。空值在数据库中代表缺失或未知的数据,因此在进行数学运算、字符串连接或其他类型的计算时,需要特别注意它们的行为。
数学运算
当NULL参与数学运算(如加法、减法、乘法、除法等)时,结果通常是NULL。这是因为MySQL无法对未知的值进行数学计算。
SELECT NULL + 10; -- 结果为 NULL
SELECT 10 - NULL; -- 结果为 NULL
SELECT NULL * 10; -- 结果为 NULL
SELECT 10 / NULL; -- 结果为 NULL,尽管在真实数学中除以0是未定义的,但这里是因为有NULL
字符串连接
当使用CONCAT()
等字符串函数时,如果任何参数是NULL,则整个CONCAT()
函数的结果也是NULL。不过,可以使用CONCAT_WS()
(其中WS代表With Separator),它允许在参数之间插入分隔符,并且会忽略NULL值。
SELECT CONCAT('Hello', NULL, 'World'); -- 结果为 NULL
SELECT CONCAT_WS(' ', 'Hello', NULL, 'World'); -- 结果为 'Hello World'
比较运算
当NULL参与比较运算时,结果也通常是特殊的。例如,任何值与NULL的比较结果都不是TRUE或FALSE,而是NULL。这意味着你不能直接使用=
、<
、>
等操作符来检查一个值是否为NULL。相反,应该使用IS NULL
或IS NOT NULL
。
SELECT 1 = NULL; -- 结果为 NULL
SELECT 1 IS NULL; -- 结果为 FALSE
SELECT NULL IS NULL; -- 结果为 TRUE
逻辑运算
在逻辑运算中(如AND、OR、NOT),NULL的行为可能会更加复杂,因为它既不是TRUE也不是FALSE。但是,通常你可以预期如果逻辑表达式中的任何部分为NULL,则整个表达式的结果可能也是NULL,或者至少不会按你期望的TRUE或FALSE来评估。
处理NULL的函数
MySQL提供了几个函数来帮助处理NULL值,如IFNULL()
(或COALESCE()
),它们允许你为NULL值指定一个替代值。
SELECT IFNULL(NULL, 0) + 10; -- 结果为 10
SELECT COALESCE(NULL, 0, 'default') + 10; -- 结果为 10,因为COALESCE返回第一个非NULL值
总之,当在MySQL中编写查询并处理可能包含NULL值的列时,重要的是要了解NULL在不同运算和函数中的行为,并相应地调整你的查询逻辑。
着重号
在MySQL中,“着重号”(通常指的是反引号`
)主要用于标识符(如数据库名、表名、列名等)的引用,特别是在这些标识符是MySQL的保留字或者包含特殊字符(如空格、连字符等)时。使用反引号可以确保这些标识符被正确地识别和处理。
为什么使用着重号(反引号)?
- 避免保留字冲突:如果你的表名或列名与MySQL的保留字相同,使用反引号可以避免语法错误。
- 支持特殊字符:如果你的标识符包含空格、连字符(-)、点(.)等特殊字符,或者以数字开头,使用反引号可以确保MySQL能够正确解析这些标识符。
示例
避免保留字冲突
假设你想创建一个名为order
的表,但order
是MySQL的保留字。为了避免冲突,你可以这样写:
CREATE TABLE `order` (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255)
);
支持特殊字符
如果你想创建一个包含空格的表名,你可以这样做:
CREATE TABLE `my table` (id INT AUTO_INCREMENT PRIMARY KEY,data VARCHAR(255)
);
或者,如果你的列名包含连字符:
CREATE TABLE example (`user-id` INT,`first-name` VARCHAR(50)
);
注意事项
- 虽然在某些情况下使用反引号是有必要的,但过度使用可能会使SQL语句看起来杂乱无章,因此建议仅在必要时使用。
- 在某些SQL方言(如PostgreSQL)中,使用双引号(")而不是反引号来引用标识符。
- 当使用MySQL命令行工具时,你可能需要根据你的操作系统和MySQL的配置,使用特定的转义字符来在命令行中包含反引号。例如,在Windows命令行中,你可能需要使用
`order`
(注意外部的双引号用于命令行字符串的界定,内部的反引号用于SQL标识符的界定)。然而,在许多现代的IDE和数据库管理工具中,这个问题通常会自动得到处理。
查询常数
注意
- 在使用
SELECT
语句时,应尽量避免使用*
来检索所有列,特别是当表中有大量列而你只需要其中几列时。这样做可以提高查询效率,减少数据传输量。 - 在
WHERE
子句中使用的条件可以是任何有效的表达式,包括比较运算符(如=
、<>
、<
、>
等)、逻辑运算符(如AND
、OR
、NOT
)等。 - SQL是大小写不敏感的,但出于可读性和一致性考虑,推荐使用特定的命名约定(如关键字大写,表名和列名小写)。
- 不同的数据库系统(如MySQL、SQL Server、Oracle等)可能在SQL方言上有所不同,但基本的
SELECT
语句在大多数系统中都是通用的。
相关文章:

【重学MySQL】十三、基本的 select 语句
【重学MySQL】十三、基本的 select 语句 基本结构示例检索所有列检索特定列带有条件的检索dual 列的别名基本的列别名使用别名在表达式中的使用别名在聚合函数中的应用 distinct基本用法注意事项示例 空值参与运算数学运算字符串连接比较运算逻辑运算处理NULL的函数 着重号为什…...

vue3.5新特性整理
本文章介绍vue3.5更新的几个新特性 1.vue中watch中深度监听更新的层级 在之前deep 属性是一个boolean值 我们要监听对象的变化需要使用deep: true 在vue3.5之后 deep 也可以是一个number 表示对象要监听的层级数量 这个功能还是比较实用的 因为层级过深的时候我们可能需要监听…...

RK3588 系列之3—rknn使用过程中遇到的bug
RK3588 系列之3—rknn使用过程中遇到的bug 1.librockchip_mpp.so: file format not recognized; treating as linker scrip2.Could not find a package configuration file provided by "OpenCV" with any of the following names参考文献 1.librockchip_…...

Java中的强引用、软引用、弱引用和虚引用于JVM的垃圾回收机制
参考资料 https://juejin.cn/post/7123853933801373733 在 Java 中,引用类型分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用…...

网络协议的基础知识
前言 本文将详细介绍IP地址、端口号、协议、协议分层、封装、分用、客户端、服务器、请求、响应以及两台主机之间的网络通信流程等网络原理知识。 一、IP 地址 概念 IP地址主要用于标识网络中的主机和其他网络设备(如路由器)的位置。 类似于快递中的…...

Java高级Day37-UDP网络编程
109.netstat指令 netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况 netstat -an|more 可以分页显示 要求在dos控制台下执行 说明: LISTENING表示某个端口在监听 如果有一个外部程序(客户端)连接到该端口…...

如何利用ChatGPT提升学术论文讨论部分的撰写质量和效率
大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。经过数月爆肝,终于完成学术AI使用教…...

谷歌seo网址如何快速被收录?
想让你的网站快速被搜索引擎收录,可以采取几种不同的策略。首先,确保你的网站内容丰富、有价值,搜索引擎更喜欢收录内容质量高的网站。同时,增强网站的外链建设,做好这些站内优化,接下来就是通过谷歌搜索控…...

自动驾驶---什么是Frenet坐标系?
1 背景 为什么提出Frenet坐标系?Frenet坐标系的提出主要是为了解决自动驾驶系统在路径规划的问题,它基于以下几个原因: 符合人类的驾驶习惯: 人类驾驶员在驾驶过程中,通常不会关心自己距离起点的横向和纵向距离&#x…...

如何编写Linux PCI设备驱动器 之一
如何编写Linux PCI设备驱动器 之一 PCI寻址PCI驱动器使用的APIpci_register_driver()pci_driver结构pci_device_id结构 如何查找PCI设备存取PCI配置空间读配置空间APIs写配置空间APIswhere的常量值共用部分类型0类型1 PCI总线通过使用比ISA更高的时钟速率来实现更好的性能&…...

梯度弥散问题及解决方法
梯度弥散问题及解决方法 简要阐述梯度弥散发生的原因以及现象针对不同发生原因有什么解决方案1. 使用ReLU及其变体激活函数2. 权重初始化3. 批量归一化(Batch Normalization)4. 残差连接(Residual Connections)5. 梯度裁剪(Gradient Clipping)简要阐述梯度弥散发生的原因…...

Python中pickle文件操作及案例-学习篇
一、简介 Pickle 算是Python的一种数据序列化方法,它能够将对象转换为字节流,进而可以保存到文件中或通过网络传输给其他Python程序。这种方式非常适合快速简便地保存复杂的数据结构,例如列表、字典、自定义对象等。 二、pickle文件的读写 …...

微服务日常总结
1.当我们在开发中,需要连接多个库时,可以在yml中进行配置。 当在查询的时候,跨库时,需要通过DS 注解来指定,需要yml配置需要保持一致。 2. 当我们想把数据存入到clob类型中,需要再字段 的占位符后面加上j…...

C和C++内存管理
C和C内存管理 (一)C/C内存分布(二)C语言动态内存管理(三)c内存管理(3.1)new/delete操作内置类型(3.2)new和delete操作自定义类型 (四)…...

axios取消请求
1.使用CancelToken: class RequestHttp {service: AxiosInstance;public constructor(config: AxiosRequestConfig) {// 实例化axiosthis.service axios.create(config);/*** description 请求拦截器* 客户端发送请求 -> [请求拦截器] -> 服务器*/this.service.interce…...
阿里中间件——diamond
一、前言 最近工作不忙闲来无事,仔细分析了公司整个项目架构,发现用到了很多阿里巴巴集团开源的框架,今天要介绍的是中间件diamond. 二、diamond学习笔记 1、diamond简介 diamond是一个管理持久配置(持久配置是指配置数据会持久化…...

pyenv -- 一款macos下开源的多版本python环境安装管理工具 国内加速版安装 + 项目venv虚拟环境 pip加速 使用与总结
一个比较方便实用的python多版本环境安装管理工具, 阿里云加速版本 pyenv安装方法: 直接克隆本下面到你的本地目录,然后设置环境变量即可 git clone https://gitee.com/tekintian/pyenv.git ~/.pyenv 环境变量配置 在~/.bash_profile 或者 .zshrc 中增加环境变量 export …...

VitePress 自定义 CSS 指南
VitePress 是一款基于 Vite 和 Vue 3 的静态网站生成器,专为文档编写而设计。尽管 VitePress 提供了丰富的默认主题,但在某些情况下,我们可能需要对其进行更深入的定制以满足特定的视觉需求。本文将详细介绍如何通过覆盖根级别的 CSS 变量来自…...

【舍入,取整,取小数,取余数丨Excel 函数】
数学函数 1、Round函数 Roundup函数 Rounddown函数 取整:(Int /Trunc)其他舍入函数: 2、Mod函数用Mod函数提取小数用Mod函数 分奇偶通过身份证号码判断性别 1、Round函数 Roundup函数 Rounddown函数 Round(数字,保留几位小数)(四…...

无线信道中ph和ph^2的场景
使用 p h ph ph的情况: Rayleigh 分布的随机变量可以通过两个独立且相同分布的零均值、高斯分布的随机变量表示。设两个高斯随机变量为 X ∼ N ( 0 , σ 2 ) X \sim \mathcal{N}(0, \sigma^2) X∼N(0,σ2)和 Y ∼ N ( 0 , σ 2 ) Y \sim \mathcal{N}(0, \sigma^2)…...

HCIA--实验五:静态路由综合实验
静态路由综合实验 一、实验内容: 1.需求/目的: 在ensp模拟器中使用四个路由器,并且在路由器上创建loopback接口,相当于连接了一台主机,通过配置静态路由的方式实现全网通。 二、实验过程 1.道具: 4个…...

不同vlan之间的通信方法
1.通过路由器的物理接口 1.给PC1,PC2配置IP地址,网关2.进入交换机配置vlan,交换机所有口都配置access口并绑定vlan3.配置路由器,进入路由器的两个接口配置网关IP和掩码缺点:成本高,每增加一个vlan就需要一个物理端口和…...

java后端框架
框架就是对技术的封装。 本篇博客小博主首先对以后我们要学习的框架进行简单概述,使大家对框架有一定的基本概念。 一.mybatis mybatis就是对jdbc(数据库连接)进行封装,避免了jdbc中手动设置参数,手动映射结果的操作。…...

如何在Word中插入复选框
如何在Word中插入复选框:详细教程与技巧 在Word中插入复选框是一项非常实用的技巧,尤其是在制作问卷调查、待办事项清单、交互式表单或文档中需要用户进行选择时,复选框不仅能提高文档的功能性,还能显得更加专业。本文将详细讲解…...

Android 源码中jni项目 加载so目录小结
Android 源码中jni项目 加载so目录小结 文章目录 Android 源码中jni项目 加载so目录小结一、前言二、so目录验证测试1、jni so文件错误报错(1)报错1 - 未找到so文件:(2)报错2 - so文件中未找到native方法: …...

24/9/6算法笔记 kaggle 房屋价格
预测模型主要分为两大类: 回归模型:当你的目标变量是连续的数值时,你会使用回归模型进行预测。回归模型试图找到输入特征和连续输出之间的关联。一些常见的回归模型包括: 线性回归(Linear Regression)岭回归…...

【MA35D1】buildroot 编译使用经验
文章目录 芯片介绍Buildroot开发Linux实践环境搭建代码获取编译执行步骤(仅适用于我公司产品) 后续有需要更改的输出文件目录 芯片介绍 NuMicro MA35D1系列为一颗异核同构的多核心微处理器,适用于高端 Edge IIoT Gateway。它是基于双核 64 位…...

排查 MyBatis XML 配置中的 IF 语句与传值名称不匹配的 Bug
文章目录 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,在改一个bug得时候发现一个有意思得问题,就是myb…...

数字证书与公钥基础设施
关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:数字证书 数字证书是由第三方可信机构(一般是证书服务器)颁发的数字证书,可以证明身份的可信度。 数字证书具有以下特点以及性质:…...

拥抱数智化,JNPF低代码平台如何推动企业转型升级
随着信息技术的飞速发展,企业面临的市场竞争日益激烈,传统的业务流程和管理模式已经难以满足快速变化的市场需求。数智化转型成为企业持续发展的必由之路。在这一过程中,低代码开发平台扮演了至关重要的角色。本文将探讨JNPF低代码平台如何助…...