文章目录
- 前言
- 回顾
- 视图
- 事务
- 用户变量
- 未完待续
前言
举例子,是最简单有效的学习方法。本系列文章以一个贯穿始终的场景,结合多个实例讲解MySQL的基本用法。
❔ 为什么要写这个系列?
- 模仿是最好的老师,实践是检验成果的方法。
- 本系列以实操样例和应用场景为核心,将MySQL基本用法贯穿其中,达到学以致用的效果。
❔ 为什么要学习MySQL?
- MySQL是最常用的数据库之一,具有简单易用的特点,适合初学者学习
- 数据库的基本用法有相通之处,学会MySQL可以为学习其他数据库打下良好基础
❔ 跟别的入门教材有什么不同?
- 以一个贯穿始终的应用场景为主线,渐进地讲解用法
- 难度适中,既有基础方法,也有值得注意的关键细节
❔ 本系列文章不包含哪些内容?
该系列文章的目标是,将最核心的知识,以最直接的方式,呈现给初学者。因此不包含:
- MySQL安装方法
- MySQL系统管理方法,例如备份、恢复、导入导出等
- 高级主题,例如数据库监控、数据库调优和SQL优化
回顾
上篇文章👉《【跟着例子学MySQL】SQL进阶 – 子查询和时间 讲了有关子查询、日期和时间的内容。这篇介绍视图、事务和变量的用法。
视图
视图是一个不包含任何物理数据的虚拟表。它提供了另一种查看数据的方法。
例如:
-- 从products、suppliers和products_suppliers表中定义一个被称为supplier_view的视图
mysql> CREATE VIEW supplier_view
AS
SELECT suppliers.name as `Supplier Name`, products.name as `Product Name`
FROM products
JOIN suppliers ON products.productID = products_suppliers.productID
JOIN products_suppliers ON suppliers.supplierID = products_suppliers.supplierID;
-- 你可以将定义的视图视为一个普通表
mysql> SELECT * FROM supplier_view;
+---------------+--------------+
| Supplier Name | Product Name |
+---------------+--------------+
| ABC Traders | Pencil 3B |
| ABC Traders | Pencil 4B |
| ABC Traders | Pencil 5B |
| XYZ Company | Pencil 6B |
+---------------+--------------+
mysql> SELECT * FROM supplier_view WHERE `Supplier Name` LIKE 'ABC%';
+---------------+--------------+
| Supplier Name | Product Name |
+---------------+--------------+
| ABC Traders | Pencil 3B |
| ABC Traders | Pencil 4B |
| ABC Traders | Pencil 5B |
+---------------+--------------+
mysql> DROP VIEW IF EXISTS patient_view;
mysql> CREATE VIEW patient_view
AS
SELECT
patientID AS ID,
name AS Name,
dateOfBirth AS DOB,
TIMESTAMPDIFF(YEAR, dateOfBirth, NOW()) AS Age
FROM patients
ORDER BY Age, DOB;
mysql> SELECT * FROM patient_view WHERE Name LIKE 'A%';
+------+---------+------------+------+
| ID | Name | DOB | Age |
+------+---------+------------+------+
| 1003 | Ali | 2011-01-30 | 1 |
| 1001 | Ah Teck | 1991-12-31 | 20 |
+------+---------+------------+------+
mysql> SELECT * FROM patient_view WHERE age >= 18;
+------+---------+------------+------+
| ID | Name | DOB | Age |
+------+---------+------------+------+
| 1001 | Ah Teck | 1991-12-31 | 20 |
+------+---------+------------+------+
事务
原子事务是一组SQL语句,它们要么全部成功,要么全部失败。事务对于确保数据库没有部分更新非常重要。事务处理将通过提交和回滚来执行。
例如:
mysql> CREATE TABLE accounts (
name VARCHAR(30),
balance DECIMAL(10,2)
);
mysql> INSERT INTO accounts VALUES ('Paul', 1000), ('Peter', 2000);
mysql> SELECT * FROM accounts;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 1000.00 |
| Peter | 2000.00 |
+-------+---------+
-- 将钱从一个帐户转帐到另一个帐户
mysql> START TRANSACTION;
mysql> UPDATE accounts SET balance = balance - 100 WHERE name = 'Paul';
mysql> UPDATE accounts SET balance = balance + 100 WHERE name = 'Peter';
mysql> COMMIT; -- 提交事务处理并结束事务处理
mysql> SELECT * FROM accounts;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 900.00 |
| Peter | 2100.00 |
+-------+---------+
mysql> START TRANSACTION;
mysql> UPDATE accounts SET balance = balance - 100 WHERE name = 'Paul';
mysql> UPDATE accounts SET balance = balance + 100 WHERE name = 'Peter';
mysql> ROLLBACK; -- 放弃此交易的所有更改并结束交易
mysql> SELECT * FROM accounts;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 900.00 |
| Peter | 2100.00 |
+-------+---------+
如果你在另一个mysql客户端并在事务期间(在提交或回滚之前)进行查询,将不会看到更改。或者,你还可以禁用所谓的自动提交模式,该模式默认启动,并自动提交每个SQL语句。
-- 通过将其设置为false (0)来禁用自动提交
mysql> SET autocommit = 0;
mysql> UPDATE accounts SET balance = balance - 100 WHERE name = 'Paul';
mysql> UPDATE accounts SET balance = balance + 100 WHERE name = 'Peter';
mysql> COMMIT;
mysql> SELECT * FROM accounts;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 800.00 |
| Peter | 2200.00 |
+-------+---------+
mysql> UPDATE accounts SET balance = balance - 100 WHERE name = 'Paul';
mysql> UPDATE accounts SET balance = balance + 100 WHERE name = 'Peter';
mysql> ROLLBACK;
mysql> SELECT * FROM accounts;
+-------+---------+
| name | balance |
+-------+---------+
| Paul | 800.00 |
| Peter | 2200.00 |
+-------+---------+
mysql> SET autocommit = 1; -- 启用自动提交
事务是一组满足ACID要求的操作单元:
- 原子性:如果所有操作都成功,则将提交更新到数据库。如果任何操作失败,则将回滚整个事务,并且不会对数据库进行任何更改。换句话说,没有部分更新。
- 一致性:事务将数据库从一个一致状态转换为另一个一致状态。
- 隔离:对事务的更改在提交之前对其他事务无效。
- 持久性:所承诺的改变是持久的,永远不会丢失
用户变量
在MySQL中,您可以通过:
- 在
SELECT
语句中通过@varname :=value
定义,或者 - 通过
SET @varname := value
或SET @varname = value
命令
例如:
mysql> SELECT @ali_dob := dateOfBirth FROM patients WHERE name = 'Ali';
mysql> SELECT name WHERE dateOfBirth < @ali_dob;
mysql> SET @today := CURDATE();
mysql> SELECT name FROM patients WHERE nextVisitDate = @today;
未完待续
下一篇我们接着介绍JOIN
的更多用法。
如果喜欢这篇文章,请不要忘记关注🧡、点赞👍和收藏📔哦!