本练习库围绕一家食品贸易公司,以「业务单据 + 会计分录」建模,覆盖《SQL必知必会》第 1~14 章核心知识点,共 7 张表、6 笔经济业务、5 道练习题(含参考答案)。
数据库:SQLite 字段名:中文(方便会计人直接上手)
使用方式:
sqlite3 会计练习.db < 本文件直接建库;- 或复制到 DBeaver / Navicat 中执行。
结构概览:
- 第 1 部分:建表(7 张表)
- 第 2 部分:示例数据(业务单据 + 会计数据,借贷平衡)
- 第 3 部分:练习题(5 道,覆盖第 1~14 章)
- 第 4 部分:参考答案(先做完再看)
练习建议:先独立作答,再对照参考答案,最后在 sqlite3 / DBeaver 里实际跑一遍验证结果。
下面整段为可执行的 SQL 脚本,含建表、插数、习题与答案,复制即可运行。
-- ============================================================================
-- SQL必知必会 · 会计练习库(第 1 次)
-- 数据库:SQLite 字段名:中文
-- 场景:一家食品贸易公司,围绕「业务单据 + 会计分录」建模
-- 使用方式:sqlite3 会计练习.db < 本文件;或复制到 DBeaver / Navicat 执行
-- ============================================================================
-- ----------------------------------------------------------------------------
-- 第 1 部分:建表
-- ----------------------------------------------------------------------------
-- 1. 客户表
CREATE TABLE 客户 (
客户编号 TEXT PRIMARY KEY,
客户名称 TEXT NOT NULL,
联系人 TEXT,
所在城市 TEXT,
信用额度 REAL
);
-- 2. 供应商表
CREATE TABLE 供应商 (
供应商编号 TEXT PRIMARY KEY,
供应商名称 TEXT NOT NULL,
所在城市 TEXT
);
-- 3. 商品表
CREATE TABLE 商品 (
商品编号 TEXT PRIMARY KEY,
商品名称 TEXT NOT NULL,
供应商编号 TEXT REFERENCES 供应商(供应商编号),
单价 REAL,
库存量 INTEGER
);
-- 4. 销售订单表(业务单据)
CREATE TABLE 销售订单 (
订单编号 TEXT PRIMARY KEY,
客户编号 TEXT REFERENCES 客户(客户编号),
订单日期 TEXT
);
-- 5. 订单明细表(一张订单可含多行商品)
CREATE TABLE 订单明细 (
订单明细编号 INTEGER PRIMARY KEY,
订单编号 TEXT REFERENCES 销售订单(订单编号),
商品编号 TEXT REFERENCES 商品(商品编号),
数量 INTEGER,
成交单价 REAL
);
-- 6. 会计科目表
CREATE TABLE 会计科目 (
科目编码 TEXT PRIMARY KEY,
科目名称 TEXT NOT NULL,
科目类别 TEXT -- 资产 / 负债 / 所有者权益 / 收入 / 费用
);
-- 7. 记账凭证表(复式记账,一行一借或一贷)
CREATE TABLE 记账凭证 (
凭证编号 TEXT,
记账日期 TEXT,
科目编码 TEXT REFERENCES 会计科目(科目编码),
借方金额 REAL DEFAULT 0,
贷方金额 REAL DEFAULT 0,
摘要 TEXT
);
-- ----------------------------------------------------------------------------
-- 第 2 部分:示例数据
-- ----------------------------------------------------------------------------
INSERT INTO 客户 VALUES
('C001','四川川味食品有限公司','张建国','成都',50000),
('C002','重庆山城商贸有限公司','李敏','重庆',30000),
('C003','成都锦程科技有限公司','王丽','成都',80000),
('C004','北京华远贸易有限公司','赵强','北京',60000),
('C005','上海浦东餐饮集团有限公司','陈芳','上海',120000),
('C006','成都天府供应链有限公司','刘洋','成都',45000);
INSERT INTO 供应商 VALUES
('V001','成都粮油贸易公司','成都'),
('V002','重庆调味品厂','重庆'),
('V003','四川包装材料公司','成都');
INSERT INTO 商品 VALUES
('P001','东北大米(50kg装)','V001',260.00,120),
('P002','大豆油(5L)','V002',145.00,300),
('P003','郫县豆瓣酱(1kg)','V002',18.50,500),
('P004','瓦楞纸箱','V003',8.00,2000),
('P005','干辣椒','V001',45.00,80);
INSERT INTO 销售订单 VALUES
('O0001','C001','2026-01-05'),
('O0002','C003','2026-01-12'),
('O0003','C002','2026-02-02'),
('O0004','C005','2026-02-18'),
('O0005','C004','2026-03-08'),
('O0006','C001','2026-03-20');
INSERT INTO 订单明细 VALUES
(1,'O0001','P001',20,260.00),
(2,'O0001','P002',30,145.00),
(3,'O0002','P003',100,18.50),
(4,'O0002','P005',50,45.00),
(5,'O0003','P002',40,145.00),
(6,'O0004','P001',50,260.00),
(7,'O0004','P004',500,8.00),
(8,'O0005','P003',200,18.50),
(9,'O0006','P005',30,45.00);
INSERT INTO 会计科目 VALUES
('1001','银行存款','资产'),
('1122','应收账款','资产'),
('1405','库存商品','资产'),
('2001','应付账款','负债'),
('2202','应付职工薪酬','负债'),
('4001','实收资本','所有者权益'),
('6001','主营业务收入','收入'),
('6401','主营业务成本','费用'),
('6601','销售费用','费用'),
('6602','管理费用','费用');
-- 六笔经济业务,借贷平衡(总借=总贷=221000)
INSERT INTO 记账凭证 VALUES
('PZ001','2026-01-05','1001',100000,0,'收到股东投资款'),
('PZ001','2026-01-05','4001',0,100000,'收到股东投资款'),
('PZ002','2026-01-05','1122',52000,0,'赊销确认收入'),
('PZ002','2026-01-05','6001',0,52000,'赊销确认收入'),
('PZ003','2026-01-05','6401',34000,0,'结转销售成本'),
('PZ003','2026-01-05','1405',0,34000,'结转销售成本'),
('PZ004','2026-01-12','6602',12000,0,'支付管理人员工资'),
('PZ004','2026-01-12','1001',0,12000,'支付管理人员工资'),
('PZ005','2026-02-02','6602',3000,0,'购买办公用品'),
('PZ005','2026-02-02','1001',0,3000,'购买办公用品'),
('PZ006','2026-03-20','1001',20000,0,'收回客户货款'),
('PZ006','2026-03-20','1122',0,20000,'收回客户货款');
-- ============================================================================
-- 第 3 部分:练习题(5 道,覆盖第 1~14 章)
-- 请先独立作答,参考答案在文件末尾「第 4 部分」。
-- ============================================================================
-- 【第 1 题】检索与排序(第 1~3 章)
-- (1) 查询商品表中所有商品,显示:商品编号、商品名称、单价,按单价从高到低排列。
-- (2) 在上面结果基础上,只保留单价不低于 50 元的商品。
-- 【第 2 题】过滤、通配符与计算字段(第 4~8 章)
-- (1) 从客户表中找出所有“成都”的客户,显示客户名称和信用额度。
-- (2) 从商品表中找出名称里含有“油”的商品。
-- (3) 计算字段:假设增值税率为 13%,为每件商品计算“含税单价”(单价 × 1.13),
-- 用 ROUND 保留 2 位小数,列名改为 含税单价。
-- 【第 3 题】汇总与分组(第 9~10 章)
-- (1) 统计客户表中共有多少位客户。
-- (2) 按“所在城市”分组,统计每个城市的客户数量。
-- (3) 在记账凭证表中,按“科目编码”分组,汇总每个科目的借方合计、贷方合计。
-- 【第 4 题】子查询(第 11 章)
-- (1) 查询单价高于“所有商品平均单价”的商品(商品编号、商品名称、单价)。
-- (2) 用 IN 子查询,找出“下过订单”的客户名称。
-- 【第 5 题】联结与组合查询(第 12~14 章)
-- (1) 多表联结:把 订单明细、商品、销售订单、客户 四张表连起来,
-- 显示:客户名称、商品名称、数量、成交单价、行金额(=数量×成交单价)。
-- (2) 汇总:按客户统计“订单总金额”(可作为应收账款参考),按金额从高到低。
-- (3) 组合查询:用 UNION 合并“成都的客户”与“信用额度≥80000 的客户”两个结果。
-- ============================================================================
-- 第 4 部分:参考答案(先做完再看)
-- ============================================================================
-- 第 1 题
-- (1) SELECT 商品编号, 商品名称, 单价 FROM 商品 ORDER BY 单价 DESC;
-- (2) SELECT 商品编号, 商品名称, 单价 FROM 商品
-- WHERE 单价 >= 50 ORDER BY 单价 DESC;
-- 第 2 题
-- (1) SELECT 客户名称, 信用额度 FROM 客户 WHERE 所在城市 = '成都';
-- (2) SELECT 商品编号, 商品名称 FROM 商品 WHERE 商品名称 LIKE '%油%';
-- (3) SELECT 商品名称, 单价, ROUND(单价*1.13, 2) AS 含税单价 FROM 商品;
-- 第 3 题
-- (1) SELECT COUNT(*) AS 客户总数 FROM 客户;
-- (2) SELECT 所在城市, COUNT(*) AS 客户数 FROM 客户 GROUP BY 所在城市;
-- (3) SELECT 科目编码,
-- SUM(借方金额) AS 借方合计,
-- SUM(贷方金额) AS 贷方合计
-- FROM 记账凭证 GROUP BY 科目编码;
-- 第 4 题
-- (1) SELECT 商品编号, 商品名称, 单价 FROM 商品
-- WHERE 单价 > (SELECT AVG(单价) FROM 商品);
-- (2) SELECT 客户名称 FROM 客户
-- WHERE 客户编号 IN (SELECT 客户编号 FROM 销售订单);
-- 第 5 题
-- (1)
-- SELECT 客.客户名称, 商.商品名称, 明.数量, 明.成交单价,
-- 明.数量*明.成交单价 AS 行金额
-- FROM 订单明细 明
-- JOIN 商品 商 ON 明.商品编号 = 商.商品编号
-- JOIN 销售订单 单 ON 明.订单编号 = 单.订单编号
-- JOIN 客户 客 ON 单.客户编号 = 客.客户编号
-- ORDER BY 客.客户名称;
-- (2)
-- SELECT 客.客户名称, SUM(明.数量*明.成交单价) AS 订单总金额
-- FROM 订单明细 明
-- JOIN 销售订单 单 ON 明.订单编号 = 单.订单编号
-- JOIN 客户 客 ON 单.客户编号 = 客.客户编号
-- GROUP BY 客.客户编号
-- ORDER BY 订单总金额 DESC;
-- (3)
-- SELECT 客户名称, 所在城市, 信用额度 FROM 客户 WHERE 所在城市 = '成都'
-- UNION
-- SELECT 客户名称, 所在城市, 信用额度 FROM 客户 WHERE 信用额度 >= 80000;
练习库配套建议:先在本地把库建起来跑通,再逐题手写答案,最后和参考答案比对——光看不练,SQL 是学不会的。