首页 > 数据库 >SQL中join后的on和where的过滤条件的区别

SQL中join后的on和where的过滤条件的区别

时间:2023-05-29 14:46:24浏览次数:36  
标签:rows join title authors SQL loops actual where id

 

1、原理

1.1连接基本概念

(1)内连接(inner join、join):必须完全满足连接运算(natural、using、on)的左右表数据行。

(2)左外连接(left outer join、left join):仅保留左表在连接运算之前的数据行,无匹配的右表列填充null。

(3)右外连接(right outer join、right join):仅保留右表在连接运算之前的数据,无匹配的左表列填充null。

(4)全外连接(full outer join、full join):保留左右表在连接运算之前的数据,无匹配的左表或右表列填充null。

(5)交叉连接(cross join):没有on或者using,因此无需讨论。

1.2说明

(1)内连接中,on过滤条件可以被where过滤条件取代,反之亦然。在on后边写连接条件where后边写其余条件的优点是可读性好。

(2)外连接中,on过滤条件和where过滤条件不同,外连接运算将不符合on过滤条件的行当作空值行存在,也就是行存在把列值抹去。

2、验证

2.1创建表

分别对左外连接中左表和右表上的ON和WHERE过滤条件进行验证。

首先创建两张表和示例数据,简单起见没有创建索引和外键:

CREATE TABLE books (

  id char(2) PRIMARY KEY,

  title varchar(20) NOT NULL,

  primary_author_id char(2) NOT NULL -- 关联authors.id

);

CREATE TABLE authors (

  id char(2) PRIMARY KEY,

  fullname varchar(20) NOT NULL

);

INSERT INTO books VALUES

('B0', '三国演义', 'A0'),

('B1', '货币战争', 'A1'),

('B2', '水浒传', 'A2');

INSERT INTO authors VALUES

('A0', '罗贯中'),

('A2', '吴承恩'),

('A3', '金庸');

2.2books表on过滤条件

SELECT a.title, b.fullname

FROM books a

LEFT JOIN authors b

ON a.primary_author_id = b.id

AND a.title = '三国演义';

 

查询计划1(EXPLAIN (analyze, costs off, timing off, summary off) 后边跟随SQL语句):

 Hash Left Join (actual rows=3 loops=1)

   Hash Cond: (a.primary_author_id = b.id)

   Join Filter: ((a.title)::text = '三国演义'::text)

   Rows Removed by Join Filter: 1

   ->  Seq Scan on books a (actual rows=3 loops=1)

   ->  Hash (actual rows=3 loops=1)

         Buckets: 1024  Batches: 1  Memory Usage: 9kB

         ->  Seq Scan on authors b (actual rows=3 loops=1)

 

查询结果1:

  title   | fullname

----------+----------

 三国演义 | 罗贯中

 货币战争 |

 水浒传   |

2.3books表WHERE过滤条件

SELECT a.title, b.fullname

FROM books a

LEFT JOIN authors b

ON a.primary_author_id = b.id

WHERE a.title = '三国演义';

 

查询计划2:

 Hash Right Join (actual rows=1 loops=1)

   Hash Cond: (b.id = a.primary_author_id)

   ->  Seq Scan on authors b (actual rows=3 loops=1)

   ->  Hash (actual rows=1 loops=1)

         Buckets: 1024  Batches: 1  Memory Usage: 9kB

         ->  Seq Scan on books a (actual rows=1 loops=1)

               Filter: ((title)::text = '三国演义'::text)

               Rows Removed by Filter: 2

 

查询结果2:

  title   | fullname

----------+----------

 三国演义 | 罗贯中

2.4authors表ON过滤条件

SELECT a.title, b.fullname

FROM books a

LEFT JOIN authors b

ON a.primary_author_id = b.id

AND b.fullname = '罗贯中';

 

查询计划3:

 Hash Left Join (actual rows=3 loops=1)

   Hash Cond: (a.primary_author_id = b.id)

   ->  Seq Scan on books a (actual rows=3 loops=1)

   ->  Hash (actual rows=1 loops=1)

         Buckets: 1024  Batches: 1  Memory Usage: 9kB

         ->  Seq Scan on authors b (actual rows=1 loops=1)

               Filter: ((fullname)::text = '罗贯中'::text)

               Rows Removed by Filter: 2

 

查询结果3:

  title   | fullname

----------+----------

 三国演义 | 罗贯中

 货币战争 |

 水浒传   |

2.5authors表WHERE过滤条件

SELECT a.title, b.fullname

FROM books a

LEFT JOIN authors b

ON a.primary_author_id = b.id

WHERE b.fullname = '罗贯中';

查询计划4:

 Hash Join (actual rows=1 loops=1)

   Hash Cond: (a.primary_author_id = b.id)

   ->  Seq Scan on books a (actual rows=3 loops=1)

   ->  Hash (actual rows=1 loops=1)

         Buckets: 1024  Batches: 1  Memory Usage: 9kB

         ->  Seq Scan on authors b (actual rows=1 loops=1)

               Filter: ((fullname)::text = '罗贯中'::text)

               Rows Removed by Filter: 2

 

查询结果4:

  title   | fullname

----------+----------

 三国演义 | 罗贯中

标签:rows,join,title,authors,SQL,loops,actual,where,id
From: https://www.cnblogs.com/hole/p/17440358.html

相关文章

  • 玩转MySQL数据库之SQL优化之慢查询
    本系列为:MySQL数据库详解,为千锋资深教学老师独家创作,致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!前言从今天开始本系列文章就带各位小伙伴学习......
  • MySQL索引(一)
    雨喝醉了,小路摇摇晃晃,倒在我怀里1,B树和B+树之间的区别是什么?2,Innodb中的B+树有什么特点?3,什么是Innodb中的page?4,Innodb中的B+树是怎么产生的?5,什么是聚簇索引?6,Innodb是如何支持范围查找能走索引的?7,什么是联合索引?对应的B+树是如何产生的?8,什么是最左前缀原则?......
  • SqlServer中的锁
    共享锁(SharedLock):表示一个事务正在读取一行数据,其他事务也可以读取同一行数据,但不能进行写操作。也称为"S锁"或"读锁"。--在事务中获取共享锁BEGINTRANSACTION;SELECT*FROMtable_nameWITH(TABLOCKX,HOLDLOCK)WHEREcolumn_name='value';--其他事务可以......
  • mysql、sqlserver、oracle分页,java分页统一接口实现
    定义:pageStart起始页,pageEnd终止页,pageSize页面容量oracle分页:rownum numfrom(实际传的SQL)where rownum<=pageEnd)wherenum>=pageStartsqlServer分页:           select*from(select top 页面容量from(select top字段Adesc)astemptable2orderb......
  • WEB漏洞—SQL注入之查询方式及报错盲注
     前言:当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。 #补充:上课的Access暴力猜......
  • MYSQL round()函数
    在mysql中,round函数用于数据的四舍五入,它有两种形式:1、round(x,d) ,x指要处理的数,d是指保留几位小数这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;2、round(x) ,其实就是round(x,0),也就是默认d为0;下面是几个实例1、查询: selectro......
  • mysql
    B树。b+树的区别:为什么,以及好处,坏处 。  B-树可以看成是平衡二叉树的多路树,每个节点上既存储索引关键字,又存储记录。查找时候从根节点开始查找。 B+树只有叶子结点存储记录,非叶子结点上存储关键字,mysql慢查询,如何优化。为什么选择N树,B+树 不选自,二叉树,红黑......
  • MySQL中时间函数NOW()和SYSDATE()的区别
    mysql中日期函数还是比较常用的。主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别。NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。因为NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句......
  • MySQL 将 字符串 转为 整数
    1、CAST(eprAStype)1)type为 SIGNEDSELECTCAST("-12"ASSIGNED);效果如下:2)type为UNSIGNEDSELECTCAST("-12"ASUNSIGNED);效果如下:2、CONVERT(expr,type)SELECTCONVERT('123',SIGNED);额外补充1、CAST和CONVERT两个函数中的type取值可以为:SIGNED,UNS......
  • ubuntu22安装docker、redis、mysql及部署net6应用
    一、更新系统软件包索引sudoaptupdate二、安装dockersudoaptinstalldocker.io三、在docker中安装Mysql拉取mysql镜像dockerpullmysql:latest查看镜像dockerimages运行容器dockerrun-itd-p3306:3306-eMYSQL_ROOT_PASSWORD=123456--namemysql......