文章目录
- 前言
- 上期回顾
- 探索数据的窗口 -- Select语句
- Select基础用法
- 无表Select语句
- 计算的基石 -- 运算符
- 比较运算符
- 字符串模式匹配
- 算术运算符
- 条件的灵魂 -- 逻辑运算
- 逻辑运算符
- IN, NOT IN
- BETWEEN, NOT BETWEEN
- IS NULL, IS NOT NULL
- 排列有序 -- ORDER BY子句
- 节流阀 -- LIMIT 子句
- 换个好听的名字 - AS关键字
- 团结就是力量 -- CONCAT()函数
- 未完待续
前言
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解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)
字符串模式匹配
对于字符串,除了使用“=‘和“<>’”等操作符进行完全匹配之外,我们还可以使用LIKE
或NOT 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"操作符进行正则表达式匹配。
算术运算符
你可以使用算术运算符对数值列执行算术运算,包括: +(加),-(减), *(乘), /(除)和 %(模)。
条件的灵魂 – 逻辑运算
逻辑运算符
你可以使用布尔运算符AND
和OR
来组合多个条件,也可以使用运算符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
你可以使用IN
或NOT 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 NULL
或IS 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
语句生成报表。
如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!