
MySQL数据库基础知识,类型知识点梳理~
MySQL是一种关系型数据库管理系统,支持多种数据结构类型,用于存储和管理结构化数据。选择合适的数据类型不仅能提高存储效率,还能提升查询性能和数据完整性。
数据结构类型:
数值类型
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTFLOAT, DOUBLEDECIMAL日期和时间类型
DATE, TIME, DATETIME, TIMESTAMP, YEAR字符串类型
CHAR, VARCHARTEXT, TINYTEXT, MEDIUMTEXT, LONGTEXTBLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB枚举和集合类型
ENUMSETJSON 类型
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; 心如明镜台,时时勤拂拭