SQL语句中不一样的连贯JOIN及join的用法
为了从两个表中获取数据,我们有时会用JOIN将两个表连贯起来。平常有下列几种连贯方式:
JOIN or INNER JOIN(内连贯) : 这两个是雷同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示。
LEFT JOIN(左外连贯):即便右侧的表中没有匹配,也从左表返回所有的行。
RIGHT JOIN(右外连贯):即便左边的表中没有匹配,也从右表返回所有的行。
FULL JOIN(全外连贯):只有其中一个表中存在匹配就返回行。
如例,有grade表(课程号sn,分数scroe,学号id),student表(学号id,学生姓名name),要查询学生的姓名和成绩
当JOIN或是INNER JOIN时,
SELECT s.name,g.sn,g.score from student as s join grade as g on s.id = g.id
或者
SELECT s.name,g.sn,g.score from student as s inner join grade as g on s.id = g.id
效果集如下
当LEFT JOIN时,
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id
效果集如下
当RIGHT JOIN时,
SELECT s.name,g.sn,g.score from student as s right join grade as g on s.id = g.id
效果集如下
当FULL JOIN时,
SELECT s.name,g.sn,g.score from student as s full join grade as g on s.id = g.id
效果集如下
注意,两个表连贯时用on,在运用left join(right join或full join)时,on与where的区别是:
on前提是在生成临时表时运用的前提,它无论on中的前提是否为真,都会返回左边表中的记载
where前提是在临时表生成好后再对临时表进行过滤的前提,这时已经没有left join的含义(必须返回左边表的记载)了,前提不为真的就全部过滤掉。如下图,
on前提为黄色局部
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id and score =90
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id where score =90
下面看下SQL中join的各种用法
1.天然连贯(natural join)
天然连贯将表中拥有雷同名称的列主动进行匹配,天然连贯无须指定任何平等连贯前提也不能以为指定哪些列需要被匹配,天然连贯得到的效果表中,两表中名称雷同的列只涌现一次。
select * from employee natural join department;
2.内连贯(inner join):发生的效果是A和B的交集(雷同列里面的雷同值)
内连贯查询能将左表和右表中能关联起来的数据连贯后返回,返回的效果就是两个表中所有相匹配的数据。
select * from TableA as A inner join TableB B on A.PK = B.PK; select * from TableA as A inner join TableB B on A.PK > B.PK;
3.外连贯(outer join)
内连贯是要显示两张表的内存,而外连贯不要求如此,外连贯可以根据连贯表保存左表,右表或全部表的行为而分为左外连贯右外连贯和全连贯。
select * from TableA as A left(right/full) join TableB as B on A.PA = B.PK;
Full Join:发生的效果是A和B的并集(要是没有雷同的值会用null作为值)
Left Join:发生表A的完全集,而B表中匹配的则有值(没有匹配的则以null值代替)
Right Join:发生表B的完全集,而A表中匹配的则有值(没有匹配的则以null值代替)
4.穿插连贯(cross join)
又称笛卡尔连贯,穿插连贯返回两个汇合的笛卡尔积。
select * from TableA cross join TableB;
参考链接:http://mazhuang.org/2017/09/11/joins-in-sql/
总结
以上所述是小编给大家介绍的SQL语句中不一样的连贯join及join的用法,但愿对大家有所帮忙,要是大家有任何疑难请给我留言,小编会及时回复大家的。在此也非常谢谢大家对我们网站的支撑!