类型 | 特点 | 常见数据库 | 适用场景 |
---|---|---|---|
关系型数据库 | 数据以表格形式存储,支持SQL | MySQL, PostgreSQL, Oracle | 需要强一致性的业务(如银行交易) |
非关系型数据库 | 灵活的数据结构(JSON、键值对) | MongoDB, Redis | 高并发、灵活数据(如用户会话、缓存) |
示例:
-- 查询所有用户
SELECT * FROM users;
-- 查询特定条件(如状态为活跃的用户)
SELECT * FROM users WHERE status = 'active';
-- 查询订单及对应的用户信息(内连接)
SELECT orders.id, users.name
FROM orders
INNER JOIN users ON orders.user_id = users.id;
-- 左连接(即使没有匹配也返回左表数据)
SELECT users.name, orders.id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- 统计每个用户的订单数量
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id;
-- 检查订单总金额是否超过1000元
SELECT user_id, SUM(amount) as total_amount
FROM orders
GROUP BY user_id
HAVING total_amount > 1000;
-- 查询没有下过单的用户
SELECT * FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);
场景:确保用户ID唯一,不能重复插入
-- 测试用例:插入重复ID
INSERT INTO users (id, name) VALUES (1, 'Alice'); -- 成功
INSERT INTO users (id, name) VALUES (1, 'Bob'); -- 应该报错!
场景:订单必须关联真实用户
-- 测试用例:插入不存在的user_id
INSERT INTO orders (id, user_id, amount)
VALUES (100, 999, 50.00); -- 应该报错(user_id=999不存在)
场景:用户名不能为空
-- 测试用例:插入NULL用户名
INSERT INTO users (id, name) VALUES (2, NULL); -- 应该报错!
-- 使用EXPLAIN分析查询性能
EXPLAIN SELECT * FROM orders WHERE user_id = 1001;
输出关键指标:
type=ALL
(全表扫描 → 需优化)type=index
(索引扫描 → 高效)-- 创建索引加速查询
CREATE INDEX idx_user_id ON orders(user_id);
-- 验证索引是否生效
EXPLAIN SELECT * FROM orders WHERE user_id = 1001; -- 应显示"Using index"
import pymysql
def test_order_creation():
# 模拟用户下单
ui_add_order(user_id=1, product="Book")
# 数据库断言
conn = pymysql.connect(host="localhost", user="test", password="test", db="shop")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM orders WHERE user_id = 1")
result = cursor.fetchone()
assert result[0] == 1, "订单未正确插入数据库!"
@Test
public void testUserRegistration() {
// 模拟注册
registerUser("testuser", "password123");
// 数据库断言
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/shop", "test", "test");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = 'testuser'");
assertTrue(rs.next(), "用户未成功注册!");
}
-- 下单后状态应为"pending"
SELECT status FROM orders WHERE id = 1001; -- 预期: 'pending'
-- 支付后状态变为"paid"
UPDATE orders SET status = 'paid' WHERE id = 1001;
SELECT status FROM orders WHERE id = 1001; -- 预期: 'paid'
-- 测试删除用户时,关联订单是否自动删除(需外键设置ON DELETE CASCADE)
DELETE FROM users WHERE id = 1001;
SELECT COUNT(*) FROM orders WHERE user_id = 1001; -- 预期: 0
技能 | 用途 | 示例 |
---|---|---|
SQL查询 | 验证数据准确性 | SELECT * FROM orders WHERE status = 'paid' |
约束测试 | 保证数据完整性 | 测试主键唯一性、外键关联 |
索引优化 | 提升查询性能 | CREATE INDEX idx_email ON users(email) |
自动化集成 | 在UI/API测试中校验数据库 | Python + pytest 数据库断言 |
学习建议: