本练习库围绕一家食品贸易公司,以「业务单据 + 会计分录」建模,覆盖《SQL必知必会》第 1~14 章核心知识点,共 7 张表、6 笔经济业务、5 道练习题(含参考答案)。

数据库:SQLite 字段名:中文(方便会计人直接上手)

使用方式:

  • sqlite3 会计练习.db < 本文件 直接建库;
  • 或复制到 DBeaver / Navicat 中执行。

结构概览:

  1. 第 1 部分:建表(7 张表)
  2. 第 2 部分:示例数据(业务单据 + 会计数据,借贷平衡)
  3. 第 3 部分:练习题(5 道,覆盖第 1~14 章)
  4. 第 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 是学不会的。