当前位置: 首页 > news >正文

MySQL连接类型

MySQL连接类型

1、连接

1.1 数据构造

CREATE TABLE departments (  department_id INT PRIMARY KEY,  department_name VARCHAR(255)  
);  CREATE TABLE employees (  employee_id INT PRIMARY KEY,  employee_name VARCHAR(255),  department_id INT
);INSERT INTO departments (department_id, department_name) VALUES (1, 'Sales');  
INSERT INTO departments (department_id, department_name) VALUES (2, 'Engineering');  
INSERT INTO departments (department_id, department_name) VALUES (3, 'Marketing');  INSERT INTO employees (employee_id, employee_name, department_id) VALUES (1, 'John Doe', 1);  
INSERT INTO employees (employee_id, employee_name, department_id) VALUES (2, 'Jane Smith', 2);  
INSERT INTO employees (employee_id, employee_name, department_id) VALUES (3, 'Bob Johnson', 1);
INSERT INTO employees (employee_id, employee_name, department_id) VALUES (4, 'Tom', 4);
select * from departments;
select * from employees;
department_iddepartment_name
1Sales
2Engineering
3Marketing
employee_idemployee_namedepartment_id
1John Doe1
2Jane Smith2
3Bob Johnson1
4Tom4

1.2 内连接(Inner Join)

匹配 2 张表中相关联的记录。

# join或inner join
# 使用inner join,使用where
select employees.employee_id,employees.employee_name,departments.department_id from employees inner join departments where employees.department_id = departments.department_id;
# 等价,使用inner join,使用where代替on
select employees.employee_id,employees.employee_name,departments.department_id from employees inner join departments on employees.department_id = departments.department_id;
# 等价,使用join
select employees.employee_id,employees.employee_name,departments.department_id from employees join departments where employees.department_id = departments.department_id;
# 等价,去掉join或者是inner join
select employees.employee_id,employees.employee_name,departments.department_id from employees,departments where employees.department_id = departments.department_id;
# 等价,使用cross join,条件只能用where不能用on
select employees.employee_id,employees.employee_name,departments.department_id from employees cross join departments where employees.department_id = departments.department_id;
employee_idemployee_namedepartment_id
1John Doe1
2Jane Smith2
3Bob Johnson1

1.3 左(外)连接(Left Join)

左外连接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记录,右表中未匹配到的字段用NULL表示。

# left join或者left outer join
# left join
select employees.employee_id,employees.employee_name,departments.department_id from employees left join departments on employees.department_id = departments.department_id;
# left outer join
select employees.employee_id,employees.employee_name,departments.department_id from employees left outer join departments on employees.department_id = departments.department_id;
employee_idemployee_namedepartment_id
1John Doe1
2Jane Smith2
3Bob Johnson1
4Tom

1.3 右(外)连接(Right Join)

除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,左表中未匹配到的字段用NULL表示。

# right join或者right outer join
# right join
select employees.employee_id,employees.employee_name,departments.department_id from employees right join departments on employees.department_id = departments.department_id;
# right outer join
select employees.employee_id,employees.employee_name,departments.department_id from employees right outer join departments on employees.department_id = departments.department_id;
employee_idemployee_namedepartment_id
1John Doe1
3Bob Johnson1
2Jane Smith2
3

1.4 全(外)连接(Full Join)

完整外部连接返回左表和右表中的所有行。

当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。

如果表之间有匹配行,则整个结果集行包含基表的数据值。

在MySQL中,full join 通常被称为 full outer join,但需要注意的是,MySQL 原生并不直接支持 full

outer join 语法。不过,你可以使用 unionleft joinright join 的组合来模拟 full outer

join 的效果。

select employees.employee_id,employees.employee_name,departments.department_id from employees left join departments on employees.department_id = departments.department_id
union
select employees.employee_id,employees.employee_name,departments.department_id from employees right join departments on employees.department_id = departments.department_id;
employee_idemployee_namedepartment_id
1John Doe1
2Jane Smith2
3Bob Johnson1
4Tom
3

1.5 交叉连接(Cross Join)

没有WHERE子句的交叉连接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔

积结果集的大小。

# cross join
select employees.employee_id,employees.employee_name,departments.department_id from employees cross join departments;
# 等价
select employees.employee_id,employees.employee_name,departments.department_id from employees,departments;
employee_idemployee_namedepartment_id
1John Doe1
1John Doe2
1John Doe3
2Jane Smith1
2Jane Smith2
2Jane Smith3
3Bob Johnson1
3Bob Johnson2
3Bob Johnson3
4Tom1
4Tom2
4Tom3

1.6 总结

1、内连接与外连接的区别是什么?

内连接:只返回两个表中联结字段相等的数据。

外连接:返回包括左/右表中的所有记录和右/左表中联结字段相等的记录。

2、左外连接和右外连接的区别是什么?

左外连接也称左连接。以左表为基表,在FROM子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN”来连接

两张表。

右外连接也称右连接。以右表为基表,在FROM子句中使用关键字“RIGHT OUTER JOIN”或关键字“RIGHT JOIN”来

连接两张表。

3、概括

内连接就是取交集的部分。

左连接就是左表全部的数据加上交集的数据。

右连接就是右表全部的数据加上交集的数据。

交叉连接就是数据全都要。


http://www.mrgr.cn/news/7430.html

相关文章:

  • [数据集][目标检测]绳子检测数据集VOC+YOLO格式322张1类别
  • 01:【江科大stm32】:LED闪烁/LED流水灯/蜂鸣器
  • 【数据结构】栈(stack)
  • 【Oracle点滴积累】Oracle 19c安装Critical Patch Update for January 2023
  • SQL手工注入漏洞测试(PostgreSQL数据库)
  • 怎么利用住宅代理提高数据抓取效率
  • 算法-模型似然值计算
  • MapBox Android版开发 1 配置
  • 前端宝典九:React Native从入门到精通实战
  • TCP vs UDP:揭秘可靠性与效率之争
  • 【GNSS射频前端】MA2769初识
  • 5大分区管理器 - 最佳硬盘分区软件
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(十二)
  • 微服务:配置管理和配置热更新
  • SpringBoot依赖之Spring Data Redis实现位图Bitmap
  • mac苹果电脑配置Docker最新国内源
  • Java语言程序设计——篇十七(3)
  • Hadoop入门基础(二):Hadoop集群安装与部署详解(超详细教程)
  • 计算机网络:DNS、子网掩码、网关
  • 周末总结(2024/08/24)