MySQL DML操作--------多表联合查询实战

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

1. 背景

   * 多表联合查询是把不同表的记录到一起的一种方式

   * 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接。其中外连接又分左外连接,右外连接。


2. 内连接例子 (inner join) [ 员工 --> 部门 ] 

   * 查看员工表[ employees ]和部门表[ departments ]结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql>  desc  employees;
+ -----------+---------------+------+-----+---------+----------------+
| Field     | Type          |  Null  Key  Default  | Extra          |
+ -----------+---------------+------+-----+---------+----------------+
| id        |  bigint (20)    |  NO    | PRI |  NULL     | auto_increment |
name       varchar (64)   |  NO    |     |  NULL     |                |
| sex       | enum( 'M' , 'F' ) |  NO    |     |  NULL     |                |
| age       |  int (11)       |  NO    |     |  NULL     |                |
| depart_id |  bigint (20)    |  NO    |     |  NULL     |                |
+ -----------+---------------+------+-----+---------+----------------+
rows  in  set  (0.00 sec)
 
mysql>  desc  departments;
+ -------+-------------+------+-----+---------+----------------+
| Field | Type        |  Null  Key  Default  | Extra          |
+ -------+-------------+------+-----+---------+----------------+
| id    |  bigint (20)  |  NO    | PRI |  NULL     | auto_increment |
name   varchar (64) |  NO    |     |  NULL     |                |
+ -------+-------------+------+-----+---------+----------------+
rows  in  set  (0.00 sec)


   * 查看员工表[ employees ]和部门表[ departments ]数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql>  select  from  employees;
+ ----+-------+-----+-----+-----------+
| id |  name   | sex | age | depart_id |
+ ----+-------+-----+-----+-----------+
|  1 | tom   | M   |  25 |         1 |
|  2 | jak   | F   |  35 |         2 |
|  3 | lisea | M   |  22 |         3 |
+ ----+-------+-----+-----+-----------+
rows  in  set  (0.00 sec)
 
mysql>  select  from  departments;
+ ----+------+
| id |  name  |
+ ----+------+
|  1 | dev  |
|  2 | test |
|  3 | ops  |
+ ----+------+
rows  in  set  (0.00 sec)


   * 查询并显示所有员工id, 姓名,姓别,年龄,所在部门 (方法一)

1
2
3
4
5
6
7
8
9
10
11
mysql>  select  e. id  id , e.name name, IF(e.sex =  'M' 'male' 'female' ) sex, e.age age, d.name
     -> from employees e, departments d
     -> where e.depart_id = d. id ;
+----+-------+--------+-----+------+
id  | name  | sex    | age | name |
+----+-------+--------+-----+------+
|  1 | tom   | male   |  25 | dev  |
|  2 | jak   | female |  35 |  test  |
|  3 | lisea | male   |  22 | ops  |
+----+-------+--------+-----+------+
3 rows  in  set  (0.03 sec)


   * 查询并显示所有员工id, 姓名,姓别,年龄,所在部门 (方法二) [ 方法一等价于方法二 ]

     inner join 可以省写成 join

1
2
3
4
5
6
7
8
9
10
11
mysql>  select  e. id  id , e.name name, IF(e.sex =  'M' 'male' 'female' ) sex, e.age age, d.name
     -> from employees e inner  join  departments d
     -> on e.depart_id = d. id ;
+----+-------+--------+-----+------+
id  | name  | sex    | age | name |
+----+-------+--------+-----+------+
|  1 | tom   | male   |  25 | dev  |
|  2 | jak   | female |  35 |  test  |
|  3 | lisea | male   |  22 | ops  |
+----+-------+--------+-----+------+
3 rows  in  set  (0.00 sec)


3. 外连接例子

   左外连接 [ 以左表为基础,左表的全部数据,右表有的组合。右表没有的为null ]

   右外连接 [ 以右表为基础,右表的全部数据,左表有的组合。左表没有的为null ]

   * 查看a表和b表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql>  desc  a;
+ -------+---------+------+-----+---------+-------+
| Field | Type    |  Null  Key  Default  | Extra |
+ -------+---------+------+-----+---------+-------+
| data  |  int (11) | YES  |     |  NULL     |       |
+ -------+---------+------+-----+---------+-------+
1 row  in  set  (0.00 sec)
 
mysql>  desc  b;
+ -------+---------+------+-----+---------+-------+
| Field | Type    |  Null  Key  Default  | Extra |
+ -------+---------+------+-----+---------+-------+
| data  |  int (11) | YES  |     |  NULL     |       |
+ -------+---------+------+-----+---------+-------+
1 row  in  set  (0.00 sec)


   * 查看a表和b表数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql>  select  * from a;
+------+
| data |
+------+
|    1 |
|    2 |
|    4 |
+------+
3 rows  in  set  (0.00 sec)
 
mysql>  select  * from b;
+------+
| data |
+------+
|    2 |
|    4 |
|    5 |
|    6 |
+------+
4 rows  in  set  (0.01 sec)

 

   * 左外连接查询 (left join) 以a表为基础,显示a表所有数据,b表有的组合,没有显示NULLL

        left outer join 可以写成 left join

1
2
3
4
5
6
7
8
9
mysql>  select  from  left  outer  join  on  a.data = b.data;
+ ------+------+
| data | data |
+ ------+------+
|    2 |    2 |
|    4 |    4 |
|    1 |  NULL  |
+ ------+------+
rows  in  set  (0.00 sec)


   * 右外连接查询 以b表为基础,显示b表所有数据,a表有的组合,没有显示NULLL

        right outer join 可以写成 right  join

1
2
3
4
5
6
7
8
9
10
mysql>  select  from  right  outer  join  on  a.data = b.data;
+ ------+------+
| data | data |
+ ------+------+
|    2 |    2 |
|    4 |    4 |
NULL  |    5 |
NULL  |    6 |
+ ------+------+
rows  in  set  (0.00 sec)


   * 完全(交叉)连接查询

     没有 where 子句的交叉联接将产生联接所涉及的表的笛卡尔积。

     第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

    (a和b交叉连接产生3*4=12条记录) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql>  select  from  a corss  join  b;
+ ------+------+
| data | data |
+ ------+------+
|    1 |    2 |
|    2 |    2 |
|    4 |    2 |
|    1 |    4 |
|    2 |    4 |
|    4 |    4 |
|    1 |    5 |
|    2 |    5 |
|    4 |    5 |
|    1 |    6 |
|    2 |    6 |
|    4 |    6 |
+ ------+------+
12  rows  in  set  (0.00 sec)


4. 总结


以需求驱动技术,技术本身没有优略之分,只有业务之分。




      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1943732,如需转载请自行联系原作者




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
SQL 关系型数据库 MySQL
菜鸟之路Day30一一MySQL之DML&DQL
本文介绍了MySQL中DML(数据操作语言)和DQL(数据查询语言)的核心用法。DML主要包括插入(insert)、更新(update)和删除(delete)语句,通过具体示例演示了如何对表数据进行增删改操作。DQL则聚焦于数据查询,涵盖基本查询、条件查询、聚合函数、分组查询、排序查询和分页查询等内容。文章通过丰富的SQL语句实例,帮助读者掌握如何高效查询和操作数据库中的数据,适合初学者学习和实践。
403 12
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
723 66
|
前端开发 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
【10月更文挑战第21天】 本文将深入浅出地探讨如何使用PHP与MySQL构建一个动态网站,从环境搭建到项目部署,全程实战演示。无论你是编程新手还是希望巩固Web开发技能的老手,都能在这篇文章中找到实用的技巧和启发。我们将一起探索如何通过PHP处理用户请求,利用MySQL存储数据,并最终呈现动态内容给用户,打造属于自己的在线平台。 ####
709 0
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
491 22
 MySQL秘籍之索引与查询优化实战指南
|
安全 关系型数据库 MySQL
PHP与MySQL动态网站开发实战指南####
——深入探索LAMP栈下的高效数据交互与处理技巧 ####
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1254 1

推荐镜像

更多