聊一聊SQL Server中Join(连接)[亲测有效]

(22) 2023-07-16 10:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说聊一聊SQL Server中Join(连接)[亲测有效],希望能够帮助你!!!。

在本文中,我将通过实例解释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 

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第1张

步骤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  

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第2张

连接的一般公式如下。

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

INNER JOIN(内连接)

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

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第3张

例子

编写查询从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 

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第4张

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

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

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第5张

例子

编写查询从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  
聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第6张

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

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

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第7张

例子

编写查询从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  

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第8张

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

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

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第9张

例子

编写查询从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 

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第10张

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  

输出

聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第11张

Self Join(自连接)

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

请注意

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

select * from tbl_Employee,tbl_Employee  --error
SELECT * FROM tbl_Employee te1, tbl_Employee te2 --success
聊一聊SQL Server中Join(连接)[亲测有效]_https://bianchenghao6.com/blog__第12张

结论

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

上一篇

已是最后文章

下一篇

已是最新文章

发表回复