Suppliers(sid: integer, sname: string, address: string)其中:sid为供应商号,sname为供应商名,address为地址。sid为主码 Parts(pid: integer, pname: string, color: string)其中pid为零件号,pname为零件名,color为颜色。pid为主码。 Catalog(sid: integer, pid: integer, cost: real) 其中主码是(sid,pid), sid, pid分别为外码 目录关系列出了供应商提供零件的价格。 关系代数: 1、查找地址在‘5 street‘的供应商sname 2、查找提供了红色零件的供应商sname SQL: 1. 创建表以及相应的约束。 2. 查找供应商提供零件的情况,输出sid、sname、pid、pname和cost。 3. 查找姓名中第三个字母是m的供应商sname。 4. 查找提供了零件名为‘bolt‘的供应商sname 5. 查找在每种零件上收取了最高价格的供应商的sid和pid 6. 查找提供零件种类超过10种的供应商sname。 7. 查找只提供了红色零件的供应商sid。 8. 查找提供了所有零件的供应商sname。 9. 查找供应了所有红色零件的供应商sname。 10. 创建视图p1(pid,pname,color), 包含pid在500到1000(包括500和1000)的零件信息。
时间: 2023-06-11 18:09:58 浏览: 134
SQL解答如下:
1. 创建表以及相应的约束。
```
CREATE TABLE Suppliers (
sid INTEGER PRIMARY KEY,
sname VARCHAR(50),
address VARCHAR(50)
);
CREATE TABLE Parts (
pid INTEGER PRIMARY KEY,
pname VARCHAR(50),
color VARCHAR(50)
);
CREATE TABLE Catalog (
sid INTEGER REFERENCES Suppliers(sid),
pid INTEGER REFERENCES Parts(pid),
cost REAL,
PRIMARY KEY(sid, pid)
);
```
2. 查找供应商提供零件的情况,输出sid、sname、pid、pname和cost。
```
SELECT s.sid, s.sname, p.pid, p.pname, c.cost
FROM Suppliers s
INNER JOIN Catalog c ON s.sid = c.sid
INNER JOIN Parts p ON p.pid = c.pid;
```
3. 查找姓名中第三个字母是m的供应商sname。
```
SELECT sname
FROM Suppliers
WHERE SUBSTR(sname, 3, 1) = 'm';
```
4. 查找提供了零件名为‘bolt‘的供应商sname
```
SELECT s.sname
FROM Suppliers s
INNER JOIN Catalog c ON s.sid = c.sid
INNER JOIN Parts p ON p.pid = c.pid
WHERE p.pname = 'bolt';
```
5. 查找在每种零件上收取了最高价格的供应商的sid和pid
```
SELECT c.sid, c.pid
FROM (
SELECT pid, MAX(cost) AS max_cost
FROM Catalog
GROUP BY pid
) AS sub
INNER JOIN Catalog c ON sub.pid = c.pid AND sub.max_cost = c.cost;
```
6. 查找提供零件种类超过10种的供应商sname。
```
SELECT s.sname
FROM Suppliers s
INNER JOIN Catalog c ON s.sid = c.sid
GROUP BY s.sid
HAVING COUNT(DISTINCT c.pid) > 10;
```
7. 查找只提供了红色零件的供应商sid。
```
SELECT c.sid
FROM Catalog c
LEFT JOIN (
SELECT pid
FROM Parts
WHERE color != 'red'
) AS sub ON c.pid = sub.pid
WHERE sub.pid IS NULL;
```
8. 查找提供了所有零件的供应商sname。
```
SELECT s.sname
FROM Suppliers s
INNER JOIN Catalog c ON s.sid = c.sid
GROUP BY s.sid
HAVING COUNT(DISTINCT c.pid) = (SELECT COUNT(*) FROM Parts);
```
9. 查找供应了所有红色零件的供应商sname。
```
SELECT s.sname
FROM Suppliers s
INNER JOIN Catalog c ON s.sid = c.sid
LEFT JOIN (
SELECT pid
FROM Parts
WHERE color != 'red'
) AS sub ON c.pid = sub.pid
WHERE sub.pid IS NULL
GROUP BY s.sid
HAVING COUNT(DISTINCT c.pid) = (SELECT COUNT(*) FROM Parts WHERE color = 'red');
```
10. 创建视图p1(pid,pname,color), 包含pid在500到1000(包括500和1000)的零件信息。
```
CREATE VIEW p1 AS
SELECT pid, pname, color
FROM Parts
WHERE pid BETWEEN 500 AND 1000;
```
阅读全文