数据查询语句

引入关系模型的时候,它引入了一个新的查询数据的方法:SQL是一个声明式查询语言,IMS和CODASYL查询用的是命令式语言。

一些常用的编程语言都是命令式的。

在关系型语法汇总,你会这样写:

命令式语言告诉电脑按顺序执行操作。你可以想象电脑按行遍历代码,计算条件,更新变量,决定是否继续循环。

在声明式语言中,你只需要设定你想要的数据:什么条件能拿到结果,数据怎么传输(sored,grouped,aggregated),而不是如何达成这些目标。这些都取决于数据库系统的查询优化器来决定使用哪些索引,哪些连接操作,以及查询语句不同部分的执行顺序。

声明式语言很有吸引力,因为它比命令式语言更加清晰,更容易。更重要的是,它隐藏了数据库引擎的实现细节,这使得数据库性能的提升与查询语句隔离了。

声明式查询

声明式查询语句的优势不限于数据库。让我们比较命令式和声明式方法在浏览器中的应用。

假设你有一个关于海洋动物的网站。用户在浏览“鲨鱼”这一页,所以你将导航菜单中的“鲨鱼”标注选中,例如

选中标签标注为CSS类“selected”。当前选中页面为Shark。

现在你想要当前选中页面为蓝色背景,用CSS语言:

CSS选择器li.selectd>p 声明了我们想要变为蓝色风格的元素的模式:即那些直接父节点是一个<li>元素的所有<p>元素,并且CSS样式为selected。元素<p>sharks</p>在这个例子中符合这个模式,<p>Whale<p>不符合,因为父节点<li>缺少属性class=“selected”。

如果你使用XSL代替CSS,同样的功能:

XPath表达式 li[@class='selected']/p 等同于CSS选择器  li.selected > p 。CSS和XSL相同之处就是他们都是用于特定风格文档的声明式语言。

设想一下使用命令式语言要怎样做。在JavaScript中使用文档对象模型DOM API,结果可能是:

JavaScript设置元素<p>Sharks</p> 为蓝色背景,但是代码很难看。不仅比XSL和CSS难以理解,而且还有其他问题:

1、如果 selected 属性移除了(用户点击其他页面),蓝色也不会移除,即便是重新执行代码,所以元素会持续高亮显示直到整个页面重新加载。使用CSS,只要selected属性移除,浏览器能够自动检测到 li.selected > p 不再适用,移除蓝色背景。

2、如果你想使用新API,例如可能提高性能的 document.getElementsByClassName("selected") 或者  document.evaluate(),你必须重写代码。另一方面,浏览器渲染器可以不破坏兼容性而提高性能。

在Web浏览器中,使用声明式的CSS样式比JavaScript中的命令式操作要好。类似的,数据库中声明式的查询语句不命令式的查询API要好用。

MapReduce查询

MapReduce是用于在多台机器间批量处理海量数据的编程模型,由Google推广。由NoSQL数据库支持的有限格式,用于在多个文档中用于只读的查询。这章我们只讨论MongoDB对这个模型的使用。

MapReduce既不是声明式查询语句也不是命令式查询语句,而是介于两者中间:使用代码片段来表示查询逻辑,同时运行框架会不停的调用。它基于 map(也叫 collect) 和 reduce(也叫fold或者inject)这些存在于很多函数式编程语言中的函数。

在PostgreSQL中你可能如下表达查询

date_trunc('month', timestamp) 函数输入包含月份的时间戳,然后返回表示月份开始的时间戳,换句话说,它将一个时间戳降至最近的月份。

查询语句首先过滤出Shark 那一类,然后按照它们出现的月份整合分组,然后按照月份求和。

MongoDB中同样功能的MapReduce表达式如下:

标签1:表示只考虑 Sharks 这一类

标签2:map函数会对每个查询到的文档调用一次,this 关键字指定文档对象。

标签3:map函数提交了一个键(由年和月份组成)和一个值(观测到的动物的数量)

标签4:map函数提交的键值对会根据键值来分组,对于每个有相同键值的键值对集合会调用一次

标签5:reduce 函数将所有特定月份的动物观测数据加起来

标签6:最后结果写入到集合 monthlySharkReport

map 和 reduce 被限制了他们只能做什么,是纯粹的函数,意味着它们只能使用传入进去的数据,而且不能进行额外的数据库查询操作,而且不能有任何副作用。这些限制允许数据库任何时候以任何顺序运行函数,失败的时候重新执行。尽管有着诸多限制,他们依然是强大的。

对于集群来说,mapreduce是一个低等级的编程模型。高等级的编程模型比如SQL可以实现成MapReduce的操作流,但是目前很多SQL的分布式实现不使用MapReduce。注意SQL中没有限制它只能运行在一台机器上。而且MapReduce并没有在分布式查询操作上取得垄断。

对于高级查询来说能够在查询中使用JavaScript代码是个很好的特性。但是它不局限于MapReduce,一些SQL数据库能够使用JavaScript函数来扩展。

MapReduce在使用中有个问题,你不得不很小心地实现两个规定好的JavaScript函数,这比单纯写一个查询要难。而且,声明式查询语句能够给查询优化器提供更多提高性能的机会。因为这些原因,MongoDB2.2 增加了声明式查询语言:聚合管道aggregation pipeline。用这个语言写鲨鱼计数查询可能是:

aggregation pipeline在表达上类似于SQL的一个子集,但是它是使用基于JSON的语法而不是SQL的英语语法,这个差异可能造成理解困难。所以这个讨论的核心就是NoSQL系统可能碰巧再发明了SQL语句,尽管只是形式上的。

Design Data-Intensive Applications 读书笔记三 查询语句相关推荐

  1. 《How Tomcat Works》读书笔记(三)--Connector(连接器)

    <How Tomcat Works>读书笔记(三)--Connector(连接器) 这是<How Tomcat Works>第三四章的读书笔记.主要写了Tomcat4.0默认的 ...

  2. mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...

    MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...

  3. 《编程之美》读书笔记(三):烙饼问题与搜索树

    <编程之美>读书笔记三:烙饼问题与搜索树 薛笛 EMail:jxuedi#gmail.com 前面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问 ...

  4. TCPIP详解Protocol 读书笔记(三) IP协议讲解

    TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 文章目录 TCP/IP详解:Protocol 读书笔记(三) Chapter3 IP:网际协议 IP协议 IP数据 ...

  5. 《Data Algorithm》读书笔记十一— 使用马尔科夫模型的智能邮件营销

    <Data Algorithm>读书笔记十一 - 使用马尔科夫模型的智能邮件营销 1. 智能邮件营销 是什么? 根据顾客的交易历史观测(其实就是推测) "下一个智能邮件营销日期& ...

  6. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  7. 《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair

    前面两篇文章介绍了淘宝的发展历程和Java时代的变迁:             <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源             <淘宝技术这十年&g ...

  8. 《大型网站技术架构》读书笔记三:大型网站核心架构要素

    来源:http://www.cnblogs.com/edisonchou/p/3806348.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...

  9. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

最新文章

  1. php文件内含有隐藏的^m字符,【整理】如何取消Linux下,vi中显示的^M符号
  2. 商汤科技举办病理、放疗两大MICCAI国际挑战赛,推动AI医疗落地
  3. php协议任意文件读取
  4. 【项目管理】ITTO-成本管理
  5. MFC中添加的ID资源号提示找不到声名问题
  6. selenium持续集成_使用Selenium进行Spring Boot集成测试
  7. Js获取短信验证码前段效果
  8. iphone型号表_iphone网络制格式怎么看,如何看两网三网、美版、欧版和国行信号到底有么有区别...
  9. 二叉搜索树的第k个节点
  10. BOM 之 screen history
  11. BZOJ5336 DP套DP
  12. JUL、JCL、Log4j、Slf4j各种日志框架的使用
  13. 关于Chrome浏览器设置启用Flash插件
  14. CART算法(机器学习)
  15. 带滤波器的PID控制仿真-3(Simulink仿真)
  16. 学习笔记 | 美团后台笔试+一面+二面
  17. 地址转换和端口映射及内网穿透的区别
  18. 杭电ACM:人见人爱A-B
  19. sysstat 工具详细说明(一)
  20. 【图像数学形态学处理】膨胀与腐蚀运算

热门文章

  1. 软件测试之因果图分析
  2. VB 2010 (20)多态性
  3. iOS最强下片神器,免费不限速,秒杀其他下载神器!
  4. 使用nid命令修改 db name 及 dbid
  5. huipengly的2018年度总结
  6. OSChina 周二乱弹 ——风流不需编码强,红袖无言意最长
  7. 长知识啦——自己动手写分类模型
  8. 中美老太太第二次对话
  9. 小哥哥,小姐姐,我有一份tcp、http面试指南你要吗?
  10. 使用 Zipkin 和 Brave 实现分布式系统追踪(基础篇