分享

sql联合查询详解

 niehouhua 2011-03-01
sql联合查询详解
资料:
http://keke-wanwei./blog/99162

http://hi.baidu.com/daweeforever/blog/item/a8831425e684296735a80f5e.html

http://sizhefang./blog/212652

这几天碰到2个有点绕的查询:
1.
select * from 表A,表A子表

where 表A.FileCode = 表A子表.FileCode   and 表A.ID

in (select 表A子表.ID from 表A子表 where

Vc_Code = '1190' AND Vc_Num ='111300' AND Er_Num ='0101');

这个查询的条件在子表,而结果在父表,没用关联查询,直接查询2个表

2.
SELECT * FROM

A表 AS A LEFT JOIN C表 AS C ON A.UID = C.EID ,

B表 AS B

WHERE A.U_ID = B.U_ID AND    //A表和B表通过U_ID关联

B.D_ID IN (SELECT MAX(D_ID) FROM B表 GROUP BY U_ID)    //要D_ID值最大的D_ID

AND B.CASEID = '87'    //B表的一个字段值已知

AND A.STATUS = '1';      //A表的一个字段值已知

关联查询总结:

1.UNION


格式:
查询语句

UNION [ALL] 查询语句

[UNION [ALL] 查询语句][…n]

说明:
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)

例子:

person表和user表没有约束
person表:

user表:

执行:select id,name from user UNION select id,name from person;

结果:


注意:sql句子栏目数必须是相同的,字段可以随意


2.JOIN


JOIN用于按照ON条件联接两个表,主要有四种:

(一)内连接

INNER JOIN:内部联接两个表中的记录,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。(表示交集)

(二)外连接

LEFT JOIN / LEFT OUTER JOIN:外部联接两个表中的记录,并包含左表中的全部记录。如果左表的某记录在右表中没有匹配记录,则在相关联的结果集中右表的所有选择列表列均为空值。理解为即使不符合ON条件,左表中的记录也全部显示出来,且结果集中该类记录的右表字段为空值。(差集)

RIGHT JOIN / RIGHT OUTER JOIN:外部联接两个表中的记录,并包含右表中的全部记录。简单说就是和LEFT JOIN反过来。(差集)

FULL JOIN / FULL OUTER JOIN: 完整外部联接返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合并,左右两表的数据都全部显示。(并集)

(三)交叉连接

交叉连接(cross join)不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

JOIN的基本语法(注意结果对比):

1.执行 select * from user as A join person as B on A.id=B.id;
select * from user as A inner join person as B on A.id=B.id;


结果如下:

2.执行 select A.* from user as A join person as B on A.id=B.id;

3.执行select * from user as A left join person as B on A.id=B.id;

4.select * from person as A right join user as B on A.id=B.id;

5.full join 
mysql 5不支持full join 所以用左关联和右关联进行联合
SELECT * FROM user
LEFT JOIN money ON user.id=money.id
UNION
SELECT * FROM user
RIGHT JOIN money ON user.id=money.id

6.执行 select * from user CROSS JOIN person;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多