sql的 几种join 用法,和区别

本文详细介绍了SQL中的不同连接类型,包括交叉连接、自连接、内连接及外连接(如左连接、右连接和全连接)。通过具体的MySQL示例,展示了如何使用这些连接来检索来自多个表的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)连接
select * from table1,table2
等价于
select * from table1 cross join table2

eg:mysql数据库

 CREATE TABLE Articles (
   ArticleID SMALLINT NOT NULL PRIMARY KEY,
   ArticleTitle VARCHAR(60NOT NULL,
   Copyright YEAR NOT NULL
)
ENGINE=INNODB;


INSERT INTO Articles VALUES (12786'How write a paper', 1934),
                            (13331'Publish a paper', 1919),
                            (14356'Sell a paper', 1966),
                            (15729'Buy a paper', 1932),
                            (16284'Conferences', 1996),
                            (17695'Journal', 1980),
                            (19264'Information', 1992),
                            (19354'AI', 1993);


CREATE TABLE Authors (
   AuthID SMALLINT NOT NULL PRIMARY KEY,
   AuthorFirstName VARCHAR(20),
   AuthorMiddleName VARCHAR(20),
   AuthorLastName VARCHAR(20)
)
ENGINE=INNODB;


INSERT INTO Authors VALUES (1006'Henry', 'S.', 'Thompson'),
                           (1007'Jason', 'Carol', 'Oak'),
                           (1008'James', NULL, 'Elk'),
                           (1009'Tom', 'M''Ride'),
                           (1010'Jack', 'K''Ken'),
                           (1011'Mary', 'G.', 'Lee'),
                           (1012'Annie', NULL, 'Peng'),
                           (1013'Alan', NULL, 'Wang'),
                           (1014'Nelson', NULL, 'Yin');


CREATE TABLE AuthorArticle (
   AuthID SMALLINT NOT NULL,
   ArticleID SMALLINT NOT NULL,
   PRIMARY KEY (AuthID, ArticleID),
   FOREIGN KEY (AuthIDREFERENCES Authors (AuthID),
   FOREIGN KEY (ArticleIDREFERENCES Articles (ArticleID)
)
ENGINE=INNODB;


INSERT INTO AuthorArticle VALUES (100614356)
                              (100815729)
                              (100912786)
                              (101017695),
                              (101115729)
                              (101219264)
                              (101219354)
                              (101416284);
SELECT ArticleTitle, AuthID FROM Articles CROSS JOIN AuthorArticle;  //CROSS JOIN 跟JOIN结果集一样

这句相当于SELECT ArticleTitle, AuthID FROM Articles  AuthorArticle;


(2)自连接

    SELECT p1.authid ,p1.articleid ,p2.authid,p2.articleid
      from AuthorArticle as p1 ,AuthorArticle as p2
      where p1.authid = p2.authid and p1.articleid ='19264' and p2.articleid = '19354';

--------+-----------+--------+
 authid | articleid | authid |articleid
--------+-----------+--------+
   1012 |     19264 |   1012 | 19354
--------+-----------+--------+
 row in set (0.00 sec)


(3) 内连接

select p1.authorfirstname, p1.AuthorMiddleName ,p1.AuthorLastName, p2.articleid
    from authors as p1
    inner join authorarticle as p2 on p1.authid = p2.authid;

inner join '表名' on 条件 --连接多个表
它等价于: select p1.authorfirstname, p1.AuthorMiddleName ,p1.AuthorLastName, p2.articleid
    from authors as p1 , authorarticle as p2
    where p1.authid = p2.authid;


(4)外连接:(outer join)
允许限制一张表中的行,而不限制另外一张表中的行。
注意:外连接不一定非要有外键约束
1: left outer join --不能用left out join
左表中的记录全部会出现在结果集中,匹配不上的显示NULL

mysql> SELECT ArticleTitle, Copyright, AuthID
    -> FROM Articles AS b LEFT JOIN AuthorArticle AS ab
    ->    ON b.ArticleID=ab.ArticleID
    -> ORDER BY ArticleTitle;
+-------------------+-----------+--------+
| ArticleTitle      | Copyright | AuthID |
+-------------------+-----------+--------+
| AI                |      1993 |   1012 |
| Buy a paper       |      1932 |   1008 |
| Buy a paper       |      1932 |   1011 |
| Conferences       |      1996 |   1014 |
| How write a paper |      1934 |   1009 |
| Information       |      1992 |   1012 |
| Journal           |      1980 |   1010 |
| Publish a paper   |      1919 |   NULL |  //显示b表和ab表里ID相同的记录,但还显示b里有但ab里没有的记录 right join则相反| Sell a paper      |      1966 |   1006 |
+-------------------+-----------+--------+
2: right outer join
右表中的记录全部会出现在结果集中,匹配不上的显示NULL

mysql> SELECT ArticleTitle, Copyright, CONCAT_WS(' ', AuthorFirstName, AuthorMiddleName, AuthorLastName) AS Author
    -> FROM Articles AS b RIGHT JOIN AuthorArticle AS ab ON b.ArticleID=ab.ArticleID
    ->    RIGHT JOIN Authors AS a ON ab.AuthID=a.AuthID
    -> ORDER BY ArticleTitle;
+-------------------+-----------+-------------------+
| ArticleTitle      | Copyright | Author            |
+-------------------+-----------+-------------------+
| NULL              |      NULL | Alan Wang         |
| NULL              |      NULL | Jason Carol Oak   |
| AI                |      1993 | Annie Peng        |
| Buy a paper       |      1932 | James Elk         |
| Buy a paper       |      1932 | Mary G. Lee       |
| Conferences       |      1996 | Nelson Yin        |
| How write a paper |      1934 | Tom M Ride        |
| Information       |      1992 | Annie Peng        |
| Journal           |      1980 | Jack K Ken        |
| Sell a paper      |      1966 | Henry S. Thompson |
+-------------------+-----------+-------------------+

3: full outer join|full join --不能用full out join
返回两个表中的匹配和不匹配的所有记录。

 

<think>首先,用户的问题是关于SQL中不同JOIN类型的区别JOIN、INNER JOIN、LEFT JOIN、RIGHT JOIN区别。系统指令要求我使用中文回答,并遵循特定的格式规则。 关键点: - 行内数学表达式必须用$...$格式,但在这个上下文中,可能没有数学表达式,所以我不需要担心。 - 独立公式必须用$$...$$格式并单独成段,但同样,SQL查询可能不需要这个。 - LaTeX语法正确:确保任何数学或技术表达正确。 - 使用中文回答:整个响应必须用中文。 - 生成相关问题:在回答结束后,添加一个"相关问题"部分。 - 引用段落末尾添加引用标识:如[^1],参考提供的引用内容。 用户提供了几个引用: - 引用[1]:解释了INNER JOIN、LEFT JOIN、RIGHT JOIN区别,包括返回不同、数量不同、记录属性不同。 - 引用[2]:关于LEFT JOIN、RIGHT JOIN、INNER JOIN的原理语法。 - 引用[3]:列出了JOIN类型:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN。 - 引用[4]:INNER JOINLEFT JOIN区别用法。 - 引用[5]:INNER JOIN、LEFT JOIN、RIGHT JOIN的使用方法。 用户的问题是:理解SQL中不同JOIN类型的区别,具体是JOIN、INNER JOIN、LEFT JOIN、RIGHT JOIN区别。 注意:JOIN通常等同于INNER JOIN。在SQL中,"JOIN"默认是INNER JOIN,除非指定其他类型。 结构化我的回答: 1. **介绍**:简要解释JOIN的概念。 2. **详细区别**: - INNER JOIN(或JOIN):只返回匹配的行。 - LEFT JOIN:返回左表的所有行,加上匹配的右表行;如果没有匹配,右表部分为NULL。 - RIGHT JOIN:返回右表的所有行,加上匹配的左表行;如果没有匹配,左表部分为NULL。 - 注意:JOIN通常指INNER JOIN。 3. **使用示例**:提供简单的SQL示例来阐明。 4. **总结**:强调关键区别。 5. **相关问题**:生成相关问题。 系统指令说:"回答中引用的段落末尾自然地添加引用标识"。所以,当我引用信息时,需要在末尾添加如[^1]。 参考提供的引用: - 引用[1]详细描述了区别。 - 其他引用提供了额外背景。 在我的回答中,我应该基于这些引用构建内容,但用自己的话表达,确保清晰。 最终,添加"相关问题"部分。 响应结构: - 用中文写。 - 清晰、逐步解释。 - 在适当的地方添加引用。 - 结束时生成相关问题。 相关问题示例: - 如何选择在查询中使用哪种JOIN类型? - FULL JOIN是什么?它与LEFT JOINRIGHT JOIN有何不同? - 在优化查询时,JOIN类型如何影响性能? - JOIN操作在数据库设计中的重要性是什么? 确保回答真实可靠,基于标准SQL知识。</think>### SQLJOIN类型的区别详解 在SQL中,JOIN操作用于连接两个或多个数据库表,基于它们之间的共同列(如主键外键)来组合数据。常见的JOIN类型包括JOIN(通常等同于INNER JOIN)、INNER JOIN、LEFT JOINRIGHT JOIN。它们的核心区别在于如何处理匹配不匹配的行。下面我将逐步解释这些区别,使用简单示例关键点来澄清概念。所有解释基于标准SQL语法,并参考了权威资料[^1][^2][^3]。 #### 1. **JOIN INNER JOIN(内连接)** - **定义返回结果**:JOINSQL中通常默认为 INNER JOIN。它只返回两个表中匹配条件相等的行。如果某行在左表或右表中没有匹配项,该行将被完全排除。 - **数量变化**:结果集的行数小于或等于左表右表中的记录数,具体取决于匹配的行数。 - **记录属性**:不匹配的行会被直接舍弃,不会出现在结果中。 - **示例**:假设有两个表:`Employees`(雇员表)`Departments`(部门表)。以下查询只返回有部门分配的雇员信息。 ```sql SELECT Employees.Name, Departments.DeptName FROM Employees INNER JOIN Departments ON Employees.DeptID = Departments.DeptID; -- 或者简写为 JOIN SELECT Employees.Name, Departments.DeptName FROM Employees JOIN Departments ON Employees.DeptID = Departments.DeptID; ``` 这里,如果一个雇员没有分配到部门(`DeptID`不匹配),该雇员不会出现在结果中[^1][^4]。 #### 2. **LEFT JOIN(左连接)** - **定义返回结果**:返回左表(`FROM`子句中的表)的所有行,以及右表中匹配的行。如果右表没有匹配项,则右表部分用NULL填充。 - **数量变化**:结果集的行数等于左表的记录数,因为左表所有行都被保留。 - **记录属性**:右表不足的属性用NULL值填充,确保左表数据完整。 - **示例**:查询所有雇员信息,包括那些没有分配到部门的雇员。 ```sql SELECT Employees.Name, Departments.DeptName FROM Employees LEFT JOIN Departments ON Employees.DeptID = Departments.DeptID; ``` 如果某个雇员没有部门,`DeptName`将显示为NULL[^1][^2][^5]。 #### 3. **RIGHT JOIN(右连接)** - **定义返回结果**:返回右表(`JOIN`子句中的表)的所有行,以及左表中匹配的行。如果左表没有匹配项,则左表部分用NULL填充。 - **数量变化**:结果集的行数等于右表的记录数,因为右表所有行都被保留。 - **记录属性**:左表不足的属性用NULL值填充,确保右表数据完整。 - **示例**:查询所有部门信息,包括那些没有雇员的部门。 ```sql SELECT Employees.Name, Departments.DeptName FROM Employees RIGHT JOIN Departments ON Employees.DeptID = Departments.DeptID; ``` 如果某个部门没有雇员,`Name`将显示为NULL[^1][^3]。 #### 4. **关键区别总结** - **JOIN vs. INNER JOIN**:在SQL中,`JOIN` 是 `INNER JOIN` 的简写形式,两者功能完全相同,都只返回匹配的行[^1][^4]。 - **LEFT JOIN vs. RIGHT JOIN**:LEFT JOIN 优先保留左表数据,RIGHT JOIN 优先保留右表数据;两者在不对称匹配时用NULL填充。实际中,LEFT JOIN 更常用,因为RIGHT JOIN 可以通过调整表顺序用LEFT JOIN 实现[^2][^5]。 - **何时使用**: - 用 INNER JOIN 当只需要精确匹配的数据(如统计有效记录)。 - 用 LEFT JOIN 当需要包含左表所有记录,即使右表无匹配(如列出所有雇员包括未分配部门的)。 - 用 RIGHT JOIN 当需要包含右表所有记录(较少用,通常用LEFT JOIN替代)。 - **性能注意**:INNER JOIN 通常更快,因为它处理的数据量较小;LEFT JOIN RIGHT JOIN 可能更慢,因为涉及NULL处理全表扫描[^3][^5]。 通过以上解释,您可以更清晰地选择适合场景的JOIN类型。记住,JOIN操作的核心是表之间的关系匹配条件,正确使用能显著提升查询效率[^1][^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值