以下实验是本人实际查询结果,结论也是本人自己总结的,结论可能有不对的地方,仅供参考!
/*
首先我们建立3张表lsy_a,lsy_b,lsy_other
其中lsy_a和lsy_b有外键aid关联。lsy_other无关联。
这3张表都有name这一列,并且每张表的name列都有相同的
值和不同的值。
特别要注意lsy_b这张表,它里面有引用lsy_a列的相同的name值分两种情况:
1,外键,name和lsy_a一致
2,外键,name和lsy_a不一致
*/
看看表里的数据吧:
lsy_a
ID | NAME | ADDRESS |
---|---|---|
16 | samename1 | samename1address |
17 | samename2 | samename2address |
18 | samename3 | samename3address |
11 | a_name_11 | a11_address |
12 | a_name_12 | a12_address |
13 | a_name_13 | a13_address |
14 | a_name_14 | a14_address |
15 | a_name_15 | a15_address |
lsy_b
ID | AID | NAME | |
---|---|---|---|
21 | 11 | b_name_21 | b21email |
22 | 12 | b_name_22 | b22email |
23 | 12 | b_name_23 | b23email |
24 | 11 | b_name_24 | b24email |
25 | 12 | b_name_25 | b25email |
26 | 16 | samename1 | samename26email |
27 | 17 | samename2 | samename27email |
28 | 11 | samename1 | samename28email |
29 | 12 | samename2 | samename29email |
lsy_other
ID | NAME | PHONE |
---|---|---|
31 | other_name_31 | other31phone |
32 | other_name_32 | other32phone |
33 | other_name_33 | other33phone |
34 | other_name_34 | other34phone |
35 | samename1 | othersamename35phone |
36 | samename2 | othersamename36phone |
看看各种情况下的查询结果,这几个很好理解结果就不贴了:
--1
select * from lsy_a a
where exists (
select * from lsy_b b--结果是lsy_a中所有值
)
--1-2
select * from lsy_b b
where exists (
select * from lsy_a a--结果是lsy_b中所有值
)
--2
select a.address from lsy_a a
where exists (
select * from lsy_b b --结果是lsy_a中所有address这列的值(注意lsy_b无此列)
)
--2-2
select b.email from lsy_b b
where exists (
select * from lsy_a a --结果是lsy_b中所有email这列的值(注意lsy_a无此列)
)
--3
select a.* from lsy_a a
where exists (
select * from lsy_b b
where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_a中有关联的数据被查询出*/
--3-2
select b.* from lsy_b b
where exists (
select * from lsy_a a
where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_b中所有的数据被查询出,因为lsy_b有外键所以肯定所有数据都有关联*/
--4,下面再在3的基础上改变,看看结果是什么样
select a.address from lsy_a a
where exists (
select * from lsy_b b
where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/* 结果lsy_a中有关联的数据的address列查询出来了,从结果集可以看出
lsy_a和lsy_b是通过外键aid列关联的!
*/
--4-2
select b.email from lsy_b b
where exists (
select * from lsy_a a
where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/* 结果lsy_b中有关联的数据的email列查询出来了,而lsy_a中根本没有email这一列!
这有点不好理解,我们翻译一下这个sql成中文就是从b中查询数据,条件b的数据在a中出现。
那a的列和b的列不对应,那怎样判定条件b的数据在a中出现是否成立呢?我再建一张表lsy_other
,其中也有id,name但它是张独立的表,没有外间,和前两张表没关系,只是有两列的名字起得相同而已。
我们继续研究。
*/
--5
select * from lsy_a a
where exists (
select * from lsy_other o--结果是lsy_a中所有值
)
--5-2
select * from lsy_other o
where exists (
select * from lsy_a a --结果是lsy_other中所有值
)
--6
select * from lsy_a a
where exists (
select * from lsy_other o
where a.name=o.name --通过name列关联,结果是有相同name的值被查出
)
--6-2
select * from lsy_other o
where exists (
select * from lsy_a a
where a.name=o.name --通过name列关联,结果是有相同name的值被查出
)
下面看几个关键的:
--7
select a.address from lsy_a a
where exists (
select * from lsy_other o
where a.name=o.name --通过name列关联,结果是有相同name的address列的值被查出
)
结果集:
ADDRESS |
---|
samename1address |
samename2address |
--7-2
select * from lsy_a a
where exists (
select o.phone from lsy_other o --注意:子查询只有phone这列
where a.name=o.name --通过name列关联,结果是有相同name的值被查出
)
结果集:
ID | NAME | ADDRESS |
---|---|---|
16 | samename1 | samename1address |
17 | samename2 | samename2address |
--7-3
select a.address from lsy_a a
where exists (
select o.phone from lsy_other o --注意:子查询只有phone这列
where a.name=o.name --通过name列关联,结果是有相同name的address列的值被查出
)
结果集:
ADDRESS |
---|
samename1address |
samename2address |
/*
从结果集我得出以下结论:
看这样一个形式,
select 表A的列 from 表A a
where exists (
select 表B的列 from 表B b
where 表A和表B关联的条件(不一定是外键)
)
1:select 表A的列是最终在结果集你要的列,改查什么就查什么,没什么好说的。
2:在exists中“select 表B的列 from 表B b”根本没什么用!你完全可以随便写一个或多个表B的列,
它在where条件中没用到照样能查数据,所以这句你可以随便写,一般写成*就行(如7-3)
3:在exists中where条件才是决定这两张表是如何关联的,这个你要小心的写。
4:如果不写where条件,那exists就没有任何意义,它默认查出所有的值!你干脆把exists去掉算了。
总之:exists查询我们可以这样翻译更好理解:
从表A查询表A的某些列作为结果集 ,表A中的每一行数据需要符合这样一个条件:
表A的行和表B的行符合条件 {where 表A和表B关联的条件(不一定是外键)}。
*/