where in与join 查询

前言

问题

Oracle:当前所用版本中,限制in中的参数不能超过 1000个。当超出时会被报错"ORA-01795异常(where in超过1000)的解决"。

MySQL:有人说有限制,有人说没限制。但尽量也是不要太多为好,容易造成全表扫描。

解决方案

  • 使用 inner join 代替 in
  • 使用 left in ... where ... is null 代替 not in

实例

1、INNER JOIN(内连接)

  • 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
  • INNER JOIN 与 JOIN 是相同的。
--查询在Orders存在的Persons,即有订购记录的用户
SELECT
	P .LastName,
	P .FirstName,
	o.OrderNo
FROM
	Persons P
INNER JOIN Orders o ON P .Id_P = o.Id_P
ORDER BY
	P .LastName

INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

2、LEFT JOIN(左连接)

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

基础

SELECT
	P .LastName,
	P .FirstName,
	o.OrderNo
FROM
	Persons P
LEFT JOIN Orders o ON P .Id_P = o.Id_P
ORDER BY
	P .LastName
  • LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
  • 当右表未匹配时会以null展示

进阶

SELECT
	p2.LastName,
	p2.FirstName,
	o2.OrderNo
FROM
	Persons p2
LEFT JOIN (
	SELECT
		P .LastName,
		P .FirstName,
		o.OrderNo
	FROM
		Persons P
	INNER JOIN Orders o ON P .Id_P = o.Id_P
) o2
WHERE
	o2.OrderNo IS NULL;
  • 先用 inner join 查询出有订单的用户,将该查询作为右表o2
  • Persons 继续做左表,此时为p2
  • p2 LEFT JOIN o2 查询左表所有信息,加上条件 o2.OrderNo is null 将有订单的用户过滤掉
  • 最终出来的是,没有下订单的用户,即代替了 not in实现。

参考与扩展

SQL INNER JOIN 关键字 SQL LEFT JOIN 关键字 inner join 和where 区别

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

理解MySQL——索引与优化

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记 录,DBMS的页面大小为4K...

752
来自专栏帘卷西风的专栏

关于SQL中Union和Join的用法

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

1033
来自专栏IT开发技术与工作效率

MySQL 8 列出相关依赖 使用CTE(公共数据表达式)

直接 SQL 实现递归的 with 语法——公共数据表达式 Common Table Expressions (CTE) 是一个命名的临时结果集,它存在于单个语...

2808
来自专栏Jerry的SAP技术分享

面试问题 - 只用位操作在ABAP里实现a+b

算法描述参考我的SCN博客 Just for fun – Implement a + b using pure bitwise operation in ABA...

3965
来自专栏Jerry的SAP技术分享

使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库

在表DBCON里维护一条记录,指向HANA数据库。con_ENV里填入HANA数据库的主机名和端口号。如vmXXXX:30015

4233
来自专栏c#开发者

递归查询

oracle -------------------------------------------------------------------------...

2664
来自专栏Linyb极客之路

MySQL 索引管理与执行计划

  索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索...

1244
来自专栏杨建荣的学习笔记

MySQL和Oracle对比学习之数据字典元数据(r4笔记第33天)

MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的。 毕竟学习的主线是MySQL,所以会从MySQL的角度来对...

2956
来自专栏面朝大海春暖花开

mysql树形结构递归查询

之前一直用的是Oracle,对于树形查询可以使用start with ... connect by 

6474
来自专栏java学习

数据库_mysq单表操作

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER ...

3285

扫码关注云+社区

领取腾讯云代金券