
SQL Server中内连接和外连接的区别
关键字: 左右连接
数据表的连接有:
1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
2、外连接: 包括
(1)左外连接(左边的表不加限制)
(2)右外连接(右边的表不加限制)
(3)全外连接(左右两表都不加限制)
3、自连接(连接发生在一张基表内)
select astudentno, astudentname, bclassname
from students a, classes b
where aclassid(+) = bclassid;
STUDENTNO STUDENTNAM CLASSNAME
对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍。
1 LEFT OUTER JOIN:左外关联
SELECT elast_name, edepartment_id, ddepartment_name
FROM employees e
LEFT OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
等价于
SELECT elast_name, edepartment_id, ddepartment_name
FROM employees e, departments d
WHERE edepartment_id=ddepartment_id(+);
结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。
2 RIGHT OUTER JOIN:右外关联
SELECT elast_name, edepartment_id, ddepartment_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
等价于
SELECT elast_name, edepartment_id, ddepartment_name
FROM employees e, departments d
WHERE edepartment_id(+)=ddepartment_id;
结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。
3 FULL OUTER JOIN:全外关联
SELECT elast_name, edepartment_id, ddepartment_name
FROM employees e
FULL OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。
left join
join
主外键是两种对表的约束。
例如:
学生表student(学号(id),姓名(name),性别(sex))
表内有:1,aa,女
课程表subject(课程编号(id),课程名(name))
表内有:1,语文
成绩表grade(成绩编号(id),学号(stu_id),课程号(sub_id),成绩(grade))
表内有:1,1,1,90
成绩表的学号就是学生表的学号相对应,并且为学生表的主键,这样就称成绩表中的学号是学生表的外键,同理,成绩表中的课程号是课程表的外键。
select from student as s inner join subject as su on sustu_id=sid inner join grade as g on gsub_id=suid where 1
扩展资料:
注意事项
SQL 连接(JOIN) 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。
左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。
假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
不同的 SQL JOIN可以使用的不同的 SQL JOIN 类型:
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行(MySQL不支持FULL JOIN)
例如:
mysql> select from access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date |
+-----+---------+-------+------------+
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set
SQL 联接--->完整外联接 (完整外部联接 full outer joinon) 收藏
SQL 联接--->完整外联接 (完整外部联接 full outer joinon)
有表 titles(书信息表) 如下图
有表 publishers(出版社) 如下图
执行完整外联接代码:
select titlestitles_id,titlestitle,publisherspub_name from titles full outer join publishers on titlespub_id=publisherspub_id 结果如下图:
大家看明白了吗? 现在要讲关于完整外联接的 理论了 要顶住呀!不带睡觉啊! 不听话按行规 剁两脚指头!
一、联接( join)
通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。联接表示应如何使用一个表中的数据来选择另一个表中的行。
联接条件通过以下方法定义两个表在查询中的关联方式:
指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。指定比较各列的值时要使用的逻辑运算符(=、<> 等)。
二、联接类型
当联接表时,创建的联接类型影响出现在结果集内的行。联接类型:
三、内联接
内连接也叫自然连接,它是组合两个表的常用方法。自然连接将两个表中的列进行比较,将两个表中满足连接条件的行组合起来,作为结果。自然连接有两种形式的语法。
语法一:
SELECT 列 FROM 表1 [insert] JION 表2 ON 表1列=表2列
语法二:
SELECT 列 FROM 表1,表2 WHERE表1列=表2列
例从titles、authors和titleauthor表中查询书的书号、书名、作者号和作者名。
select titlestitle_id, title, authorsau_id, au_lname from titles join titleauthor on titlestitle_id=titleauthortitle_id join authors on authorsau_id=titleauthorau_id
四、外连接(Outer join)
在自然连接中,只有在两个表中匹配的行才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。
外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。
五、外连接(Outer join)语法
左外连接的语法为: SELECT 列 FROM 表1 LEFT [OUTER]JOIN 表2 ON 表1列1=表2列2
右外连接的语法为: SELECT select_list FROM 表1 RIGHT[OUTER]JOIN 表2 ON 表1列1=表2列2
全外连接(完整外部联接)的语法为: SELECT select_list FROM 表1 FULL[OUTER] JOIN 表2 ON 表1列1=表2列2
六、左向外联接
包括第一个命名表(“左”表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。
例35下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名: Use pubs SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles LEFT OUTER JOIN publishers ON titlespub_id = publisherspub_id
七、右向外联接
包括第二个命名表(“右”表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。
例36在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。
SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles RIGHT OUTER JOIN publishers ON titlespub_id = publisherspub_id
八、完整外部联接
包括所有联接表中的所有行,不论它们是否匹配。
例37 titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles FULL OUTER JOIN publishers ON titlespub_id = publisherspub_id
九、交叉联接
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
例39 阅读以下程序:
USE pubs
SELECT au_fname, au_lname, pub_name FROM authors CROSS JOIN publishers ORDER BY au_lname DESC
说明:结果集包含 184 行(authors 有 23 行,publishers 有 8 行;23 乘以 8 等于 184)。 不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。
表与表之间是通过主外键链接的
可以通过‘数据库关系图’进行链接
将要连接的表选中,然后用鼠标拖动
列
例如
定义表Student、Course和SC之间的关系图。
要求:先要定义好三个表的主键SNO、CNO、(SNO,CNO)
(1) 展开数据库“学生管理”节点,在“数据库关系图”上击右键,选择“新建数据库关系图”命令,d出新建数据库关系图向导,选择要添加到关系图中的表Student、Course和SC,这三个表将出现在新关系图窗口中。每个表显示包含的属性和定义的主键,拖动标题栏可以改变它们在窗口中的位置。
(2) 将Student表的属性SNO拖动到SC表的SNO上,松开鼠标d出“创建关系”窗口,设置后单击“确定”按钮。在Student表和SC表之间会自动出现一条连线,说明创建关系成功。同样的方法可以创建Course表和SC表之间的关系。
(3) 单击关闭按钮保存。
(4) 试着修改或删除Student、Course和SC表中的数据,看看定义关系后有何作用。
内连接又分为等值连接、自然连接和不等连接三种。 \x0d\\x0d\外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。 \x0d\\x0d\交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 \x0d\\x0d\连接 *** 作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。 \x0d\\x0d\无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如: \x0d\\x0d\SELECT p1pub_id,p2pub_id,p1pr_info \x0d\FROM pub_info AS p1 INNER JOIN pub_info AS p2 \x0d\ON DATALENGTH(p1pr_info)=DATALENGTH(p2pr_info) \x0d\\x0d\(一) 内连接 \x0d\\x0d\内连接查询 *** 作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种: \x0d\\x0d\1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 \x0d\\x0d\2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、、!& lt;和。 \x0d\\x0d\3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 \x0d\\x0d\例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社: \x0d\\x0d\SELECT \x0d\FROM authors AS a INNER JOIN publishers AS p \x0d\ON acity=pcity \x0d\\x0d\又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state): \x0d\\x0d\SELECT a,ppub_id,ppub_name,pcountry \x0d\FROM authors AS a INNER JOIN publishers AS p \x0d\ON acity=pcity \x0d\\x0d\(二) 外连接 \x0d\\x0d\内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 \x0d\\x0d\如下面使用左外连接将论坛内容和作者信息连接起来: \x0d\\x0d\SELECT a,b FROM luntan LEFT JOIN usertable as b \x0d\ON ausername=busername \x0d\\x0d\下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市: \x0d\\x0d\SELECT a,b \x0d\FROM city as a FULL OUTER JOIN user as b \x0d\ON ausername=busername \x0d\\x0d\(三) 交叉连接 \x0d\\x0d\交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 \x0d\\x0d\例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于68=48 行。 \x0d\\x0d\SELECT type,pub_name \x0d\FROM titles CROSS JOIN publishers \x0d\ORDER BY type \x0d\\x0d\介绍了表连接,更确切的说是inner joins内连接. \x0d\内连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。 \x0d\为更好的理解这个概念,我们介绍两个表作演示。苏格兰议会中的政党表(party)和议员表 (msp)。 \x0d\\x0d\party(Code,Name,Leader) \x0d\Code: 政党代码 \x0d\Name: 政党名称 \x0d\Leader: 政党领袖 \x0d\\x0d\msp(Name,Party,Constituency) \x0d\Name: 议员名 \x0d\Party: 议员所在政党代码 \x0d\Constituency: 选区
select f_ConsumerNO as '用户编号',f_WorkNO as '工号',f_ConsumerName as '姓名',t_b_Consumerf_ConsumerID as 'ID'
from t_b_Consumer
LEFT JOIN t_b_IDCard
ON t_b_Consumerf_ConsumerID = t_b_IDCardf_ConsumerID
这样就好了呀
以上就是关于SQL Server中内连接和外连接的区别全部的内容,包括:SQL Server中内连接和外连接的区别、数据库 外连接的意思最好举例、mysql数据库表之间是怎么关联的请详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)