`
pjluo
  • 浏览: 61862 次
  • 来自: 浙江省浦江县
社区版块
存档分类
最新评论

MySQL联表查询扫盲

阅读更多
转自CSDN
作者:不祥
内容:left join、right join、direct join
没有提到inner join
 
------------------------------------------------------------------------------
 
还是先 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!
 

 

 原文地址 http://it.563.net/article/2004/2004-2-4/23300.html
分享到:
评论
1 楼 xiaokang1582830 2012-05-25  
没错,left join,right join这样的联表查询效率非常低,就算加了索引这些同样也是非常慢在大数据查询的条件下

相关推荐

    Mysql多表联合查询

    MySql,多表联合查询加AS语句,多余的就不说了,自己看,绝对简单!

    mysql多表查询和EXISTS查询性能对比

    ### MySQL多表查询和EXISTS查询性能对比 #### 测试环境 在进行MySQL多表查询与EXISTS查询的性能对比之前,首先需要了解测试环境的相关配置。虽然原文中并未给出具体的测试环境细节,但在实际操作中,这一步骤至关...

    mysql多表联合查询的教程

    MySQL 多表联合查询教程 在本教程中,我们将学习 MySQL 中的多表联合查询,包括多表插入和多表更新的操作。多表联合查询是指从多个表中检索数据的操作,这种操作在实际应用中非常常见。 什么是多表联合查询 多表...

    MySQL多表查询练习题原数据

    练习题答案解决思路请查看本人原文章MySQL数据库多表查询练习题

    45-MySQL单表2000万数据查询慢解决方案1

    MySQL单表2000万数据查询慢解决方案1 本文主要讨论了如何解决MySQL单表2000万数据查询慢的问题,通过将表分区和使用时间触发器来实现数据的优化。 分区设计 在解决方案中,我们使用的是按照8周将单表分为8个区,...

    mysql多表联合查询.pdf

    在给定的文件中,我们可以看到有关MySQL多表联合查询的知识点。首先,文件包含了创建和操作MySQL数据库表的SQL语句,接着是使用INSERT语句向表中插入数据的示例,最后是一些使用PHP通过MySQL扩展连接数据库进行操作...

    MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 ...

    导出 MySQL数据库表结构word设计文档,一键连接数据库,直接导出库表结构、字段解析、自动排序

    导出 MySQL数据库表结构word设计文档,一键连接数据库,直接导出库表结构、字段解析、自动排序 导出 MySQL数据库表结构word设计文档,一键连接数据库,直接导出库表结构、字段解析、自动排序 导出 MySQL数据库表结构...

    MySQL联表查询的简单示例

    下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型数据库,免不了表之间存在各种引用与关联。这些关联是通过主键与外键搭配来形成的...

    mysql多表联合查询

    mysql多表联合查询 表连接的约束条件 MySQL如何优化LEFT JOIN和RIGHT JOIN

    mysql多表查询

    主要记录描述了mysql数据中的多表查询问题,以及问题的解决办法

    mysql 树形结构查询

    mysql 树形结构查询 MySQL 树形结构查询是指使用存储过程来实现 MySQL 数据库中的树形结构查询。这种查询方式可以高效地查询树形结构的数据,并且可以根据需要设置递归深度。 MySQL 中的树形结构查询可以使用存储...

    mysql数据库全文多库多表查找,查询所有数据库中包含指定字符的数据。

    mysql数据库全文查找,查询所有数据库中包含指定字符的数据。 一、支持功能: 1、支持所有数据库查询字符串,或者指定一个或者多个数据库查询字符串; 2、支持本地使用或者指定远程数据库地址; 3、支持命令行指定...

    25.3 MySQL 多表查询

    在数据库管理中,MySQL 是一款广泛使用的开源关系型数据库管理系统,它提供了强大的...通过熟练运用各种连接类型、子查询和联合查询,你可以更有效地处理复杂的数据需求,从而在业务场景中发挥出 MySQL 的强大功能。

    mysql多表查询示例.sql

    mysql多表查询示例,假设我们有以下三个表: Employee(员工表) emp_id: 员工ID emp_name: 员工姓名 dept_id: 部门ID Department(部门表) dept_id: 部门ID dept_name: 部门名称 Salary(薪资表) emp_id: 员工...

    mysql基础知识扫盲

    本文将介绍MySQL的基础知识,包括连接MySQL服务器、SQL语句、查询、聚合操作、表连接、子查询以及联合查询。 首先,连接MySQL服务器是使用MySQL的第一步。通过CMD命令行,切换到MySQL Server的bin目录,输入`mysql ...

    mysql表结构对比

    mysql表结构对比,生成sql,直接同步mysql表结构

    mysql查询表结构.txt

    可以查询表结构,查询的表头含有:表说明、序号、字段名称、类型、长度、字段说明、索引类型和索引名称。

    MySQL面试题,扫盲学习,从零开始

    MySQL面试题扫盲学习,从零开始 MySQL 是一种关系型数据库管理系统(RDBMS),它是现在最流行的数据库管理系统之一。下面是 MySQL 面试题扫盲学习,从零开始的知识点总结: 1. 数据库概述 数据库是存储数据的仓库...

    MYSQL-系统表

    MYSQL 系统表 information_schema 详解 MYSQL 系统表 information_schema 中的关键信息是 MYSQL 站点进行渗透时快速定位重要信息的重要依据。下面是对 information_schema 中的各种表的详细解释: All_Tables 表 ...

Global site tag (gtag.js) - Google Analytics