【跟着例子学MySQL】窥探数据本质 -- Select语句基础


前言

在这里插入图片描述
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。

为什么要写这个系列?

  • 模仿是最好的老师,实践是检验成果的方法。
  • 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。

为什么要学习MySQL?

  • MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
  • 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础

跟别的入门教材有什么不同?

  • 以一个贯穿始终的应用场景为主线,渐进地讲解用法
  • 难度适中,既有基础方法,也有值得注意的关键细节

本系列文章不包含哪些内容?

该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:

  • MySQL安装方法
  • MySQL系统管理方法,例如备份、恢复、导入导出等
  • 高级主题,例如数据库监控、数据库调优和SQL优化

上期回顾

上篇文章👉《【跟着例子学MySQL】构建新世界 – 创建样例库》中介绍了如何创建数据库并插入数据。

今天接着讲如何查询这些数据。


探索数据的窗口 – Select语句

Select基础用法

使用SELECT语句查询数据库中的数据是最常见、最重要,也是最复杂的任务。SELECT的语法如下:

-- 列出指定列中的所有行
SELECT column1Name, column2Name, ... FROM tableName

-- 列出所有列中的所有行,*是通配符,代表所有列
SELECT * FROM tableName

-- 在WHERE子句中过滤出满足指定条件的行
SELECT column1Name, column2Name,... FROM tableName WHERE criteria
SELECT * FROM tableName WHERE criteria

例如:

-- 列出name和price列的所有行
mysql> SELECT name, price FROM products;

+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+
5 rows in set (0.00 sec)

-- 列出所有列的所有行
mysql> SELECT * FROM products;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+
5 rows in set (0.00 sec)

无表Select语句

SELECT语句中不一定非要包含表,你也可以执行不带表的SELECT语句。例如,计算一个表达式或执行一个内置函数。

mysql> SELECT 1+1;
+-----+
| 1+1 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)

mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2012-10-24 22:13:29 |
+---------------------+
1 row in set (0.00 sec)

// 返回多个列
mysql> SELECT 1+1, NOW();
+-----+---------------------+
| 1+1 | NOW()               |
+-----+---------------------+
| 2   | 2012-10-24 22:16:34 |
+-----+---------------------+
1 row in set (0.00 sec)

计算的基石 – 运算符

比较运算符

对于数值类型(INT、DECIMAL、FLOAT),可以使用比较运算符:“=”、“<>”或“!=”(不等于)、“>”、“<”、“>=”、“<=”来比较两个数字。例如,price > 1.0,quantity <= 500。

mysql> SELECT name, price FROM products WHERE price < 1.0;
+-----------+-------+
| name      | price |
+-----------+-------+
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+
2 rows in set (0.00 sec)

mysql> SELECT name, quantity FROM products WHERE quantity <= 2000;
+-----------+----------+
| name      | quantity |
+-----------+----------+
| Pen Black | 2000     |
+-----------+----------+
1 row in set (0.00 sec)

❗ 注意:FLOAT 不能通过 “=” 做等值判断,因为 FLOAT 并不精确。

对于字符串,你还可以使用“=”、“<>”、“>”、“<”、“>=”、“<=”来比较两个字符串,字符串的顺序取决于所选的排序规则。例如:

mysql> SELECT name, price FROM products WHERE productCode = 'PEN';
-- String values are quoted
+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
+-----------+-------+
3 rows in set (0.00 sec)

字符串模式匹配

对于字符串,除了使用“=‘和“<>’”等操作符进行完全匹配之外,我们还可以使用LIKENOT LIKE操作符执行模式匹配。

通配符“_”匹配任何单个字符,“%”匹配任意数量的字符(包括零)。例如:

  • “abc%”匹配以“abc”开头的字符串;
  • “%xyz”匹配以“xyz”结尾的字符串;
  • “%aaa%”匹配包含“aaa”的字符串;
  • ‘___’匹配恰好包含三个字符的字符串;
  • ‘a_b%‘匹配以“a”开头的字符串,后面跟着任何单个字符,再后面跟着“b”,最后跟着0个或多个字符。
-- name列以PENCIL开头
mysql> SELECT name, price FROM products WHERE name LIKE 'PENCIL%';
+-----------+-------+
| name      | price |
+-----------+-------+
| Pencil 2B | 0.48  |
| Pencil 2H | 0.49  |
+-----------+-------+

-- name列以P开头, 后面跟着任意两个字符,再后边是空格, 再后是0或多个字符
mysql> SELECT name, price FROM products WHERE name LIKE 'P__ %';
+-----------+-------+
| name      | price |
+-----------+-------+
| Pen Red   | 1.23  |
| Pen Blue  | 1.25  |
| Pen Black | 1.25  |
+-----------+-------+

❗ 注意:MySQL还支持通过"REGEXE"操作符进行正则表达式匹配。

算术运算符

你可以使用算术运算符对数值列执行算术运算,包括: +(加),-(减), *(乘), /(除)和 %(模)。

条件的灵魂 – 逻辑运算

逻辑运算符

你可以使用布尔运算符ANDOR来组合多个条件,也可以使用运算符NOT反转条件。例如:

mysql> SELECT * FROM products WHERE quantity >= 5000 AND name LIKE 'Pen %';
+-----------+-------------+----------+----------+-------+
| productID | productCode | name     | quantity | price |
+-----------+-------------+----------+----------+-------+
| 1001      | PEN         | Pen Red  | 5000     | 1.23  |
| 1002      | PEN         | Pen Blue | 8000     | 1.25  |
+-----------+-------------+----------+----------+-------+

mysql> SELECT * FROM products WHERE quantity >= 5000 AND price < 1.24 AND name LIKE 'Pen %';
+-----------+-------------+---------+----------+-------+
| productID | productCode | name    | quantity | price |
+-----------+-------------+---------+----------+-------+
| 1001      | PEN         | Pen Red | 5000     | 1.23  |
+-----------+-------------+---------+----------+-------+

mysql> SELECT * FROM products WHERE NOT (quantity >= 5000 AND name LIKE 'Pen %');
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+

IN, NOT IN

你可以使用INNOT IN运算符从集合的成员中进行选择。这比等效的“AND-OR”表达式更容易也更清晰。

mysql> SELECT * FROM products WHERE name IN ('Pen Red', 'Pen Black');
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
+-----------+-------------+-----------+----------+-------+

BETWEEN, NOT BETWEEN

要检查该值是否在一个范围内,你可以使用BETWEEN ... AND ...运算符。同样,这比等效的"AND-OR"表达更容易也更清晰。

mysql> SELECT * FROM products
       WHERE (price BETWEEN 1.0 AND 2.0) AND (quantity BETWEEN 1000 AND 2000);
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
+-----------+-------------+-----------+----------+-------+

IS NULL, IS NOT NULL

NULL是一个特殊值,表示“无值”、“缺失值”或“未知值”。你可以通过IS NULLIS NOT NULL检查列是否包含NULL。例如:

mysql> SELECT * FROM products WHERE productCode IS NULL;
Empty set (0.00 sec)

一个非常常见的错误是:使用比较运算符(=或<>)来检查NULL 。例如:

 SELECT * FROM products WHERE productCode = NULL;
-- 这是一个常见的错误。NULL不能比较。

排列有序 – ORDER BY子句

你可以使用ORDER BY子句对已筛选的行进行排序,语法如下:

SELECT ... FROM tableName
WHERE criteria
ORDER BY columnA ASC|DESC, columnB ASC|DESC, ...

已筛选的行将根据 columnA 中的值进行排序,可按升序(ASC,默认)或降序(DESC)排序。如果 columnA 中的几行具有相同的值,则它将按 columnB 进行排序,以此类推。例如:

-- 按price降序排序
mysql> SELECT * FROM products WHERE name LIKE 'Pen %' ORDER BY price DESC;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
+-----------+-------------+-----------+----------+-------+

-- 按price降序排序,然后按quantity升序(默认)排序
mysql> SELECT * FROM products WHERE name LIKE 'Pen %' ORDER BY price DESC, quantity;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1003      | PEN         | Pen Black | 2000     | 1.25  |
| 1002      | PEN         | Pen Blue  | 8000     | 1.25  |
| 1001      | PEN         | Pen Red   | 5000     | 1.23  |
+-----------+-------------+-----------+----------+-------+

你也可以通过RAND()函数返回乱序结果,例如:

mysql> SELECT * FROM products ORDER BY RAND();

节流阀 – LIMIT 子句

对大型数据库的SELECT查询可能会产生大量结果。你可以使用LIMIT子句来限制显示的行数,例如:

-- 显示price最便宜的两行
mysql> SELECT * FROM products ORDER BY price LIMIT 2;
+-----------+-------------+-----------+----------+-------+
| productID | productCode | name      | quantity | price |
+-----------+-------------+-----------+----------+-------+
| 1004      | PEC         | Pencil 2B | 10000    | 0.48  |
| 1005      | PEC         | Pencil 2H | 8000     | 0.49  |
+-----------+-------------+-----------+----------+-------+

要继续查看后续记录,可以在LIMIT子句中指定要跳过的行数和要继续显示的行数,如下所示:

-- 跳过前两行,继续显示第三行
mysql> SELECT * FROM products ORDER BY price LIMIT 2, 1;
+-----------+-------------+---------+----------+-------+
| productID | productCode | name    | quantity | price |
+-----------+-------------+---------+----------+-------+
| 1001      | PEN         | Pen Red | 5000     | 1.23  |
+-----------+-------------+---------+----------+-------+

换个好听的名字 - AS关键字

你可以使用关键字AS为标识符(如列名和表名)定义别名,它可以被引用,并显示在最终结果中。例如:

mysql> SELECT productID AS ID, productCode AS Code,
              name AS Description, price AS `Unit Price` 
       FROM products
       ORDER BY ID; --使用别名ID作为引用
+------+------+-------------+------------+
| ID   | Code | Description | Unit Price |
+------+------+-------------+------------+
| 1001 | PEN  | Pen Red     | 1.23       |
| 1002 | PEN  | Pen Blue    | 1.25       |
| 1003 | PEN  | Pen Black   | 1.25       |
| 1004 | PEC  | Pencil 2B   | 0.48       |
| 1005 | PEC  | Pencil 2H   | 0.49       |
+------+------+-------------+------------+

❗ 注意:标识符“Unit Price”包含空格,必须用反引号包围。

团结就是力量 – CONCAT()函数

你还可以使用函数CONCAT()将几列连接为一列。例如:

mysql> SELECT CONCAT(productCode, ' - ', name) AS `Product Description`,   price FROM products;
+---------------------+-------+
| Product Description | price |
+---------------------+-------+
| PEN - Pen Red       | 1.23  |
| PEN - Pen Blue      | 1.25  |
| PEN - Pen Black     | 1.25  |
| PEC - Pencil 2B     | 0.48  |
| PEC - Pencil 2H     | 0.49  |
+---------------------+-------+

未完待续

这篇我们讲了SELECT语句的基本用法,下一篇我们继续讲如何利用SELECT语句生成报表。


如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师昌哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值