一,起因

在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助。
因此我先交代一下写这篇随笔的起因。

我在做项目的时候遇到了一个比较有意思的情况,

首先说明我有如下两个比较重要的表

分别是 comment_table 和 comment_pic_table

这两个表分别用于存评论和评论附带的图片

下面是我以前出问题的查询sql

 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
comment_table c,user_info_table u,comment_pic_table p
WHERE
c.user_id=u.user_id AND
p.comment_id=c.comment_id AND
homestay_id='' ORDER BY comment_time DESC
LIMIT 0,3

你只需要注意我将comment_table 和comment_pic_table关联。

因为我想要查询完整的评论,肯定是要将二者关联起来的。

如此问题就来了。

对于有图片的评论,这样固然可以完整的查出我想要的数据(评论本身和评论图片)。

但是,对于没有图片的评论,则该sql一条记录都查不出来。

这是由于 p.comment_id=c.comment_id 这个条件导致的。(因为没有图片,自然"p"表comment_id对应的记录为null。)

学过sql的看到这里应该已经发现问题了,没发现的自己慢慢看吧。

对此,我能想到的就是用外连接语法解决。

外连接分为左外连接,右外连接,和全外连接三种。

目前我还不清楚第三种的应用场景在哪里,当然,昨天我甚至不知道外连接有何作用,因为我从未使用过这种语法去实际的解决什么问题,即便我很早的便学习了外连接的概念和语法。

所以它的存在必然是有意义的,还是学了好。不然指不定以后哪天遇到问题了都不知道该用什么技术去解决这个问题。

知识的广度和深度是同级的。

二,定义

左外连接,就是将两个表关联查询,但是和内连接不同的是,对于关联查询没有满足搜索条件的记录,内连接一条都不显示,但左外连接仍然会显示左表的全部记录。(你可以给左表增加where条件再次过滤。)

三,代码

在了解了外连接的概念之后,我的sql就变成了如下形式:

 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
(
comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id
)
LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id
AND homestay_id=''
ORDER BY comment_time DESC
LIMIT 0,3

这种sql相比较之前的来说虽然查到数据了,但是仍然存在问题,就是多查了。

原因上面已经说了:左外连接仍然会显示左表的全部记录。

可能有同学会问了,你明明加了and过滤了啊,但是,这个and过滤的是右表的记录,而不是左表。因此左表依然显示全部记录。

对此我们再次做出修改,修改之后的sql如下:

 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
(
comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id
AND homestay_id=''
)
LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id
ORDER BY comment_time DESC
LIMIT 0,3

如此一来,我们就可以正确的查到想要的记录了。

mysql外连接的更多相关文章

  1. mysql 外连接总结

    内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...

  2. mysql 外连接的时候,条件在on后面和条件在where后面的区别

    最近使用mysql的时候碰到一个问题:当一个表外联另一个表的时候,将一些查询条件放在on后面和放在where后面不太一样: 学生分数表stuscore: 当查询语句如下(查询语句1): SELECT ...

  3. mysql 外连接

    自连接:最大的特点是:一张表看做两张表.自己连接自己. 找出每个员工的上级领导,要求显示员工名和对应的领导名. select e.ename,ee.ename from emp e join emp ...

  4. 解释 MySQL 外连接、内连接与自连接的区别 ?

    先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一 个表的所有记录和另一个表中的所有记录一一匹配. 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合 条 ...

  5. 解释 MySQL 外连接、内连接与自连接的区别 ?

    先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一 个表的所有记录和另一个表中的所有记录一一匹配. 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合 条 ...

  6. Mysql学习总结(25)——MySQL外连接查询

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

  7. MySQL内连接和外连接

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...

  8. mysql学习笔记(七)—— MySQL内连接和外连接

        MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...

  9. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

随机推荐

  1. 领扣(LeetCode)七进制数 个人题解

    给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10" 注意: 输入 ...

  2. VLAN实验(4)单臂路由

    1.选择1台Router路由器.2台S3700交换机和4台pc机,并根据实验编址完成此拓扑图. 2.对交换机mengyu-S2建立VLAN (1)建立两个VLAN,VLAN10和VLAN20,并添加描 ...

  3. Kafka幂等性原理及实现剖析

    1.概述 最近和一些同学交流的时候反馈说,在面试Kafka时,被问到Kafka组件组成部分.API使用.Consumer和Producer原理及作用等问题都能详细作答.但是,问到一个平时不注意的问题, ...

  4. 手把手带你一键部署 Kubernetes + KubeSphere 至 Linux

    本文介绍一个最快安装 Kubernetes 和体验 KubeSphere 核心功能的方式,all-in-one 模式可一键安装 Kubernetes v1.15.5 和 KubeSphere 至一台 ...

  5. Java基础知识总结之垃圾回收机制

    垃圾回收机制 Java垃圾回收机制是Java语言的重要功能之一.当程序创建对象,数组等引用类型对象时,系统会自动在内存区为之分配一块内存,对象就保存在这块内存区内,当这块内存不再被任何变量引用时,这块 ...

  6. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  7. springboot+swagger接口文档企业实践(下)

    目录 1.引言 2. swagger接口过滤 2.1 按包过滤(package) 2.2 按类注解过滤 2.3 按方法注解过滤 2.4 按分组过滤 2.4.1 定义注解ApiVersion 2.4.2 ...

  8. oracle内存占用过高和修改不当无法启动oracle实例的解决办法

    今天,在自己机器上装了oracle 12c,发现Oracle的服务Oracle RDBMS Kenel  Executable (OracleServiceORCL)占用内存高达5G,本人电脑内存才1 ...

  9. Django-分页-form数据校验

    分页 view层 def fenye(request): all_data = models.AuthorDetail.objects.all() current_page = request.GET ...

  10. 题解 CF1206B 【Make Product Equal One】

    感谢 @一个低调的人 (UID=48417) 题目: CodeForces链接 Luogu链接 思路: 这是一个一眼题 我们不妨把所有的数都看做是\(1\)(取相应的花费,如:\(6\) 的花费就是\ ...