sql思维
写sql的思路不同于常规编程语言(C、python)等等。前者,考虑如何一步步地得到最终答案;后者,考虑如何一步步地收缩数据范围。
简而言之,前者是面向过程化(for each row do x),后者是面向集合(do all -> another all)。
具体来讲,写sql从两种角度考虑:
一、集合
- 首先考虑,要得到正确结果,需要把哪些表,以何种形式连接起来;
- 对连接之后的大集合,做怎么样的过滤 (where、having)
- 根据需要做出合适的投影 (select)
- 可能需要重复前面三步
select T1.x, T1.y
from T1 left outer join T2
where T1.z = T2.z
二、变量替换
传统语言,变量部分要么用变身本身,要么用函数代替。如 a = b; a = f(b)
1、变量部分可以用子查询代替
sql语句的任意一部分(select、from、where、having)都可以用子查询去做,比如
select:这地方的子查询必须是标量子查询(明确返回只有一个值的集合,如sum(x)等)
from:select x from (select ...) tmp_table ...
where: exist(select ...)、 in (select ...)
having:比较符号(〉〈)后面跟的,肯定也只能是标量子查询
2、变量部分也可以用语句代替
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负
如果要生成下列结果, 该如何写sql语句?
胜 负
2005-05-09 2 2
2005-05-10 1 2 select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',
sum(case when shengfu='负' then 1 else 0 end)'负'
from #tmp
group by rq
参考资料:http://www.ituring.com.cn/article/472
sql思维的更多相关文章
- 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战
本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...
- SQL思维导图总结
- SQL思维导图
- 数据库系统学习(十)-嵌入式SQL语言之动态SQL
第十讲 嵌入式SQL语言之动态SQL 静态SQL 区别变量和属性:高级语言向嵌入式SQL传递变量的方法 动态SQL 动态构造SQL语句是应用程序员必须掌握的重要手段 SQL语句的动态构造示例 根据界面 ...
- 优化笔记: jxrsfxrxx_D_20140916.gz
表的重复扫描. ----------------------------------想进一步研究,继续往下看------------------------------ 1. 所有相似 ...
- SQL到NOSQL的思维转变
NOSQL系统一般都会宣传一个特性,那就是性能好,然后为什么呢?关系型数据库发展了这么多年,各种优化工作已经做得很深了,NOSQL系统一般都是吸收关系型数据库的技术,然后,到底是什么因素束缚了关系型数 ...
- [原创] 思维导图笔记(二):SQL
为了补一补知识体系上的缺漏,最近找了看完了Ben Forta写的<Sams Teach Yourself SQL in 10 Minutes>,翻译过来叫<SQL必知必会>.从 ...
- SQL 到 NOSQL 的思维转变
转自:http://blogread.cn/it/article/3130?f=wb SQL 到 NOSQL 的思维转变 NOSQL系统一般都会宣传一个特性,那就是性能好,然后为什么呢?关系型数据库发 ...
- PCB SQL SERVER 数据库阻塞进程关系以思维导图方式呈现的实现方法
最近公司服务数据库同步机制常发生阻塞,时不时的导致PCB工程系统卡死现象,只有找到阻塞源头并处理掉,才以消除阻塞,但数据库中查看会话阻塞是通过二维表方式展示的父子会话进程ID的,是很难清楚的展示各会话 ...
随机推荐
- Android lint 删除无用图片文件和配置文件
Android lint 删除无用.冗余的 配置文件和 图片资源 转载请注明 http://blog.csdn.net/aaawqqq?viewmode=contents Android项 ...
- git的作用和原理(待续)
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令: $ sudo git init --bare sample.git Git就会创建一个裸仓库,裸仓库没有 ...
- linux简单配置
lsof -i lsof -i:211.判断apache查找httpd路径: ps aux | grep httpd 结果: /usr/local/apache/bin/httpd /usr/loc ...
- VIM 打造 c/c++ IDE
1. vim 的安装 $sudo apt-get install vim vim-scripts vim-doc <br> 其中vim-scripts包含了vim的一些基本插件,包括语法高 ...
- C语言中的转义字符
转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将 ...
- c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
- Java replace() 方法
Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...
- is(C# 参考)
检查对象是否与给定类型兼容. 例如,下面的代码可以确定对象是否为 MyObject 类型的一个实例,或者对象是否为从 MyObject 派生的一个类型: if (obj is MyObject ...
- java复用和传参
java复用和传参的三种方法总结: (1) 直接在一个类中调用函数 : 1 package test1; 2 3 public class a 4 { 5 public static void get ...
- ie8 table td拆分宽度不适应问题
在table上加style="table-layout: fixed;"并在首行加一个高度为0且给定宽度的tr <table class="subtabledeta ...