04 SQL是关于集合的
面向集合去思考
要想成为写SQL语句的高级专家, 最困难的是一个转变就是从面相过程的思维方式转变到面相集合的思维方式.
首先要停止那些一次处理一行数据的过程化步骤思维, 试着把思路转移到使用类似于 “for all”的短语上来. 例如: 如果我让你生成一个所有在公司里每个工作岗位上干了同样年数的员工的列表, 你会怎么做?
关键是要开始以后完成后的结果的形式(而不是以处理步骤的形式)来思考. 要找集合的特征而不是单独的步骤或行为.

另一种常见的但是却是错误的思考方式是将表看做是排过序的行的集合. 其实, 一张表代表一个集合, 集合是无序的.

举例:
任务是要计算出一个顾客在哥哥订单之间的平均天数. 集合的思维是: select (max(truc(order_date) – min(trunc(order_date))) / count(*) ) as avg_days_between from orders where customer_id = 102;
集合运算
UNION, UNION ALL, MINUS, INTERSECT.
UNION ALL 返回的值包含重复的.
UNION 返回来自所有输入查询的不包含重复值的结果集.
MINUS 返回在第一个输入查询中存在但是接下来的查询中不存在的非重复数据行
INTERSECT 返回在所有输入查询中都存在的非重复行.
条件:
- 所有输入查询必须返回相同数目的列.
- 每一列的数据类型必须与对应的其他输入查询一致.(存在隐式转换也可以)
- order by 子句不能在某个单独的查询中应用, 只能在整个查询的最后.
- 列名源自第一个输入查询.
每个输入查询都先被单独处理然后进行集合运算.



集合与空值
空值并不是一个值, 最多就是一个标记, 空值可以理解为”我不知道”. 举例:
select * from scott.emp where deptno not in (10, 20, 30); 这时, 如果deptno 是 null, 这行本来满足条件, 因为这行的 deptno 不是10,20,30 但是, 查询时不会包括这行, 说明, 空值除非显示声明, 它们不会被包含在结果集中. 空值不能进行比较, 不能与任何东西进行加, 减, 乘, 除运算. 另外, 只能使用 select * from emp where deptno is null, 而不能使用 select * from emp where deptno = null;
另外, group by 与 order by 会将所有的空值放在一起, 换句话说, 它们可以识别空值.
聚合函数会忽略空值, 例如 sum, count, avg, min 等 比如, count(*) 与 count(com) 的区别, 前一个会统计出所有行数, 而后一个会统计出所有com不为空的行数.
04 SQL是关于集合的的更多相关文章
- 【SQL查询】集合查询之INTERSECT
[SQL查询]集合查询之INTERSECT 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...
- SQL语句实例集合
SQL语句实例 表操作 例 1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- SQL记录-PLSQL集合
PL/SQL集合 集合是一个有序组具有相同的数据类型的元素.每个元素进行标识的唯一标表示其在集合中的位置. PL/SQL提供了三种集合类型: 索引表或关联数组 嵌套表 可变大小的数组或变长数组 Ora ...
- SQL入门之集合操作
尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下 ...
- SQL使用总结——集合操作函数
Oracle中集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配 ...
- SQL Server温故系列(4):SQL 查询之集合运算 & 聚合函数
1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 2.1.求行数函数 COUNT 2.2.求和函数 ...
- 恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合
在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee { private Inte ...
- SQL是关于集合的
一 以面向集合的思维方式来思考 公司里每个工作岗位上干了同样年数的员工列表 select emplyee_id from job_history group by employee_id h ...
- 过滤sql特殊字符方法集合
/// <summary> /// 过滤不安全的字符串 /// </summary> /// <param name="Str" ...
随机推荐
- ectouch第二讲之 文件结构
相信大家在ectouch官网都注意到了,ectouch采用的MVC框架,之前一直以为它用的和ecshop一样都是smarty,本鸟默默按照smarty的文件结构研究了好几天,结果是各种文件对不上号.无 ...
- bianwu 哈希表输出到 excel
一.输出到excel 函数: protected void InputFileTheme(object[] Header,object [] DataFileds,string sql,string ...
- Color Me Less 分类: POJ 2015-06-10 18:24 11人阅读 评论(0) 收藏
Color Me Less Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31693 Accepted: 15424 D ...
- 翻译之basename()
NAME top basename, dirname - parse pathname components SYNOPSIS top #include <libgen.h> char * ...
- 使用Jvisualvm监控JVM的内存、CPU、线程
最近做性能测试发现很多性能问题,面对一些开发小白的数据结构思想,真想喊一声:放开那个代码,让我来!冲动. 面对WEB站点开发,性能测试是经常要做的,下面一种介绍如何结合性能测试工具,更好的监控WEB服 ...
- bnu A Matrix 北京邀请赛A题
A Matrix Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class n ...
- 解决maven的“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
需要添加一个插件,在build标签中添加 <plugins> <plugin> <groupId>org.apache.maven.plugins</grou ...
- spring容器启动过程
1.AbstractApplicationContext的prepareRefresh()方法调用. 2.XmlBeanDefinitionReader的loadBeanDifinitions(Bea ...
- linux 切换多个jdk脚本
1,编写脚本 jdkswitch.sh #!/bin/sh # usage: . this_file [argvs] openjdk7_home=/usr/lib/jvm/java--openjdk- ...
- Java发送邮件,所遇到的常见需求
明天要做关于发送邮件的接口,虽然我之前已用Java Mail做过许多关于邮件的发送.但同事说有点难点,虽我还不知难点在哪,还是要复习下.凡事预则立,不预则废嘛~ 所需的包: Java Mail : 目 ...