SQL----Inner Join、 Outer Join、Cross Join理解

多表的查询,会涉及到Join操作

总结一下查询的种类和使用方法。

准备数据:

假设有两个表,学生和班级。

create table Stu (
    Stu_no varchar(10),
    Class_no nvarchar(10)
    primary key(Stu_no)
)

create table Class(
    Class_no nvarchar(10),
    Class_teacher nvarchar(10)
    primary key(Class_no)
)

insert into Stu
values (‘1‘,‘电系‘),(‘2‘,‘火系‘),(‘3‘,‘水系‘)

insert into Class
values (‘金系‘,‘皮卡丘‘),(‘草系‘,‘妙蛙种子‘),(‘水系‘,‘蚊香蝌蚪‘)

这里的数据,学生表1,2号的班级电系,火系,班级表中没有

班级表草系,金系,在学生表中也不存在

            

sql的join可以分为内连接(inner join),外连接(outer join)、交叉连接(cross join)

其中inner和outer语法中需要加on, on后为连接条件,按照这个条件来进行筛选

cross语法不需要加on

1.inner join 内连接

    看成两个表的并集,要求每个表中每一行都匹配,不匹配的行会被排除

     

    在Stu、Class两表中使用内连接,目的是取出当前有班主任的学生的信息

select *
from Stu inner join Class
on Stu.Class_no = Class.Class_no

    学生表中学生1,2分别是电系和火系的,班级表中没有这个班级,就删去1,2学生的信息

    班级表的草系和金系,在学生表中没有这样班级的学生,于是将草系,金系删除

    这样获取学生,老师信息是一一对应的

    

2.outer join 外连接

  外连接分为三大类,左连接、右连接、全链接

左(外)连接:

    看作两个表的下图连接,左表中的每一行都要存在,右表与左表不匹配的内容删去,输出中匹配不了的右表部分使用null

      

    Stu、Class做左连接,目的是选取每个学生的信息,学号,班级,老师,没有班主任的学生也要输出

select *
from Stu left join Class
on Stu.Class_no = Class.Class_no

    学生表1,2分别是电系和火系,在右表班级中没有对应的班级,使用null值代替,仍输出左表不匹配内容

    班级草系、金系在左表学生中没有匹配,删除

    

左内连接:

    看作是两个表做下图操作,在左外连接上去除了右表存在部分,只提取左表没有匹配的行

    

    Stu,Class进行左内连接,目的选取所有没有班主任的学生

select *
from Stu left join Class
on Stu.Class_no = Class.Class_no
where Class.Class_no is null

    在左连接的基础上,选择右表匹配项为null值的项,就是左表中没有匹配的项

    进行左连接后,1,2号学生没有匹配到班主任,右表内容为null,选择右表值为null的项就可以将左表未匹配项选择出来  

    

右(外)连接:

    将两表看作下图操作,右表中每一行都存在,左表与右表匹配不了的行删去,输出中匹配不了的左表部分使用null填充

    

    Stu、Class进行右连接,输出所有班级信息,没有学生也输出

select *
from Stu right join Class
on Stu.Class_no = Class.Class_no

    班级表中信息全部输出,草系,金系与左表没有匹配项,将左表内容用null进行输出

    

右内连接:

    将两表看作下图操作,在右外连接的基础上,除去左表也存在的内容,提取右表中没有匹配的行

    

    Stu、Class右内操作,输出所有没有学生的班级

select *
from Stu right join Class
on Stu.Class_no = Class.Class_no
where Stu.Class_no is null

    在右外连接的基础上,班级表草系,金系对应学生表中的信息为空,将空值输出

    

全(外)链接:

    两个表进行并集操作,对应不匹配位置使用null值替代

    

    Stu、Class进行并集操作,目的选出所有学生,班级信息

select *
from Stu full join Class
on Stu.Class_no = Class.Class_no

  

    

全内连接:

    两表进行下图操作,选出左右两表所有没有匹配的项

    

select *
from Stu full join Class
on Stu.Class_no = Class.Class_no
-- 全内连接
where Stu.Class_no is null or Class.Class_no is null 

    Stu、Class做全内连接,选出两个表中所有没有匹配的项

    

3.Cross join 交叉连接

    两个表中所有元素的排列组合,Stu表中有3个班级,Class表中有3个班级,输出值为3*3 = 9个

    cross join 不用加on

select *
from Stu cross join Class

    什么都不加,直接在from后面放两个表,也是交叉连接

select *
from Stu,Class

原文地址:https://www.cnblogs.com/xieviki650/p/SQL_JOIN.html

时间: 2024-10-03 02:05:39

SQL----Inner Join、 Outer Join、Cross Join理解的相关文章

SQL SERVER 2012 第四章 连接 JOIN の OUTER JOIN,完全连接FULL JOIN,交叉连接CROSS JOIN

SELECT <SELECT LIST> FROM <the table you want to be the "LEFT" table> <LEFT|RIGHT> [OUTER] JOIN <table you want to be the "RIGHT" table> ON <join condition> 可以看做JOIN之前的表是左表,之后的表是右表. 外部连接本质上是包含的.明确包含的记录取决于使

DB2数据库的外连接(OUTER JOIN),内连接(INNER JOIN)和交叉连接(CROSS JOIN)区别

1.交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积,返回记录的个数应当是a和b表中符合记录的和. 显式:select [cols_list] from a cross join b where [condition] 隐式:select [cols_list] from a, b where [condition] 2.内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行,和我们写普通的sql

Sql的各种连接用法(cross join、inner join、full join)

1.名词解释: 笛卡尔乘积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积,又称直积,表示X x Y ,第一个对象是X的成员,而第二个对象       是Y的所有可能有序列的其中的一个成员.假设集合A={a,b},集合B={0,1, 2},则两个笛卡尔积为{(a,0),(a,1),(a,2),         (b,0),(b,1),(b,2)} 2.原址参考:http://ashui.net/archives/2013/552.html 1> 交叉连接CROSS JOIN SELECT *

SQLSERVER表连接(INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN,CROSS JOIN,CROSS APPLY,OUTER APPLY)

1 常用表连接(inner join,left join,right join,full join,cross join) if object_id(N'table1',N'U') is not null drop table table1 if object_id(N'table2',N'U') is not null drop table table2 create table table1(id int,name varchar(20)) insert into table1 select

翻译:Gregory Larsen,2016/02/19(第一版:2014年12月17日)高级T-SQL阶梯1级:使用CROSS JOIN介绍高级T-SQL

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119933/ 原文作者:Gregory Larsen,2016/02/19(第一版:2014年12月17日) 系列 本文是"Stairway Series:Stairway to Advanced T-SQL"的一部分 这个阶梯将包含一系列文章,这些文章将在前面两个T-SQL阶梯,T-SQL DML和T-SQL超越基础知识的T-SQL基础上进行扩展. 这个楼梯应

MySQL应用之CROSS JOIN用法简介教程

目录 2. cross join用法 @ 本博客翻译自两篇博客的: http://www.mysqltutorial.org/mysql-cross-join/ https://www.w3resource.com/mysql/advance-query-in-mysql/mysql-cross-join.php 1. cross join简介 MySQL cross join是mysql中的一种连接方式,区别于内连接和外连接,对于cross join连接来说,其实使用的就是笛卡尔连接.在MyS

CROSS JOIN

原文:CROSS JOIN 最近在讲到T-SQL查询的Join部分时,一下子没有想起来CROSS JOIN的用法,因为其实平常也确实基本不用到.特意找了一个例子,以供参考 CROSS JOIN又称为笛卡尔乘积,实际上是把两个表乘起来.以下资料摘自:http://www.sqlguides.com/sql_cross_join.php SQL CROSS JOIN will return all records where each row from the first table is comb

SQL夯实基础(一):inner join、outer join和cross join的区别

一.数据构建 先建表,再说话 create database Test use Test create table A ( AID int identity(1,1) primary key, name nvarchar(50), age int ) create table B ( BID int identity(1,1) primary key, name nvarchar(50), gender int ) 创建完之后,插入数据 insert A(name,age)values('张三'

SQL中inner join、outer join和cross join的区别

摘自:http://blog.csdn.net/scythe666/article/details/51881235 缺省情况下是inner join,开发中使用的left join和right join属于outer join,另外outer join还包括full join.下面我通过图标让大家认识它们的区别. 现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的: 1.INNER JOIN 产生的结果是AB的交集 SELECT