从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • RSS
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 📖 读书

    • 读书工具
    • 读书笔记
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

  • 数据库

    • 教程概述
    • 数据的存储
    • 数据库的安装
    • 数据库的启停与连接
    • 数据库的管理
    • SQL 概述
    • 表的管理
    • SELECT 基础
      • 查询指定列
      • 查询所有列
      • 指定列别名
      • 查询常数
      • 查询时去除重复行
      • 根据条件查询
      • 注释的写法
    • 运算符
    • 聚合查询
    • 数据的排序
    • 数据的插入
    • 数据的删除
    • 数据的更新
    • 事务
    • 视图
    • 子查询
    • 函数
    • 谓词
    • CASE 表达式
    • 集合运算
    • 联结查询-JOIN
    • SQL 入门小结
    • 更多数据库
    • MySQL 的数据类型
    • 命令行的一些用法
    • 用户与权限管理
    • MySQL 的权限管理
    • mysqldump
    • mysqladmin
    • Liquibase
    • 表注释与字段注释
    • 编码类型
  • 编程工具

  • 装机

  • 计算机基础
  • 数据库
2023-11-17
目录

SELECT 基础

# 60.SELECT 基础

接下来我们使用 SELECT ​语句来查询之前创建的 Product 表。SELECT​ 语句是 SQL 最基本也是最重要的语句,掌握了 SELECT 语句,距离掌握 SQL 语句就不远了。请务必亲自动手实践。

‍ ‍

# 查询指定列

从表中选取数据时需要使用 SELECT 语句 ,通过 SELECT 语句查询并选取出必要数据的过程称为匹配查询或查询 (query)。

SELECT 语句的基本语法如下所示:

SELECT <列名>,……
 FROM <表名>;
1
2

该 SQL 包含了 SELECT 和 FROM 两个子句 (clause)。子句是 SQL 语句的组成要素,是以 SELECT 或者 FROM 等作为起始的短语。

SELECT 子句中列举了希望从表中查询出的列的名称,查询多列时,需要使用逗号进行分隔。而 FROM 子句则指定了选取出数据的表的名称。

接下来,我们尝试从 Product 表中,查询出 product_id (商品编号)列、product_name (商品名称)列和 purchase_price (进货单价)列:

SELECT product_id, product_name, purchase_price
  FROM Product;

1
2
3

‍ 执行结果:

mysql> SELECT product_id, product_name, purchase_price
    ->   FROM Product;
+------------+--------------+----------------+
| product_id | product_name | purchase_price |
+------------+--------------+----------------+
| 0001       | T恤衫        |            500 |
| 0002       | 打孔器       |            320 |
| 0003       | 运动T恤      |           2800 |
| 0004       | 菜刀         |           2800 |
| 0005       | 高压锅       |           5000 |
| 0006       | 叉子         |           NULL |
| 0007       | 擦菜板       |            790 |
| 0008       | 圆珠笔       |           NULL |
+------------+--------------+----------------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

‍ 可以看到,查询结果中列的顺序和 SELECT 子句中的顺序相同。

# 查询所有列

想要查询出全部列时,可以使用代表所有列的星号(* ) 。语法:

SELECT *
  FROM <表名>;
1
2

使用星号的话,就无法设定列的显示顺序了。这时就会按照 CREATE TABLE 语句的定义对列进行排序。 ‍ 例如查询 Product 表中的全部列:

SELECT *
  FROM Product;
1
2

‍ 执行结果:

mysql> SELECT * FROM Product;
+------------+--------------+--------------+------------+----------------+-------------+
| product_id | product_name | product_type | sale_price | purchase_price | regist_date |
+------------+--------------+--------------+------------+----------------+-------------+
| 0001       | T恤衫        | 衣服         |       1000 |            500 | 2009-09-20  |
| 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11  |
| 0003       | 运动T恤      | 衣服         |       4000 |           2800 | NULL        |
| 0004       | 菜刀         | 厨房用具     |       3000 |           2800 | 2009-09-20  |
| 0005       | 高压锅       | 厨房用具     |       6800 |           5000 | 2009-01-15  |
| 0006       | 叉子         | 厨房用具     |        500 |           NULL | 2009-09-20  |
| 0007       | 擦菜板       | 厨房用具     |        880 |            790 | 2008-04-28  |
| 0008       | 圆珠笔       | 办公用品     |        100 |           NULL | 2009-11-11  |
+------------+--------------+--------------+------------+----------------+-------------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

‍

# 指定列别名

SQL 语句可以使用 AS 关键字 为列设定别名:

SELECT product_id     AS id,
       product_name   AS name,
       purchase_price AS price
  FROM Product;
1
2
3
4

‍ 执行结果:

+------+---------+-------+
| id   | name    | price |
+------+---------+-------+
| 0001 | T恤衫   |   500 |
| 0002 | 打孔器  |   320 |
| 0003 | 运动T恤 |  2800 |
| 0004 | 菜刀    |  2800 |
| 0005 | 高压锅  |  5000 |
| 0006 | 叉子    |  NULL |
| 0007 | 擦菜板  |   790 |
| 0008 | 圆珠笔  |  NULL |
+------+---------+-------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13

‍ 别名可以使用中文,使用中文时需要用双引号(" ) 括起来 。使用双引号可以设定包含空格(空白)的别名。但是如果忘记使用双引号就可能出错,因此并不推荐。大家可以像 product_list 这样使用下划线(_)来代替空白。

mysql> SELECT product_id     AS "商品编号",
    ->        product_name   AS "商品名称",
    ->        purchase_price AS "进货单价"
    ->   FROM Product;
+----------+----------+----------+
| 商品编号 | 商品名称 | 进货单价 |
+----------+----------+----------+
| 0001     | T恤衫    |      500 |
| 0002     | 打孔器   |      320 |
| 0003     | 运动T恤  |     2800 |
| 0004     | 菜刀     |     2800 |
| 0005     | 高压锅   |     5000 |
| 0006     | 叉子     |     NULL |
| 0007     | 擦菜板   |      790 |
| 0008     | 圆珠笔   |     NULL |
+----------+----------+----------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

‍ 像这样使用别名可以让 SELECT 语句的执行结果更加容易理解和操作。

注意,Oracle 中不能使用 as,上述 SQL 中直接去掉 as 即可,会自动将列名后的内容当作别名 ‍

# 查询常数

SELECT 子句中不仅可以书写列名,还可以书写常数。写了常数有什么用呢?相当于为结果添加一列,例如:

mysql> SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
    ->        product_id, product_name
    ->   FROM Product;
+--------+--------+------------+------------+--------------+
| string | number | date       | product_id | product_name |
+--------+--------+------------+------------+--------------+
| 商品   |     38 | 2009-02-24 | 0001       | T恤衫        |
| 商品   |     38 | 2009-02-24 | 0002       | 打孔器       |
| 商品   |     38 | 2009-02-24 | 0003       | 运动T恤      |
| 商品   |     38 | 2009-02-24 | 0004       | 菜刀         |
| 商品   |     38 | 2009-02-24 | 0005       | 高压锅       |
| 商品   |     38 | 2009-02-24 | 0006       | 叉子         |
| 商品   |     38 | 2009-02-24 | 0007       | 擦菜板       |
| 商品   |     38 | 2009-02-24 | 0008       | 圆珠笔       |
+--------+--------+------------+------------+--------------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

可以看到查询结果多了我们指定的列。一般来说直接书写常数用的较少

# 查询时去除重复行

想知道 Product 表中保存了哪些商品种类(product_type ),要怎么做呢?方法一是直接查询,然后从结果中去除重复行:

select product_type from Product;
+--------------+
| product_type |
+--------------+
| 衣服         |
| 办公用品     |
| 衣服         |
| 厨房用具     |
| 厨房用具     |
| 厨房用具     |
| 厨房用具     |
| 办公用品     |
+--------------+
8 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

或者我们使用 DISTINCT 关键字来删除重复行:

mysql> SELECT DISTINCT product_type FROM Product;
+--------------+
| product_type |
+--------------+
| 衣服         |
| 办公用品     |
| 厨房用具     |
+--------------+
3 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9

‍ 在使用 DISTINCT 时,NULL 也被视为一类数据。NULL 存在于多行中时,也会被合并为一条 NULL 数据。例如商品价格有 2 个为空,查询结果:

mysql> SELECT DISTINCT purchase_price FROM Product;3
+----------------+
| purchase_price |
+----------------+
|            500 |
|            320 |
|           2800 |
|           5000 |
|           NULL |
|            790 |
+----------------+
6 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12

‍ DISTINCT 也可以在多列之前使用。此时,会将多个列的数据进行组合,将重复的数据合并为一条。例如:

mysql> SELECT DISTINCT product_type, regist_date
    ->   FROM Product;
+--------------+-------------+
| product_type | regist_date |
+--------------+-------------+
| 衣服         | 2009-09-20  |
| 办公用品     | 2009-09-11  |
| 衣服         | NULL        |
| 厨房用具     | 2009-09-20  |
| 厨房用具     | 2009-01-15  |
| 厨房用具     | 2008-04-28  |
| 办公用品     | 2009-11-11  |
+--------------+-------------+
7 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

product_type 列为 '厨房用具' ,同时 regist_date 列为 '2009-09-20' 的两条数据被合并成了一条。

注意:DISTINCT 关键字只能用在第一个列名之前 。因此,请大家注意不能写成 regist_date, DISTINCT product_type 。 ‍

# 根据条件查询

有时候我们不想查询全部数据。而是想查询部分数据,例如“商品种类为衣服”“销售单价在 1000 日元以上”等条件的数据,那么此时就可以用 where 关键字。

在 WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。执行含有这些条件的 SELECT 语句,就可以查询出只符合该条件的记录了

这和 Excel 中根据过滤条件对行进行过滤的功能是相同的。 ‍ 语法:

SELECT <列名>, ……
  FROM <表名>
 WHERE <条件表达式>;
1
2
3

‍ 例如,选取 product_type 列为'衣服'的数据:

mysql> select product_name, product_type
    ->   from Product
    ->  where product_type = '衣服';
+--------------+--------------+
| product_name | product_type |
+--------------+--------------+
| T恤衫        | 衣服         |
| 运动T恤      | 衣服         |
+--------------+--------------+
2 rows in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10

‍ WHERE 子句中的“product_type = '衣服' ”就是用来表示查询条件的表达式(条件表达式 )。等号是比较两边的内容是否相等的符号,上述条件就是将 product_type 列的值和 '衣服' 进行比较,判断是否相等。Product 表的所有记录都会被进行比较。 ‍ 执行的过程是这样的:先通过 where 子句查询出符合指定条件的记录,然后再通过 select 选出指定的列:

​​

注意:SQL 中子句的书写顺序是固定的,不能随意更改。例如 where 子句必须紧跟在 from 子句之后,书写顺序发生改变的话会造成执行错误。 ‍

# 注释的写法

注释是 SQL 语句中用来标识说明或者注意事项的部分,提高可读性,对 SQL 的执行没有任何影响。因此,无论是英文字母还是汉字都可以随意使用。

注释分为行注释和多行注释。 ‍ 行注释:书写在“-- ”之后(注意--后面有个空格),只能写在同一行。例如:

-- 本SELECT语句会从结果中删除重复行。
SELECT DISTINCT product_id, purchase_price
  FROM Product;
1
2
3

‍ 多行注释:书写在“/*​”和“ */​ ”之间,可以跨多行。例如:

/* 本SELECT语句,
   会从结果中删除重复行。*/
SELECT DISTINCT product_id, purchase_price
  FROM Product;
1
2
3
4

‍ 甚至在 SQL 语句内部也可以用注释:

select *
-- 注释
from Product;
1
2
3

注释能够帮助阅读者更好地理解 SQL 语句,特别是在书写复杂的 SQL 语句时,希望大家能够尽量多加简明易懂的注释。注释没有长度限制,写多少都行 ‍ (完)

上次更新: 2025/5/5 17:15:09
表的管理
运算符

← 表的管理 运算符→

最近更新
01
2025 年 4 月记
04-30
02
山西大同 “订婚强奸案” 将会给整个社会带来的影响有多严重? - 知乎 转载
04-26
03
一个小技巧,让电子书阅读体验翻倍!
04-18
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式