首页
学习
活动
专区
圈层
工具
发布

《SQL Cookbook》 - 第三章 多表查询

为了避免NOT IN和NULL值带来的问题,可以结合使用NOT EXISTS和关联子查询。关联子查询指的是外层查询执行的结果集会被内层子查询引用。...EXISTS/NOT EXISTS和关联子查询一起使用时,SELECT中的列,不重要,之所以使用了NULL,是为了让注意力集中在子查询的连接操作上,而不是SELECT的列上。 5. ...从一个表检索和另一个表不相关的行 基于共同列将两个表连接起来,返回一个表的所有行,不论这些行在另一个表中是否存在匹配行,然后,只存储这些不匹配的行即可。...组合适用连接查询和聚合函数 如果连接查询产生了重复行,通常有两种办法来使用聚合函数, (1) 调用聚合函数时,使用关键字DISTINCT,每个值都会先去掉重复项再参与计算。...多个表中返回缺少的值 使用全外连接,基于一个共同值从两个表中返回缺少的值,全外连接查询就是合并两个表的外连接查询的结果集。

2.9K50

PostgreSQL基础知识整理

可以使用WHERE子句DELETE查询删除所选行,否则所有的记录会被删除。...可以使用子查询的有SELECT,INSERT,UPDATE和DELETE语句,与运算符如=,,>=,使用。有几个子查询必须遵循的规则: 必须用括号括起来的子查询。...子查询只能有一个在SELECT子句中的列,除非多列在主查询的查询来比较其选定的列。 ORDER BY不能使用在子查询中,虽然主查询就可以使用ORDER BY。...GROUP BY可以用来执行相同的功能在子查询中的ORDER BY。 子查询返回多于一行只能用于使用多值的运算符,如为IN,EXISTS,IN,ANY / SOME,ALL运算符。...EXISTS指定一个子查询,检测行的存在。NOT EXISTS的作用与EXISTS正好相反。如果子查询没有返回行,则满足了NOT EXISTS中的WHERE子句。

4.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据库系统概述——第三章 关系数据库标准语言SQL(知识点复习+练习题)

    A.从职工表中删除行(‘025’,‘王芳’,‘03’,720) B.将行(‘005,’,‘乔兴’,‘04’,750)插入到职工表中 C.将职工号为,‘001’的工资改为700 D.将职工号为,’038’...的部门号改为‘03’ 5、在SQL语言中,用来测试一个集合里是否有重复元组存在,使用下列哪一个关键字(A) A.UNIQUE B.DISTINCT C.EXISTS D.NOT IN 6、SQL数据查询语句...SELECT Sname,2012-Sage /*假定当年的年份为2012年,减去年龄 即得出生年份*/ FROM Student; (2)选择表中的若干元组 取消取值重复的行:(指定DISTINCT关键词...,去掉表中重复的行) 例:查询选修了课程的学生号码 SELECT DISTINCT Sno (使用DISTINCT关键词取消了重复学号的行) FROM SC; 查询满足条件的行:(WHERE语句) 例:...,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname=‘ 刘晨 ’); 带有比较运算符的子查询:(当内查询的结果是一个值时

    40210

    详解SQL集合运算

    为什么使用集合运算: 1.在集合运算中比联接查询和EXISTS/NOT EXISTS更方便。 在阅读下面的章节时,我们可以先把环境准备好,以下的SQL脚本可以帮助大家创建数据库,创建表,插入数据。...如果输入的查询1的第一列为char类型,输入的查询2的第一列为datetime类型,则会提示转换失败:从字符串转换日期和/或时间时,转换失败; (6)集合运算结果中列名由输入的查询1决定,如果要为结果分配结果列...,应该在输入的查询1中分配相应的别名; (7)集合运算时,对行进行进行比较时,集合运算认为两个NULL相等; (8)UNION支持DISTINCT和ALL。...进行查询,如果custid或empid其中有null值存在,则不能用NOT EXISTS进行查询,因为比较NULL值的结果是UNKNOWN,这样的行用NOT EXISTS查询返回的子查询的行会被过滤掉,...custid或empid其中有null值存在,则不能用EXISTS进行查询,因为比较NULL值的结果是UNKNOWN,这样的行用EXISTS查询返回的子查询的行会被过滤掉,所以最后的外查询会少NULL值的行

    2.6K80

    高效sql性能优化极简教程

    ) 应用执行计划 执行必要的I/O和排序操作 提取(FETCH) 从查询结果中返回记录 必要时进行排序 使用ARRAY FETCH机制 七,sql表的基本连接方式 表连接有几种?...(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为:左连接、右连接、完全外连接。...5,用exists、not exists和in、not in相互替代 原则是哪个的子查询产生的结果集小,就选哪个 select * from t1 where x in (select y from...6,使用exists替代distinct 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在select子句中使用distinct,一般可以考虑使用exists代替,exists使查询更为迅速...子句中对列的任何操作结果都是在sql运行时逐行计算得到,因此它不得不进行全表扫描,而没有使用上面的索引;如果这些结果在查询编译时就能得到,那么就可以被sql优化器优化,使用索引,避免全表扫描,因此sql

    3.7K50

    【T-SQL基础】03.子查询

    在逻辑上,子查询会为每个外部行单独计算一次。 标量子查询:返回单个值的子查询。标量子查询可以出现在外部查询中期望使用单个值的任何地方。 多值子查询:在一个列中 为什么要使用子查询?...一、独立子查询 1.独立标量子查询(查看练习题1,2) 例子:从HR.Employees表中返回empid最大的员工信息。...2.如果标量子查询没有返回任何值,其结果就转换为NULL,和NULL行进行比较得到的是UNKNOWN,查询过滤器不会返回任何让过滤表达式计算结果为UNKNOWN的行。...3.子查询之distinct关键字 当我们想要剔除掉子查询中的重复值时,会想到在子查询中不必指定distinct关键字,其实是没有必要的,因为数据库引擎会帮助我们删除重复的值,而不用我们显示指定distinct...如果O1中某行的订单日期和子查询返回的订单日期匹配,那么O1中的这个订单日期就是当前客户的最大的订单日期,在这种情况下,查询便会返回O1表中的这个行。

    2.2K60

    SQL 进阶技巧(上)

    2、注释,有单行注释和多行注释,如下 -- 单行注释 -- 从SomeTable中查询col_1 SELECT col_1 FROM SomeTable; /* 多行注释 从 SomeTable...SQL 性能优化技巧 一、参数是子查询时,使用 EXISTS 代替 IN 如果 IN 的参数是(1,2,3)这样的值列表时,没啥问题,但如果参数是子查询时,就需要注意了。比如,现在有如下两个表: ?...如果使用 EXISTS,那么只要查到一行数据满足条件就会终止查询, 不用像使用 IN 时一样扫描全表。...ON A.id = B.id; 用到了 「id」列上的索引,而且由于没有子查询,也不会生成临时表 二、避免排序 SQL 是声明式语言,即对用户来说,只关心它能做什么,不用关心它怎么做。...八、减少中间表 在 SQL 中,子查询的结果会产生一张新表,不过如果不加限制大量使用中间表的话,会带来两个问题,一是展示数据需要消耗内存资源,二是原始表中的索引不容易用到,所以尽量减少中间表也可以提升性能

    1.3K20

    让SQL起飞(优化)

    1.1 子查询用EXISTS代替IN 当IN的参数是子查询时,数据库首先会执行子查询,然后将结果存储在一张临时的工作表里(内联视图),然后扫描整个视图。很多情况下这种做法都非常耗费资源。...使用EXISTS的话,数据库不会生成临时的工作表。但是从代码的可读性上来看,IN要比EXISTS好。使用IN时的代码看起来更加一目了然,易于理解。...因此,如果确信使用IN也能快速获取结果,就没有必要非得改成EXISTS了。 这里用Class_A表和Class_B举例, 图片 我们试着从Class_A表中查出同时存在于Class_B表中的员工。...(同样的IN也可以使用索引,这不是重要原因) 如果使用EXISTS,那么只要查到一行数据满足条件就会终止查询,不用像使用IN时一样扫描全表。在这一点上NOT EXISTS也一样。...实际上,大部分情况在子查询数量较小的场景下EXISTS和IN的查询性能不相上下,由EXISTS查询更快第二点可知,子查询数量较大时使用EXISTS才会有明显优势。

    1.7K42

    MySQL数据库:SQL优化与索引优化

    4、避免使用select的内联子查询: 在select后面有子查询的情况称为内联子查询,SQL返回多少行,子查询就需要执行过多少次,严重影响SQL性能。...对于连续的数值,能用 between 就不要用 in: 10、小表驱动大表,即小的数据集驱动大的数据集: in 和 exists 都可以用于子查询,那么 MySQL 中 in 和 exists 有什么区别呢...(2)in在内表查询或者外表查询过程中都会用到索引;exists仅在内表查询时会用到索引 (3)一般来说,当子查询的结果集比较大,外表较小使用exist效率更高;当子查询的结果集较小,外表较大时,...(4)对于 not in 和 not exists,not exists 效率比 not in 的效率高,与子查询的结果集无关,因为 not in 对于内外表都进行了全表扫描,没有使用到索引。...not exists的子查询中可以用到表上的索引。

    1.7K20

    SQL进阶-9-谓词exists使用

    extists谓词不仅可以将多行数据作为整体来表达高级的条件,还可以在使用关联子查询时表现出良好的性能。...将B中全部行记录作为参数 from Bar B where F.id=B.id); Exists的子查询中,select子句的列表中可以有3种写法:...都不满足条件P SQL中实现全称量化,需要将所有的行都满足条件P转成不存在不满足条件P的行 案例1-查询没有参会人员 需求 从Meeting表中找出没有参会的人员 ?...-- 小于50分的科目 需求2-查询分数 某个学生的所有行记录中,如果科目是数学,则分数在80分以上;如果科目是语文,则分数在50以上 SQL实现 select distinct student_id...需求3-查询全是1的行 从下面的表中找出全部是1的行 ?

    1.3K20

    Sql 语句中 IN 和 EXISTS 的区别及应用「建议收藏」

    EXISTS语句:执行student.length次 指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。...但是,不一样的是它们的执行流程完全不一样:   使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是: select *...区别及应用场景     in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists...not in 和not exists     如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。...11、用exists替换distinct: 当提交一个包含一对多表信息的查询时,避免在select子句中使用distinct.

    1.2K30

    MySQL优化总结

    clo = 1 那么,使用这条sql查询,可直接从(clo1,clo2)索引树中获取数据,无需回表查询 因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。...join 3.避免 SELECT *,从数据库里读出越多的数据,那么查询就会变得越慢 4.尽可能的使用 NOT NULL列,可为NULL的列占用额外的空间,且在值比较和使用索引时需要特殊处理,影响性能...5.用exists、not exists和in、not in相互替代 原则是哪个的子查询产生的结果集小,就选哪个 select * from t1 where x in (select y from...6、使用exists替代distinct 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在select子句中使用distinct,一般可以考虑使用exists代替,exists使查询更为迅速...SELECTDEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询DERIVED:导出表的SELECT(FROM子句的子查询) table 输出的行所引用的表 type 联接类型

    2.1K40

    MySQL秘籍之索引与查询优化实战指南

    128 ) COMMENT '用户名称';1.1.2 增删改查询和更新指令构成了 SQL 的 DML 部分:SELECT - 从数据库表中获取数据UPDATE - 更新数据库表中的数据DELETE...- 从数据库表中删除数据INSERT INTO - 向数据库表中插入数据插入一条数据INSERT INTO 语句INSERT INTO 语句用于向表格中插入新的行。...当 name和role都是索引时,使用一张表中的多个索引时,mysql会将多个索引合并在一起。...3SUBQUERY在SELECT或WHERE列表中包含了子查询。4DERIVED在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中。...虽然ALL和Index都是读全表,但index是从索引中读取的,而ALL是从硬盘读取的。7ALLFull Table Scan将遍历全表以找到匹配的行。

    57910

    SQL养成这8个好习惯是一笔财富

    OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束 4...:处理select列表产生vt8 9.DISTINCT:将重复的行从vt8中去除产生vt9 10.ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10 11.TOP:从...(2)当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。...C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。...六、子查询的用法 子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。

    33810

    【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询

    选择表中的若干元组 消除取值重复的行,如果没有指定DISTINCT关键词,则缺省为ALL 【1】查询选修了课程的学生学号。...Cno= ' 2 '); 说明: 上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询 SQL语言允许多层嵌套查询【即一个子查询中还可以嵌套其他子查询】 子查询的限制,不能使用ORDER...使用ANY或ALL谓词时必须同时使用比较运算 语义为: > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 子查询结果中的某个值...指定要删除的元组 缺省表示要删除表中的全部元组,表的定义仍在字典中 三种删除方式 删除某一个元组的值 删除多个元组的值 带子查询的删除语句 【1】 删除学号为201215128的学生记录...这是一场独特的学习冒险,从基本概念到算法实现,逐步揭示更深层次的模式分析、匹配算法和智能模式识别的奥秘。渴望挑战数据库SQL Server中的模式匹配学习路径和掌握信息领域的技术?

    1.2K10

    如何写出更快的 SQL (db2)

    首先要明白什么是执行计划 执行计划是数据库根据 SQL 语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条 SQL 语句如果用来从一个 10 万条记录的表中查 1...exists 代替 in 当()中的数据量较大时使用 exists() ,较少时可以使用 in ()。...like ‘%xx%’ 不会执行索引 like ‘y%xx%’ 会执行索引 用 TRUNCATE 替代 DELETE 来清空一个表 当删除表中的记录时,在通常情况下, 回滚段 (rollback segments...在这种情况下, 使用EXISTS(或 NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN 子句将执行一个内部的排序和合并。...(比如部门表和雇员表)的查询时,避免在SELECT 子句中使用 DISTINCT, 一般可以考虑用 EXIST 替换, EXISTS 使查询更为迅速,因为 RDBMS 核心模块将在子查询的条件一旦满足后

    2.6K20

    数据仓库开发 SQL 使用技巧总结

    in 好 -- in/notin -- 略 -- exists/not exists(略) -- 子查询是相关的, 对于 scores 表中的每一行,子查询检查 class 表中是否有对应的行。 ...如果有匹配行,则子查询返回一个使外部查询包含 scores 表中的当前行的子查询。 ...如果没有相应的行,则子查询不返回导致外部查询不包括结果集中 scores 表中的当前行的行 select     id, score from     scores where     exists(...可通过在 left semi join, where ...in 和 where exists 中嵌套子查询来实现。...,不是按照索引从表内读行,无法利用索引Using index 表示覆盖索引得到结果,避免回表Using where 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回,表示对表的全部请求都是索引的部分

    3.6K30

    Oracle性能优化-子查询到特殊问题

    SQL> select * from dual where 2 not in (select 1 from dual); D - X SQL> select * from dual where 2 not...IN/EXISTS 从原理来讲,IN操作是先进行子查询操作,再进行主查询操作。EXISTS操作是先进行主查询操作,再到子查询中进行过滤。...IN操作相当于对inner table执行一个带有distinct的子查询语句,然后得到的查询结果集再与outer table进行连接,当然连接的方式和索引的使用仍然等同于普通的两表连接。...当子查询表数据量巨大且索引情况不好(大量重复值等),则不宜使用产生对子查询的distinct检索而导致系统开支巨大的IN操作;反之当外部表数据量巨大(不受索引影响)而子查询表数据较少且索引良好时,不宜使用引起外部表全表扫描的...如果限制性强的条件在子查询,一般建议使用IN操作。如果限制性强的条件在主查询,则使用EXISTS操作。 2. NOT IN/EXISTS 在子查询中,NOT IN子句将执行一个内部的排序和合并。

    2.1K70

    3.4 《数据库系统概论》之数据查询—SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    ❶ 算术表达式 ❷ 字符串常量及函数 ❸ 使用列别名改变查询结果的列标题 (2)选择表中的若干元组(行) ① 关键词DISTINCT去掉表中重复的行 ② 查询满足条件的元组(行) ❶ 比较大小 ❷ 确定范围...(行) ① 关键词DISTINCT去掉表中重复的行 如果没有指定DISTINCT关键词,则缺省为ALL SELECT Sno FROM SC; /*等价于:*/ SELECT ALL Sno FROM...指定DISTINCT关键词,去掉表中重复的行 SELECT DISTINCT Sno FROM SC; ② 查询满足条件的元组(行) 常用的查询条件 查询条件 谓词 比较 =,>,=,表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续 找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组...)和右表(table2)其中一个表中存在匹配,则返回行。

    7K20

    SQL好的写法

    为真的行才被插入vt2     3.OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束...> 为true的组才插入vt7     8.SELECT:处理select列表产生vt8     9.DISTINCT:将重复的行从vt8中去除产生vt9     10.ORDER BY:将vt9的行按...(2)当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。     ...C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。   ...六、子查询的用法   子查询是一个 SELECT 查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。

    1.2K20
    领券