《数据库管理系统原理与设计》笔记1

1.弄清了初学数据库时候的一个问题。

【找出水手的平均年龄在所有等级中是最低的那些等级】

错误写法:

  SELECT S.rating

  FROM Sailor S

  WHERE AVG(S.age)=(SELECT MIN(AVG(S2.age))

                                  FROM Sailor S2

                                  GROUP BY S2.rating)

以前一直被聚集函数里不能有聚集函数规定困扰,其实就算合法,选出的也和没用MIN一样的,因为是在分组里选的而不是在分组集合中选。

正确写法:(产生一个临时表)

  SELECT Temp.rating,Temp.avgage

  FROM(SELECT S.rating,AVG (S.age) AS avgage

            FROM Sailor S

            GROUP BY S.rating) AS Temp

  WHERE Temp.avgage=(SELECT MIN(Temp.avgage) FROM TEMP)

即选出一个有rating和平均年龄avgage的TEMP表,再用嵌套选出min(avgage)

另外方法待测试:

  SELECT Temp.rating,MIN(Temp.avgage)

  FROM(SELECT S.rating,AVG (S.age) AS avgage  

            FROM Sailor S

            GROUP BY S.rating) AS Temp

2.弄清楚了为什么有了约束断言,还需要触发器。

A.约束只能限制不能这样做,而触发器是产生了这样或者那样的情况,加以动作,更加灵活。

B.触发器能够用于产生事件日志

C.约束是不在运行时定义,容易理解;相反,触发器的一条语句可能触发另外一个触发器,产生递归触发器,而DBMS处理激活触发器顺序不可预测,造成难理解难控制。

3.问题:空值 与 比较、聚集函数、EXISTS的关系。

4.问题:=和LIKE: 'jeff'='jeff'真,'jeff' LIKE 'jeff'假?.

5.除操作的经典示例:

【找出预订了所有船只的水手的名字】

SELECT S.sname

FROM Sailors S

WHERE NOT EXISTS(SELECT B.bid

                               FROM Boats B

                               WHERE NOT EXISTS (SELECT R.bid

                                                               FROM Reserves R

                                                               WHERE R.bid=B.bid AND R.sid=S.sid))

找出一个【找不出【订单里没有此船和此水手】的船只】的水手的名字

=找出一个定了全部船的水手名

posted on 2014-10-14 23:20  BWB  阅读(589)  评论(0编辑  收藏  举报

导航