数据库笔试题【都是精华】
今天参加了一个笔试,里面有一道数据库题,感觉很基础,但是也很容易出错。所以记录一下,方便以后翻阅。
题目:有如下两个表:
表A 表B
请写SQL语句输出一下效果:
(1)
(2)
(3)
下面讲解一下这三个小题:
首先由表可以看出:A,B两个表的id都是字符串类型。这一点很重要,后面会用到。
1.
由第一个小题的要求(图)可以看出,这是在考察SQL的等值连接,表A和表B 的id相等的都满足该条件。故:
select * from A a,B b where a.id_a = b.id_b;
2.
由图2可知:A的没有全显示,而B的全显示出来了,想到这,马上就可以知道这是“右外连接”,连接的条件为:A的id等于B的id且A的name等于B的name。故可以得到如下SQL语句:
select * from A a right join B b on a.id_a = b.id_b and a.name_a = b.name_b;
不过,这种查询结果有一点小问题:如图
可以看出来,这明显不符合题目要求(可以对比一下第二题的要求)。
接下来就考到细节了,查询后的结果去null。SQL有这样一个函数ISNULL(表达式1,表达式2),该函数的大意就是:查询的结果表达式1是否位NULL,如果为NULL则取表达式2的值,否则取表达式1的值。
所以,完整的答案为:
select ISNULL(a.id_a,'') id_a,ISNULL(a.name_a,'') name_a,ISNULL(a.desc_a,'') desc_a,b.id_b,b.name_b,b.desc_b from A a right join B b on a.name_a = b.name_b;
3.
由图三可知:
A表id为3对应B表的那一行为空,B表id为3对应A表的那一行为空。这时,可以得出如下结论:
分别对A表和B表全查询,但是查询的条件不能为id,而是name。可以想到 'full outer join on' ,它的大意:分别查询A,B表,A和B在查询条件满足时的数据显示出来,还有不满足查询条件的也显示出来。(去NULL的办法2中已经介绍)
select ISNULL(a.id_a,'') id_a,ISNULL(a.name_a,'') name_a,ISNULL(a.desc_a,'') desc_a,ISNULL(b.id_b,'') id_b,ISNULL(b.name_b,'') name_b,ISNULL(b.desc_b,'') desc_b from A a full outer join B b on a.name_a =b.name_b ;
今天就总结到这,后面若再有面试,还会继续出来分析。。。