SQL中等值连接,不等值连接,自然连接,自身连接,外连接的几种区别和不同作用

在SQL中,连接(Join)操作用于将两个或多个表中的数据行组合起来,基于一个共同的字段。以下是几种常见的连接类型及其区别和作用:

  1. 等值连接(Inner Join)

    • 作用:返回两个表中匹配的记录。
    • 语法SELECT columns FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name
    • 特点:只返回两个表中连接条件相等的行。
  2. 不等值连接

    • 这不是一个标准的SQL术语,但通常指的是使用不等于(<> 或 !=)条件的连接。
    • 作用:返回一个表中存在而另一个表中不存在匹配的记录。
    • 语法SELECT columns FROM table1 JOIN table2 ON table1.column_name <> table2.column_name
    • 特点:使用不等值条件,返回不匹配的行。
  3. 自然连接(Natural Join)

    • 作用:返回两个表中所有共有列的值相等的行。
    • 语法SELECT columns FROM table1 NATURAL JOIN table2
    • 特点:自动匹配两个表中同名的列,不需要显式指定连接条件。
  4. 自身连接(Self Join)

    • 作用:一个表与其自身进行连接。
    • 语法SELECT columns FROM table1 AS T1 JOIN table1 AS T2 ON T1.column_name = T2.column_name
    • 特点:可以用于查询表中相关联的行,例如,员工表中员工与其直接上级的关系。
  5. 外连接(Outer Join)

    • 子类型
      • 左外连接(Left Outer Join):返回左表(table1)的所有记录和右表(table2)中匹配的记录。如果右表没有匹配,结果中右表的部分将为NULL。
      • 右外连接(Right Outer Join):返回右表(table2)的所有记录和左表(table1)中匹配的记录。如果左表没有匹配,结果中左表的部分将为NULL。
      • 全外连接(Full Outer Join):返回两个表中所有匹配和不匹配的记录。如果一个表中有匹配而另一个表中没有,那么没有匹配的部分将为NULL。注意,并非所有数据库系统都支持全外连接。
    • 语法
      • 左外连接:SELECT columns FROM table1 LEFT OUTER JOIN table2 ON table1.column_name = table2.column_name
      • 右外连接:SELECT columns FROM table1 RIGHT OUTER JOIN table2 ON table1.column_name = table2.column_name
      • 全外连接:SELECT columns FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name(并非所有数据库支持)
    • 特点:外连接可以返回一个或两个表中的所有记录,即使它们在另一个表中没有匹配。
  6. 交叉连接(Cross Join)

    • 作用:返回两个表的笛卡尔积,即每个表中的每一行都与另一个表中的每一行组合。
    • 语法SELECT columns FROM table1 CROSS JOIN table2
    • 特点:返回的行数是两个表行数的乘积。

具体事例

  1. 等值连接(Inner Join)

    • 例子
      SELECT Students.Name, Courses.Name
      FROM Students
      INNER JOIN Courses ON Students.CourseID = Courses.ID;
    • 说明:这个查询将返回学生表(Students)和课程表(Courses)中 CourseID 和 ID 相等的所有记录。
  2. 不等值连接

    • 例子
      SELECT Employees.Name, Departments.Name
      FROM Employees
      JOIN Departments ON Employees.DepartmentID <> Departments.ID;
    • 说明:这个查询将返回员工表(Employees)中 DepartmentID 不等于部门表(Departments)中 ID 的所有记录。
  3. 自然连接(Natural Join)

    • 例子
      SELECT *
      FROM Employees
      NATURAL JOIN Departments;
    • 说明:这个查询将返回员工表(Employees)和部门表(Departments)中所有共有列(如 DepartmentID)相等的记录。
  4. 自身连接(Self Join)

    • 例子
      SELECT E1.Name AS Employee, E2.Name AS Manager
      FROM Employees AS E1
      JOIN Employees AS E2 ON E1.ManagerID = E2.ID;
    • 说明:这个查询将返回员工表(Employees)中每名员工及其直接上级的姓名,通过 ManagerID 和 ID 进行连接。
  5. 外连接(Outer Join)

    • 左外连接(Left Outer Join)
      SELECT Customers.Name, Orders.Total
      FROM Customers
      LEFT OUTER JOIN Orders ON Customers.ID = Orders.CustomerID;
      • 说明:这个查询将返回客户表(Customers)中的所有记录,以及订单表(Orders)中匹配的记录。如果某个客户没有订单,那么 Total 将为NULL。
    • 右外连接(Right Outer Join)
      SELECT Orders.Total, Customers.Name
      FROM Orders
      RIGHT OUTER JOIN Customers ON Orders.CustomerID = Customers.ID;
      • 说明:这个查询将返回订单表(Orders)中的所有记录,以及客户表(Customers)中匹配的记录。如果某个订单没有对应的客户,那么 Name 将为NULL。
    • 全外连接(Full Outer Join)
      SELECT Customers.Name, Orders.Total
      FROM Customers
      FULL OUTER JOIN Orders ON Customers.ID = Orders.CustomerID;
      • 说明:这个查询将返回客户表和订单表中所有记录,无论它们是否匹配。如果客户没有订单或订单没有对应的客户,相应的字段将为NULL。
  6. 交叉连接(Cross Join)

    • 例子
      SELECT A.Name, B.Name
      FROM Authors AS A
      CROSS JOIN Titles AS B;
    • 说明:这个查询将返回作者表(Authors)和标题表(Titles)的笛卡尔积,即每一行作者与每一行标题的组合。

你可能感兴趣的:(sql,数据库,mysql)