首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >More SQL(Focus Subqueries、Join)

More SQL(Focus Subqueries、Join)

作者头像
小陈又菜
发布2025-12-23 16:28:00
发布2025-12-23 16:28:00
1230
举报

Subqueries

  • A parenthesized SELECT-FROM-WHERE statement (subquery ) can be used as a value in a number of places, including FROM and WHERE clauses.(将子查询的结果作为一张表进行查询)
  • Example: in place of a relation in the FROM clause, we can use a subquery and then query its result.
  • Must use a tuple-variable to name tuples of the result.(必须为子查询的这张临时表命名)

Subqueries That Return One Tuple

  • If a subquery is guaranteed to produce one tuple, then the subquery can be used as a value.
  • Usually, the tuple has one component.
  • A run-time error occurs if there is no tuple or more than one tuple.

例题:

子查询的优先级比父查询的优先级更高

Subqueries and Self Connection

思考题:是不是所有的额子查询都能够写成连接形式,又是不是所有的连接都能写成子查询形式?并且思考两者的效率如何?

The IN Operator

  1. <tuple> IN (<subquery>) is true if and only if the tuple is a member of the relation produced by the subquery.(IN表达式正确当且仅当元组在子查询返回的结果中)
  2. Opposite: <tuple> NOT IN (<subquery>).
  3. IN-expressions can appear in WHERE clauses.

The Exists Operator

  • EXISTS(<subquery>) is true if and only if the subquery result is not empty.
  • Example: From Beers(name, manf) , find those beers that are the unique beer by their manufacturer.
代码语言:javascript
复制
SELECT name
FROM Beers b1
WHERE NOT EXISTS (
    SELECT *
    FROM Beers
    WHERE manf = b1.manf AND
    name <> b1.name);

The Operator ANY

  • x = ANY(<subquery>) is a boolean condition that is true if x equals at least one tuple in the subquery result.(ANY语句为真当且仅当x与其中的至少一个元组相同)

= could be any comparison operator.(=可以是其他的运算符号) Example: x >= ANY(<subquery>) means x is not the uniquely smallest tuple produced by the subquery.

  • Note tuples must have one component only.

The Operator ALL

  • x <> ALL(<subquery>) is true if for every tuple t in the relation, x is not equal to t.
  • That is, x is not in the subquery result.

<> can be any comparison operator. Example: x >= ALL(<subquery>) means there is no tuple larger than x in the subquery result.

Union, Intersection, and Difference(交并差)

Union, intersection, and difference of relations are expressed by the following forms, each involving subqueries:

  • (<subquery>) UNION (<subquery>)
  • (<subquery>) INTERSECT (<subquery>)
  • (<subquery>) EXCEPT (<subquery>)

要注意的是:UNION产生的结果是一个集合,集合是不允许出现重复元素的,但如果写法是(UNION ALL那么产生的结果是一个包,包中是允许重复元素的)

深入思考:交、并、差运算的前提应该都是排序,所以说在排序之后便直接产生了集合

Bag Semantics

  • Although the SELECT-FROM-WHERE statement uses bag semantics, the default for union, intersection, and difference is set semantics.
  • That is, duplicates are eliminated as the operation is applied.

Controlling Duplicate Elimination

  • Force the result to be a set by SELECT DISTINCT . . .
  • Force the result to be a bag (i.e., don’t eliminate duplicates) by ALL, as in . . . UNION ALL . . .

Inner Joins

代码语言:javascript
复制
SELECT buyer_name, sales.buyer_id, qty
FROM buyers INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id

Outer Joins

代码语言:javascript
复制
SELECT buyer_name, sales.buyer_id, qty
FROM buyers LEFT OUTER JOIN sales
ON buyers.buyer_id = sales.buyer_id
代码语言:javascript
复制
SELECT buyer_name, sales.buyer_id, qty
FROM sales RIGHT OUTER JOIN buyers
ON buyers.buyer_id = sales.buyer_id

内连接和外连接的核心区别在于对于未匹配行的处理:

特性

内连接(INNER JOIN)

外连接(OUTER JOIN)

匹配策略

仅保留两表中完全匹配的行

保留至少一个表的所有行,未匹配的部分用 NULL 填充

结果集大小

可能小于或等于参与连接的表的行数之和

可能等于或大于参与连接的表的行数之和

默认关键字

JOIN(等价于 INNER JOIN)

必须显式指定类型(LEFT/RIGHT/FULL)

数据完整性

丢弃未匹配的数据

保留所有数据(通过 NULL 表示无匹配)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Subqueries
  • Subqueries That Return One Tuple
  • Subqueries and Self Connection
  • The IN Operator
  • The Exists Operator
  • The Operator ANY
  • The Operator ALL
  • Union, Intersection, and Difference(交并差)
  • Bag Semantics
  • Controlling Duplicate Elimination
  • Inner Joins
  • Outer Joins
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档