问答题
现银行决策者希望查看在天津市各支行开户,且2009年9月使用了银行存取服务的所有客户的详细信息,请补充完整相应的查询语句(交易日期形式为'2000-01-01')。 SELECT DISTINCT 客户.* FROM 客户,账户,支行,交易 WHERE 客户.客户号=账户.客户号 AND 账户.开户支行号=支行.支行号 AND (d) AND 交易.账户号=账户.账户号 AND (e) ; 上述查询优化后的语句如下,请补充完整。 SELECT DISTINCT 客户.* FROM 客户,账户, (f) AS 新支行, (g) AS 新交易 WHERE 客户.客户号=账户.客户号 AND 账户.开户支行号=新支行.支行号 AND 新交易.账户号=账户.账户号; (2)假定一名客户可以申请多个账户,给出在该银行当前所有账户余额之和超过百万的客户信息,并按客户号降序排列。 SELECT * FROM 客户 WHERE (h) (SELECT 客户号 FROM 账户 GROUP BY 客户号 (i) ) ORDER BY (j) ;
【正确答案】这是一道要求读者掌握SQL数据操作语言(DML)的综合应用题,本题的解答思路是如下。 (1)依题意,若要满足题干的查询要求,则需在表连接条件的基础上,再添加两个条件:①支行关系的城市属性值为“天津市”,即(d)空缺处应填入“支行.城市='天津市'”;②在2009年9月存在交易记录,由于交易日期形式为'2000-01-01',因此需要通过模糊匹配来实现,用LIKE关键词和通配符表示,即(e)空缺处应填入“交易.交易日期LIKE'2009-09-%'”。 WHERE子句中条件的先后顺序会对执行效率产生影响。假如解析器是按照先后顺序依次解析并列条件,优化的原则是:表之间的连接必须出现在其他WHERE条件之后,那些可以过滤掉最多条记录的条件尽可能出现在WHERE子句中其他条件的前面。据此,可以重新组织WHERE条件的顺序或者通过嵌套查询以缩小连接记录数目的规模,从而实现相应的查询优化过程。 依题意所给出的程序语句,需要添加两个子查询以缩小参与连接的记录的数目,即筛选出天津市的所有支行,(f)空缺处应填入(SELECT * FROM支行WHERE 城市='天津市'),而且找到2009年9月发生的交易记录,(g)空缺处应填入(SELECT * FROM 交易 WHERE 交易日期 LIKE'2009-09-%'),然后再进行连接查询。 (2)依题意要求,可通过子查询实现“当前所有账户余额之和超过百万的客户信息”的查询,即(h)空缺处应填入“客户号 IN”;对SUM函数计算的结果应通过HAVING条件语句进行约束,即(i)空缺处应填入“HAVING SUM(余额)>1000000.00”;降序排列可以通过关键字DESC来实现,即(i)空缺处应填入“客户号DESC”。
【答案解析】
问答题
为账户关系增加一个属性“账户标记”,默认值为0,取值类型为整数,并将当前账户关系中所有记录的“账户标记”属性值修改为0。请补充相关的SQL语句。 ALTER TABLE 账户 (k) DEFAULT 0; UPDATE 账户 (l) ; (2)对于每笔金额超过10万元的交易,其对应账户标记属性值加1,给出触发器实现的方案。 CREATE TRIGGER交易_触发器 (m) ON交易 REFERENCING NEW ROW AS 新交易 FOR EACH ROW WHEN (n) BEGIN ATOMIC UPDATE 账户 SET 账户标记=账户标记+1 WHERE (o) ; COMMIT WORK; END;