针对相同的表进行的连接被称为“自连接”(self join)。一旦熟练掌握自连接技术, 我们便能快速地解决很多问题。

可重排列、排列、组合

-- 现有张表Products,内有一列name包含3个元素:苹果、橘子、香蕉-- 生成有序对(笛卡尔乘积)
SELECT P1.name AS name_1, P2.name AS name_2
FROM Products P1, Products P2;
-- 答案:(苹果,苹果),(苹果,橘子),(苹果,香蕉);
--          (橘子,苹果),(橘子,橘子),(橘子,香蕉);
--          (香蕉,苹果),(香蕉,橘子),(香蕉,香蕉);-- 排除掉由相同元素构成的对
SELECT P1.name AS name_1, P2.name AS name_2
FROM Products P1, Products P2
WHERE P1.name <> P2.name;
-- 答案:(苹果,橘子),(苹果,香蕉);
--          (橘子,苹果),(橘子,香蕉);
--          (香蕉,苹果),(香蕉,橘子);-- 用于获取组合的 SQL 语句
SELECT P1.name AS name_1, P2.name AS name_2
FROM Products P1, Products P2
WHERE P1.name > P2.name;
-- 答案:(苹果,橘子);
--          (香蕉,橘子);
--          (香蕉,苹果);
-- 原理:这条 SQL 语句所做的是,按字符顺序排列各商品,只与“字符顺序比自己靠前”的商品进行配对。
-- 到这里,我们终于得到了无序对。-- 想要获取 3 个以上元素的组合时,像下面这样简单地扩展一下就可以
SELECT P1.name AS name_1, P2.name AS name_2, P3.name AS name_3
FROM Products P1, Products P2, Products P3
WHERE P1.name > P2.name AND P2.name > P3.name;
-- 答案:(香蕉,苹果,橘子);
  • 如这道例题所示,使用等号“=”以外的比较运算符,如“<、>、<>” 进行的连接称为“非等值连接”。这里将非等值连接与自连接结合使用了,因此称为“非等值自连接”。

删除重复行

重复行有多少行都没有关系。通常,如果重复的列里不包含主键,就可以用主键来处理,但像这道例题一样所有的列都重复的情况,则需要使用由数据库独自实现的行 ID。这里的行 ID 可以理解成拥有“任何表都可以使用的主键”这种特征的虚拟列。

-- 用于删除重复行的 SQL 语句 (1) :使用极值函数
-- 在下面的 SQL 语句里,我们使用的是 Oracle 数据库里的 rowid
delete from products p1
where rowid < (select max(p2.rowid)from products p2where p1.name = p2.name and p1.price = p2.price);-- 用于删除重复行的 SQL 语句 (2) :使用非等值连接
DELETE FROM Products P1
WHERE EXISTS ( SELECT *FROM Products P2WHERE P1.name = P2.nameAND P1.price = P2.price AND P1.rowid < P2.rowid )

查找局部不一致的列

-- 用于查找是同一家人但住址却不同的记录的 SQL 语句
SELECT DISTINCT A1.name, A1.address
FROM Addresses A1, Addresses A2
WHERE A1.family_id = A2.family_id AND A1.address <> A2.address ;

排序

-- 排序 :使用窗口函数
-- 在出现相同位次后,rank_1 跳过了之后的位次,rank_2 没有跳过, 而是连续排序。
SELECT name, price, RANK() OVER (ORDER BY price DESC) AS rank_1, DENSE_RANK() OVER (ORDER BY price DESC) AS rank_2
FROM Products;-- 不依赖于具体数据库来实现的方法。下面是用非等值自连接
SELECT P1.name, P1.price, (SELECT COUNT(P2.price)FROM Products P2WHERE P2.price > P1.price) + 1 AS rank_1
FROM Products P1 ORDER BY rank_1;

本节要点

  1. 自连接经常和非等值连接结合起来使用。
  2. 自连接和GROUP BY结合使用可以生成递归集合。
  3. 将自连接看作不同表之间的连接更容易理解。
  4. 应把表看作行的集合,用面向集合的方法来思考。
  5. 自连接的性能开销更大,应尽量给用于连接的列建立索引。

MICK-SQL进阶教程 1.2 自连接的用法相关推荐

  1. SQL进阶教程—自链接的用法

    用法 https://moonshuo.cn/posts/14085.html 可重排列,排列,组合 需求:现在我需要将这个水果的品种各个组合起来,构成一个有序对的组合 在这个过程中首先执行完毕fro ...

  2. 【SQL学习笔记】《SQL进阶教程》1.1

    SQL进阶教程学习笔记1.1 1-1case 表达式 将已有编号方式转换为新的方式并统计 SELECT CASE pref_nameWHEN '辽宁' THEN '东北'WHEN '福建' THEN ...

  3. 【SQL进阶教程】第一章 case表达式

    本系列基于<SQL进阶教程>(如下图)学习,实现了书中代码及练习题代码.PS:电子书请大家各自默默脚本之家. [知识点1]case表达式概述 Case表达式有简单case表达式和搜索cas ...

  4. SQL进阶教程—CASE表达式

    所有的文件在SQL进阶教程 (ituring.com.cn),随书下载那里 概述 文章原址 基本写法 简单CASE表达式 SELECT CASE 列名称WHEN 匹配字符 THEN 转换字符WHEN ...

  5. 【SAP Hana】X档案:SAP HANA SQL 进阶教程

    SAP HANA SQL 进阶教程 5.HANA SQL 进阶教程 (1)Databases (2)User & Role (3)Schemas (4)Tables (5)Table Inde ...

  6. sql 视图不排序_算法工程师SQL进阶:神奇的自连接与子查询

    自连接与子查询是SQL中非常重要的两项技术,自连接是针对相同的表的联结方法,是SQL语言面向集合编程思想的集中体现,而子查询有很多变式,关联子查询技术是在实际中进行行与行之间的比较时非常重要的方法,特 ...

  7. 【SQL学习笔记】《SQL进阶教程》1.2

    1-2自连接的用法 自连接+非等值连接 自连接+GROUP BY = 递归集合 表是行的集合,面向集合 开销较大 唯二重要的方法 CASE 自连接 SQL语言 : 面向集合的特性 可重排列.排列.组合 ...

  8. SQL进阶教程——自连接的用法(第二章)

    1. 什么是自连接 针对相同的表进行的连接被称为"自连接",一旦熟练掌握自连接技术,我们便能快速的解决很多问题.但是,其处理过程不太容易想象,以至于常常被人们敬而远之. 理解自连接 ...

  9. SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师

    目录 第一部分:基础--增删查改 [第一章]做好准备 Getting Started (时长25分钟) [第二章]在单一表格中检索数据 Retrieving Data From a Single Ta ...

最新文章

  1. vj p1042捕风捉影 题解
  2. 如何在bash中等待多个子进程完成并在任何子进程以代码!= 0结尾时返回退出代码!= 0?
  3. 计算机系统结构研究分支,“计算机系统结构” 课程教学探讨[J] 电子科技大学.doc...
  4. WEBApp-搭建Android开发环境
  5. Spring Boot——不同环境调用不同的配置文件解决方案
  6. 【CentOS Linux 7】实验2【Shell编程及应用】
  7. from mysql_MySQL的FROM
  8. Splash resource_timeout 属性
  9. 关于XML字符串和XML Document之间的转换
  10. ★C语言期末课程设计★——教师工资管理系统(详细报告+源代码+详细注释)
  11. 开源成语答题小程序红包设置教程
  12. 徐家骏:我在华为工作十年的感悟
  13. 【python 监控报警】python自动发钉钉机器人报警
  14. GPS北斗模块串口助手输出测试
  15. 2022山东大学控制科学与工程学院研究生新生学业奖学金评奖排序细则
  16. xampp 配置php版本,XAMPP各个版本配置
  17. librosa audioread.NoBackendError
  18. Outlook邮件存档设置
  19. php褚洪波,怎么学好php - 褚洪波的个人空间 - OSCHINA - 中文开源技术交流社区
  20. 医疗器械计算机系统审评准则,医疗器械注册审评管理系统

热门文章

  1. 数据解读 | 中国网络小说出海:老外也逃不开屌丝逆袭的套路
  2. [R]直方圖(Histogram)的用法
  3. Android O Working With Fonts
  4. c语言笔记:对a[i++]的理解
  5. 2023年10个最适合外贸网站的WordPress主题推荐
  6. java中自动刷新的语句_页面自动刷新代码大全
  7. Word文件删除限制密码的方法
  8. 计算机网络体系结构基础
  9. dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法
  10. python使用linux命令复制文件示例