mysql,100个题目。

本文展示了贷款管理系统的数据库设计,包含5个核心表:customers(客户信息)、loan_applications(贷款申请)、repayment_plans(还款计划)、overdue_records(逾期记录)和devices(设备信息)。每张表都定义了主键、字段类型、约束条件和外键关联,确保数据完整性和业务逻辑。例如客户表包含身份证和手机号唯一约束,贷款申请表设置状态枚举值,还款计划表关联贷款申请ID等。还提供了示例数据插入语句,构建了完整的数据库结构体系,适用于金融信贷业务场景的数据存储和管理需求。

sql 复制代码
create database sqlstudy;
use sqlstudy;

-- 一、建表语句
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    id_number VARCHAR(18) UNIQUE,
    phone VARCHAR(11) UNIQUE,
    age TINYINT,
    address VARCHAR(100),
    income DECIMAL(10, 2),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
 
CREATE TABLE loan_applications (
    application_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT NOT NULL,
    loan_amount DECIMAL(10, 2) NOT NULL,
    loan_term TINYINT,
    apply_time DATETIME NOT NULL,
    status ENUM('pending', 'approved', 'rejected', 'withdrawn'),
    risk_level ENUM('low', 'medium', 'high'),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
 
CREATE TABLE repayment_plans (
    plan_id INT PRIMARY KEY AUTO_INCREMENT,
    application_id INT NOT NULL,
    due_date DATE NOT NULL,
    principal DECIMAL(10, 2),
    interest DECIMAL(10, 2),
    status ENUM('paid', 'overdue', 'default'),
    FOREIGN KEY (application_id) REFERENCES loan_applications(application_id)
);
 
CREATE TABLE overdue_records (
    overdue_id INT PRIMARY KEY AUTO_INCREMENT,
    plan_id INT NOT NULL,
    overdue_days TINYINT,
    penalty DECIMAL(10, 2),
    collection_status ENUM('提醒中', '已催收', '已核销'),
    FOREIGN KEY (plan_id) REFERENCES repayment_plans(plan_id)
);
 
CREATE TABLE devices (
    device_id VARCHAR(64) PRIMARY KEY,
    customer_id INT NOT NULL,
    device_type VARCHAR(50),
    ip_address VARCHAR(45),
    first_use DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

-- 客户信息表:存储贷款客户的基础信息
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,  -- 客户唯一ID,主键且自增(核心标识)
    name VARCHAR(50) NOT NULL,                   -- 客户姓名,非空(必填项)
    id_number VARCHAR(18) UNIQUE,                -- 身份证号码,唯一约束(避免重复录入)
    phone VARCHAR(11) UNIQUE,                    -- 手机号码,唯一约束(避免重复)
    age TINYINT,                                 -- 客户年龄(TINYINT范围0-255,适配年龄取值)
    address VARCHAR(100),                        -- 客户居住地址
    income DECIMAL(10, 2),                       -- 客户月收入,保留2位小数(金额类字段规范)
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP  -- 记录创建时间,默认值为当前系统时间
);
 
-- 贷款申请表:存储客户的贷款申请信息
CREATE TABLE loan_applications (
    application_id INT PRIMARY KEY AUTO_INCREMENT,  -- 贷款申请唯一ID,主键且自增
    customer_id INT NOT NULL,                       -- 关联的客户ID,非空(必须归属具体客户)
    loan_amount DECIMAL(10, 2) NOT NULL,            -- 申请贷款金额,非空,保留2位小数
    loan_term TINYINT,                              -- 贷款期限(单位:月,TINYINT适配短期贷款)
    apply_time DATETIME NOT NULL,                   -- 贷款申请提交时间,非空
    status ENUM('pending', 'approved', 'rejected', 'withdrawn'),  -- 申请状态:待处理/已批准/已拒绝/已撤回
    risk_level ENUM('low', 'medium', 'high'),       -- 申请风险等级:低/中/高
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)  -- 外键关联客户表,保证客户ID合法性
);
 
-- 还款计划表:存储每笔贷款的分期还款计划
CREATE TABLE repayment_plans (
    plan_id INT PRIMARY KEY AUTO_INCREMENT,         -- 还款计划唯一ID,主键且自增
    application_id INT NOT NULL,                    -- 关联的贷款申请ID,非空(归属具体贷款申请)
    due_date DATE NOT NULL,                         -- 还款截止日期,非空(必填的还款时间)
    principal DECIMAL(10, 2),                       -- 当期应还本金,保留2位小数
    interest DECIMAL(10, 2),                        -- 当期应还利息,保留2位小数
    status ENUM('paid', 'overdue', 'default', 'pending'),      -- 还款状态:已还款,逾期,违约,待还款
    FOREIGN KEY (application_id) REFERENCES loan_applications(application_id)  -- 外键关联贷款申请表
);

-- 逾期记录表:存储还款计划的逾期详情
CREATE TABLE overdue_records (
    overdue_id INT PRIMARY KEY AUTO_INCREMENT,      -- 逾期记录唯一ID,主键且自增
    plan_id INT NOT NULL,                           -- 关联的还款计划ID,非空(归属具体还款计划)
    overdue_days TINYINT,                           -- 逾期天数(TINYINT适配0-255天的逾期范围)
    penalty DECIMAL(10, 2),                         -- 逾期罚金,保留2位小数
    collection_status ENUM('提醒中', '已催收', '已核销'),  -- 催收状态:提醒中/已催收/已核销
    FOREIGN KEY (plan_id) REFERENCES repayment_plans(plan_id)  -- 外键关联还款计划表
);
 
-- 设备信息表:存储客户绑定的设备信息(风控用)
CREATE TABLE devices (
    device_id VARCHAR(64) PRIMARY KEY,              -- 设备唯一标识(如设备序列号),主键(字符串适配设备ID格式)
    customer_id INT NOT NULL,                       -- 关联的客户ID,非空(归属具体客户)
    device_type VARCHAR(50),                        -- 设备类型(如手机、电脑、平板)
    ip_address VARCHAR(45),                         -- 设备IP地址(45位适配IPv6最长长度)
    first_use DATE,                                 -- 设备首次使用日期
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)  -- 外键关联客户表
);


-- 二、插入数据
INSERT INTO customers (name, id_number, phone, age, address, income) VALUES
('张三', '110101199001011234', '13800138000', 32, '北京海淀', 20000.00),
('李四', '110101199502022345', '13900139000', 28, '上海浦东', 15000.00),
('王五', '120101198503033456', '13700137000', 38, '广州天河', 30000.00),
('赵六', '120101199804044567', '13600136000', 25, '深圳南山', 12000.00),
('孙七', '130101198005055678', '13500135000', 43, '杭州西湖', 25000.00),
('周八', '130101199306066789', '13400134000', 30, '成都武侯', 18000.00),
('吴九', '140101198807077890', '13300133000', 35, '重庆渝中', 22000.00),
('郑十', '140101199608088901', '13200132000', 27, '西安未央', 16000.00),
('王十一', '150101198309099012', '13100131000', 40, '武汉武昌', 35000.00),
('李十二', '150101199910100123', '13000130000', 24, '南京鼓楼', 10000.00);
 
INSERT INTO loan_applications (customer_id, loan_amount, loan_term, apply_time, status, risk_level) VALUES
(1, 50000.00, 12, '2023-01-01 10:00:00', 'approved', 'medium'),
(2, 30000.00, 6, '2023-01-15 14:30:00', 'pending', 'low'),
(3, 80000.00, 24, '2023-02-03 09:15:00', 'approved', 'high'),
(4, 20000.00, 12, '2023-02-20 16:20:00', 'rejected', 'high'),
(5, 60000.00, 18, '2023-03-10 13:10:00', 'approved', 'medium'),
(6, 40000.00, 12, '2023-03-25 09:45:00', 'withdrawn', 'low'),
(7, 70000.00, 24, '2023-04-05 11:45:00', 'approved', 'medium'),
(8, 10000.00, 6, '2023-04-20 14:20:00', 'rejected', 'high'),
(9, 90000.00, 36, '2023-05-01 10:00:00', 'approved', 'low'),
(10, 15000.00, 6, '2023-05-15 14:30:00', 'pending', 'medium'),
(1, 35000.00, 6, '2023-06-01 11:30:00', 'approved', 'medium'),
(3, 45000.00, 12, '2023-06-15 10:45:00', 'rejected', 'high'),
(5, 25000.00, 6, '2023-07-01 14:20:00', 'approved', 'medium'),
(7, 55000.00, 18, '2023-07-15 09:30:00', 'approved', 'medium'),
(9, 30000.00, 12, '2023-08-01 11:15:00', 'pending', 'low'),
(2, 20000.00, 6, '2023-08-15 13:45:00', 'approved', 'low'),
(4, 40000.00, 12, '2023-09-01 10:30:00', 'rejected', 'high'),
(6, 30000.00, 6, '2023-09-15 14:15:00', 'withdrawn', 'low'),
(8, 60000.00, 24, '2023-10-01 09:45:00', 'approved', 'high'),
(10, 25000.00, 6, '2023-10-15 12:30:00', 'pending', 'medium');
 
INSERT INTO repayment_plans (application_id, due_date, principal, interest, status) VALUES
(1, '2023-02-01', 4166.67, 300.00, 'paid'),
(1, '2023-03-01', 4166.67, 275.00, 'overdue'),
(2, '2023-02-15', 5000.00, 150.00, 'pending'),
(3, '2023-03-03', 3333.33, 400.00, 'default'),
(3, '2023-04-03', 3333.33, 380.00, 'overdue'),
(4, '2023-03-20', 1666.67, 100.00, 'pending'),
(5, '2023-04-05', 2777.78, 500.00, 'paid'),
(5, '2023-05-05', 2777.78, 450.00, 'overdue'),
(6, '2023-04-25', 3333.33, 200.00, 'pending'),
(7, '2023-05-05', 2916.67, 525.00, 'paid'),
(7, '2023-06-05', 2916.67, 490.00, 'paid'),
(8, '2023-05-20', 1666.67, 50.00, 'pending'),
(9, '2023-06-01', 2500.00, 600.00, 'paid'),
(9, '2023-07-01', 2500.00, 575.00, 'paid'),
(10, '2023-06-15', 2500.00, 75.00, 'pending'),
(11, '2023-07-01', 5833.33, 210.00, 'paid'),
(11, '2023-08-01', 5833.33, 185.00, 'pending'),
(12, '2023-07-15', 3750.00, 225.00, 'pending'),
(13, '2023-08-01', 4166.67, 150.00, 'paid'),
(13, '2023-09-01', 4166.67, 125.00, 'pending'),
(14, '2023-08-15', 3055.56, 305.56, 'paid'),
(14, '2023-09-15', 3055.56, 272.22, 'pending'),
(15, '2023-09-01', 2500.00, 200.00, 'pending'),
(16, '2023-09-15', 3333.33, 100.00, 'paid'),
(16, '2023-10-15', 3333.33, 75.00, 'pending'),
(17, '2023-10-01', 3333.33, 200.00, 'pending'),
(18, '2023-10-15', 5000.00, 150.00, 'pending'),
(19, '2023-11-01', 2500.00, 300.00, 'pending'),
(19, '2023-12-01', 2500.00, 275.00, 'pending'),
(20, '2023-11-15', 4166.67, 125.00, 'pending');
 
INSERT INTO overdue_records (plan_id, overdue_days, penalty, collection_status) VALUES
(2, 15, 150.00, '提醒中'),
(3, 45, 400.00, '已催收'),
(5, 30, 200.00, '提醒中'),
(8, 20, 100.00, '已催收'),
(18, 10, 50.00, '提醒中');
 
INSERT INTO devices (device_id, customer_id, device_type, ip_address, first_use) VALUES
('device_001', 1, '手机', '192.168.1.100', '2023-01-01'),
('device_002', 2, '手机', '192.168.1.101', '2023-01-15'),
('device_003', 3, '电脑', '192.168.1.102', '2023-02-03'),
('device_004', 4, '手机', '192.168.1.103', '2023-02-20'),
('device_005', 5, '电脑', '192.168.1.104', '2023-03-10'),
('device_006', 6, '手机', '192.168.1.105', '2023-03-25'),
('device_007', 7, '电脑', '192.168.1.106', '2023-04-05'),
('device_008', 8, '手机', '192.168.1.107', '2023-04-20'),
('device_009', 9, '平板', '192.168.1.108', '2023-05-01'),
('device_010', 10, '手机', '192.168.1.109', '2023-05-15'),
('device_011', 1, '平板', '192.168.1.110', '2023-06-01'),
('device_012', 3, '手机', '192.168.1.111', '2023-06-15'),
('device_013', 5, '手机', '192.168.1.112', '2023-07-01'),
('device_014', 7, '平板', '192.168.1.113', '2023-07-15'),
('device_015', 9, '电脑', '192.168.1.114', '2023-08-01'),
('device_016', 2, '电脑', '192.168.1.115', '2023-08-15'),
('device_017', 4, '平板', '192.168.1.116', '2023-09-01'),
('device_018', 6, '电脑', '192.168.1.117', '2023-09-15'),
('device_019', 8, '平板', '192.168.1.118', '2023-10-01'),
('device_020', 10, '电脑', '192.168.1.119', '2023-10-15');
 
-- 三、练习题及答案
 
-- 一、基础查询(1-20题)
1. 查询年龄大于30的客户姓名和手机号
SELECT name, phone FROM customers WHERE age > 30;
 
2. 查询贷款申请状态为approved的记录
SELECT * FROM loan_applications WHERE status = 'approved';
 
3. 查询逾期天数超过30天的逾期记录
SELECT * FROM overdue_records WHERE overdue_days > 30;
 
4. 查询地址包含"北京"或"上海"的客户
SELECT * FROM customers WHERE address LIKE '%北京%' OR address LIKE '%上海%';
 
5. 查询贷款金额超过50000的申请ID和客户ID
SELECT application_id, customer_id FROM loan_applications WHERE loan_amount > 50000;
 
6. 查询2023年6月之后创建的客户
SELECT * FROM customers WHERE create_time > '2023-06-01';
 
7. 查询风险等级为high的贷款申请数量
SELECT COUNT(*) FROM loan_applications WHERE risk_level = 'high';
 
8. 查询收入在15000-25000之间的客户
SELECT * FROM customers WHERE income BETWEEN 15000 AND 25000;
 
9. 查询设备类型为"电脑"的设备ID和客户ID
SELECT device_id, customer_id FROM devices WHERE device_type = '电脑';
 
10. 查询还款状态为default的还款计划
SELECT * FROM repayment_plans WHERE status = 'default';
 
11. 查询手机号以138开头的客户
SELECT * FROM customers WHERE phone LIKE '138%';
 
12. 查询2023年第一季度的贷款申请
SELECT * FROM loan_applications WHERE apply_time BETWEEN '2023-01-01' AND '2023-03-31';
 
13. 查询罚金超过200元的逾期记录
SELECT * FROM overdue_records WHERE penalty > 200;
 
14. 查询年龄最大的前3个客户
SELECT * FROM customers ORDER BY age DESC LIMIT 3;
 
15. 查询贷款期限为12个月的申请
SELECT * FROM loan_applications WHERE loan_term = 12;
 
16. 查询状态为"已催收"的逾期记录
SELECT * FROM overdue_records WHERE collection_status = '已催收';
 
17. 查询没有逾期记录的还款计划
SELECT * FROM repayment_plans WHERE plan_id NOT IN (SELECT plan_id FROM overdue_records);
 
18. 查询收入最高的客户姓名和收入
SELECT name, income FROM customers ORDER BY income DESC LIMIT 1;
 
19. 查询2023年7月有还款计划的贷款申请ID
SELECT DISTINCT application_id FROM repayment_plans WHERE due_date BETWEEN '2023-07-01' AND '2023-07-31';
 
20. 查询设备首次使用时间在2023年上半年的记录
SELECT * FROM devices WHERE first_use BETWEEN '2023-01-01' AND '2023-06-30';
 
-- 二、聚合与分组(21-40题)
21. 统计每个风险等级的贷款申请数量
SELECT risk_level, COUNT(*) FROM loan_applications GROUP BY risk_level;
 
22. 计算每个客户的平均贷款金额
SELECT customer_id, AVG(loan_amount) FROM loan_applications GROUP BY customer_id;
 
23. 统计各地区的客户数量
SELECT SUBSTRING(address, 1, 2) AS region, COUNT(*) FROM customers GROUP BY region;
 
24. 计算每种设备类型的使用次数
SELECT device_type, COUNT(*) FROM devices GROUP BY device_type;
 
25. 统计每个客户的逾期次数
SELECT c.customer_id, COUNT(o.overdue_id) 
FROM customers c 
LEFT JOIN loan_applications la ON c.customer_id = la.customer_id
LEFT JOIN repayment_plans rp ON la.application_id = rp.application_id
LEFT JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY c.customer_id;
 
26. 查询每月的贷款申请数量
SELECT DATE_FORMAT(apply_time, '%Y-%m') AS month, COUNT(*) 
FROM loan_applications 
GROUP BY month;
 
27. 计算每个风险等级的平均贷款金额
SELECT risk_level, AVG(loan_amount) 
FROM loan_applications 
GROUP BY risk_level;
 
28. 统计不同年龄段(每10岁一组)的客户数量
SELECT FLOOR(age/10)*10 AS age_group, COUNT(*) 
FROM customers 
GROUP BY age_group;
 
29. 查询每个客户的最大贷款金额
SELECT customer_id, MAX(loan_amount) 
FROM loan_applications 
GROUP BY customer_id;
 
30. 统计每个月的逾期总金额
SELECT DATE_FORMAT(rp.due_date, '%Y-%m') AS month, SUM(o.penalty) 
FROM repayment_plans rp 
JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY month;
 
31. 计算每种还款状态的总金额(本金+利息)
SELECT status, SUM(principal + interest) 
FROM repayment_plans 
GROUP BY status;
 
32. 统计每个客户的贷款申请次数
SELECT customer_id, COUNT(*) 
FROM loan_applications 
GROUP BY customer_id;
 
33. 查询平均收入最高的地区
SELECT SUBSTRING(address, 1, 2) AS region, AVG(income) 
FROM customers 
GROUP BY region 
ORDER BY AVG(income) DESC 
LIMIT 1;
 
34. 统计不同催收状态的逾期记录占比
SELECT collection_status, COUNT(*) / (SELECT COUNT(*) FROM overdue_records) * 100 AS percentage 
FROM overdue_records 
GROUP BY collection_status;
 
35. 计算每个客户的负债收入比(总贷款金额/月收入)
SELECT c.customer_id, SUM(la.loan_amount) / c.income AS debt_income_ratio 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY c.customer_id;
 
36. 统计每个月的贷款发放总金额(仅approved状态)
SELECT DATE_FORMAT(apply_time, '%Y-%m') AS month, SUM(loan_amount) 
FROM loan_applications 
WHERE status = 'approved' 
GROUP BY month;
 
37. 查询使用设备数量最多的客户ID
SELECT customer_id, COUNT(*) 
FROM devices 
GROUP BY customer_id 
ORDER BY COUNT(*) DESC 
LIMIT 1;
 
38. 统计每个风险等级中收入超过20000的客户数量
SELECT la.risk_level, COUNT(*) 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
WHERE c.income > 20000 
GROUP BY la.risk_level;
 
39. 计算每个客户的平均逾期天数
SELECT c.customer_id, AVG(o.overdue_days) 
FROM customers c 
LEFT JOIN loan_applications la ON c.customer_id = la.customer_id
LEFT JOIN repayment_plans rp ON la.application_id = rp.application_id
LEFT JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY c.customer_id;
 
40. 统计每个月的贷款申请通过率(approved数量/总申请数)
SELECT 
    DATE_FORMAT(apply_time, '%Y-%m') AS month,
    SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END) / COUNT(*) AS approval_rate
FROM loan_applications 
GROUP BY month;
 
-- 三、表连接(41-60题)
41. 查询客户姓名及其贷款申请金额
SELECT c.name, la.loan_amount 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id;
 
42. 查询有逾期记录的客户手机号
SELECT DISTINCT c.phone 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
JOIN overdue_records or ON rp.plan_id = or.plan_id;
 
43. 查询使用电脑设备的客户姓名
SELECT c.name 
FROM customers c 
JOIN devices d ON c.customer_id = d.customer_id
WHERE d.device_type = '电脑';
 
44. 查询每个客户的贷款申请次数和逾期次数
SELECT 
    c.customer_id,
    COUNT(DISTINCT la.application_id) AS applications,
    COUNT(o.overdue_id) AS overdue_count
FROM customers c 
LEFT JOIN loan_applications la ON c.customer_id = la.customer_id
LEFT JOIN repayment_plans rp ON la.application_id = rp.application_id
LEFT JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY c.customer_id;
 
45. 查询风险等级为high且有逾期记录的客户ID
SELECT DISTINCT c.customer_id 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
JOIN overdue_records o ON rp.plan_id = o.plan_id
WHERE la.risk_level = 'high';
 
46. 查询客户姓名、贷款金额及对应的还款计划
SELECT c.name, la.loan_amount, rp.due_date, rp.principal, rp.interest 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id;
 
47. 查询没有任何贷款申请的客户
SELECT * 
FROM customers c 
LEFT JOIN loan_applications la ON c.customer_id = la.customer_id
WHERE la.application_id IS NULL;
 
48. 查询使用同一设备申请贷款的不同客户(设备ID相同但客户ID不同)
SELECT d1.device_id, d1.customer_id AS customer1, d2.customer_id AS customer2 
FROM devices d1 
JOIN devices d2 ON d1.device_id = d2.device_id AND d1.customer_id < d2.customer_id;
 
49. 查询每个客户的首次贷款申请日期
SELECT c.customer_id, MIN(la.apply_time) 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY c.customer_id;
 
50. 查询逾期记录对应的客户姓名和设备类型
SELECT c.name, d.device_type 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
JOIN overdue_records o ON rp.plan_id = o.plan_id
JOIN devices d ON c.customer_id = d.customer_id;
 
51. 查询客户收入、风险等级和平均贷款金额
SELECT c.income, la.risk_level, AVG(la.loan_amount) 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY c.customer_id, la.risk_level;
 
52. 查询2023年6月后申请贷款的客户姓名和申请金额
SELECT c.name, la.loan_amount 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
WHERE la.apply_time > '2023-06-01';
 
53. 查询有超过2次逾期记录的客户姓名
SELECT c.name 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY c.customer_id 
HAVING COUNT(o.overdue_id) > 2;
 
54. 查询每个风险等级中收入最高的客户
SELECT la.risk_level, c.name, MAX(c.income) 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY la.risk_level;
 
55. 查询设备首次使用时间早于贷款申请时间的记录
SELECT d.device_id, c.customer_id, d.first_use, la.apply_time 
FROM customers c 
JOIN devices d ON c.customer_id = d.customer_id
JOIN loan_applications la ON c.customer_id = la.customer_id
WHERE d.first_use < la.apply_time;
 
56. 查询每个客户的累计贷款金额和当前负债(未还金额)
SELECT 
    c.customer_id,
    SUM(la.loan_amount) AS total_loan,
    SUM(CASE WHEN rp.status IN ('overdue', 'pending') THEN rp.principal + rp.interest ELSE 0 END) AS current_debt
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
GROUP BY c.customer_id;
 
57. 查询客户姓名、最近一次还款日期和还款金额
SELECT 
    c.name,
    MAX(rp.due_date) AS last_repayment_date,
    SUM(rp.principal + rp.interest) AS last_repayment_amount
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
GROUP BY c.customer_id;
 
58. 查询风险等级为medium且使用手机设备的客户
SELECT c.* 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN devices d ON c.customer_id = d.customer_id
WHERE la.risk_level = 'medium' AND d.device_type = '手机';
 
59. 查询每个月的逾期率(逾期笔数/总还款计划数)
SELECT 
    DATE_FORMAT(rp.due_date, '%Y-%m') AS month,
    SUM(CASE WHEN o.overdue_id IS NOT NULL THEN 1 ELSE 0 END) / COUNT(rp.plan_id) AS overdue_rate
FROM repayment_plans rp 
LEFT JOIN overdue_records o ON rp.plan_id = o.plan_id
GROUP BY month;
 
60. 查询客户姓名、申请状态和对应的设备IP地址
SELECT c.name, la.status, d.ip_address 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN devices d ON c.customer_id = d.customer_id;
 
-- 四、子查询与逻辑判断(61-80题)
61. 查询贷款金额超过平均水平的申请
SELECT * 
FROM loan_applications 
WHERE loan_amount > (SELECT AVG(loan_amount) FROM loan_applications);
 
62. 查询没有逾期记录的客户
SELECT * 
FROM customers 
WHERE customer_id NOT IN (
    SELECT DISTINCT c.customer_id 
    FROM customers c 
    JOIN loan_applications la ON c.customer_id = la.customer_id
    JOIN repayment_plans rp ON la.application_id = rp.application_id
    JOIN overdue_records o ON rp.plan_id = o.plan_id
);
 
63. 判断客户"张三"是否有贷款申请
SELECT EXISTS(
    SELECT 1 
    FROM loan_applications 
    WHERE customer_id = (SELECT customer_id FROM customers WHERE name = '张三')
);
 
64. 查询逾期天数最长的记录
SELECT * 
FROM overdue_records 
WHERE overdue_days = (SELECT MAX(overdue_days) FROM overdue_records);
 
65. 查询每个客户的最高贷款金额(使用子查询)
SELECT customer_id, loan_amount 
FROM loan_applications la1 
WHERE loan_amount = (
    SELECT MAX(loan_amount) 
    FROM loan_applications la2 
    WHERE la1.customer_id = la2.customer_id
);
 
66. 查询收入高于所有客户平均收入的客户
SELECT * 
FROM customers 
WHERE income > (SELECT AVG(income) FROM customers);
 
67. 查询风险等级为high的客户的设备信息
SELECT d.* 
FROM devices d 
WHERE customer_id IN (SELECT customer_id FROM loan_applications WHERE risk_level = 'high');
 
68. 查询有2次以上贷款申请的客户ID
SELECT customer_id 
FROM loan_applications 
GROUP BY customer_id 
HAVING COUNT(*) > 2;
 
69. 查询每个月的最大贷款金额(使用子查询)
SELECT 
    DATE_FORMAT(apply_time, '%Y-%m') AS month,
    MAX(loan_amount) AS max_amount
FROM loan_applications 
GROUP BY month;
 
70. 查询未逾期的还款计划中金额最高的记录
SELECT * 
FROM repayment_plans 
WHERE status != 'overdue' 
ORDER BY principal + interest DESC 
LIMIT 1;
 
71. 查询客户"李四"的所有贷款申请状态
SELECT status 
FROM loan_applications 
WHERE customer_id = (SELECT customer_id FROM customers WHERE name = '李四');
 
72. 查询设备IP地址以192.168.1开头的客户姓名
SELECT name 
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM devices WHERE ip_address LIKE '192.168.1%');
 
73. 查询每个客户的平均贷款金额与所有客户平均贷款金额的差值
SELECT 
    customer_id,
    AVG(loan_amount) - (SELECT AVG(loan_amount) FROM loan_applications) AS difference
FROM loan_applications 
GROUP BY customer_id;
 
74. 查询逾期罚金超过该客户平均罚金2倍的记录
SELECT o.* 
FROM overdue_records o 
JOIN repayment_plans rp ON o.plan_id = rp.plan_id
JOIN loan_applications la ON rp.application_id = la.application_id
WHERE o.penalty > 2 * (
    SELECT AVG(penalty) 
    FROM overdue_records o2 
    JOIN repayment_plans rp2 ON o2.plan_id = rp2.plan_id
    JOIN loan_applications la2 ON rp2.application_id = la2.application_id
    WHERE la2.customer_id = la.customer_id
);
 
75. 查询2023年第二季度申请的贷款中,至今仍未还款的记录
SELECT * 
FROM loan_applications 
WHERE apply_time BETWEEN '2023-04-01' AND '2023-06-30' 
AND application_id NOT IN (SELECT DISTINCT application_id FROM repayment_plans WHERE status = 'paid');
 
76. 查询每个风险等级中贷款金额最大的3个申请
SELECT * 
FROM loan_applications la1 
WHERE (
    SELECT COUNT(*) 
    FROM loan_applications la2 
    WHERE la1.risk_level = la2.risk_level AND la2.loan_amount > la1.loan_amount
) < 3 
ORDER BY risk_level, loan_amount DESC;
 
77. 查询客户年龄大于30且收入超过20000的贷款申请
SELECT * 
FROM loan_applications 
WHERE customer_id IN (SELECT customer_id FROM customers WHERE age > 30 AND income > 20000);
 
78. 查询设备首次使用时间在2023年且客户收入超过平均水平的记录
SELECT d.* 
FROM devices d 
JOIN customers c ON d.customer_id = c.customer_id
WHERE d.first_use BETWEEN '2023-01-01' AND '2023-12-31' 
AND c.income > (SELECT AVG(income) FROM customers);
 
79. 查询每个客户的贷款申请次数占总申请次数的比例
SELECT 
    customer_id,
    COUNT(*) / (SELECT COUNT(*) FROM loan_applications) AS ratio
FROM loan_applications 
GROUP BY customer_id;
 
80. 查询有逾期记录的客户中,收入最低的客户信息
SELECT * 
FROM customers 
WHERE customer_id IN (SELECT DISTINCT customer_id FROM loan_applications JOIN repayment_plans USING (application_id) JOIN overdue_records USING (plan_id))
ORDER BY income ASC 
LIMIT 1;
 
-- 五、窗口函数与复杂查询(81-100题)
81. 为每个客户的贷款申请按时间排序
SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY apply_time) AS rn
FROM loan_applications;
 
82. 计算每个客户的累计贷款金额
SELECT *, 
       SUM(loan_amount) OVER (PARTITION BY customer_id ORDER BY apply_time) AS total_loan
FROM loan_applications;
 
83. 按风险等级分组,计算每个客户的贷款金额排名
SELECT *, 
       RANK() OVER (PARTITION BY risk_level ORDER BY loan_amount DESC) AS amount_rank
FROM loan_applications;
 
84. 查询每个客户的最近3笔贷款申请
SELECT * 
FROM (
    SELECT *, 
           ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY apply_time DESC) AS rn
    FROM loan_applications
) t 
WHERE rn <= 3;
 
85. 计算每个客户的贷款金额与该客户平均贷款金额的差值
SELECT *, 
       loan_amount - AVG(loan_amount) OVER (PARTITION BY customer_id) AS diff_from_avg
FROM loan_applications;
 
86. 按月份统计贷款申请金额,并显示累计金额
SELECT 
    DATE_FORMAT(apply_time, '%Y-%m') AS month,
    SUM(loan_amount) AS monthly_amount,
    SUM(SUM(loan_amount)) OVER (ORDER BY DATE_FORMAT(apply_time, '%Y-%m')) AS cumulative_amount
FROM loan_applications 
GROUP BY month;
 
87. 查找连续2次逾期的客户ID
SELECT DISTINCT c.customer_id 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp1 ON la.application_id = rp1.application_id
JOIN overdue_records o1 ON rp1.plan_id = o1.plan_id
JOIN repayment_plans rp2 ON la.application_id = rp2.application_id
JOIN overdue_records o2 ON rp2.plan_id = o2.plan_id
WHERE rp1.plan_id < rp2.plan_id 
  AND DATEDIFF(rp2.due_date, rp1.due_date) = 30;  -- 假设每月还款一次
 
88. 使用NTILE将贷款申请金额分为4个等级
SELECT *, 
       NTILE(4) OVER (ORDER BY loan_amount) AS quartile
FROM loan_applications;
 
89. 计算每个客户的设备使用时长(从首次使用到当前日期)
SELECT 
    device_id,
    customer_id,
    first_use,
    DATEDIFF(CURRENT_DATE, first_use) AS days_used
FROM devices;
 
90. 按设备类型分组,显示每组申请金额的前25%记录
SELECT * 
FROM (
    SELECT 
        d.device_type,
        la.*,
        NTILE(4) OVER (PARTITION BY d.device_type ORDER BY la.loan_amount DESC) AS quartile
    FROM loan_applications la 
    JOIN devices d ON la.customer_id = d.customer_id
) t 
WHERE quartile = 1;
 
91. 查询近30天内有逾期记录的客户
SELECT DISTINCT c.* 
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
JOIN repayment_plans rp ON la.application_id = rp.application_id
JOIN overdue_records o ON rp.plan_id = o.plan_id
WHERE DATEDIFF(CURRENT_DATE, rp.due_date) <= 30;
 
92. 统计高风险客户的贷款申请拒绝率
SELECT 
    SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) / COUNT(*) AS rejection_rate
FROM loan_applications 
WHERE risk_level = 'high';
 
93. 查找使用同一设备申请贷款超过2次的设备ID
SELECT device_id 
FROM devices 
GROUP BY device_id 
HAVING COUNT(DISTINCT customer_id) > 2;
 
94. 计算每个客户的负债收入比(总贷款金额/月收入)
SELECT 
    c.customer_id,
    SUM(la.loan_amount) / c.income AS debt_income_ratio
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY c.customer_id;
 
95. 查询首次贷款申请时间在2023年Q1的客户的平均风险等级
SELECT AVG(CASE WHEN risk_level = 'low' THEN 1 WHEN risk_level = 'medium' THEN 2 ELSE 3 END) AS avg_risk
FROM loan_applications 
WHERE customer_id IN (
    SELECT customer_id 
    FROM loan_applications 
    WHERE apply_time BETWEEN '2023-01-01' AND '2023-03-31'
    GROUP BY customer_id 
    HAVING MIN(apply_time) BETWEEN '2023-01-01' AND '2023-03-31'
);
 
96. 统计各地区(地址前两个字)的高风险客户占比
SELECT 
    SUBSTRING(address, 1, 2) AS region,
    SUM(CASE WHEN risk_level = 'high' THEN 1 ELSE 0 END) / COUNT(*) AS high_risk_ratio
FROM customers c 
JOIN loan_applications la ON c.customer_id = la.customer_id
GROUP BY region;
 
97. 查找逾期天数超过60天且未被催收的记录
SELECT * 
FROM overdue_records 
WHERE overdue_days > 60 AND collection_status != '已催收';
 
98. 计算每个客户的贷款申请通过率(批准次数/总申请次数)
SELECT 
    customer_id,
    SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END) / COUNT(*) AS approval_rate
FROM loan_applications 
GROUP BY customer_id;
 
99. 查询设备IP地址相同的客户组(可能存在团伙欺诈)
SELECT 
    d1.ip_address,
    GROUP_CONCAT(DISTINCT d1.customer_id) AS customer_ids
FROM devices d1 
JOIN devices d2 ON d1.ip_address = d2.ip_address AND d1.customer_id < d2.customer_id
GROUP BY d1.ip_address;
 
100. 统计风险等级为low的客户中,收入高于3万元的比例
SELECT 
    SUM(CASE WHEN income > 30000 THEN 1 ELSE 0 END) / COUNT(*) AS high_income_ratio
FROM customers 
WHERE customer_id IN (SELECT customer_id FROM loan_applications WHERE risk_level = 'low');
相关推荐
2501_941805933 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
李慕婉学姐3 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力3 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
哈里谢顿4 小时前
记录一次sql优化记录
mysql
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora4 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
倔强的石头_4 小时前
【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)
数据库
小熊officer5 小时前
Python字符串
开发语言·数据库·python
渐暖°5 小时前
JDBC直连ORACLE进行查询
数据库·oracle
萧曵 丶6 小时前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读