MYSQL学习二 关于左连接

工作中有如下的SQL, 针对A.ID =‘abcdefg‘, left  join  B和C两个表,来查找其他信息。就算是B和C中没有任何满足条件的记录,最后结果也肯定不是空。因为A.ID =‘abcdefg‘是存在的。

SELECT ******
FROM tableA    A
LEFT JOIN tableB  B  on b.DELETED = ‘0‘
AND A.DELETED = ‘0‘
AND B.fid=A.ID
LEFT JOIN tableC  C ON B.XXXid=C.id AND c.DELETED = ‘0‘
WHERE A.ID =‘abcdefg‘

一开始我的写法是这样的: 把 b.DELETED = ‘0‘放在后面,这样导致结果为null, 这是因为: 如果把and b.DELETED = ‘0‘ 放在最后,是对left  join后的结果做过滤,

这个时候就有可能导致结果为null。(考虑这种情况: B和C表没有能和A连接成功的记录,如果用上面的SQL,会出结果,用这个SQL,就会null)

SELECT ******
FROM tableA    A
LEFT JOIN tableB  B  on
AND A.DELETED = ‘0‘
AND B.fid=A.ID
LEFT JOIN tableC  C ON B.XXXid=C.id AND c.DELETED = ‘0‘
WHERE A.ID =‘abcdefg‘ 

and  b.DELETED = ‘0‘

上面这个问题是工作中遇到的,一不小心浪费了好多时间来fix,  SQL掌握的不好!

原文地址:https://www.cnblogs.com/liufei1983/p/8988020.html

时间: 2024-10-12 11:29:41

MYSQL学习二 关于左连接的相关文章

mysql学习之内、外连接语句

名词: 内连接:自然连接,只有两个相匹配的行才能在结果集中显示 外连接:左外连接.右连接.全外连接 内连接,只显示满足where后条件的列  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id 左外连接,select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id     左列为主,右表为副表. 右外连接, select 

mysql执行顺序及左连接和右连接

SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行: 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果 每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过 对比了一下,mysql和sql执行顺序基本是一样的, 标准顺序的 SQL 语

MySql学习 - 查询/子查询/连接查询/联合查询

数据库查询 设定两张数据库表 第一个表格user包含: user_id username age sex 1 Alps1992 22 man 第二个表格toy包含 user_id toyname 1 OnePiece 普通查询: 查询关键字: AS, SUM, DESC, GROUP BY, ORDER BY, AVG, MIN, MAX, COUNT, LIMIT; 关键字查询例子 select * from user as u order by age limit 5; // as 用来做别

MySQL学习(二)——SQL语句创建删除修改以及中文乱码问题

一.对数据库的操作 1.创建一个库 create database 库名; 创建带有编码的:create database 库名 character set 编码; 查看编码:show create database 库名; 2.删除一个库 drop database 库名; 3.使用库 use 库名; 4.查看当前正在操作的库 select database(); 二.对数据库表的操作 1.创建一张表 create table 表名( 字段名 类型(长度) [约束], 字段名 类型(长度) [

MySql学习(二) —— where / having / group by / order by / limit 简单查询

这篇博客主要记录sql的五种子句查询语法! 一个重要的概念:将字段当做变量看,无论是条件,还是函数,或者查出来的字段. select五种子句 where 条件查询 group by 分组 having 筛选 order by 排序 limit 限制结果条数 为了练习上面5种子句,先建立一张goods表,主要用于查询操作,表结构如下: 1.基础查询 —— where where常用运算符: 1.1 查出主键为20的商品 :mysql> SELECT goods_id,cat_id,goods_sn

MYSQL学习(二)

并发控制 MySQL在两个层面实现并发控制:服务器层与存储引擎层. 读锁和写锁: 在处理并发读或写时,可以通过实现一个由两种锁组成的系统来解决问题. 这两种锁通常被称为共享锁和排他锁,或者称为读锁和写锁. 读锁:是共享的,或者说是相互不阻塞的,多个客户可以在同时读取同一数据. 写锁:是排他的,一个写锁会阻塞其他的写锁和读锁,同一时刻只能有一个用户能够写入,并防止其他用户读取正在写入的数据. 锁粒度: 锁粒度:指加锁的对象的大小.显然,锁的粒度越小,并发控制效率越高. 锁的各种操作,包括获得锁.检

MySQL学习(二)——MySQL多表

分页操作:使用limit(参数1,参数2) 起始位置(参数1)=(第几页-1)*每页显示的条数(参数2) 1.分类表 create table category( cid varchar(32) primary key, cname varchar(100) ); 2.商品表 create table product( pid varchar(32) primary key, pname varchar(40), price double, category_id varchar(32) );

MySQL学习笔记_12_Linux下C++/C连接MySQL数据库(二) --返回数据的SQL

 Linux下C++/C连接MySQL数据库(二) --返回数据的SQL 引: 返回数据的SQL是指通过查询语句从数据库中取出满足条件的数据记录 从MySQL数据库值哦功能检索数据有4个步骤: 1)发出查询 2)检索数据 3)处理数据 4)整理所需要的数据 用mysql_query()发出查询,检索数据可以使用mysql_store_result()或mysql_use_result(),取决与怎样检索数据,接着是调用mysql_fetch_row()来处理数据,最后,还必须调用mysql_

MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)

同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作测试) 一.子查询 1.where型子查询:把内层查询的结果作为外层查询的比较条件 1.1 查询id最大的一件商品(使用排序+分页实现) :mysql> SELECT goods_id,goods_name,shop_price FROM goods ORDER BY goods_id DESC LIMIT 1; 1.2 查询id最大的一件商