

MySQL数据库基础知识,类型知识点梳理~
MySQL是一种关系型数据库管理系统,支持多种数据结构类型,用于存储和管理结构化数据。选择合适的数据类型不仅能提高存储效率,还能提升查询性能和数据完整性。
数据结构类型:
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT FLOAT, DOUBLE DECIMALDATE, TIME, DATETIME, TIMESTAMP, YEAR CHAR, VARCHAR TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB ENUMSETJSON实际案例~应用场景分析:
在开发过程中,根据具体的业务需求和数据特点来选用合适的数据类型,以实现最佳的性能和可维护性。下方举例四种常见的平台来简要分析一下。
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提供了丰富的函数类型,包括数学函数、日期函数、字符串函数、逻辑函数等。这些函数能在数据库中进行数据处理、转换和计算,提高数据处理的效率和灵活性。
函数类型:
,作为分隔符4.逻辑函数
应用场景分析:
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;2.社交网络应用
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;3.财务系统
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';4.内容管理系统
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支持四种事务隔离级别,每种级别提供的隔离程度不同,适用于不同的应用场景。
1.读未提交(READ UNCOMMITTED)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 其他事务未提交的更改在此事务中也可见2.读已提交(READ COMMITTED)
Oracle)。OLTP)使用此级别。SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 其他事务提交的更改在此事务中可见3.可重复读(REPEATABLE READ)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
-- 第一次读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 同一事务中的第二次读取操作,结果与第一次一致
SELECT * FROM orders WHERE order_id = 1;4.串行化(SERIALIZABLE)
代码示例:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
-- 读取操作
SELECT * FROM orders WHERE order_id = 1;
-- 插入操作将被阻塞,直到当前事务完成
INSERT INTO orders (order_id, amount) VALUES (2, 100);在数据库事务处理中,脏读、不可重复读和幻读是数据一致性问题的三种经典类型 ,根据具体业务需求和数据一致性要求来选择合适的隔离级别,以平衡性能和数据一致性。
1.脏读(Dirty Read)
-- 事务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; 2.不可重复读(Non-repeatable Read)
-- 在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; 3.幻读(Phantom Read)
-- 在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;心如明镜台,时时勤拂拭
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。