`
lindongxiao
  • 浏览: 47617 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

sql的 几种join 用法,和区别

阅读更多

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

eg:mysql数据库

 CREATE TABLE Articles (
   ArticleID SMALLINT NOT NULL PRIMARY KEY,
   ArticleTitle VARCHAR(60) NOT 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 (AuthID) REFERENCES Authors (AuthID),
   FOREIGN KEY (ArticleID) REFERENCES Articles (ArticleID)
)
ENGINE=INNODB;


INSERT INTO AuthorArticle VALUES (1006, 14356), 
                              (1008, 15729), 
                              (1009, 12786), 
                              (1010, 17695),
                              (1011, 15729), 
                              (1012, 19264), 
                              (1012, 19354), 
                              (1014, 16284);
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
返回两个表中的匹配和不匹配的所有记录。

 

分享到:
评论

相关推荐

    sql语句中join的用法

    下面我们将详细介绍几种常见的JOIN类型:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(FULL JOIN),并通过具体的例子进行说明。 #### 一、内连接(INNER JOIN) 内连接是最常用...

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

    根据不同的连接方式,`JOIN`可以分为几种类型,包括`INNER JOIN`、`OUTER JOIN`(左外联接`LEFT JOIN`、右外联接`RIGHT JOIN`以及全外联接`FULL JOIN`)和`CROSS JOIN`。每种类型的`JOIN`都有其独特的应用场景和特点。...

    hive sql + left join 数据缺失

    针对上述问题,可以通过以下几种方式进行解决: 1. **调整bucketing_version**: - 通过查询当前表的bucketing_version属性,并将其调整为与旧版本一致的设置(例如设置为1)。 - 查询示例SQL如下: ```sql ...

    oracle-join用法

    在Oracle SQL中,Join主要分为几个类型,包括INNER JOIN、LEFT JOIN (LEFT OUTER JOIN)、RIGHT JOIN (RIGHT OUTER JOIN)以及FULL JOIN (FULL OUTER JOIN)。这些类型在Java编程中同样可以使用,通过SQL查询语句来实现...

    SQL各种查询方法

    以上是SQL2000中的各种查询方法,这些基础知识对于理解和使用任何SQL数据库都是非常重要的。通过熟练掌握这些方法,你可以高效地从数据库中获取你需要的信息。在实际应用中,还可以结合存储过程、触发器、视图等高级...

    表连接 SQL JOIN 速查表

    这里我们将深入探讨几种主要的JOIN类型,包括自然JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN以及CROSS JOIN。 1. **自然JOIN (NATURAL JOIN)**: 自然JOIN是根据两个表中存在的相同列名来匹配并合并数据。在结果集中...

    SQL经典游标使用方法

    游标有几种不同的类型,包括静态、动态、键集驱动和只读/可写。静态游标在打开时加载所有数据,适合不经常更改的数据;动态游标则始终反映数据库的最新状态;键集驱动游标在内存中保存一部分键,提高效率;只读/可...

    SQL语句中不同的连接JOIN及join的用法

    通常有以下几种连接方式: JOIN or INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何一边缺失数据就不显示。 LEFT JOIN(左外连接):即使右边的表中没有匹配,也从左表返回...

    50种方法巧妙优化你的SQL Server数据库

    以下是从给定文件标题、描述、标签和部分内容中提炼出的关于“50种方法巧妙优化你的SQL Server数据库”的详细知识点: ### 1. I/O优化 - **RAID配置**:为了提高I/O性能,特别是对Tempdb数据库,建议采用RAID0配置...

    SQL 必知必会.pdf

    9.1 inner join 和 outer join 的区别 inner join 返回两个表的交集,而 outer join 返回一个表的所有行和另一个表的匹配行。 9.2 如何优化 SQL 查询 可以使用索引、优化查询语句、使用缓存等方法来优化 SQL 查询...

    SQL高级用法

    ### SQL高级用法详解 #### 一、提升SQL查询效率的方法 为了提高SQL查询的效率,我们可以采用多种高级技巧来优化...以上是几种常见的SQL高级用法示例,通过这些技巧的应用,我们可以更高效地处理复杂的数据查询任务。

    大数据课程设计-Hadoop-MapReduce实现sql的统计、groupby和join-全部源码

    通常,有几种方法来实现JOIN,包括:1) 全外连接(Full Outer Join)通常通过两次MapReduce作业完成,第一次MapReduce实现一个表的JOIN键的完整复制,第二次JOIN另一个表;2) 交叉连接(Cross Join)只需将所有键值...

    sql即查即用资料

    在IT领域,SQL(Structured Query Language)是一种用于管理和处理关系数据库的强大工具,广泛应用于数据查询、更新、插入和删除等操作。"sql即查即用资料"是一个专注于实用SQL脚本的学习资源,它包含了便于快速理解...

    SQL语句大全 电子书

    书中将阐述这两者的创建、修改和使用方法。 7. **索引与优化**:索引能显著提升查询性能,书中会介绍如何创建、管理索引,以及优化查询性能的策略。 8. **事务与并发控制**:SQL支持事务处理,确保数据的一致性和...

    SQL解析-参考文档和技术手册

    这本书会介绍SQLite的特性和使用方法,包括如何在移动设备或嵌入式系统上部署SQLite,以及其与其他大型数据库系统的异同。 通过阅读这些文档,无论是初学者还是经验丰富的开发者,都能增强对SQL的理解,提升数据库...

    sql基本知识全集

    在IT领域,SQL(Structured Query Language)是一种用于管理和处理关系数据库的强大语言,广泛应用于数据存储、查询、更新和管理。本资源"SQL基本知识全集"涵盖了SQL的基础概念和常见用法,适用于初学者和需要巩固...

    几套SQL Server试题

    SQL Server是一种广泛使用的关系型数据库管理系统,由微软公司开发,其功能强大且适应性强,广泛应用于数据存储、分析和业务处理。本压缩包文件“几套SQL Server试题”显然是为初学者设计的一系列练习题,旨在帮助...

    VFP+sql例程适合初学vfp+sql server

    VFP(Visual FoxPro)和SQL Server是两种不同的数据库管理系统,它们在数据处理和应用程序开发中都有着广泛的应用。VFP是Microsoft推出的一种基于xBase语言的数据库开发工具,以其高效、小巧著称;而SQL Server是...

    SQL经典练习题_sql练习_

    本资料包中的"SQL经典练习题.sql练习."包含了个人收藏的一系列SQL题目和案例,这些内容常常在面试中出现,对提升SQL技能和准备面试具有很高的价值。 首先,我们要了解SQL的基本概念。SQL主要包括以下几个部分: 1....

Global site tag (gtag.js) - Google Analytics