`

什么是mysql左链接查询 如何使用

阅读更多
MySQL左连接查询是连接查询中的一种方式,下面就为您介绍MySQL左连接查询中的一些问题谈论,如果您感兴趣的话,不妨一看。

  我这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询。比如说在MySQL左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts:


CREATE TABLE IF NOT EXISTS `categories` (    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,    `name` varchar(15) NOT NULL,    `created` datetime NOT NULL,    PRIMARY KEY (`id`),    KEY `name` (`name`)    );       CREATE TABLE IF NOT EXISTS `posts` (    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,    `category_id` int(10) unsigned NOT NULL,    `title` varchar(100) NOT NULL,    `content` varchar(200) NOT NULL,    `created` datetime NOT NULL,    PRIMARY KEY (`id`),    KEY `category_id` (`category_id`),    KEY `created` (`created`),    KEY `category_id_created` (`category_id`, `created`)    );  

  先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下


SQL:       EXPLAIN SELECT *    FROM posts    LEFT JOIN categories ON posts.category_id = categories.id    WHERE categories.name LIKE 'foobar%'    ORDER BY posts.created DESC  

  结果如下所示:


table      key         Extra    categories name        Using where; Using temporary; Using filesort    posts      category_id  

  在join查询的explain的结果中,第一行表示的表就是主表。所以说在此查询里categories是主表,而在我们的经验里,LEFT JOIN查询里,左表(posts表)才应该是主表,这产生一个根本的矛盾,MySQL之所以这样处理,是因为在我们的WHERE部分,查询条件是按照 categories表的字段来进行筛选的,且categories表刚好存在合适的索引,所以在查询时把categories表作为主表更有利于缩小结果集。

  那explain结果中的Using temporary; Using filesort又是为什么呢,为什么created或category_id_created索引无效呢?这是因为主表是categories表,从表是posts表,而我们使用从表的字段去ORDER BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。

  再看一个比较怪异的例子:


EXPLAIN SELECT *    FROM posts    LEFT JOIN categories ON posts.category_id = categories.id    WHERE categories.id = ‘一个已经存在的ID’    ORDER BY posts.created DESC  

  这个例子里posts表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据category_id_created索引在连接的同时自然就得到排序后的结果。但换个角度看,既然 categories.id都是确定的了,那类似这样的需求,我们一般就不会再使用LEFT JOIN查询了,而会分成两个独立的查询去检索categories和posts才对。

  主观上一旦搞错了主表,可能怎么调整索引都得不到高效的SQL,所以在写SQL时,比如说在写MySQL左连接查询时,如果希望左表是主表,那么就要保证在WHERE语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去ORDER BY。

  注意:大多数情况下,使用从表字段去排序都是低效的,我最初的例子误导了大家,已更正。
分享到:
评论

相关推荐

    MYSQL 左连接右连接和内连接的详解及区别

    主要介绍了MYSQL 左连接右连接和内连接的详解及区别的相关资料,需要的朋友可以参考下

    数据库系统及原理及MYSQL应用教程多表连接和子查询实验报告

    实验报告主要涵盖了数据库系统的基本操作,特别是MySQL中的分组查询、多表连接和子查询的运用。以下是对这些知识点的详细解释: 1. **GROUP BY 语句与聚合函数**: GROUP BY 语句用于将数据分组,通常与聚合函数如...

    mysql连接查询

    如果我们想要获取 table1 中的所有记录,并将其与 table2 中的记录连接起来,可以使用左连接查询。 结果将是: | table1.name | table1.city | table2.name | table2.city | | --- | --- | --- | --- | | Person A...

    左外连接右外连接,内连接区别

    在数据库查询中,连接操作是将两个或多个表的数据...反之,如果希望包含所有右表的记录,即使左表中没有匹配,就使用右外连接。了解这些基本的连接类型及其差异,对于优化 SQL 查询和处理复杂的数据库关系至关重要。

    剖析MySQL左连接右连接等值连接异同.pdf

    根据文件中提供的信息,我们可以详细探讨MySQL中的不同连接类型,包括左连接(LEFT JOIN)、右连接(RIGHT JOIN)、内连接(INNER JOIN)以及等值连接的概念和它们之间的异同。 首先,我们需要明确什么是“连接”...

    DBeaver连接mysql数据库图文教程

    下面,我们将通过图文教程的方式来详细解释如何使用 DBeaver 连接 MySQL 数据库。 首先,你需要启动 DBeaver 应用程序。一旦应用程序打开,你会看到一个主界面,通常包含多个工作区和选项卡。为了建立一个新的...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE smallint unsigned not null, STU_SEX char(2) not ...

    mysql连接查询(左连接,右连接,内连接)

    MySQL 提供了多种连接类型,包括 INNER JOIN(内连接)、LEFT JOIN(左连接)和 RIGHT JOIN(右连接)。这些连接方式主要根据不同的数据需求,确定如何处理两表之间的匹配关系。 1. INNER JOIN(内连接) INNER ...

    mysql之左连接与右连接.doc

    例如,在查询员工信息和对应的部门信息时,可以使用左连接;在查询部门信息和对应的员工信息时,可以使用右连接。 四、 实践案例 创建两个表 department 和 job,department 表包含部门 ID、代码和名称,job 表...

    mysql多条件查询

    执行左连接查询: ```sql SELECT * FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno; ``` #### 五、总结 本文详细介绍了MySQL中的多条件查询技术,特别是子查询和多表查询的相关知识点。子查询提供了一种灵活...

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

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

    MySQL连接查询.docx

    MySQL中的连接查询是数据库操作中的核心技能之一,它允许用户将多个表的数据组合在一起,以获取更复杂的数据分析结果。本文将深入探讨七种主要的MySQL连接查询类型,并提供每种查询的实现示例。 1. 内连接(INNER ...

    mysql数据库的多表设计和各种查询(连接查询\子查询\联合查询\报表查询),以及数据库备份和恢复

    常见的连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。 2. 子查询(Subquery):子查询是在一个查询语句中嵌套另一个查询,用于获取临时结果,然后这个结果...

    MySQL中基本的多表连接查询教程

    本文将详细介绍MySQL中涉及的几种基本的多表连接查询方法,包括笛卡尔积、内连接和外连接,以及它们的使用场景和技巧。 1. 笛卡尔积(交叉连接): 笛卡尔积是通过CROSS JOIN或简单的JOIN实现的,也可以用逗号(,)...

    python中使用mysql数据连接

    打开数据库连接,正常显示中文标签,正常显示负号,使用 execute() 方法执行 SQL 查询

    MYSQL查询操作教程

    MYSQL 查询操作也可以使用连接,例如: ```sql SELECT * FROM 学生表 LEFT JOIN 监护人表 ON 学生表.学号=监护人表.学号 ``` 这将在“学生表”和“监护人表”中选择满足条件的记录,并返回左边表“学生表”中的所有...

    sqlYog连接MYSQL数据库

    ### 使用 SQLyog 连接 MySQL 的步骤 1. **安装 SQLyog**:下载并运行 `SQLyog-12.5.0-0_setup.exe` 安装程序,按照提示完成安装过程。 2. **配置连接参数**:启动 SQLyog,点击“连接”按钮,输入 MySQL 服务器的...

    MySQL数据库:外连接.pptx

    MySQL数据库中的外连接是数据查询中的一个重要概念,它允许我们在联接两个或多个表时,不仅包含匹配的行,还包含至少一个表的所有行。这与内连接不同,内连接只返回两个表中存在匹配的行。外连接分为两种主要类型:...

Global site tag (gtag.js) - Google Analytics