前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >where in与join 查询

where in与join 查询

作者头像
WindCoder
发布2018-09-19 16:01:07
发布2018-09-19 16:01:07
1.9K00
代码可运行
举报
文章被收录于专栏:WindCoderWindCoder
运行总次数:0
代码可运行

前言

问题

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 是相同的。
代码语言:javascript
代码运行次数:0
运行
复制
--查询在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。

基础
代码语言:javascript
代码运行次数:0
运行
复制
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展示
进阶
代码语言:javascript
代码运行次数:0
运行
复制
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 区别

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 问题
    • 解决方案
  • 实例
    • 1、INNER JOIN(内连接)
    • 2、LEFT JOIN(左连接)
      • 基础
      • 进阶
  • 参考与扩展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档