写SQL的一般思路
1.投影、选择、连接、笛卡尔积、并、交6种运算优先使用内连接查询写,利用输入输出分析法内连接所有相关表,然后再进行条件筛选。
2.需求明显地分成两个集合,一个集合排除掉另一个得到结果,用差运算,推荐使用NOT IN嵌套查询写,也可使用集合查询、左连接查询。
3.需求中存在两个集合,要求判断一个集合是否完全包含另一个集合,用除运算,目前只有两次嵌套的写法。
练习题
1.求供应工程J1零件的供应商号码
SELECT DISTINCT SNO FROM SPJ WHERE JNO = 'J1';
2.求供应工程J1零件P1的供应商号码
SELECT DISTINCT SNO FROM SPJ
WHERE JNO='J1' AND PNO='P1';
3.求供应工程J1红色零件的供应商号码
SELECT DISTINCT SNO FROM SPJ,P
WHERE SPJ.PNO=P.PNO
AND JNO='J1' AND COLOR='红';
4.求使用了非天津供应商(含供应商不明的)提供的红色零件的工程项目代码
分析:输入--城市、颜色;输出--工程项目代码
SELECT DISTINCT JNO FROM SPJ,P,S
WHERE SPJ.SNO=S.SNO AND SPJ.PNO=P.PNO--连接条件
AND (CITY<> '天津 OR CITY IS NULL) AND COLOR='红';
5.求至少使用了供应商S1所提供的全部种类零件的工程项目代码
SELECT JNO FROM J
WHERE NOT EXISTS
(SELECT DISTINCT PNO FROM SPJ SPJ1
WHERE SNO='S1'
AND NOT EXISTS
(SELECT * FROM SPJ SPJ2
WHERE SPJ2.SNO=SPJ1.SNO AND SPJ2.JNO=J.JNO));