MySQL必知必会——第四章检索数据

2023-11-19

检索数据

本章将介绍如何使用SELECT语句从表中检索一个或多个数据列。

SELECT语句

SQL语句是由简单的英语单词关键字构成的,每个SQL语句都由一个或多个关键字构成。最常用的SQL语句就是SELECT语句,它的用途是从一个或多个表中检索信息。

使用SELECT检索表数据,必须有两个信息:

  1. 从什么地方选择。
  2. 要选择什么。

检索单个列

最简单的SQL SELECT语句:

mysql> SELECT prod_name
    -> FROM products;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| Detonator      |
| Bird seed      |
| Carrots        |
| Fuses          |
| JetPack 1000   |
| JetPack 2000   |
| Oil can        |
| Safe           |
| Sling          |
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.03 sec)

上述语句利用SELECT语句从products表中检索一个名为prod_name的列。所需的列名在SELECT关键字后给出,FROM关键字指出所需列所在的表名。

如上的一条简单SELECT语句将返回表中所有行。数据没有过滤,也没有排序。

  • 未排序数据 如果读者自己尝试这个查询,可能会发现显示输出的数据顺序与上文不同。这种情况很正常。如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。只要返回相同数目的行就是正常的。
  • 结束SQL语句 多条SQL语句必须以分号(;)分隔。
  • SQL语句和大小写 SQL语句不区分大小写。为使代码易于阅读和调试,我们习惯将关键字全部大写,将所有列和表名全部小写。
  • 使用空格 处理SQL语句时,其中所有空格都被忽略。为了代码可读性,我们可以将语句分为多行。

检索多个列

检索多个列与检索单个列唯一不同的是,SELECT关键字后拥有多个列名,列名间用逗号分隔。

下面SELECT语句从products表中选择3列:

mysql> SELECT prod_id, prod_name, prod_price
    -> FROM products;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| ANV01   | .5 ton anvil   |       5.99 |
| ANV02   | 1 ton anvil    |       9.99 |
| ANV03   | 2 ton anvil    |      14.99 |
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| FC      | Carrots        |       2.50 |
| FU1     | Fuses          |       3.42 |
| JP1000  | JetPack 1000   |      35.00 |
| JP2000  | JetPack 2000   |      55.00 |
| OL1     | Oil can        |       8.99 |
| SAFE    | Safe           |      50.00 |
| SLING   | Sling          |       4.49 |
| TNT1    | TNT (1 stick)  |       2.50 |
| TNT2    | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
14 rows in set (0.00 sec)

与前一个例子一样,这条语句使用SELECT语句从表products中检索数据。但指定了三个列名,列名间用逗号分隔。

  • 数据表示 SQL语句一般返回原始的、无格式的数据。因此数据格式化显示(对齐、符号、分隔)一般在显示该数据的应用程序中规定。

检索所有列

除了指定列外,SELECT语句还可以检索所有列而不必一一列出所有列。这可以在列名处使用星号(*)通配符来实现:

mysql> SELECT *
    -> FROM products;
+---------+---------+----------------+------------+----------------------------------------------------------------+
| prod_id | vend_id | prod_name      | prod_price | prod_desc                                                      |
+---------+---------+----------------+------------+----------------------------------------------------------------+
| ANV01   |    1001 | .5 ton anvil   |       5.99 | .5 ton anvil, black, complete with handy hook                  |
| ANV02   |    1001 | 1 ton anvil    |       9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
| ANV03   |    1001 | 2 ton anvil    |      14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
| DTNTR   |    1003 | Detonator      |      13.00 | Detonator (plunger powered), fuses not included                |
| FB      |    1003 | Bird seed      |      10.00 | Large bag (suitable for road runners)                          |
| FC      |    1003 | Carrots        |       2.50 | Carrots (rabbit hunting season only)                           |
| FU1     |    1002 | Fuses          |       3.42 | 1 dozen, extra long                                            |
| JP1000  |    1005 | JetPack 1000   |      35.00 | JetPack 1000, intended for single use                          |
| JP2000  |    1005 | JetPack 2000   |      55.00 | JetPack 2000, multi-use                                        |
| OL1     |    1002 | Oil can        |       8.99 | Oil can, red                                                   |
| SAFE    |    1003 | Safe           |      50.00 | Safe with combination lock                                     |
| SLING   |    1003 | Sling          |       4.49 | Sling, one size fits all                                       |
| TNT1    |    1003 | TNT (1 stick)  |       2.50 | TNT, red, single stick                                         |
| TNT2    |    1003 | TNT (5 sticks) |      10.00 | TNT, red, pack of 10 sticks                                    |
+---------+---------+----------------+------------+----------------------------------------------------------------+
14 rows in set (0.00 sec)

给定一个通配符(*),则返回表中所有列。列的顺序一般是列在定义中出现的顺序,但表模式的变化(如添加或删除列)可能会导致顺序的变化。

  • 使用通配符 通配符很方便,但检索不需要的列通常会降低检索和应用程序的性能。所有没有使用必要时,不使用。
  • 检索未知列 通配符有一大优点。能检索出名字未知的列。

检索不同的行

如果我们想要products表中所有供应商ID:

mysql> SELECT vend_id
    -> FROM products;
+---------+
| vend_id |
+---------+
|    1001 |
|    1001 |
|    1001 |
|    1002 |
|    1002 |
|    1003 |
|    1003 |
|    1003 |
|    1003 |
|    1003 |
|    1003 |
|    1003 |
|    1005 |
|    1005 |
+---------+
14 rows in set (0.01 sec)

SELECT语句返回14行(即使表中只有4个供应商),因为products表中有14个产品记录。这与我们的预期结果不符。

为了解决重复的数据,我们使用DISTINCT关键字,此关键字指示MySQL只返回不同的值。

mysql> SELECT DISTINCT vend_id
    -> FROM products;
+---------+
| vend_id |
+---------+
|    1001 |
|    1002 |
|    1003 |
|    1005 |
+---------+
4 rows in set (0.00 sec)

SELECT DISTINCT vend_id告诉MySQL只返回不同的vend_id行,因此只返回4行。如果使用DISTINCT关键字,它必须放在所有列名的前面。

  • 不能部分使用DISTINCT DISTINCT关键字应用于所有列而不仅是前置它的列。

限制结果

SELECT语句返回所有匹配的行。但我们可以使用LIMIT子句来返回第一行或前几行:

mysql> SELECT prod_name
    -> FROM products
    -> LIMIT 5;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
| Detonator    |
| Bird seed    |
+--------------+
5 rows in set (0.00 sec)

此语句使用SELECT语句检索单个列。LIMIT 5指示MySQL返回不多于5行。

我们还可以指定要检索的开始行和行数,例如得出上个结果的下一个5行:

mysql> SELECT prod_name
    -> FROM products
    -> LIMIT 5, 5;
+--------------+
| prod_name    |
+--------------+
| Carrots      |
| Fuses        |
| JetPack 1000 |
| JetPack 2000 |
| Oil can      |
+--------------+
5 rows in set (0.00 sec)

LIMIT 5, 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。

所以,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。

  • 行0 第一行的行号为0而不是1。所以,LIMIT 1, 1将返回第二行。
  • 行数不够时 LIMIT中指定的行数为检索的最大行数。若行数不足最大行数,将只会检索出所有的行。即行数可能不等于最大行数。
  • MySQL 5的LIMIT语法 LIMIT中的开始行与最大行数容易弄混,所有MySQL 5支持LIMIT的另一个语法,将逗号改成关键字OFFSET。例如,LIMIT 5 OFFSET 5。

使用完全限定的表名

目前的SQL语句的例子只通过列名引用列。但为了区分不同表中可能存在相同的列名,我们可以使用完全限定的名字来引用列(同时使用表名和列名):

mysql> SELECT products.prod_name
    -> FROM products;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| Detonator      |
| Bird seed      |
| Carrots        |
| Fuses          |
| JetPack 1000   |
| JetPack 2000   |
| Oil can        |
| Safe           |
| Sling          |
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.01 sec)

这条语句在功能上等于本章最开始的那条语句,但这里指定了一个完全限定的列名。

表名也可以是完全限定的(同时使用数据库名和表名):

mysql> SELECT products.prod_name
    -> FROM crashcourse.products;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| Detonator      |
| Bird seed      |
| Carrots        |
| Fuses          |
| JetPack 1000   |
| JetPack 2000   |
| Oil can        |
| Safe           |
| Sling          |
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)

这条语句在功能上也等于上一个例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL必知必会——第四章检索数据 的相关文章

  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • A deep learning approach to detection of splicing and copy-move forgeries in images

    https github com kPsarakis Image Forgery Detection CNNhttps github com kPsarakis Image Forgery Detection CNN 代码是结合代尔夫特理工
  • Python报错: Using TensorFlow backend

    Python报错 Using TensorFlow backend 环境 系统 win10 pycharm2017 问题描述 导入keras库运行时 Python总是出现Using TnesorFlow backend报错 解决过程 网上有
  • android-smart-image-view源码分析,android性能优化推荐书

    三 源码分析 从github上clone该项目 可以看到整个项目的代码只包含7个Java源文件 同时 还可进行扩展 方便使用者根据实际图片的来源进行扩展 我们来看看Class逻辑图 上面有提到 SmartImageView继承自ImageV
  • python 从外部引入变量并运行该程序

    1 python程序部分 import argparse FLAGS tf app flags FLAGS office31 flags train parser argparse ArgumentParser parser add arg
  • java自动化测试框架基础eclipse+maven配置

    java自动化测试框架基础eclipse maven配置 文章目录 java自动化测试框架基础eclipse maven配置 一 maven安装配置 二 eclipse中使用maven 一 maven安装配置 Maven是一个项目构建和管理
  • IDEA安装及配置

    目录 下载与安装 IDEA文件目录介绍 IDEA优化配置 提高启动和运行 下载与安装 IDEA下载网址 JetBrains Essential tools for software developers and teams 在官网中找到自己
  • make: *** No rule to make target 错误原因、分析和解决办法

    问题描述 在用codewarrior编译的时候 遇到编译器报如下错误 mingw32 make No rule to make target D CW Workspace Renalt PBG BOOT Project Settings L
  • 2021常见面试题汇总(持续更新)

    2021常见面试题汇总 1 Valatile的定义和使用 1 1 可见性 1 2 有序性 2 syc1 8之后有什么区别 3 synchronized和Lock的区别 4 redis如何进行大key或value值删除 5 redis如何进行
  • SQL server 查询语句大全

    在 SQL Server 中 查询语句是最常用的语句类型 用于从数据库中提取有用的信息 SQL Server 中常用的查询语句有 SELECT FROM WHERE GROUP BY HAVING 和 ORDER BY 1 SELECT S
  • 【数电】常用时序逻辑电路模块总结

    文章目录 同步置零和异步置零 同步预置数和异步预置数 一 移位寄存器 I D触发器构成的4位移位寄存器 II 双向移位寄存器 74HC194 二 计数器 I 同步计数器 i 同步二进制计数器 1 同步二进制加法计数器 74161 2 同步二
  • iOS中自动消失提示框的实现

    iOS中自动消失提示框的实现 添加一个提示框 UIAlertView alert UIAlertView alloc initWithTitle 提示 message 你很漂亮 delegate self cancelButtonTitle
  • chrome浏览器安装失败,已解决(方便)

    原因分析 如果是第一次安装 一般都会安装成功 倘若报错后安装失败 说明之前电脑上存在Google Chrome 谷歌浏览器 安装的残余 导致再次安装时 无法将安装的数据正常的写入注册表 因为在软件安装过程中 都会将必要的文件添加到注册表中
  • 大数据学习之Scala——02Scala基础

    一 杂项 1 Scala语言输出的三种方式 字符串通过 号连接 类似java printf用法 类似C语言 字符串通过 传值 格式化输出 字符串插值 通过 引用 类似PHP println name name age age url url
  • dosbox中out of memory_在Rust中实现goto逻辑

    众所周知 在Rust中是没有goto表达式的 最近在 试着用Rust练习翻新一些古代陈旧代码 结果这堆古代的pascal代码中就有很多goto语句 于是写了几个宏来模拟了一下 在这里也写一篇文章介绍一下 希望给大家在思路上有所帮助 如果不想
  • ​​PMP项目管理—第3章 项目经理的角色。

    PMBOK项目管理知识体系指南 PMP项目管理学习笔记 总 第1章 引论 第2章 项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理 第9章 项
  • c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建

    推荐视频课程 https www bilibili com video BV1et411b73Z p 2 已投币三连 b站果然是个学习的网站 本来是想在linux环境下运行QT 于是先学了几个月linux嵌入式驱动开发 后来发现太底层了 与
  • 【FPGA】面试问题及答案整理合集

    面试问题及答案整理合集 1 硬件描述语言和软件编程语言的区别 2 FPGA选型问题 3 建立时间和保持时间问题 3 亚稳态问题 4 竞争和冒险问题 5 乒乓操作问题 6 同步和异步逻辑电路 7 同步复位和异步复位 8 MOORE 与 MEE
  • CUDA异步并发之CUDA流详解

    CUDA中得异步并发 CUDA 将以下操作公开为可以彼此同时操作的独立任务 在主机上计算 设备上的计算 从主机到设备的内存传输 从设备到主机的内存传输 在给定设备的内存中进行内存传输 设备之间的内存传输 这些操作之间实现的并发级别将取决于设
  • 《Transfer Adaptation Learning: A Decade Survey》阅读笔记

    摘要 传统机器学习的目的是通过最小化训练数据的正则化经验风险 对测试数据的最小期望风险最小的模型 但假设训练数据和测试数据具有相似的联合概率分布 TAL的目标是通过从语义相关但分布不同的源域学习知识 来建立能够执行目标域任务的模型 在经典的
  • MySQL必知必会——第四章检索数据

    检索数据 本章将介绍如何使用SELECT语句从表中检索一个或多个数据列 SELECT语句 SQL语句是由简单的英语单词关键字构成的 每个SQL语句都由一个或多个关键字构成 最常用的SQL语句就是SELECT语句 它的用途是从一个或多个表中检