指点成金-最美分享吧

登录

SQL语句中两个表的连接

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了SQL语句中两个表的连接相关的知识,希望对你有一定的参考价值。

select * from A,B whereA.ID=B.ID
select * from A JOIN B ON A.ID=B.ID这两句没区别把?where ...and和join....on什么区别

where ...and和join....on的区别

1、where 是在两个表join完成后,再附上where条件

2、而 and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join。即 

假如是左连接的话,如果左边表的某条记录不符合连接条件,那么它不进行连接,但是仍然留在结果集中(此时右边部分的连接结果为NULL)。on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

3、建议尽量用where来过滤条件

比较:

1、用AND后的SQL和结果集。还是有383这条结果集

2、用where后的SQL和结果集。没有了这条记录

扩展资料

1、eft join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。

2、right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。

3、inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。

4、full join:外连接,返回两个表中的行:left join + right join。

5、cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

关键字: on

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

参考技术A

1、打开数据库管理工具,在数据库中新建两个表用于测试,这里,两个表的表结构要一样,分别建立TEST 和 TEST1。

2、开启新的SQL查询窗口,创建一个存储过程。意思是将insert到TEST中的数据插入到TEST1中。

3、单击"执行’,一个名字为"T’的触发就新建完成了。

4、展开表结构,我们也能看见刚才新建的触发器"T’。

5、现在先在TEST表中插入一条数据做测试。INSERT INTO dbo.TEST VALUES("1","Simon","25")。

6、提示插入数据成功两次,那么,我们再来看看TEST1中的数据是否有及时更新过来。SELECT * FROM dbo.TEST1经测,数据成功写入。

参考技术B

一、外连接

1.左连接  left join 或 left outer join

SQL语句:select * from student left join score on student.Num=score.Stu_id;

2.右连接  right join 或 right outer join

SQL语句:select * from student right join score on student.Num=score.Stu_id;

3.完全外连接  full join 或 full outer join

SQL语句:select * from student full join score on student.Num=score.Stu_id;

通过上面这三种方法就可以把不同的表连接到一起,变成一张大表,之后的查询操作就简单一些了。

而对于select * from student,score;则尽量不使用此语句,产生的结果过于繁琐。

二、内连接 

join 或 inner join

SQL语句:select * from student inner join score on student.Num=score.Stu_id;

此时的语句就相当于:select * from student,score where student.ID=course.ID;

三、交叉连接

cross join,没有where指定查询条件的子句的交叉联接将产生两表的笛卡尔积。

SQL语句:select * from student cross join score;

四、结构不同的表连接

当两表为多对多关系的时候,我们需要建立一个中间表student_score,中间表至少要有两表的主键。

SQL语句:select s.Name,C.Cname from student_score as sc left join student as s on s.Sno=sc.Sno left join score as c on c.Cno=sc.Cno

select C_name,grade from student left join score on student.Num=score.Stu_id where name="李五一";

红色部分即中间表,是集合两表所有内容的一张总表。

五、UNION操作符用于合并两个或多个select语句的结果集。

UNION内部的SELECT语句必须拥有相同数量的列,每个列也必须拥有相似的数据类型,每条SELECT语句中的列的顺序必须相同。

select Num from student union select Stu_id from score;

union操作符是默认查重的,如果允许重复的值,就可以使用union all 。对于两张结构相同的表,union也可以把他们合并成一张表:

select * from student1 union select *from student2;

参考技术C (inner) join on 内链接 与 where 子查询 是一样的。
主要有区别是 left join right join 以及 full join,功能和性能跟where有差异

inner join
(等值连接)
只返回两个表中联结字段相等的行
WHERE 和INNER JOIN产生的连接关系,本质区别不详,结果一样。
(1)在效率上,Where可能具有和Inner join一样的效率。但基本可以肯定的(通过SQLServer帮助和其它资料,以及本测试)是Join的效率不比Where差。
(2)使用Join可以帮助检查语句中的无效或者误写的关联条件。
(3)从可读性角度来看,Where更直观。
left join
left outer join
(左联接)
返回包括左表中的所有记录和右表中联结字段相等的记录
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
right join
right outer join
(右联接)
返回包括右表中的所有记录和左表中联结字段相等的记录
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
full join
full outer join
(全连接)
完整外部联接返回左表和右表中的所有行
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。
如果表之间有匹配行,则整个结果集行包含基表的数据值。
Join & where总结:
where是两个表中的数据满足共同条件才会显示。
Jion on是相同条件匹配。

因此,除了inner join结果通常不一样。本回答被提问者采纳

SQl 语句 表的连接

当涉及到多个表查询时就需要使用将表连接的方法进行查询。

SQL语句连接的方式根本上分为5种:

1 ?EQUI JOIN2 ?SEMI JOIN3 ?ANTI JOIN4 ?CROSS JOIN5 ?DIVISION

1.EQUI JOIN

这是最基本的JOIN(连接)操作包括:内连接,左连接,右连接,全连接

内连接:内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。

 语法格式:inner join

1 select  *2 from  Student_One3 inner join   Student_Two 4 on  Student_One.sno=Student_One.sno;

左连接:左连接的结果集包括left join 子句中指定的所有的行,不仅仅连接所匹配的行,如果左表的某行在右表中没有匹配行,在相关联的结果集行中右表的所有选择列表为空值。

  语法格式:left join

1 select  *2 from  Student_One3 left join   Student_Two 4 on  Student_One.sno=Student_One.sno;

 

右连接:右连接是左连接的反向连接。返回右表的所有行,如果右表某行在左表没有匹配行,则左表对应的返回空值。

  语法格式:right join

1 select *2 from  Student_One3 right join   Student_Two 4 on  Student_One.sno=Student_One.sno;

全连接:返回左表和有右表中的所有行(有匹配的返回匹配的行)。当某行在另一个表中没有匹配时,另一个表的选择列表列包含空值。如果有匹配行,则整个结果集行包含基表的数据值。

  语法格式:full join

1 select *2 from  Student_One3 full join   Student_Two 4 on  Student_One.sno=Student_One.sno;

交叉连接:交叉连接返回左表中的所有行,左表的每一行与右表所有行组合。交叉连接也叫笛卡儿积。

注意:交叉连接有两种,显式和隐式的,没有on子句,返回的是两表的笛卡尔积。

隐式:

1 select *2 from  Student_One,Student_Two

显式:

1 select *2 from Student_One3 cross join Student_Two;

from子句中的表或者视图可通过内连接或全连接按任意顺序指定;但是用左连接或右连接指定表或视图的顺序很重要。

2.SEMI JOIN

这种连接关系在SQL中有两种表现方式:使用IN 或者 使用EXITS。

IN 比 EXITS 的可读性好

EXITS 比 IN 的表达性好(适合复杂的语句)

例子:

1 -- Using IN2 select *3 FROM author4 where author.id IN (select book.author_id from book)5  6 -- Using EXISTS7 select *8 from author9 where EXISTS (select 1 from book where book.author_id = author.id)

 

3.ANTI JOIN

这种连接的关系和SEMI JOIN 相反。在 IN 或 EXITS 前加 NOT 关键字

1 -- Using IN2 select *3 from author4 where  author.id NOT IN (select book.author_id from book)5  6 -- Using EXISTS7 select *8 from  author9 where NOT EXISTS (select 1 from book where book.author_id = author.id)

 

多表连接时SQl的常用技术 必须掌握!

以上是关于SQL语句中两个表的连接的主要内容,如果未能解决你的问题,请参考以下文章