SQL语句中不同的连接JOIN及SQL中join的各种用法
本文给大家较详细的介绍了SQL语句中不同的连接JOIN及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的用法,希望对大家有所帮助。
-
SQL SERVER 2012数据库自动备份的方法
文章主要为大家详细介绍了SQL SERVER 2012数据库自动备份的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下为了防止数据丢失,这里给大家介绍SQL SERVER2012数据自动备...
-
关于SQL server2008调试存储过程的完整步骤
文章主要给大家分享介绍了关于sql server2008调试存储过程的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编...
-
SQL Server数据库调整表中列的顺序操作方法及遇到问题
文章主要介绍了SQL Server 数据库调整表中列的顺序操作,文中给大家通过详细步骤介绍了需求及问题描述 ,需要的朋友可以参考下SQL Server 数据库中表一旦创建,我们不建议擅自调...
-
SQL Server中的SELECT会阻塞SELECT相关资料
文章主要给大家介绍了SQL Server中的SELECT会阻塞SELECT的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧前言在SQL Server中...
-
Docker中部署mysql服务的方法及遇到的问题
文章主要介绍了Docker中部署mysql服务的方法及遇到的坑,本文是小编细心给大家收藏整理下来的,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下最近一直在学习搬运工,感觉...
-
利用数据库trigger对安全进行监控
最近帮一个朋友看他们的网站安全问题,他们非常担心系统中的数据被篡改,因为一旦篡改可能就别人兑换东西或者套现走了就会造成损失,而最典型的修改一般都是利用事务性不一致和一些数据库中的溢出等错误和直接获取权...
-
win7下手动配置apache+php+mysql记
本来想学学php,于是就想搭建web服务器和sql环境,结果浪费掉了不少时间。大致的总结下,也算是长个记性。使用的安装包分别是httpd-2.2.22-win32-x86-no_ssl.msi,php-5.2.5-Win32.zip和mysql-installer-communit...
-
完成Excel动态链接外部数据库
我们有时需要在Excel中调取其他数据库的数据,并且希望其他数据库数据改变时,Excel中调取的数据也随之动态改变。下面介绍在Excel中通过“新建数据库查询”(MicrosoftQuery)的方法来实现动态链接数据库。...
-
网站被sql注入的修复方法
近日,网站频频被黑。在网站里莫名其妙的多出一篇文章,还有多出一组贴图。正在纳闷是谁可以登陆我的后台发表文章和图片的时候,我的qq弹出消息,一个陌生人给我发消息,说我的网站有漏洞,还说是他弄了我的网站。不过还好,他给...
-
SQL 注入技术详解
1.1概述1.2背景1.3字符编码2.1综合测试2.2测试过程2.3分析结果3.1绕过验证3.2SELECT3.2.1直接利用...