
SQL进阶教程
「已注销」
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
1-1 case表达式-SQL进阶教程
1-1 CASE 表达式 ■ CASE 表达式的写法 -- 简单case表达式 case sex when '1' then '男' when '2' then '女' else '其他' end -- 搜索case表达式 case when sex='1' then '男' when sex='2' then '女' else '其他' end ■ 剩余的WHEN 子句被忽略的写...原创 2019-06-06 15:33:35 · 363 阅读 · 1 评论 -
1-7练习题-SQL进阶教程
练习题1-7-1 :改进“只使用union的比较” 在“比较表和表:检查集合相等性之基础篇”部分,我们学习了只使用了union的SQL语句。当时我们提到,在使用这条SQL语句之前需要事先查一下两张表的行数是否相等。实际上,我们稍微修改一下,就可以不需要判断行数也能直接执行。请考虑一下该如何修改 select ( case when count(*)=(select count(*) from ...原创 2019-08-26 11:24:03 · 262 阅读 · 0 评论 -
1-8 exists谓词的用法-SQL进阶教程
谓词是一种特殊的函数,返回值是真值(true 、false或者unknown) 例如,“= 、< 、> ”等比较谓词,以及between、like 、in 、is null等 在exists的子查询里, select子句的列表可以有下面这三种写法 通配符:SELECT * 常量:SELECT ‘这里的内容任意’ 列名:SELECT col 全称量词∀(for All x):所有的x...原创 2019-08-27 16:22:21 · 327 阅读 · 0 评论 -
1-8练习题-SQL进阶教程
练习题1-8-1 :数组表——行结构表的情况 在“对列进行量化:查询全是1的行”部分,我们讨论了对模拟数组的表按“列方向”量化的方法。接下来我们将正文中的表改成行结构的表,并通过这张表来练习一下。“i”列表示数组的下标,因此主键是“key, i ” 一个实体对应10行数据,所以上面的表省略了一部分以方便显示。A、B、C的元素和正文中是一样的。key为A的行val全都是null,key为B的行中只...原创 2019-08-27 17:36:51 · 262 阅读 · 0 评论 -
1-9 用SQL处理数列-SQL进阶教程
生成连续编号原创 2019-08-28 15:36:43 · 495 阅读 · 0 评论 -
1-9练习题-SQL进阶教程
练习题1-9-1 :求所有的缺失编号——not exists和外连接 正文中提到过,SQL里有很多方法可以实现差集运算。正文里介绍了使用except和not in实现的方法。请思考一下使用not exists和外连接实现的方法 -- not exists版 select seq from Sequence S where seq between 1 and 12 and not exists(...原创 2019-08-28 16:02:34 · 212 阅读 · 0 评论 -
1-10 having子句又回来了-SQL进阶教程
各队,全体点名 查出现在可以出勤的队伍。可以出勤即队伍里所有队员都处于“待命”状态 -- 用谓词表达全称量化命题 select team_id,member from Teams T1 where not exists( select * from Teams T2 where T1.team_id=T2.team_id and status<>'待命' ); -- 用集合...原创 2019-08-29 10:41:47 · 220 阅读 · 0 评论 -
1-10练习题-SQL进阶教程
练习题1-10-1 :单重集合与多重集合的一般化 在“单重集合与多重集合”部分,我们只针对material一个字段检查了集合中是否存在重复值。这次我们考虑一下推而广之,针对多个字段检查是否存在重复 我们在原来的表中加上“原产国”这样一个字段,作为测试数据 请从表中查出材料和原产国两个字段都重复的生产地 select center from Materials2 group by center ...原创 2019-08-29 11:02:13 · 411 阅读 · 0 评论 -
1-11 让SQL飞起来-SQL进阶教程
使用高效的查询 参数是子查询时,使用exists代替in -- 从Class_A表中查出同时存在于Class_B表中的员工 select * from Class_A where id in(select id from Class_B); select * from Class_A A where exists (select * from Class_B B where A.id=B.i...原创 2019-08-29 17:39:24 · 371 阅读 · 0 评论 -
1-7 用SQL进行集合运算-SQL进阶教程
导入篇:集合运算的几个注意事项 注意事项 1:SQL能操作具有重复行的集合,可以通过可选项all来支持(eg.union all) 集合运算符为了排除掉重复行,默认地会发生排序,而加上可选项all之后,就不会再排序,所以性能会有提升 注意事项 2:集合运算符有优先级 intersect比union和except优先级更高 当同时使用union和intersect,又想让union优先执行时,必须用...原创 2019-08-26 11:05:21 · 294 阅读 · 0 评论 -
1-6练习题-SQL进阶教程
练习题1-6-1 :简化多行数据的比较 在“用列表展示与上一年的比较结果”部分,我们比较了企业每年的营业额与上一年相比是否增加。其实,第一条SQL的性能还有改善的余地。在三个when子句里,同样的子查询执行了三次,有点多余,所以请把它们整合在一个when子句里 练习题1-6-2 :使用overlaps查询重叠的时间区间 很多人都不知道,SQL-92提供了overlaps谓词(Oracle和Post...原创 2019-08-23 11:01:14 · 305 阅读 · 0 评论 -
1-6 用关联子查询比较行与行-SQL进阶教程
增长、减少、维持现状 -- 求与上一年营业额一样的年份(1):使用关联子查询 select year,sale from Sales S1 where sale=(select sale from Sales S2 where S2.year=S1.year-1) order by year; -- 求与上一年营业额一样的年份(2):使用自连接 select S1.year,S1.sale f...原创 2019-08-23 10:18:13 · 230 阅读 · 0 评论 -
1-1练习题-SQL进阶教程
1-1 CASE 表达式 ●练习题1-1-1 :多列数据的最大值 -- 求x,y和z中的最大值 select key, case when case when x<y then y else x end<z then z else case when x<y then y else x end end as greatest ...原创 2019-06-06 15:35:45 · 636 阅读 · 0 评论 -
1-2 自连接的用法-SQL进阶教程
针对相同的表进行的连接被称为“自连接”(self join) 面向对象语言以对象的方式来描述世界,而面向集合语言SQL以集合(eg.二维表) 的方式来描述世界 可重排列、排列、组合 有序对(ordered pair) <1, 2> ≠ <2, 1> - 排列 无序对(unordered pair) {1, 2} = {2, 1} - 组合 ...原创 2019-06-21 16:57:52 · 522 阅读 · 0 评论 -
1-2练习题-SQL进阶教程
1-2 自连接的用法 ●练习题1-2-1 :可重组合 请使用 P.22 的表 Products,求出两列可重组合。结果应该如下所示 因为是组合,所以(香蕉, 橘子)和(橘子, 香蕉)这样顺序相反的对 被视为相同的对。此外,因为允许重复,所以结果里也出现了(橘 子, 橘子)这样的对 ●练习题1-2-2 :分地区排序 P.29 的“排序”部分针对表的所有行计算了位次。这里准备了下面这样增加了“地区”...原创 2019-08-01 13:18:36 · 514 阅读 · 0 评论 -
1-3 三值逻辑和null-SQL进阶教程
二值逻辑 布尔型只有true和false两个值 三值逻辑 布尔型除true和false之外还有第三个值unknown null既不是值也不是变量,null只是一个表示“没有值”的标记 1. 比较谓词和null(1):排中律不成立 排中律 把命题和它的否命题通过‘or’连接而成的命题全都是真命题 由于存在null值,在SQL的世界里,排中律是不成立的 -- 添加第3个条件:年龄是20岁,或者不是2...原创 2019-08-01 15:57:21 · 376 阅读 · 0 评论 -
1-5 外连接的用法-SQL进阶教程
用外连接进行行列转换 (1)(行→列):制作交叉表 -- 水平展开求交叉表(1):使用外连接 select C0.name, (case when C1.name is not null then 'o原创 2019-08-21 10:25:00 · 335 阅读 · 0 评论 -
1-5练习题-SQL进阶教程
1-5 外连接的用法 ●练习题1-5-1 :先连接还是先聚合 在“在交叉表里制作嵌套式表侧栏”部分里,我们通过聚合将DATA视图和MASTER视图转换为一对一的关系之后进行了连接操作。采用这种做法时,代码的确比较好理解,但是这就需要创建两个临时视图,性能并不是很好。请想办法改善一下代码,尽量减少临时视图 select MASTER.age_class age_class,MASTER.sex_...原创 2019-08-21 11:00:38 · 305 阅读 · 0 评论 -
1-4 having子句的力量-SQL进阶教程
寻找缺失的编号 -- 如果有查询结果,说明存在缺失的编号 select '存在缺失的编号' gap from SeqTbl having count(*)<>max(seq); /* having子句是可以脱离group by子句单独使用的 但是在这种情况下select子句就不能引用原来表里的字段了,要么像示例里一样使用常量,要么像 select count(*)这样使用聚合函数 *...原创 2019-08-16 15:55:50 · 221 阅读 · 0 评论 -
1-4练习题-SQL进阶教程
1-4 having子句的力量 练习题1-4-1 :修改编号缺失的检查逻辑,使结果总是返回一行数据 在“寻找缺失的编号”部分,我们写了一条SQL语句,让程序只在存在缺失的编号时返回结果。请将SQL语句修改成始终返回一行结果,即存在缺失的编号时返回“存在缺失的编号”,不存在缺失的编号时返回“不存在缺失的编号” select '存在缺失的编号' gap from SeqTbl having coun...原创 2019-08-16 16:27:06 · 258 阅读 · 0 评论 -
1-12 SQL编程方法-SQL进阶教程
表的设计 名字和意义 命名时允许的字符有以下3种: 英文字母 阿拉伯数字 下划线“_” 标准SQL中规定名称的第一个字符应该是英文字母 属性和列 在数据库中,列代表的是“属性”,因此应该具有一贯性 编程的方针 注释 -- 单行注释 -- 从SomeTable中查询col_1 select col_1 from SomeTable; /* 多行注释 从SomeTable中查询col_1 */ ...原创 2019-08-30 10:40:59 · 424 阅读 · 0 评论