首页 > 数据库 >MySQL多表查询-小记

MySQL多表查询-小记

时间:2023-07-09 19:00:34浏览次数:42  
标签:返回 多表 匹配 查询 MySQL JOIN LEFT 连接 小记

基本的多表查询模板:

SELECT 列列表
FROM 表1
JOIN 表2 ON 连接条件
JOIN 表3 ON 连接条件
...
WHERE 筛选条件
GROUP BY 分组列
HAVING 分组筛选条件
ORDER BY 排序列
  • SELECT:指定要查询的列,可以使用逗号分隔多个列。

  • FROM:指定要查询的表,可以使用逗号分隔多个表。在查询中涉及到的所有表都需要在这里列出。

  • JOIN:使用JOIN关键字将表进行连接。根据连接类型,可以使用INNER JOINLEFT JOINRIGHT JOIN等连接操作符。

  • ON:在JOIN子句后面使用ON关键字指定连接条件,即两个表之间用于匹配行的条件。

  • WHERE:可选部分,用于指定筛选条件,对结果进行进一步的过滤。

  • GROUP BY:可选部分,用于指定分组列。通常与聚合函数(如COUNTSUM)一起使用,以便按照分组列对数据进行分组和聚合计算。

  • HAVING:可选部分,用于对分组后的结果进行筛选。可以使用聚合函数和其他条件来定义筛选条件。

  • ORDER BY:可选部分,用于指定结果的排序方式。可以按照一个或多个列进行升序或降序排序。

内连接与外连接:

  内连接是一种连接方式,它只返回两个表之间满足连接条件的匹配行。在这个查询中,使用INNER JOIN(内连接)将"dept3"表和"emp3"表连接起来,

连接条件是"dept3"表的"deptno"列与"emp3"表的"dept_id"列相等。只有在这两个列的值匹配的情况下,才会返回结果。

  换句话说,内连接只返回那些在两个表中都有对应匹配关系的行,而不会返回任何不匹配的行。在这个查询中,

只有那些在"dept3"表和"emp3"表中都有对应的部门号和部门ID的行才会被包含在结果中。

  相比之下,外连接(如左外连接和右外连接)将返回满足连接条件的行以及至少一个表中的所有行,无论是否有匹配。

如果使用外连接,即使某个部门没有对应的员工或某个员工没有对应的部门,也会在结果中显示它们,并将缺失的值用NULL填充。

  在查询中,由于使用了内连接,只有那些有匹配关系的部门和员工才会被返回,不会包括任何不匹配的行。

使用别名的好处:

  1. 缩短了查询语句的长度,使其更易读和理解。
  2. 当查询涉及多个表时,使用别名可以明确指定要引用的表,避免歧义和冲突。
  3. 在查询中引用表别名比完整表名更加简洁,尤其是当表名较长或复杂时。

多表查询显式连接与隐式连接:

  隐式连接方式容易造成可读性和维护性的问题,并且在更复杂的查询中可能会导致错误或歧义。

  因此,推荐使用显式的连接语法,如INNER JOIN,以提高查询的可读性和可维护性,并避免潜在的问题。

例子:隐式改为显式

  隐式SQL语句:

SELECT name, ename
FROM dept3, emp3
WHERE dept_id = deptno;

  显示SQL语句:

SELECT d.name, e.ename
FROM dept3 d
INNER JOIN emp3 e ON d.deptno = e.dept_id;

LEFT JOIN

  当使用左连接(Left Join)时,会返回左表(即在FROM子句中放置在左侧的表)的所有行,

以及与右表(即在LEFT JOIN子句中指定的表)中满足连接条件的行。如果右表中没有与左表匹配的行,则用NULL值填充右表的列。

例句:

SELECT d.deptno, d.name, COUNT(e.eid) AS employee_count
FROM dept3 d
LEFT JOIN emp3 e ON d.deptno = e.dept_id
GROUP BY d.deptno, d.name
ORDER BY employee_count ASC;

  这个查询使用了左连接(LEFT JOIN)。通过LEFT JOIN将"dept3"表和"emp3"表连接起来,连接条件是"dept3"表的"deptno"列

与"emp3"表的"dept_id"列相等。这样,查询会返回所有在"dept3"表中的部门,以及每个部门对应的员工数量。

  如果某个部门在"emp3"表中没有对应的员工记录,则通过左连接,该部门的员工数会被计算为0,并且该部门的信息也会出现在结果中。

这样就能确保返回所有部门的信息,而不仅仅是有员工的部门。返回的是左边的那个报名结构---from

  另外,关于右连接(Right Join),它与左连接相反。右连接会返回右表的所有行,以及与左表中满足连接条件的行。

如果左表中没有与右表匹配的行,则用NULL值填充左表的列。虽然MySQL中没有提供RIGHT JOIN关键字,但可以通过使用左连接的方式来实现右连接。

只需交换左表和右表的顺序,并将连接条件中的表顺序进行调换,就可以实现右连接的效果。

判断什么时候用inner join什么时候用left join

 

  1、需要返回的数据:首先考虑你需要返回的数据集。如果你只需要返回两个表中完全匹配的行,即两个表中都存在的关联记录,那么可以使用INNER JOIN

这种情况下,INNER JOIN将过滤掉不匹配的行,只返回满足连接条件的行。

 

 

  2、保留非匹配行:如果你想要保留左表(第一个表)中没有匹配到右表(第二个表)的行,可以使用LEFT JOINLEFT JOIN会返回左表的所有行,

即使在右表中没有匹配的行,通过填充NULL值来表示没有匹配的部分。

 

 

  3、数据完整性:考虑到数据的完整性,如果某个表的数据是主要数据源,而另一个表的数据只是辅助信息,那么可以将主要数据表作为左表,使用LEFT JOIN连接辅助表。这样可以确保主要表的所有数据都被包括在结果中。

 

 

  4、业务逻辑和需求:理解业务逻辑和需求也是判断使用哪种连接的重要因素。仔细分析数据之间的关系和连接条件,并根据业务规则确定是否需要保留非匹配行,或仅返回匹配的行。

 

  总的来说,INNER JOIN适用于需要返回两个表中完全匹配的行的情况,而LEFT JOIN适用于需要保留左表中所有行的情况,并可能包含右表中匹配的行。

根据具体的业务需求和数据关系,选择适当的连接类型可以确保查询结果符合预期,并提供所需的数据。

例题链接: MySQL多表查询练习_dlluo的博客-CSDN博客

标签:返回,多表,匹配,查询,MySQL,JOIN,LEFT,连接,小记
From: https://www.cnblogs.com/luojuning/p/17539177.html

相关文章

  • 23 | MySQL是怎么保证数据不丢的?
    以下内容出自《MySQL实战45讲》23|MySQL是怎么保证数据不丢的?binlog的写入机制1、事务执行过程中,先把日志写到binlogcache,事务提交的时候,再把binlogcache写到binlog文件中。2、一个事务的binlog是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。3、......
  • MySQL之GROUP_CONCAT()
    MySQL的group_concat()函数可太好用了将作用是将属于同一组的列显示出来,所以和groupby一同使用,同一组的默认以逗号分隔显示基础语法:selectgroup_concat(列SEPARATOR',')fromtablenamegroupby列名SEPARATOR定义以什么分隔结果,可以不写,不写就是默认以逗号分隔; ......
  • MyBaits查询MySQL日期类型结果相差8个小时
    问题描述在Java项目中使用MyBatis作为ORM框架,但是查询出的MySQL日期类型字段值总是比数据库表里的值多8个小时。具体说明:MySQL数据库表字段类型为timestamp,映射的Java日期类型为java.util.Date,当数据库表里的字段值为2023-07-0800:08:38时,查询出的Java字段值为2023-07-0808:0......
  • MySQL--Sorted Index Builds 导致备份失败故障分析
    问题概述xtrabackup备份失败,日志中有这样的信息InnoDB:Anoptimized(withoutredologging)DDLoperationhasbeenperformed.Allmodifiedpagesmaynothavebeenflushedtothediskyet.问题原因redologs会跳过一些DDL,PerconaXtraBackup监测到redolog有跳过时,它会......
  • Windows下MySQL 5.7.20的installer 模式安装
    一、安装Windows环境wrar_5.50.0.0_scp.exevcredist2013_x86.exeVC2015_x64.exeNDP452-KB2901907-x86-x64-AllOS-ENU.exeMicrosoft.NET4.0.zip二、installer模式安装MySQL         安装完成以后停止服务、改目录重新准备my.ini参数重新初......
  • MySQL8.0 密码管理与密码策略
    一、密码管理#新密码不能和前面三次的密码相同password_history=3;#新密码不能和前面九十天内使用的密码相同password_reuse_interval=90;#默认为off;为on时修改密码需要用户提供当前密码(开启后修改密码需要验证旧密码,root用户不需要)password_require_current......
  • 字节、腾讯争先部署,ClickHouse+Doris 赶超 MySQL 810 倍
    阿里流传着这样一句话,“一切业务数据化,一切数据业务化”。 作为大数据从业者,你一定明白有数据是一回事,可要想让数据发挥价值、成为生产力是另一回事。手里得有两把刷子,才能成为大数据圈儿的“大拿”! 如何实现智能路径检测,查询出符合条件的路径详情及符合路径的用户数?关于......
  • Debian 11 x64 安装 MySQL 8.0.33
    更新sudoaptupdatesudoaptinstallgnupg安装DEBPackagewget-chttps://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.debsudodpkg-imysql-apt-config_0.8.25-1_all.deb具体版本见官方网站:MySQLCommunityDownloads,这里仅以版本0.8.25-1作为示例。更新......
  • 字节、腾讯争先部署,ClickHouse+Doris 赶超 MySQL 810 倍
    阿里流传着这样一句话,“一切业务数据化,一切数据业务化”。作为大数据从业者,你一定明白有数据是一回事,可要想让数据发挥价值、成为生产力是另一回事。手里得有两把刷子,才能成为大数据圈儿的“大拿”!如何实现智能路径检测,查询出符合条件的路径详情及符合路径的用户数?关于有序漏斗转化......
  • 吹爆!阿里大牛MySQL优化笔记有多强?才在GitHub被BATJ联手封杀
    今年的春招很猛,公司的大神也变多了。。。来了个新同事,一看是个二本生,还是非科班出身,刚30岁。。。结果没想到人家上来就把现有项目的性能优化了一遍,直接给公司节省了一半的成本,这种“王炸”打法,直接给所有人整懵了。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁......