还是先 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 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...
### MySQL中的JOIN详解及SQL实战 #### 一、引言 在关系型数据库管理系统(RDBMS)中,数据往往分布在多个表中。为了获取所需的信息,常常需要将这些表组合起来,这时就会用到JOIN操作。JOIN是SQL语言中非常重要的...
在“详解关键字的功能”部分,手册会详细解释每个关键字的作用、语法、参数以及使用时的注意事项。比如,"JOIN"关键字用于将两个或更多表的数据结合在一起,根据指定的条件进行匹配。有多种类型的JOIN,如INNER JOIN...
更高级的用法涉及JOIN(连接表)、GROUP BY(分组数据)和HAVING(过滤分组结果)。 4. **数据库设计** 正确的数据库设计是系统性能的关键。概念数据模型(ER图)、逻辑数据模型和物理数据模型都是设计过程的一...
本套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 ...
4. **FULL OUTER JOIN**:返回两个表中所有匹配和不匹配的行(MySQL不支持,但可以使用UNION实现类似效果)。 三、聚合函数 MySQL提供了多种聚合函数,用于对一组值进行计算: 1. **COUNT()**:计算非NULL值的...
关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行。 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 ...
3. **优化连接类型**:尽量使连接类型从`ALL`到`eq_ref`,避免`Using where`和`Using join buffer`。 4. **避免子查询优化**:尽可能将子查询转换为连接查询,或者使用EXISTS替代IN。 5. **合理使用函数和计算**:...
1. JOIN操作:学习INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,合并多表数据。 2. 聚合函数:COUNT、SUM、AVG、MAX、MIN的使用,以及GROUP BY和HAVING子句进行分组与过滤。 3. 子查询:理解嵌套查询,使用子查询...
- `eq_ref`类型用于join查询中,通过主键或非空唯一索引来连接表,并且要求表间是一对一的关系。 - `ref`类型用于通过非唯一索引来查找多行记录的情况。 ### 执行计划的Extra - `Extra`列包含执行查询时的额外信息...
MySQL 服务性能优化 My.cnf 配置说明详解(16G 内存) MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf ...
本章节我们将向大家介绍如何使用MySQL 的 JOIN 在两个或多个表中查询数据。对mysql中的join感兴趣的朋友一起学习吧
这份"mysql基础知识详解,完整ppt"提供了全面的学习资源,帮助初学者和教学者快速掌握MySQL的核心概念。以下是对这份PPT中可能涵盖的知识点的详细解读: 1. **MySQL简介**:MySQL是一个开源、免费的数据库系统,它...
### MySQL安装与配置详解 #### 一、MySQL简介与重要性 MySQL自1996年起,从一个简单的SQL工具发展成为全球最受欢迎的开源数据库之一。它被广泛应用于互联网网站、搜索引擎、数据仓库以及各类任务关键型软件和系统...
`join_buffer_size=n`:JOIN操作的缓冲区大小,影响JOIN查询的速度。 配置MySQL时,需要根据实际需求和服务器资源来调整这些参数,以达到最佳的性能和安全性。每个选项都有其特定的作用和场景,合理的配置能显著...
在“PHP5与MYSQL5 web开发技术详解 第五章”这一主题中,我们将深入探讨这两个核心技术在构建Web应用程序时的协同工作方式。PHP5作为服务器端脚本语言,与MySQL5这种关系型数据库管理系统(RDBMS)的结合,为开发者...