10-78 spj-显示每个工程项目使用零件的供应列表 分数 10 作者 张庆 单位 集美大学 本题目要求编写SQL语句,在SPJ数据库中,显示每个工程项目所使用的提供零件数量少于100的供应列表,如工程项目尚未有供应商提供零件的也要列出。输出结果集以工程项目jno升序排序。 提示:请使用SELECT语句作答。 表结构: 请在这里写定义表结构的SQL语句。例如: CREATE TABLE `j` ( -- 工程项目表 `jno` char(3) NOT NULL,-- 工程项目号 `jname` varchar(10) DEFAULT NULL, `city` varchar(10) DEFAULT NULL, PRIMARY KEY (`jno`) ); CREATE TABLE `p` ( -- 零件表 `pno` char(3) NOT NULL, -- 零件号 `pname` varchar(10) DEFAULT NULL, `color` char(2) DEFAULT NULL, `weight` smallint(6) DEFAULT NULL, PRIMARY KEY (`pno`) ); CREATE TABLE `s` ( -- 供应商表 `sno` char(3) NOT NULL, -- 供应商号 `sname` varchar(10) DEFAULT NULL, `status` char(2) DEFAULT NULL, `city` varchar(10) DEFAULT NULL, PRIMARY KEY (`sno`) ); CREATE TABLE `spj` ( -- 零件供应表 `sno` char(3) NOT NULL, `pno` char(3) NOT NULL, `jno` char(3) NOT NULL, `qty` smallint(6) DEFAULT NULL, PRIMARY KEY (`sno`,`pno`,`jno`), CONSTRAINT `fk_jno` FOREIGN KEY (`jno`) REFERENCES `j` (`jno`), CONSTRAINT `fk_pno` FOREI
时间: 2025-06-05 18:09:16 浏览: 27
### 查询分析
为了实现查询每个工程项目所使用的提供零件数量少于100的供应列表,并包括尚未有供应商提供零件的工程项目,可以采用 `LEFT JOIN` 来连接各个表。以下是完整的 SQL 语句及其解释:
#### 完整 SQL 语句
```sql
SELECT j.jno AS 工程编号, p.pno AS 零件编号, spj.qty AS 数量
FROM j
LEFT JOIN spj ON j.jno = spj.jno
LEFT JOIN p ON p.pno = spj.pno
WHERE spj.qty < 100 OR spj.qty IS NULL
ORDER BY j.jno ASC;
```
---
### 解析
1. **使用 LEFT JOIN 连接表**
使用 `LEFT JOIN` 将 `j` 表与其他两个表 (`spj`, `p`) 进行关联[^4]。这样即使某些工程项目没有对应的供应记录,它们也会被保留下来。
2. **过滤条件**
- `spj.qty < 100`: 筛选出零件数量小于 100 的供应记录。
- `OR spj.qty IS NULL`: 包括那些没有任何供应记录的工程项目(即 `qty` 值为空的情况)。这部分数据通过 `LEFT JOIN` 自动填充为 `NULL`[^1]。
3. **排序**
结果按照 `j.jno` 升序排列,确保输出顺序清晰有序[^2]。
---
### 输出字段说明
- `j.jno`: 工程项目的唯一标识符。
- `p.pno`: 提供给该工程的零件编号。
- `spj.qty`: 对应零件的数量。如果某个工程未有任何供应,则显示为 `NULL`。
---
### 示例结果
假设数据库中有如下数据:
| j.jno | j.jname |
|-------|---------|
| J1 | 工程A |
| J2 | 工程B |
以及 `SPJ` 和 `P` 表中的部分数据:
| spj.sno | spj.pno | spj.jno | spj.qty |
|----------|-----------|-----------|----------|
| S1 | P1 | J1 | 80 |
| S2 | P2 | J1 | 120 |
执行上述 SQL 后的结果可能如下所示:
| 工程编号 | 零件编号 | 数量 |
|----------|----------|--------|
| J1 | P1 | 80 |
| J2 | NULL | NULL |
其中,`J2` 没有任何供应记录,因此其零件编号和数量均为 `NULL`。
---
### 注意事项
- 如果存在多个符合条件的零件供应记录,这些记录都会被列出。
- 若需要进一步筛选或分组统计,可以在外部嵌套一层聚合函数,例如 `COUNT()` 或 `SUM()`[^3]。
---
阅读全文
相关推荐


















