关联查询和子查询

关联查询和子查询

关联查询(多表查询)

等值连接(不推荐)
select t1.,t2. – 100000 2
from t_student t1,t_class t2 – 10000 100 100W 获取的结果集可能非常大
where t1.classid = t2.cid – 10条
全部组合后,再来查找匹配,效率低
1内连接
select t1.,t2.
from t_student t1 inner join t_class t2 on t1.classid = t2.cid
– 左边的数据和右边的数据满足 on 关键字后面的条件保留
一条组合后,匹配后再组合下一条
–在连接的时候一般将数据量小的表放在连接符合的左侧
2左连接:在内连接的基础上保留左侧不满足条件的数据
select t1.,t2.
from t_student t1 left (outer) join t_class t2
on t1.classid = t2.cid
3右连接:在内连接的基础上保留右侧不满足条件的数据
select t1.,t2.
from t_student t1 right join t_class t2
on t1.classid = t2.cid
等同于:
select t.,(select * from t_class where classid=t.classid) cname from t_student4 t;
4全连接:在内连接的基础上保留左右两侧不满足条件的数据
select t1.
,t2.*
from t_student t1 full join t_class t2
on t1.classid = t2.cid

子查询
子查询允许把一个查询嵌套在另一个查询当中。
比较常见的有
1 标量子查询:

是指子查询返回的是单一值的标量,如一个数字或一个字符串,也是子查询中最简单的返回形式。 可以使用 = > < >= <= <> 这些操作符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧
    示例:   
SELECT * FROM article WHERE uid = (SELECT uid FROM user WHERE status=1 ORDER BY uid DESC LIMIT 1)
SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2)
SELECT * FROM article AS t WHERE 2 = (SELECT COUNT(*) FROM article WHERE article.uid = t.uid)
2 ANY进行子查询

any关键词的意思是“对于子查询返回的列中的任何一个数值,如果比较结果为TRUE,就返回TRUE”。

好比“10 >any(11, 20, 2, 30)”,由于10>2,所以,该该判断会返回TRUE;只要10与集合中的任意一个进行比较,得到TRUE时,就会返回TRUE。

select table1.customer_id,city,count(order_id)
from table1 join table2
on table1.customer_id=table2.customer_id
where table1.customer_id<>‘tx’ and table1.customer_id<>‘9you’
group by customer_id
having count(order_id) >
any (
select count(order_id)
from table2
where customer_id=‘tx’ or customer_id=‘9you’
group by customer_id);
  any的意思比较好明白,直译就是任意一个,只要条件满足任意的一个,就返回TRUE。

3 使用IN进行子查询

使用in进行子查询,这个我们在日常写sql的时候是经常遇到的。in的意思就是指定的一个值是否在这个集合中,如何在就返回TRUE;否则就返回FALSE了。

in是“=any”的别名,在使用“=any”的地方,我们都可以使用“in”来进行替换。

有了in,肯定就有了not in;not in并不是和<>any是同样的意思,not in和<>all是一个意思。

where型子查询:指把内部查询的结果作为外层查询的比较条件。
from型子查询:把内层的查询结果当成临时表,供外层sql再次查询。
in子查询:内层查询语句仅返回一个数据列,这个数据列的值将供外层查询语句进行比较。
exists子查询:把外层的查询结果,拿到内层,看内层是否成立,简单来说后面的返回true,外层(也就是前面的语句)才会执行,否则不执行。
any子查询:只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
all子查询:内层子查询返回的结果需同时满足所有内层查询条件。

你可能感兴趣的:(关联查询和子查询)