千家信息网

mysql中如何使用左链接查询

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,mysql中如何使用左链接查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我这里所说的主表是指在连接查询里MySQL以哪个表为主进
千家信息网最后更新 2026年11月02日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中如何使用左链接查询问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

查询 结果 字段 索引 问题 例子 经验 排序 链接 一行 两个 就是 数据 时候 更多 最好 条件 比如说 这是 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 云之行互联网科技 科技互联网企业 互联网科技深圳 互联网是不是新科技 未来的互联网科技 南京欣网互联网科技 华脉科技工业互联网产品 剑昆互联网络科技有限公司临桂 昭通云南众福互联网科技有限公司 阿里互联网科技公司 移动互联网科技公司 成都互联网科技公司工作好不好 中和天地互联网科技有限公司 智帮互联网科技公司最近动向 互联网科技实习生岗位 九思连强互联网电子科技有限公司 互联网金融运营模式中的金融科技 兰石爱特工业互联网科技分公司 知域互联网科技有限公司官网 广州大一互联网络科技有限公司 互联网科技活动banner A股互联网金融科技公司 极限挑战互联网科技 广州善班互联网科技 互联网科技咨询 互联网公司会议桌创意科技软装饰 金融科技与互联网金融相同和不同 内蒙古九一互联网科技 工业互联网科技成果转化
0