`

MySQL Join详解

阅读更多
MySQL Join详解
  发表日期:2005-09-05 作者:DennisLan[转贴] 出处:CSDN  
 

 

  还是先 Create table 吧

  create table emp(
  id int not null primary key,
  name varchar(10)
  );

  create table emp_dept(
  dept_id varchar(4) not null,
  emp_id int not null,
  emp_name varchar(10),
  primary key (dept_id,emp_id));

  insert into emp() values
  (1,"Dennis-1"),
  (2,"Dennis-2"),
  (3,"Dennis-3"),
  (4,"Dennis-4"),
  (5,"Dennis-5"),
  (6,"Dennis-6"),
  (7,"Dennis-7"),
  (8,"Dennis-8"),
  (9,"Dennis-9"),
  (10,"Dennis-10");

  insert into emp_dept() values
  ("R&D",1,"Dennis-1"),
  ("DEv",2,"Dennis-2"),
  ("R&D",3,"Dennis-3"),
  ("Test",4,"Dennis-4"),
  ("Test",5,"Dennis-5");
  >> left join
  -------------
  select a.id,a.name,b.dept_id
  from emp a left join emp_dept b on (a.id=b.emp_id);

  # 挑出左边的 table emp 中的所有资料,即使 emp_dept 中没有的资料也挑出来,没有的就用 NULL   来显示,
  # 也即显示资料是以左边的 table emp 中的资料为基础

  mysql> select a.id,a.name,b.dept_id
  -> from emp a left join emp_dept b on (a.id=b.emp_id);
  +----+-----------+---------+
  | id | name      | dept_id |
  +----+-----------+---------+
  |  1 | Dennis-1  | R&D     |
  |  2 | Dennis-2  | DEv     |
  |  3 | Dennis-3  | R&D     |
  |  4 | Dennis-4  | Test    |
  |  5 | Dennis-5  | Test    |
  |  6 | Dennis-6  | NULL    |
  |  7 | Dennis-7  | NULL    |
  |  8 | Dennis-8  | NULL    |
  |  9 | Dennis-9  | NULL    |
  | 10 | Dennis-10 | NULL    |
  +----+-----------+---------+
  # 挑出 table emp 中有而 table emp_dept 中没有的人员资料
  select a.id,a.name,b.dept_id
  from emp a left join emp_dept b on (a.id=b.emp_id)
  where b.dept_id IS NULL;

  mysql> select a.id,a.name,b.dept_id
  -> from emp a left join emp_dept b on (a.id=b.emp_id)
  -> where b.dept_id IS NULL;
  +----+-----------+---------+
  | id | name      | dept_id |
  +----+-----------+---------+
  |  6 | Dennis-6  | NULL    |
  |  7 | Dennis-7  | NULL    |
  |  8 | Dennis-8  | NULL    |
  |  9 | Dennis-9  | NULL    |
  | 10 | Dennis-10 | NULL    |
  +----+-----------+---------+

  # 把 table emp_dept 放在左边的情形(当然以 emp_dept 中的数据为基础来显示资料,emp 中比emp_dept 中多的资料也就不会显示出来了):

  select a.id,a.name,b.dept_id
  from emp_dept b left join emp a on (a.id=b.emp_id);
  mysql> select a.id,a.name,b.dept_id
  -> from emp_dept b left join emp a on (a.id=b.emp_id);
  +------+----------+---------+
  | id   | name     | dept_id |
  +------+----------+---------+
  |    2 | Dennis-2 | DEv     |
  |    1 | Dennis-1 | R&D     |
  |    3 | Dennis-3 | R&D     |
  |    4 | Dennis-4 | Test    |
  |    5 | Dennis-5 | Test    |
  +------+----------+---------+

  >> right join
  ---------------
  select a.id,a.name,b.dept_id
  from emp a right join emp_dept b on (a.id=b.emp_id);
  # 挑资料时以右边 table emp_dept 中的资料为基础来显示资料

  mysql> select a.id,a.name,b.dept_id
  -> from emp a right join emp_dept b on (a.id=b.emp_id);

  +------+----------+---------+
  | id   | name     | dept_id |
  +------+----------+---------+
  |    2 | Dennis-2 | DEv     |
  |    1 | Dennis-1 | R&D     |
  |    3 | Dennis-3 | R&D     |
  |    4 | Dennis-4 | Test    |
  |    5 | Dennis-5 | Test    |
  +------+----------+---------+
  5 rows in set (0.00 sec)

  # 我们再把 table 的位置交换一下,再用 right join 试试

  select a.id,a.name,b.dept_id
  from emp_dept b right join emp a on (a.id=b.emp_id);

  mysql> select a.id,a.name,b.dept_id
  -> from emp_dept b right join emp a on (a.id=b.emp_id);
  +----+-----------+---------+
  | id | name      | dept_id |
  +----+-----------+---------+
  |  1 | Dennis-1  | R&D     |
  |  2 | Dennis-2  | DEv     |
  |  3 | Dennis-3  | R&D     |
  |  4 | Dennis-4  | Test    |
  |  5 | Dennis-5  | Test    |
  |  6 | Dennis-6  | NULL    |
  |  7 | Dennis-7  | NULL    |
  |  8 | Dennis-8  | NULL    |
  |  9 | Dennis-9  | NULL    |
  | 10 | Dennis-10 | NULL    |
  +----+-----------+---------+

  # 是不是和 left join 一样了?

  >> direct join
  --------------
  # 如果用right join 同不用 Join 直接挑资料是相同的,它等介於以下的指令

  select a.id,a.name,b.dept_id
  from emp a ,emp_dept b
  where a.id=b.emp_id;

  mysql> select a.id,a.name,b.dept_id
  -> from emp a ,emp_dept b
  -> where a.id=b.emp_id;
  +----+----------+---------+
  | id | name     | dept_id |
  +----+----------+---------+
  |  2 | Dennis-2 | DEv     |
  |  1 | Dennis-1 | R&D     |
  |  3 | Dennis-3 | R&D     |
  |  4 | Dennis-4 | Test    |
  |  5 | Dennis-5 | Test    |
  +----+----------+---------+

  怎样,弄明白了吗?

  Enjoy it!

分享到:
评论

相关推荐

    Mysql之innerjoin,leftjoin,rightjoin详解.pdf

    Mysql 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...

    MySQL中的JOIN详解及sql实战

    ### MySQL中的JOIN详解及SQL实战 #### 一、引言 在关系型数据库管理系统(RDBMS)中,数据往往分布在多个表中。为了获取所需的信息,常常需要将这些表组合起来,这时就会用到JOIN操作。JOIN是SQL语言中非常重要的...

    mysql 参考手册(详解关键字的功能和涉及到的问题)

    在“详解关键字的功能”部分,手册会详细解释每个关键字的作用、语法、参数以及使用时的注意事项。比如,"JOIN"关键字用于将两个或更多表的数据结合在一起,根据指定的条件进行匹配。有多种类型的JOIN,如INNER JOIN...

    mysql技术详解

    更高级的用法涉及JOIN(连接表)、GROUP BY(分组数据)和HAVING(过滤分组结果)。 4. **数据库设计** 正确的数据库设计是系统性能的关键。概念数据模型(ER图)、逻辑数据模型和物理数据模型都是设计过程的一...

    全套Mysql技术详解

    本套MySQL技术详解涵盖了从基础到高级的各种知识点,旨在帮助读者全面理解和掌握MySQL的使用。 首先,我们要从安装和配置MySQL开始。安装过程通常包括下载适合你操作系统的MySQL安装包,然后按照向导进行安装。配置...

    mysql入门详解精要

    4. JOIN操作:连接多个表,`SELECT * FROM table1 JOIN table2 ON table1.column = table2.column;` 5. GROUP BY与聚合函数:用于分组数据和计算统计值,如`SELECT column1, COUNT(*) FROM table_name GROUP BY ...

    mysql所有的查询语句详解

    4. **FULL OUTER JOIN**:返回两个表中所有匹配和不匹配的行(MySQL不支持,但可以使用UNION实现类似效果)。 三、聚合函数 MySQL提供了多种聚合函数,用于对一组值进行计算: 1. **COUNT()**:计算非NULL值的...

    深入理解mysql之left join 使用详解

    关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 ...

    mysql explain详解

    3. **优化连接类型**:尽量使连接类型从`ALL`到`eq_ref`,避免`Using where`和`Using join buffer`。 4. **避免子查询优化**:尽可能将子查询转换为连接查询,或者使用EXISTS替代IN。 5. **合理使用函数和计算**:...

    MySql从零开始学-必知必会

    1. JOIN操作:学习INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,合并多表数据。 2. 聚合函数:COUNT、SUM、AVG、MAX、MIN的使用,以及GROUP BY和HAVING子句进行分组与过滤。 3. 子查询:理解嵌套查询,使用子查询...

    MYSQL执行计划详解.pdf

    - `eq_ref`类型用于join查询中,通过主键或非空唯一索引来连接表,并且要求表间是一对一的关系。 - `ref`类型用于通过非唯一索引来查找多行记录的情况。 ### 执行计划的Extra - `Extra`列包含执行查询时的额外信息...

    mysql服务性能优化my_cnf配置说明详解16G内存[参考].pdf

    MySQL 服务性能优化 My.cnf 配置说明详解(16G 内存) MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf ...

    Mysql中Join的使用实例详解

    本章节我们将向大家介绍如何使用MySQL 的 JOIN 在两个或多个表中查询数据。对mysql中的join感兴趣的朋友一起学习吧

    mysql基础知识详解,完整ppt

    这份"mysql基础知识详解,完整ppt"提供了全面的学习资源,帮助初学者和教学者快速掌握MySQL的核心概念。以下是对这份PPT中可能涵盖的知识点的详细解读: 1. **MySQL简介**:MySQL是一个开源、免费的数据库系统,它...

    MySQL安装 配置 详解

    ### MySQL安装与配置详解 #### 一、MySQL简介与重要性 MySQL自1996年起,从一个简单的SQL工具发展成为全球最受欢迎的开源数据库之一。它被广泛应用于互联网网站、搜索引擎、数据仓库以及各类任务关键型软件和系统...

    mysql配置详解及设置建议.pdf

    `join_buffer_size=n`:JOIN操作的缓冲区大小,影响JOIN查询的速度。 配置MySQL时,需要根据实际需求和服务器资源来调整这些参数,以达到最佳的性能和安全性。每个选项都有其特定的作用和场景,合理的配置能显著...

    PHP5与MYSQL5 web开发技术详解 第五章

    在“PHP5与MYSQL5 web开发技术详解 第五章”这一主题中,我们将深入探讨这两个核心技术在构建Web应用程序时的协同工作方式。PHP5作为服务器端脚本语言,与MySQL5这种关系型数据库管理系统(RDBMS)的结合,为开发者...

Global site tag (gtag.js) - Google Analytics