浅谈数据库联合查询
Posted zzfx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈数据库联合查询相关的知识,希望对你有一定的参考价值。
http://www.cnblogs.com/Candies/p/4142576.html
本文介绍以下内容:
LFET JOIN、RIGHT JOIN、INNER JOIN、UNION、UNION ALL、FULL JOIN等!
测试数据(以下数据未经考证,非真实有效数据,仅作为本次学习的测试数据!)
|
数据库表结构和数据SQL(使用Navicat从mysql导出):
利用以下SQL可以查询出以上的表格并了解表之间的关系:
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
修改部分测试数据:
SCHOOL:
BF8085E385004A5295F950F390C67476 四川大学 四川 1 12
5C354FDA736C4D189C97BEE8DDD0D0E6 山东大学 山东 1 16
-->
BF8085E385004A5295F950F390C67475 四川大学 四川 1 12
5C354FDA736C4D189C97BEE8DDD0D0E7 山东大学 山东 1 16
SCHOOLMASTER:
5496350FC7F0455A96268FC76AE11A01 陈俊 8150DCFA7F6144D6A77A109977538047
-->
5496350FC7F0455A96268FC76AE11A01 陈俊 8150DCFA7F6144D6A77A109977538046
继续使用以上SQL查询出高校排名:
查询结果如下表:
|
数据库中查询分为:内连接、外连接、全连接,其中外连接分为左外连接(左连接)、右外连接(右连接)。
以下练习只关注表SCHOOL和表SCHOOLMASTER之间的连接关系,不关注表SCHOOL和表SCHOOLTYPE之间的连接关系,所以表SCHOOL和表SCHOOLTYPE之间使用LEFT JOIN进行联合查询。
左外连接(左连接):
使用以上测试数据,查询所有大学的校名和校长:
SQL:
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S LEFT JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID LEFT JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
查询结果:
|
左连接查询:以左表(LEFT JOIN左边的表:表SCHOOL)为主表,即使右表(LEFT JOIN右边的表:表SCHOOLMASTER)没有匹配的数据,也从左表返回所有行数据。
以上SQL还可以写成
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S LEFT OUTER JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID LEFT OUTER JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
这也是左外连接简称为左连接的原因。
或者
SELECT SCHOOL.SORTKEY, SCHOOL.SCHOOLNAME, SCHOOL.SCHOOLLOCATION, SCHOOLMASTER.NAME, SCHOOLTYPE.TYPENAME FROM SCHOOL, SCHOOLMASTER, SCHOOLTYPE WHERE SCHOOL.SCHOOLID = SCHOOLMASTER.SCHOOLID(+) AND SCHOOL.SCHOOLTYPE = SCHOOLTYPE.TYPEID(+) ORDER BY SCHOOL.SORTKEY
以上SQL也是用了左连接,因为(+)在右侧,所以“(+)”所在位置的另一侧为连接的方向,不过这种方式已经过时了。
右外连接(右连接):
使用以上测试数据,查询所有校长管理的学校:
SQL:
SELECT M.NAME, S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, T.TYPENAME FROM SCHOOL S RIGHT JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID LEFT JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
查询结果:
|
右连接查询:以右表(RIGHT JOIN右边的表:表SCHOOLMASTER)为主表,即使左表(RIGHT JOIN左边的表:表SCHOOL)没有匹配的数据,也从右表返回所有行数据。
以上SQL还可以写成
SELECT M.NAME, S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, T.TYPENAME FROM SCHOOL S RIGHT OUTER JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID LEFT JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
这也是右外连接简称为右连接的原因。
或者
SELECT SCHOOLMASTER.NAME, SCHOOL.SORTKEY, SCHOOL.SCHOOLNAME, SCHOOL.SCHOOLLOCATION, SCHOOLTYPE.TYPENAME FROM SCHOOL, SCHOOLMASTER, SCHOOLTYPE WHERE SCHOOL.SCHOOLID(+) = SCHOOLMASTER.SCHOOLID AND SCHOOL.SCHOOLTYPE = SCHOOLTYPE.TYPEID(+) ORDER BY SCHOOL.SORTKEY
以上SQL也是用了右连接,因为(+)在左侧,所以“(+)”所在位置的另一侧为连接的方向。
学习完左连接和右连接后,比较一下以下的SQL:
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME FROM SCHOOL S LEFT JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID ORDER BY S.SORTKEY
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME FROM SCHOOLMASTER M RIGHT JOIN SCHOOL S ON S.SCHOOLID = M.SCHOOLID ORDER BY S.SORTKEY
运行以上两句SQL后,发现查询结果是一致的。虽然第一句SQL使用的是LEFT JOIN,而第二句使用的是RIGHT JOIN。
根据上文中左连接查询、右连接查询的定义:
左连接查询:以左表为主表,即使右表没有匹配的数据,也从左表返回所有行数据。
右连接查询:以右表为主表,即使左表没有匹配的数据,也从右表返回所有行数据。
分析以上两句SQL。
第一句(LEFT JOIN):因为使用了左连接查询,所以以左表SCHOOL为主表,返回查询结果;
第二句(RITHT JOIN):因为使用了右连接查询,所以以右表SCHOOL为主表,返回查询结果。
所以主表为同一数据表,查询结果相同。
也就是说在软件开发过程中,针对某一功能需求,使用左连接查询或者右连接查询以及其他查询都是可以的,只要查询结果正确即可。
同时,也可以用多种查询方式检查SQL的正确性。
左连接查询、右连接查询等各种查询方式并没有错误,只要符合功能需求即可。这一观点在后文以及以后的工作中也会得到证实。
内连接查询:
使用以上测试数据,查询所有学校和校长,特别指出的是,没有校长的学校、没有领导学校的校长不要显示:
SQL:
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
查询结果:
|
内连接查询:如果表中有至少一个匹配,则返回行数据。
以上SQL还可以写成
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S INNER JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID INNER JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
也就是说INNER JOIN 等同于 JOIN,为了方便起见,一般直接使用JOIN。
UNION、UNION ALL:
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL:
( SELECT S.SCHOOLID ID, S.SCHOOLNAME NAME FROM SCHOOL S ) UNION ( SELECT M . ID ID, M . NAME NAME FROM SCHOOLMASTER M ) UNION ( SELECT TYPEID ID, TYPENAME NAME FROM SCHOOLTYPE )
查询结果:
|
以上SQL仅仅为了说明UNION的功能,没有具体意义。
当列数据有重复时,UNION只能查询出一条记录,这时候就需要使用UNION ALL进行查询。
全连接查询:
SQL:
SELECT S.SORTKEY, S.SCHOOLNAME, S.SCHOOLLOCATION, M.NAME, T.TYPENAME FROM SCHOOL S FULL JOIN SCHOOLMASTER M ON S.SCHOOLID = M.SCHOOLID LEFT JOIN SCHOOLTYPE T ON S.SCHOOLTYPE = T.TYPEID ORDER BY S.SORTKEY
查询结果:
|
全连接查询:只要其中某个表存在匹配,就返回行数据。
以上是关于浅谈数据库联合查询的主要内容,如果未能解决你的问题,请参考以下文章
浅谈!SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
尽管未使用接口或联合,但 readFragment 导致 IntrospectionFragmentMatcher 错误