码迷,mamicode.com
首页 > 数据库 > 详细

数据库总结

时间:2016-04-21 23:36:52      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

题目:有如下两个表:

        表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的值。

所以,完全的答案是:

技术分享
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.id_a = b.id_b  and a.name_a = b.name_b;
View Code

3.

  由图三可知:

    A表id为3对应B表的那一行为空,B表id为3对应A表的那一行为空。这时,可以得出如下结论:

      分别对A表和B表全查询,但是查询的条件不能为id,而是name。可以想到 ‘full outer join on‘  ,它的大意:分别查询A,B表,A和B在查询条件满足时的数据显示出来,还有不满足查询条件的也显示出来。(去NULL的办法2中已经介绍)

技术分享
1 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.id_a = b.id_b and a.name_a =b.name_b ;
View Code

 


 

 

数据库总结

标签:

原文地址:http://www.cnblogs.com/xinhuawei/p/5419275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!