SQL 左外连接后还能加where不
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 左外连接后还能加where不相关的知识,希望对你有一定的参考价值。
可以啊,连接条件放在on后面, 其余的条件放在where后面就可以了 参考技术A where 中的条件,应该用于对 主表的 限制, 否则影响 左联接的效果比如:
select a.*.b.* from a left outer join b on a.id = b.id
where a.name='abc' 参考技术B 左外连接后面的库都在on后面加条件,其它的库条件可以放到where后面 参考技术C select table_3.a,table_3.b,table_6.a,table_6.c from table_3 left outer join table_6 on table_3.a=table_6.a where table_6.a=‘1’ 参考技术D 当然可以
什么是左外连接 SQLserver
请举例说明! 谢谢了!
SQL的四种连接-左外连接、右外连接、内连接、全连接今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以达到效果。
联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定联接条件。WHERE和HAVING子句也可以包含搜索条件,以进一步筛选联接条件所选的行。
联接可分为以下几类:
1、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。
2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
3、交叉联接
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。
例子:
-------------------------------------------------
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在关系
--------------------------------------------------
1) 内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
2)左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null
3) 右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
4) 完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null 参考技术A 左外连接(left join)
左外连接:
先取出 左表(table1)中的纪录,再根据连接条件(on 后面的),从右表(table2)取出匹配到的纪录,没有匹配到则以null代替。
例如:
table1(A,B,C)
A B C
A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 null
table2(C,D,E)
C D E
C1 D1 E1
C4 D2 E2
C3 D3 E3
Select * from table1 left join table2 on table1.C=table2.C
最终结果
A B C D E
A1 B1 C1 D1 E1
A2 B2 C2 NULL NULL
A3 B3 C3 D3 E3
A4 B4 NULL NULL NULL 参考技术B 用于返回满足连接条件的数据,以及不满足连接条件的左边其他数据
例如:
select a.dname,b.ename from dept a
left join emp b on a.deptno=b.deptno;
这就是从表emp和dept中返回deptno相同的,由于这是左连接,所以还会返回左表(即dept表)中不满足条件的所有其他数据 参考技术C 比如:有a,b两个表,a表存了01,02两个学生的数据id、name、kid(选科目id),01选A科目,02没选科目,b表存A、B两个科目的数据kid,kname。左外查询就是select * from a left join b where a.kid=b.kid。分析:左边a表是主表,它的数据全部查出,右边b表是从表,只查出与主表对应的数据。查询结果是:01.....A科目,02.....Null 参考技术D 可以先建立两个表插入一些Demo数据
----student=(sno,sname) 学号,姓名
insert into student(sno,sname) values('2005001','小施');
insert into student(sno,sname) values('2005002','小王');
insert into student(sno,sname) values('2005003','小张');
insert into student(sno,sname) values('2005004','小贾');
----stu_score=(sno,scrore) 学号,分数
insert into stu_score(sno,scrore) values('2005001',90.00);
insert into stu_score(sno,scrore) values('2005002',95.00);
insert into stu_score(sno,scrore) values('2005008',80.50);
insert into stu_score(sno,scrore) values('2005009',88.50);
左连接或left join,left outer join 返回包括左表中的所有记录和右表中联接字段相等的记录
右连接或right join ,right outer join 返回包括右表中的所有记录和由表中联接字段相等的记录
----左连接/左外连接(数据量=M)
select a.*,b.* from student a left join stu_score b on a.sno=b.sno;
select a.*,b.* from student a left outer join stu_score b on a.sno=b.sno;
----右连接/右外连接(数据量=N)
select a.*,b.* from student a right join stu_score b on a.sno=b.sno;
select a.*,b.* from student a right outer join stu_score b on a.sno=b.sno; 第5个回答 2011-10-21 left join
以上是关于SQL 左外连接后还能加where不的主要内容,如果未能解决你的问题,请参考以下文章