MySQL 数据库详解(一篇文章带你从零基础到精通)

MySQL 数据库详解(一篇文章带你从零基础到精通)

本指南旨在为初学者提供一个结构化的 MySQL 学习框架。内容涵盖了从环境连接、数据库与表结构管理(DDL)、数据操作(DML),到高级查询与核心概念(如索引和事务)的完整知识体系。

如果觉得本文对凝有帮助,请点个赞和关注吧,你的支持就是我持续更新的最大动力,谢谢!!!!

文章目录

第一部分:基础管理与连接1.1 连接 MySQL 服务器1.2 数据库(Database)核心操作

第二部分:DDL - 数据定义语言2.1 表(Table)核心操作

第三部分:DML - 数据操纵语言3.1 插入数据 (INSERT)3.2 查询数据 (SELECT)3.3 更新数据 (UPDATE)3.4 删除数据 (DELETE)

第四部分:高级查询技术4.1 聚合函数 (Aggregate Functions)4.2 分组查询 (`GROUP BY`)4.3 分组过滤 (`HAVING`)4.4 连接查询 (`JOIN`)

第五部分:核心进阶概念5.1 索引 (Index)5.2 事务 (Transaction)

第六部分:深入查询与数据组合6.1 子查询 (Subquery)6.2 组合查询 (`UNION`)

第七部分:关系完整性与外键7.1 外键 (Foreign Key)7.2 级联操作 (`ON DELETE` / `ON UPDATE`)

第八部分:视图与常用函数8.1 视图 (View)8.2 常用内置函数

第九部分:用户管理与权限控制9.1 用户管理9.2 权限控制

总结与展望

第一部分:基础管理与连接

在与数据交互之前,必须首先建立与数据库服务器的连接,并掌握对数据库(Database)本身的管理。

1.1 连接 MySQL 服务器

连接 MySQL 服务器是与数据库进行交互的首要步骤。

语法格式

mysql -h 主机地址 -u 用户名 -p

参数详解

mysql: MySQL 客户端应用程序的可执行命令。-h (host): 指定目标 MySQL 服务器的主机名或 IP 地址。若连接本机服务器,此参数可省略。-u (user): 指定用于登录的用户名。-p (password): 此参数会提示用户在下一行安全地输入密码,以避免密码在命令行历史中暴露。

示例

# 使用 root 用户连接本地 MySQL 服务器

mysql -u root -p

# 系统将提示输入密码

Enter password:

成功连接后,命令提示符将变为 mysql>,表示已进入 MySQL 交互环境。

1.2 数据库(Database)核心操作

数据库是表的逻辑集合,是数据管理的最高层级容器。

1. 查看所有数据库

SHOW DATABASES;

说明:该命令用于列出当前 MySQL 服务器上存在的所有数据库。SQL 语句以分号 ; 结尾。

2. 创建新数据库

CREATE DATABASE 数据库名;

示例:创建一个用于存储电子商务数据的数据库 e_commerce。

CREATE DATABASE e_commerce;

3. 选择(进入)数据库

USE 数据库名;

说明:在执行任何针对表的操作前,必须通过此命令指定当前会话的默认数据库。 示例:选择 e_commerce 数据库作为当前操作环境。

USE e_commerce;

4. 删除数据库

DROP DATABASE 数据库名;

警告:此操作将永久性删除数据库及其所有内容(包括表、数据、索引等),且无法恢复。执行前请务必确认。 示例:删除一个名为 temp_db 的测试数据库。

DROP DATABASE temp_db;

第二部分:DDL - 数据定义语言

DDL (Data Definition Language) 用于定义和管理数据库对象的结构,核心是表(Table)的创建与维护。

2.1 表(Table)核心操作

表是结构化数据的基本单位,由行(记录)和列(字段)组成。

1. 查看当前数据库的所有表

SHOW TABLES;

说明:此命令必须在已通过 USE 命令选定数据库后执行。

2. 创建新表 CREATE TABLE 是定义数据结构的关键命令。

语法格式

CREATE TABLE 表名 (

列名1 数据类型 [约束条件],

列名2 数据类型 [约束条件],

...,

PRIMARY KEY (主键列)

);

关键组件详解

常用数据类型

INT: 整数类型。VARCHAR(n): 可变长度字符串,n 为最大字符数。TEXT: 用于存储长文本数据。DECIMAL(p, s): 高精度定点数,p 为总位数,s 为小数位数。适用于金融计算。DATETIME: 存储日期和时间,格式为 YYYY-MM-DD HH:MM:SS。TIMESTAMP: 时间戳,通常用于自动记录行创建或更新的时间。 常用约束 (Constraints)

NOT NULL: 强制列值不能为空。AUTO_INCREMENT: 自动递增,常用于整数类型的主键列。PRIMARY KEY: 主键约束,唯一标识表中的每一行。UNIQUE: 唯一约束,确保列中所有值均不重复。DEFAULT value: 为列设置默认值。

示例 在 e_commerce 数据库中创建 products 表。

CREATE TABLE products (

id INT NOT NULL AUTO_INCREMENT,

product_name VARCHAR(255) NOT NULL,

category VARCHAR(100),

price DECIMAL(10, 2) NOT NULL,

stock_quantity INT NOT NULL DEFAULT 0,

created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (id)

);

结构分析:

id: 主键,整数,非空,自增。product_name: 商品名称,字符串,非空。category: 商品分类,字符串。price: 价格,精确到两位小数,非空。stock_quantity: 库存数量,整数,默认为0。created_at: 记录创建时间,默认为当前时间戳。

3. 查看表结构

DESCRIBE 表名; -- 可简写为 DESC 表名;

示例:查看 products 表的详细定义。

DESC products;

4. 修改表结构 (ALTER TABLE) 用于在表创建后调整其结构。

添加新列

ALTER TABLE 表名 ADD COLUMN 新列名 数据类型 [约束];

示例:为 products 表添加 supplier (供应商) 列。

ALTER TABLE products ADD COLUMN supplier VARCHAR(150);

修改列定义

ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型 [新约束];

示例:将 supplier 列的类型长度扩展至 VARCHAR(200)。

ALTER TABLE products MODIFY COLUMN supplier VARCHAR(200);

删除列

ALTER TABLE 表名 DROP COLUMN 列名;

示例:从 products 表中移除 supplier 列。

ALTER TABLE products DROP COLUMN supplier;

5. 删除表

DROP TABLE 表名;

警告:此操作将永久性删除表结构及其所有数据,请谨慎操作。 示例:删除名为 old_products 的表。

DROP TABLE old_products;

第三部分:DML - 数据操纵语言

DML (Data Manipulation Language) 负责对表中的数据进行增、删、改、查(CRUD)操作,是日常使用频率最高的命令集。

3.1 插入数据 (INSERT)

向表中添加新的记录。

语法格式

-- 插入单条记录

INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);

-- 插入多条记录

INSERT INTO 表名 (列1, 列2, ...) VALUES

(值A1, 值A2, ...),

(值B1, 值B2, ...);

示例

-- 向 products 表插入一条记录

INSERT INTO products (product_name, category, price, stock_quantity)

VALUES ('Laptop Model X', 'Electronics', 8500.00, 50);

-- 向 products 表插入多条记录

INSERT INTO products (product_name, category, price, stock_quantity) VALUES

('Wireless Mouse', 'Accessories', 250.00, 300),

('Mechanical Keyboard', 'Accessories', 750.00, 150);

3.2 查询数据 (SELECT)

从表中检索数据,是功能最强大且最复杂的 DML 命令。

1. 查询所有列

SELECT * FROM 表名;

说明:* 通配符代表所有列。在生产环境中,为提升性能和代码可读性,推荐显式指定列名。 示例:

SELECT * FROM products;

2. 查询指定列

SELECT 列1, 列2 FROM 表名;

示例: 仅查询商品名称和价格。

SELECT product_name, price FROM products;

3. 条件过滤 (WHERE) WHERE 子句用于筛选满足特定条件的记录。

常用操作符: =, <>, !=, >, <, >=, <=, BETWEEN ... AND ..., LIKE, IN (...)

示例

-- 查询价格高于 1000 的电子产品

SELECT product_name, price FROM products WHERE category = 'Electronics' AND price > 1000;

-- 查询产品名称中包含 'Keyboard' 的产品 (模糊查询)

SELECT * FROM products WHERE product_name LIKE '%Keyboard%';

-- 查询价格在 500 到 1000 区间的产品

SELECT * FROM products WHERE price BETWEEN 500 AND 1000;

4. 结果排序 (ORDER BY)

SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC];

说明:ASC 为升序 (默认),DESC 为降序。 示例: 按价格降序排列所有商品。

SELECT product_name, price FROM products ORDER BY price DESC;

5. 限制返回数量 (LIMIT) 用于数据分页或获取 Top-N 结果。

语法格式

-- 返回前 N 条记录

LIMIT N;

-- 从偏移量 M 处开始,返回 N 条记录 (偏移量从 0 开始)

LIMIT M, N;

示例

-- 查询价格最高的 3 款产品

SELECT product_name, price FROM products ORDER BY price DESC LIMIT 3;

-- 分页查询:获取第 2 页数据,每页 10 条 (记录 10 到 19)

SELECT * FROM products LIMIT 10, 10;

3.3 更新数据 (UPDATE)

修改表中已存在的记录。

语法格式

UPDATE 表名 SET 列1 = 新值1, 列2 = 新值2, ... WHERE 条件;

警告:WHERE 子句是 UPDATE 的安全阀。若省略,将更新表中的所有行。务必在执行前确认 WHERE 条件的准确性。

示例

-- 将 'Laptop Model X' 的价格更新为 8200.00

UPDATE products SET price = 8200.00 WHERE product_name = 'Laptop Model X';

-- 将所有 'Accessories' 分类的商品库存增加 20

UPDATE products SET stock_quantity = stock_quantity + 20 WHERE category = 'Accessories';

3.4 删除数据 (DELETE)

从表中移除记录。

语法格式

DELETE FROM 表名 WHERE 条件;

警告:与 UPDATE 类似,WHERE 子句至关重要。若省略,将删除表中的所有行。

示例

-- 删除 ID 为 3 的产品记录

DELETE FROM products WHERE id = 3;

注意: TRUNCATE TABLE 表名; 可用于快速清空表内所有数据。其效率高于 DELETE,但它不触发删除触发器,且通常无法回滚。

第四部分:高级查询技术

掌握高级查询技术是数据分析和复杂应用开发的基础。

4.1 聚合函数 (Aggregate Functions)

聚合函数对一组行的值进行计算,并返回单个结果。

COUNT(列名|*): 计算行数。COUNT(*) 计算所有行,COUNT(列名) 计算指定列非 NULL 值的行数。SUM(列名): 计算数值列的总和。AVG(列名): 计算数值列的平均值。MAX(列名): 返回列中的最大值。MIN(列名): 返回列中的最小值。

示例

-- 计算产品总数

SELECT COUNT(*) AS total_products FROM products;

-- 计算所有 'Electronics' 类产品的总库存

SELECT SUM(stock_quantity) AS total_electronics_stock FROM products WHERE category = 'Electronics';

-- 查询最昂贵产品的价格

SELECT MAX(price) FROM products;

说明:AS 关键字用于为结果列指定别名,提高可读性。

4.2 分组查询 (GROUP BY)

GROUP BY 子句将具有相同值的行聚合到摘要行中,常与聚合函数联用。

语法格式

SELECT 列, 聚合函数() FROM 表名 GROUP BY 列;

示例

-- 统计每个分类下的产品数量

SELECT category, COUNT(*) AS product_count FROM products GROUP BY category;

-- 计算每个分类的平均价格

SELECT category, AVG(price) AS average_price FROM products GROUP BY category;

4.3 分组过滤 (HAVING)

HAVING 子句用于在 GROUP BY 分组后对结果集进行过滤。

语法格式

SELECT ... FROM ... GROUP BY ... HAVING 分组条件;

WHERE 与 HAVING 的区别:

WHERE 在分组前对原始行进行过滤。HAVING 在分组后对聚合结果进行过滤。

示例

-- 查找产品数量超过 10 个的分类

SELECT category, COUNT(*) AS product_count

FROM products

GROUP BY category

HAVING COUNT(*) > 10;

4.4 连接查询 (JOIN)

JOIN 用于根据相关列将多个表中的行组合起来。

场景: 假设存在 orders (订单) 表,包含 order_id, product_id, quantity 等列。

1. INNER JOIN (内连接) 返回两个表中连接列匹配的行。

示例: 查询订单及其对应的产品名称。

SELECT

o.order_id,

p.product_name,

o.quantity

FROM orders AS o

INNER JOIN products AS p ON o.product_id = p.id;

说明: ON 子句定义了表之间的连接条件。使用表别名(如 o 和 p)可以简化查询语句。

2. LEFT JOIN (左连接) 返回左表的所有行,以及右表中匹配的行。若右表无匹配,则结果为 NULL。

示例: 列出所有产品及其订单信息,即使某些产品从未被订购。

SELECT

p.product_name,

o.order_id,

o.quantity

FROM products AS p

LEFT JOIN orders AS o ON p.id = o.product_id;

第五部分:核心进阶概念

理解索引和事务是保证数据库性能和数据一致性的关键。

5.1 索引 (Index)

索引是数据库中一种特殊的数据结构,旨在大幅提高数据检索的速度。

创建索引

CREATE INDEX 索引名 ON 表名 (列名1, 列名2, ...);

适用场景: 频繁用于 WHERE 查询条件、JOIN 连接条件或 ORDER BY 排序的列是创建索引的主要候选对象。主键列会自动创建唯一的聚集索引。

示例 为 products 表的 product_name 列创建索引以加速按名称搜索。

CREATE INDEX idx_product_name ON products (product_name);

查看与删除索引

-- 查看表的索引信息

SHOW INDEX FROM 表名;

-- 删除索引

DROP INDEX 索引名 ON 表名;

5.2 事务 (Transaction)

事务是一个原子性的操作序列,这些操作要么全部执行成功,要么全部回滚失败,以维护数据库的完整性和一致性。

事务控制命令

START TRANSACTION; 或 BEGIN;: 标志着一个新事务的开始。COMMIT;: 提交事务,将事务期间的所有修改永久性地写入数据库。ROLLBACK;: 回滚事务,撤销自事务开始以来的所有修改。

示例: 模拟一个安全的库存扣减和订单创建过程。

START TRANSACTION;

-- 步骤 1: 扣减产品库存

UPDATE products SET stock_quantity = stock_quantity - 1

WHERE id = 1 AND stock_quantity > 0;

-- 步骤 2: 创建订单记录

-- (假设上一步操作影响的行数为 1,表示库存足够)

INSERT INTO orders (product_id, quantity) VALUES (1, 1);

-- 如果所有步骤均成功,则提交事务

COMMIT;

-- 如果任何步骤失败 (例如,库存不足导致 UPDATE 未执行),则回滚

-- ROLLBACK;

说明:在应用程序逻辑中,通常会检查每一步操作的执行结果,然后决定是 COMMIT 还是 ROLLBACK。

第六部分:深入查询与数据组合

当单个表的查询无法满足需求时,就需要掌握更高级的查询技巧,如子查询、组合查询以及更复杂的连接。

6.1 子查询 (Subquery)

子查询是嵌套在另一个 SQL 查询(如 SELECT, INSERT, UPDATE, DELETE)中的查询。它允许我们基于一个查询的结果来执行另一个查询。

1. 在 WHERE 子句中使用 这是最常见的用法,用于根据动态条件进行过滤。

示例:查询价格高于平均价格的所有产品。

-- 步骤 1: 找出平均价格 (这将是子查询)

-- SELECT AVG(price) FROM products;

-- 步骤 2: 将子查询嵌入主查询

SELECT product_name, price

FROM products

WHERE price > (SELECT AVG(price) FROM products);

2. 在 FROM 子句中使用 子查询的结果可以作为一个临时的、派生的表,在主查询中被引用。

示例:查询每个分类中价格最高的产品信息。

-- 子查询: 找出每个分类的最高价格

-- SELECT category, MAX(price) AS max_price FROM products GROUP BY category;

-- 主查询: 将产品表与上述派生表连接

SELECT p.product_name, p.category, p.price

FROM products AS p

INNER JOIN (

SELECT category, MAX(price) AS max_price

FROM products

GROUP BY category

) AS max_prices_by_cat

ON p.category = max_prices_by_cat.category AND p.price = max_prices_by_cat.max_price;

6.2 组合查询 (UNION)

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

语法规则

所有 SELECT 语句必须拥有相同数量的列。相应列的数据类型必须兼容。列的顺序必须相同。

UNION vs UNION ALL

UNION: 自动去除结果集中的重复行。UNION ALL: 保留所有行,包括重复行,因此执行效率更高。

示例:假设我们有一个 archived_products (已归档产品) 表,结构与 products 相同。现在需要查询所有在售和已归档的电子产品。

-- 从在售产品表中查询

SELECT product_name, category, price FROM products WHERE category = 'Electronics'

UNION ALL

-- 从已归档产品表中查询

SELECT product_name, category, price FROM archived_products WHERE category = 'Electronics';

第七部分:关系完整性与外键

在关系型数据库中,表与表之间的关系至关重要。外键是维护这种关系和数据完整性的核心机制。

7.1 外键 (Foreign Key)

外键是一个(或一组)列,其值引用另一张表的主键。它确保了引用数据的有效性,防止产生“孤儿记录”。

场景: 我们需要一个 orders (订单) 表来记录哪个产品被购买了。orders 表中的 product_id 就应该是一个外键,指向 products 表的 id。

创建带有外键的表

-- 先创建 customers 表

CREATE TABLE customers (

id INT NOT NULL AUTO_INCREMENT,

customer_name VARCHAR(255) NOT NULL,

email VARCHAR(255) UNIQUE,

PRIMARY KEY (id)

);

-- 创建 orders 表,并设置外键

CREATE TABLE orders (

order_id INT NOT NULL AUTO_INCREMENT,

customer_id INT,

order_date DATE,

total_amount DECIMAL(12, 2),

PRIMARY KEY (order_id),

FOREIGN KEY (customer_id) REFERENCES customers(id)

);

外键约束分析: FOREIGN KEY (customer_id) REFERENCES customers(id)

FOREIGN KEY (customer_id): 指定 orders 表中的 customer_id 为外键列。REFERENCES customers(id): 指明此外键引用 customers 表的 id 列。这个约束意味着,插入到 orders 表的 customer_id 必须是 customers 表中已经存在的 id。

7.2 级联操作 (ON DELETE / ON UPDATE)

外键可以定义当被引用的主键记录被删除或更新时,应采取的相应动作。

CASCADE: 如果父表中的记录被删除/更新,则子表中所有相关的记录也自动被删除/更新。SET NULL: 如果父表中的记录被删除/更新,则子表中相关记录的外键列被设置为 NULL (前提是该列允许为 NULL)。RESTRICT / NO ACTION (默认): 如果子表中存在相关记录,则阻止对父表记录的删除/更新操作。

示例:创建订单详情表 order_items,当订单被删除时,相关的订单项也自动删除。

CREATE TABLE order_items (

item_id INT NOT NULL AUTO_INCREMENT,

order_id INT NOT NULL,

product_id INT NOT NULL,

quantity INT,

price_per_unit DECIMAL(10, 2),

PRIMARY KEY (item_id),

FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,

FOREIGN KEY (product_id) REFERENCES products(id)

);

第八部分:视图与常用函数

8.1 视图 (View)

视图是一个虚拟表,其内容由查询定义。它就像一个“已保存的查询”,可以简化复杂查询、提供数据安全性并保持逻辑一致性。

创建视图

CREATE VIEW 视图名 AS SELECT_语句;

示例: 创建一个只显示高价值电子产品信息的视图。

CREATE VIEW high_value_electronics AS

SELECT product_name, price, stock_quantity

FROM products

WHERE category = 'Electronics' AND price > 5000;

使用视图 视图创建后,可以像查询普通表一样查询它。

SELECT * FROM high_value_electronics WHERE stock_quantity < 20;

优点

简化操作: 将复杂的 JOIN 和过滤逻辑封装起来。安全性: 可以只向用户暴露视图,隐藏底层表的敏感列或行。逻辑独立性: 即使底层表的结构发生变化(如添加列),只要视图的定义不受影响,依赖于视图的应用程序就无需修改。

8.2 常用内置函数

MySQL 提供了大量内置函数,用于数据处理和计算。

1. 字符串函数

CONCAT(str1, str2, ...): 连接字符串。LENGTH(str): 返回字符串的字节长度。UPPER(str) / LOWER(str): 转换为大/小写。SUBSTRING(str, pos, len): 提取子字符串。

示例:

SELECT CONCAT(product_name, ' (Category: ', category, ')') AS full_description FROM products;

2. 数值函数

ROUND(num, d): 四舍五入到指定小数位数 d。CEIL(num): 向上取整。FLOOR(num): 向下取整。

示例:

SELECT price, ROUND(price) AS rounded_price FROM products;

3. 日期与时间函数

NOW(): 返回当前日期和时间。CURDATE(): 返回当前日期。CURTIME(): 返回当前时间。DATE_FORMAT(date, format): 按指定格式格式化日期。

示例:

-- 以 '2023-10-27' 格式显示订单日期

SELECT order_id, DATE_FORMAT(order_date, '%Y-%m-%d') AS formatted_date FROM orders;

4. 控制流函数

IF(expr1, expr2, expr3): 如果 expr1 为真,返回 expr2,否则返回 expr3。CASE ... WHEN ... THEN ... ELSE ... END: 复杂的条件逻辑判断。

示例: 根据价格给产品打上标签。

SELECT

product_name,

price,

CASE

WHEN price > 5000 THEN 'Premium'

WHEN price > 1000 AND price <= 5000 THEN 'Mid-Range'

ELSE 'Affordable'

END AS price_tier

FROM products;

第九部分:用户管理与权限控制

在多用户环境中,为不同用户分配适当的权限是数据库安全的核心。

9.1 用户管理

1. 创建用户

CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

主机: 指定用户可以从哪个主机连接。localhost 表示仅本机,% 表示任意主机。

示例: 创建一个只能从本地连接的只读用户 readonly_user。

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'secure_password';

2. 删除用户

DROP USER '用户名'@'主机';

9.2 权限控制

1. 授予权限 (GRANT)

GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机';

权限列表: 如 SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 等。数据库.表: 可以是 db_name.* (整个数据库), db_name.table_name (特定表), 或 *.* (所有数据库)。

示例:

-- 为 readonly_user 授予对 e_commerce 数据库所有表的 SELECT 权限

GRANT SELECT ON e_commerce.* TO 'readonly_user'@'localhost';

-- 创建一个可以对 products 表进行增删改查的 app_user

CREATE USER 'app_user'@'%' IDENTIFIED BY 'app_password';

GRANT SELECT, INSERT, UPDATE, DELETE ON e_commerce.products TO 'app_user'@'%';

2. 撤销权限 (REVOKE)

REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'主机';

示例: 撤销 app_user 的 DELETE 权限。

REVOKE DELETE ON e_commerce.products FROM 'app_user'@'%';

3. 查看权限

SHOW GRANTS FOR '用户名'@'主机';

最佳实践: 遵循 最小权限原则 (Principle of Least Privilege),即只授予用户完成其工作所必需的最小权限。

总结与展望

您已完成了一次从基础到进阶的 MySQL 旅程,掌握了从数据操作(DML)、结构定义(DDL),到高级查询、关系设计、安全管理的核心知识体系。精通之路在于持续实践与深入探索,将理论知识应用于真实场景。

建议后续学习方向:

查询优化:学习使用 EXPLAIN 分析性能,精通索引的应用。数据库设计:掌握范式(Normalization)与外键,设计健壮、高效的数据模型。高级功能:探索存储过程、触发器与视图,实现业务逻辑自动化。管理与安全:熟练配置用户权限,并掌握备份与恢复策略。

相关推荐

肈的解释
365游戏注册

肈的解释

07-18 👁️ 4586
冯的意思,冯的解释,冯的拼音,冯的部首,冯的笔顺
365赢30万不让提款

冯的意思,冯的解释,冯的拼音,冯的部首,冯的笔顺

07-28 👁️ 8613