龙空技术网

聊一聊SQL Server中Join(连接)

笨笨猿 178

前言:

当前小伙伴们对“sqlserver左连接和右连接”大概比较关切,看官们都想要学习一些“sqlserver左连接和右连接”的相关资讯。那么小编在网络上网罗了一些有关“sqlserver左连接和右连接””的相关文章,希望大家能喜欢,朋友们快快来了解一下吧!

在本文中,我将通过实例解释Join和Join的类型。 在这里,我们将使用SQL Server 2017,或者您可以使用SQL Server 2008或更高版本。

介绍

Join用于从数据库的两个或多个相关表中获取/检索数据。通常,表通过外键约束相互关联。

Join的类型

在SQL Server中有四种连接类型。

Inner Join(内连接)Outer Join(外连接)Cross Join(交叉连接)Self Join(自连接)

同样,Outer Join(外连接)分为三种类型。

左连接(Left Join)或左外连接(Left Outer Join)右连接(Right Join)或右外连接(Right Outer Join)完全连接(Full Join)或完全外连接(Full Outer Join)

现在,我将通过示例解释不同类型的连接以及它们之间的区别。

先决条件

推荐SQL Server 2017,也可以使用SQL Server 2008或更高版本。

现在,首先我们将创建一个数据库和两个表来应用连接以便于理解。

创建数据库和两个表

步骤1 - 创建一个数据库

打开SQL服务器并使用下面的脚本创建“chittadb”数据库。

Create database chittadb

现在,选择脚本查询,然后按F5或单击Execute按钮来执行上面的脚本。

您应该会看到一条消息,“命令成功完成”,这意味着您的新数据库已经创建。

步骤2 - 创建第一个表

打开SQL服务器并使用以下脚本创建表“tbl_Department”。

create table tbl_Department  (     DeptId int primary key not null identity(1,1),     DeptName nvarchar(50),     DeptHead nvarchar(50),     Location nvarchar(100)  ) 

执行上面的查询来创建“bl_Department”。

您应该会看到一条消息,“命令成功完成”。

现在,数据被插入到表中。

Insert into tbl_Department values ( 'IT', 'Chitta', 'Chennai')  Insert into tbl_Department values ( 'Payroll', 'Akhil', 'Odisha')  Insert into tbl_Department values ( 'HR', 'Ram', 'Pune')  Insert into tbl_Department values ( 'Timesheet', 'Kannan', 'chennai')  

执行上面的查询,您应该会看到一条消息,“命令成功完成”。

现在从“tbl_Department”表检索所有数据。

select * from tbl_Department 

输出

步骤3 - 创建第二个表

打开SQL服务器并使用以下脚本创建表“tbl_Employee”。

Create table tbl_Employee  (       EmpID int primary key not null identity(1,1),       Name nvarchar(50),       Gender nvarchar(50),       country nvarchar(20),       Salary int,       DepartmentId int foreign key references tbl_Department(DeptId)  )  

执行上面的查询来创建“tbl_Employee”。

您应该会看到一条消息,“命令成功完成”。

现在,数据被插入到表中。

Insert into tbl_Employee values ( 'Jitu', 'Male','India',4000, 1)  Insert into tbl_Employee values ( 'Rani', 'Female','India', 5000, 3)  Insert into tbl_Employee values ( 'Rohit', 'Male','India', 5500, 1)  Insert into tbl_Employee values ( 'Dibas', 'Male','India', 6500, 2)  Insert into tbl_Employee values ( 'Gajendra', 'Male','India', 3800, 2)  Insert into tbl_Employee values ( 'Raja', 'Male','India', 9000, 1)  Insert into tbl_Employee values ( 'Jeni', 'Female','India', 5800, 3)  Insert into tbl_Employee values ( 'Chandin', 'Female','India', 8500, 1)  Insert into tbl_Employee values ( 'pintu', 'Male','India', 9500, NULL)  Insert into tbl_Employee values ( 'Subrat', 'Male','India', 9800, NULL)  

执行上面的查询,您应该会看到一条消息,“命令成功完成”。

现在检索“tbl_Employee”表中的所有数据。

select * from tbl_Employee  

输出

连接的一般公式如下。

SELECT      ColumnList (whatever column you want to display)   FROM           LeftTableName   JOIN_TYPE  RightTableName   ON

INNER JOIN(内连接)

内连接只返回两个表之间匹配的行,去除了不匹配的行。

例子

编写查询从tbl_Employee和tbl_Department表检索名称、性别、国家、薪水和部门。

INNER JOIN内连接查询

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  INNER JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId 

或者

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee   JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId  

请注意

Join和Inner Join是一样的,但一般习惯性使用Inner Join。

或者

select emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName       from tbl_Employee emp       inner join tbl_Department dept      on emp.DepartmentId=dept.DeptId 

输出

LEFT JOIN(左连接)或LEFT OUTER JOIN(左外连接)

Left Join或Left Outer Join只返回两个表之间匹配的行,加上左表中不匹配的行。

例子

编写查询从tbl_Employee和tbl_Department表检索名称、性别、国家、薪水和部门。

左连接或左外连接查询

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  LEFT OUTER JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId 

或者

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  LEFT JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId 

请注意

可以使用左连接或左外连接,OUTER关键字是可选的。

或者

select emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName       from tbl_Employee emp       LEFT JOIN tbl_Department dept      on emp.DepartmentId=dept.DeptId  

Right Join(右连接)或Right Outer Join(右外连接)

右连接或右外连接只返回两个表之间匹配的行,加上右表中不匹配的行。

例子

编写查询从tbl_Employee和tbl_Department表检索名称、性别、国家、薪水和部门。

右连接或右外连接查询

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  RIGHT JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId

或者

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  RIGHT OUTER JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId  

请注意

可以使用右连接或右外连接,OUTER关键字是可选的。

或者

select emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName       from tbl_Employee emp       RIGHT JOIN tbl_Department dept      on emp.DepartmentId=dept.DeptId  

输出

Full Join(完全连接)或Full Outer Join(完全外连接)

完全连接或完全外部连接返回两个表(左表和右表)中的所有行,包括两个表中不匹配的行。

例子

编写查询从tbl_Employee和tbl_Department表检索名称、性别、国家、薪水和部门。

完全连接或完全外部连接查询

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  FULL OUTER JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId

或者

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  FULL JOIN tbl_Department  ON tbl_Employee.DepartmentId = tbl_Department.DeptId

请注意

可以使用完全连接或完全外连接。OUTER关键字是可选的。

或者

select emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName       from tbl_Employee emp       FULL JOIN tbl_Department dept      on emp.DepartmentId=dept.DeptId 

输出

Cross Join(交叉连接)

交叉连接,产生两个表的笛卡尔积。

例如,在tbl_Employee表中有10行,在tbl_Department表中有4行。因此,这两个表之间的交叉连接将产生40行。交叉连接不应该有ON子句。

例子

编写一个查询,从tbl_Employee和tbl_Department表检索名称、性别、国家、薪水和部门。

交叉连接查询

SELECT Name, Gender,country, Salary, DeptName   FROM tbl_Employee  CROSS JOIN tbl_Department  

或者

select emp.Name,emp.Gender,emp.country,emp.Salary,dept.DeptName       from tbl_Employee emp       cross JOIN tbl_Department dept  

输出

Self Join(自连接)

一张表自己和自己连接起来查询数据

请注意

使用自连接的时候必须给表起别名

select * from tbl_Employee,tbl_Employee  --errorSELECT * FROM tbl_Employee te1, tbl_Employee te2 --success

结论

在本文中,我通过示例解释了SQL Server中的Join连接操作,希望这篇文章能帮助您很好地理解这个主题。

标签: #sqlserver左连接和右连接