赞
踩
MySQL数据库基础知识,类型知识点梳理~
MySQL是一种关系型数据库管理系统,支持多种数据结构类型,用于存储和管理结构化数据。选择合适的数据类型不仅能提高存储效率,还能提升查询性能和数据完整性。
数据结构类型:
数值类型
TINYINT
, SMALLINT
, MEDIUMINT
, INT
, BIGINT
FLOAT
, DOUBLE
DECIMAL
日期和时间类型
DATE
, TIME
, DATETIME
, TIMESTAMP
, YEAR
字符串类型
CHAR
, VARCHAR
TEXT
, TINYTEXT
, MEDIUMTEXT
, LONGTEXT
BLOB
, TINYBLOB
, MEDIUMBLOB
, LONGBLOB
枚举和集合类型
ENUM
SET
JSON 类型
JSON
实际案例~应用场景分析:
在开发过程中,根据具体的业务需求和数据特点来选用合适的数据类型,以实现最佳的性能和可维护性。下方举例四种常见的平台来简要分析一下。
电子商务平台
VARCHAR
或TEXT
存储产品名称和描述,使用DECIMAL
存储价格,使用INT
存储库存数量。DATETIME
记录订单时间,使用ENUM
记录订单状态 (如待支付、已支付、已发货等) 。VARCHAR
存储用户名和电子邮件地址,使用DATE
存储用户生日。社交网络
VARCHAR
存储用户名和密码,使用TEXT
存储用户简介,使用DATE
存储生日。TEXT
存储帖子和评论内容,使用DATETIME
记录发布时间。INT
存储用户ID,使用SET
表示关系类型(好友,关注者,被关注者)。财务系统
INT
存储账户ID,使用DECIMAL
存储余额,使用ENUM
表示账户类型(储蓄账户、支票账户)。DECIMAL
存储交易金额,使用DATETIME
记录交易时间,使用ENUM
表示交易类型(存款、取款、转账)。内容管理系统
TEXT
存储文章内容,使用VARCHAR
存储标题,使用DATETIME
记录发布时间。VARCHAR
存储分类和标签名称,使用INT
作为关联键。ENUM
表示用户角色(管理员、编辑、作者、读者)。MySQL提供了丰富的函数类型,包括数学函数、日期函数、字符串函数、逻辑函数等。这些函数能在数据库中进行数据处理、转换和计算,提高数据处理的效率和灵活性。
函数类型:
数学函数
日期函数
字符串函数
,
作为分隔符
应用场景分析:
SUM()
计算订单中商品的总金额。 SELECT order_id, SUM(price * quantity) AS total_amount
FROM order_details
GROUP BY order_id;
DATE_FORMAT()
将订单时间格式化为可读的日期格式。SELECT order_id, DATE_FORMAT(order_date, '%Y-%m-%d %H:%i:%s') AS formatted_date
FROM orders;
社交网络应用
CONCAT()
拼接用户的姓和名,生成完整的用户名。SELECT user_id, CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
IF()
根据用户最近登录时间判断用户是否活跃。SELECT user_id, last_login,
IF(last_login > DATE_SUB(NOW(), INTERVAL 30 DAY), 'Active', 'Inactive') AS activity_status
FROM users;
财务系统
SELECT product_id, (sales_amount - cost_amount) / sales_amount AS profit_margin
FROM financials;
SELECT transaction_id, amount, transaction_date
FROM transactions
WHERE transaction_date BETWEEN '2023-01-01' AND '2023-12-31';
内容管理系统
SUBSTRING()
截取文章内容生成摘要展示。SELECT article_id, SUBSTRING(content, 1, 200) AS summary
FROM articles;
CASE WHEN THEN ELSE END
根据用户角色控制内容的显示权限。SELECT content_id,
CASE
WHEN user_role = 'admin' THEN full_content
WHEN user_role = 'editor' THEN editor_content
ELSE public_content
END AS display_content
FROM contents
JOIN users ON contents.user_id = users.user_id;
MySQL支持多种事务类型,主要包括非事务型引擎(如MyISAM)和事务型引擎(如InnoDB),并且可以用于处理需要一致性和并发控制的场景,通过保证事务的ACID特性,可以有效地管理数据操作的完整性和可靠性。
MySQL事务类型:
MyISAM
引擎不支持事务,它的表级锁设计使得在高并发环境下表现较差。适合于读密集、写少的场景,例如简单的查询应用。InnoDB
引擎支持事务,是MySQL的默认事务引擎。它提供了ACID
(原子性、一致性、隔离性、持久性)事务支持,能够处理复杂的并发操作。应用场景分析:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class TransactionExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/transition_demo"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 开启事务 conn.setAutoCommit(false); Statement stmt = conn.createStatement(); // 执行转账操作,更新账户余额 // 使用两条记录进行模拟 stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE account_id = 1"); stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE account_id = 2"); // 提交事务 conn.commit(); System.out.println("Transaction committed successfully."); } catch (SQLException e) { e.printStackTrace(); try { if (conn != null) { // 回滚事务 conn.rollback(); System.out.println("Transaction rolled back."); } } catch (SQLException ex) { ex.printStackTrace(); } } } }
批量操作:
保证数据完整性:
MySQL支持四种事务隔离级别,每种级别提供的隔离程度不同,适用于不同的应用场景。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 其他事务未提交的更改在此事务中也可见
Oracle
)。OLTP
)使用此级别。SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 其他事务提交的更改在此事务中可见
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
-- 第一次读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 同一事务中的第二次读取操作,结果与第一次一致
SELECT * FROM orders WHERE order_id = 1;
代码示例:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 插入操作将被阻塞,直到当前事务完成
INSERT INTO orders (order_id, amount) VALUES (2, 100);
在数据库事务处理中,脏读、不可重复读和幻读是数据一致性问题的三种经典类型 ,根据具体业务需求和数据一致性要求来选择合适的隔离级别,以平衡性能和数据一致性。
-- 事务B读取到了事务A未提交的数据,如果事务A最终回滚
-- 则事务B读取的数据就是“脏”的、不可靠的数据
-- 事务A
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 事务B
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
-- 读取到未提交的数据
SELECT balance FROM accounts WHERE account_id = 1;
-- 事务A 回
ROLLBACK;
-- 在READ COMMITTED隔离级别下,事务A可能会在两次读取之间看到不同的值 -- 事务A SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; -- 第一次读取 SELECT balance FROM accounts WHERE account_id = 1; -- 事务B START TRANSACTION; UPDATE accounts SET balance = balance + 100 WHERE account_id = 1; COMMIT; -- 事务A -- 第二次读取,结果可能不同 SELECT balance FROM accounts WHERE account_id = 1;
-- 在REPEATABLE READ隔离级别下,虽然可以防止不可重复读,但幻读仍可能发生 -- 只有在SERIALIZABLE隔离级别下才能完全避免幻读 -- 事务A SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; -- 第一次读取 SELECT * FROM orders WHERE customer_id = 123; -- 事务B START TRANSACTION; INSERT INTO orders (order_id, customer_id, amount) VALUES (5, 123, 50); COMMIT; -- 事务A -- 第二次读取,结果集可能不同 SELECT * FROM orders WHERE customer_id = 123;
心如明镜台,时时勤拂拭
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。