扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.D
清原ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
子查询是一个嵌套在SELECT、INSERT、UPDATE 或DELETE语句,或者另一个子查询里的查询。一个子查询可以返回一行或多行结果给父查询
比如:
Select *,(select A From B where B.id=C.id) From C
Select * from B where id = (select max(id) from C)
2.A
视图可以被看成是虚拟表或存储查询。可通过视图访问的数据不作为独特的对象存储在数据库内。数据库内存储的是 SELECT 语句
3.B
DELETE 删除记录
DROP 删除表,视图,存储过程,触发器,函数,数据库等
CLEAR ,REMOVE 这两个mssql没有
4.C
数据查询 Select
数据操纵(DML) Update,Delete,Insert
数据定义(DDL) Create,Alter,Drop
数据控制(DCL) Grant ,Revoke
5.C
只有索引才可以加快查询语句的执行速度
6.A
Update 表 Set 字值 Where 条件
首先排除C,D
Grade为成绩,数值型,值不需要加引号,所以选A
但在mssql,B答案执行也是正确的,会隐式转换
7.A
3个表连接,首先需要连接条件S.S# = SC.S#and C.C# =SC.C#
SAGE in=20 and CNAME in ‘ACCESS’ 明显没有这样的写法
CNAME in( ‘ACCESS’) 这样是可以的
所以答案是A
8.C
增加 Alter Table 表 Add
修改 Alter Table 表 Alter
删除 Alter Table 表 Drop
9.B
同上
什么是NoSQL
大家有没有听说过“NoSQL”呢?近年,这个词极受关注。看到“NoSQL”这个词,大家可能会误以为是“No!SQL”的缩写,并深感愤怒:“SQL怎么会没有必要了呢?”但实际上,它是“Not Only SQL”的缩写。它的意义是:适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。
为弥补关系型数据库的不足,各种各样的NoSQL数据库应运而生。
为了更好地了解本书所介绍的NoSQL数据库,对关系型数据库的理解是必不可少的。那么,就让我们先来看一看关系型数据库的历史、分类和特征吧。
关系型数据库简史
1969年,埃德加?6?1弗兰克?6?1科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的《IBM Research Report》只是IBM公司的内部刊物,因此论文反响平平。1970年,他再次在刊物《Communication of the ACM》上发表了题为“A Relational Model of Data for Large Shared Data banks”(大型共享数据库的关系模型)的论文,终于引起了大家的关注。
科德所提出的关系数据模型的概念成为了现今关系型数据库的基础。当时的关系型数据库由于硬件性能低劣、处理速度过慢而迟迟没有得到实际应用。但之后随着硬件性能的提升,加之使用简单、性能优越等优点,关系型数据库得到了广泛的应用。
通用性及高性能
虽然本书是讲解NoSQL数据库的,但有一个重要的大前提,请大家一定不要误解。这个大前提就是“关系型数据库的性能绝对不低,它具有非常好的通用性和非常高的性能”。毫无疑问,对于绝大多数的应用来说它都是最有效的解决方案。
突出的优势
关系型数据库作为应用广泛的通用型数据库,它的突出优势主要有以下几点:
保持数据的一致性(事务处理)
由于以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)
可以进行JOIN等复杂查询
存在很多实际成果和专业技术信息(成熟的技术)
这其中,能够保持数据的一致性是关系型数据库的最大优势。在需要严格保证数据一致性和处理完整性的情况下,用关系型数据库是肯定没有错的。但是有些情况不需要JOIN,对上述关系型数据库的优点也没有什么特别需要,这时似乎也就没有必要拘泥于关系型数据库了。
关系型数据库的不足
不擅长的处理
就像之前提到的那样,关系型数据库的性能非常高。但是它毕竟是一个通用型的数据库,并不能完全适应所有的用途。具体来说它并不擅长以下处理:
大量数据的写入处理
为有数据更新的表做索引或表结构(schema)变更
字段不固定时应用
对简单查询需要快速返回结果的处理
。。。。。。
NoSQL数据库
为了弥补关系型数据库的不足(特别是最近几年),NoSQL数据库出现了。关系型数据库应用广泛,能进行事务处理和JOIN等复杂处理。相对地,NoSQL数据库只应用在特定领域,基本上不进行复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不足之处。
易于数据的分散
如前所述,关系型数据库并不擅长大量数据的写入处理。原本关系型数据库就是以JOIN为前提的,就是说,各个数据之间存在关联是关系型数据库得名的主要原因。为了进行JOIN处理,关系型数据库不得不把数据存储在同一个服务器内,这不利于数据的分散。相反,NoSQL数据库原本就不支持JOIN处理,各个数据都是独立设计的,很容易把数据分散到多个服务器上。由于数据被分散到了多个服务器上,减少了每个服务器上的数据量,即使要进行大量数据的写入操作,处理起来也更加容易。同理,数据的读入操作当然也同样容易。
提升性能和增大规模
下面说一点题外话,如果想要使服务器能够轻松地处理更大量的数据,那么只有两个选择:一是提升性能,二是增大规模。下面我们来整理一下这两者的不同。
首先,提升性能指的就是通过提升现行服务器自身的性能来提高处理能力。这是非常简单的方法,程序方面也不需要进行变更,但需要一些费用。若要购买性能翻倍的服务器,需要花费的资金往往不只是原来的2倍,可能需要多达5到10倍。这种方法虽然简单,但是成本较高。
另一方面,增大规模指的是使用多台廉价的服务器来提高处理能力。它需要对程序进行变更,但由于使用廉价的服务器,可以控制成本。另外,以后只要依葫芦画瓢增加廉价服务器的数量就可以了。
不对大量数据进行处理的话就没有使用的必要吗?
NoSQL数据库基本上来说为了“使大量数据的写入处理更加容易(让增加服务器数量更容易)”而设计的。但如果不是对大量数据进行操作的话,NoSQL数据库的应用就没有意义吗?
答案是否定的。的确,它在处理大量数据方面很有优势。但实际上NoSQL数据库还有各种各样的特点,如果能够恰当地利用这些特点将会是非常有帮助。具体的例子将会在第2章和第3章进行介绍,这些用途将会让你感受到利用NoSQL的好处。
希望顺畅地对数据进行缓存(Cache)处理
希望对数组类型的数据进行高速处理
希望进行全部保存
多样的NoSQL数据库
NoSQL数据库存在着“key-value存储”、“文档型数据库”、“列存储数据库”等各种各样的种类,每种数据库又包含各自的特点。下一节让我们一起来了解一下NoSQL数据库的种类和特点。
NoSQL数据库是什么
NoSQL说起来简单,但实际上到底有多少种呢?我在提笔的时候,到NoSQL的官方网站上确认了一下,竟然已经有122种了。另外官方网站上也介绍了本书没有涉及到的图形数据库和对象数据库等各个类别。不知不觉间,原来已经出现了这么多的NoSQL数据库啊。
本节将为大家介绍具有代表性的NoSQL数据库。
key-value存储
这是最常见的NoSQL数据库,它的数据是以key-value的形式存储的。虽然它的处理速度非常快,但是基本上只能通过key的完全一致查询获取数据。根据数据的保存方式可以分为临时性、永久性和两者兼具三种。
临时性
memcached属于这种类型。所谓临时性就是 “数据有可能丢失”的意思。memcached把所有数据都保存在内存中,这样保存和读取的速度非常快,但是当memcached停止的时候,数据就不存在了。由于数据保存在内存中,所以无法操作超出内存容量的数据(旧数据会丢失)。
在内存中保存数据
可以进行非常快速的保存和读取处理
数据有可能丢失
永久性
Tokyo Tyrant、Flare、ROMA等属于这种类型。和临时性相反,所谓永久性就是“数据不会丢失”的意思。这里的key-value存储不像memcached那样在内存中保存数据,而是把数据保存在硬盘上。与memcached在内存中处理数据比起来,由于必然要发生对硬盘的IO操作,所以性能上还是有差距的。但数据不会丢失是它最大的优势。
在硬盘上保存数据
可以进行非常快速的保存和读取处理(但无法与memcached相比)
数据不会丢失
两者兼具
Redis属于这种类型。Redis有些特殊,临时性和永久性兼具,且集合了临时性key-value存储和永久性key-value存储的优点。Redis首先把数据保存到内存中,在满足特定条件(默认是15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的key发生变更)的时候将数据写入到硬盘中。这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久性。这种类型的数据库特别适合于处理数组类型的数据。
同时在内存和硬盘上保存数据
可以进行非常快速的保存和读取处理
保存在硬盘上的数据不会消失(可以恢复)
适合于处理数组类型的数据
面向文档的数据库
MongoDB、CouchDB属于这种类型。它们属于NoSQL数据库,但与key-value存储相异。
不定义表结构
面向文档的数据库具有以下特征:即使不定义表结构,也可以像定义了表结构一样使用。关系型数据库在变更表结构时比较费事,而且为了保持一致性还需修改程序。然而NoSQL数据库则可省去这些麻烦(通常程序都是正确的),确实是方便快捷。
可以使用复杂的查询条件
跟key-value存储不同的是,面向文档的数据库可以通过复杂的查询条件来获取数据。虽然不具备事务处理和JOIN这些关系型数据库所具有的处理能力,但除此以外的其他处理基本上都能实现。这是非常容易使用的NoSQL数据库。
不需要定义表结构
可以利用复杂的查询条件
面向列的数据库
Cassandra、Hbase、HyperTable属于这种类型。由于近年来数据量出现爆发性增长,这种类型的NoSQL数据库尤其引人注目。
面向行的数据库和面向列的数据库
普通的关系型数据库都是以行为单位来存储数据的,擅长进行以行为单位的读入处理,比如特定条件数据的获取。因此,关系型数据库也被称为面向行的数据库。相反,面向列的数据库是以列为单位来存储数据的,擅长以列为单位读入数据。
高扩展性
面向列的数据库具有高扩展性,即使数据增加也不会降低相应的处理速度(特别是写入速度),所以它主要应用于需要处理大量数据的情况。另外,利用面向列的数据库的优势,把它作为批处理程序的存储器来对大量数据进行更新也是非常有用的。但由于面向列的数据库跟现行数据库存储的思维方式有很大不同,应用起来十分困难。
高扩展性(特别是写入处理)
应用十分困难
最近,像Twitter和Facebook这样需要对大量数据进行更新和查询的网络服务不断增加,面向列的数据库的优势对其中一些服务是非常有用的,但是由于这与本书所要介绍的内容关系不大,就不进行详细介绍了。
总结:
NoSQL并不是No-SQL,而是指Not Only SQL。
NoSQL的出现是为了弥补SQL数据库因为事务等机制带来的对海量数据、高并发请求的处理的性能上的欠缺。
NoSQL不是为了替代SQL而出现的,它是一种替补方案,而不是解决方案的首选。
绝大多数的NoSQL产品都是基于大内存和高性能随机读写的(比如具有更高性能的固态硬盘阵列),一般的小型企业在选择NoSQL时一定要慎重!不要为了NoSQL而NoSQL,可能会导致花了冤枉钱又耽搁了项目进程。
NoSQL不是万能的,但在大型项目中,你往往需要它!
首先我们要了解Java语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。
大数据
Java :只要了解一些基础即可,做大数据不需要很深的Java 技术,学java SE 就相当于有学习大数据基础。
Linux:因为大数据相关软件都是在Linux上运行的,所以Linux要学习的扎实一些,学好Linux对你快速掌握大数据相关技术会有很大的帮助,能让你更好的理解hadoop、hive、hbase、spark等大数据软件的运行环境和网络环境配置,能少踩很多坑,学会shell就能看懂脚本这样能更容易理解和配置大数据集群。还能让你对以后新出的大数据技术学习起来更快。
Hadoop:这是现在流行的大数据处理平台几乎已经成为大数据的代名词,所以这个是必学的。Hadoop里面包括几个组件HDFS、MapReduce和YARN,HDFS是存储数据的地方就像我们电脑的硬盘一样文件都存储在这个上面,MapReduce是对数据进行处理计算的,它有个特点就是不管多大的数据只要给它时间它就能把数据跑完,但是时间可能不是很快所以它叫数据的批处理。
Zookeeper:这是个万金油,安装Hadoop的HA的时候就会用到它,以后的Hbase也会用到它。它一般用来存放一些相互协作的信息,这些信息比较小一般不会超过1M,都是使用它的软件对它有依赖,对于我们个人来讲只需要把它安装正确,让它正常的run起来就可以了。
Mysql:我们学习完大数据的处理了,接下来学习学习小数据的处理工具mysql数据库,因为一会装hive的时候要用到,mysql需要掌握到什么层度那?你能在Linux上把它安装好,运行起来,会配置简单的权限,修改root的密码,创建数据库。这里主要的是学习SQL的语法,因为hive的语法和这个非常相似。
Sqoop:这个是用于把Mysql里的数据导入到Hadoop里的。当然你也可以不用这个,直接把Mysql数据表导出成文件再放到HDFS上也是一样的,当然生产环境中使用要注意Mysql的压力。
Hive:这个东西对于会SQL语法的来说就是神器,它能让你处理大数据变的很简单,不会再费劲的编写MapReduce程序。有的人说Pig那?它和Pig差不多掌握一个就可以了。
Oozie:既然学会Hive了,我相信你一定需要这个东西,它可以帮你管理你的Hive或者MapReduce、Spark脚本,还能检查你的程序是否执行正确,出错了给你发报警并能帮你重试程序,最重要的是还能帮你配置任务的依赖关系。我相信你一定会喜欢上它的,不然你看着那一大堆脚本,和密密麻麻的crond是不是有种想屎的感觉。
Hbase:这是Hadoop生态体系中的NOSQL数据库,他的数据是按照key和value的形式存储的并且key是唯一的,所以它能用来做数据的排重,它与MYSQL相比能存储的数据量大很多。所以他常被用于大数据处理完成之后的存储目的地。
Kafka:这是个比较好用的队列工具,队列是干吗的?排队买票你知道不?数据多了同样也需要排队处理,这样与你协作的其它同学不会叫起来,你干吗给我这么多的数据(比如好几百G的文件)我怎么处理得过来,你别怪他因为他不是搞大数据的,你可以跟他讲我把数据放在队列里你使用的时候一个个拿,这样他就不在抱怨了马上灰流流的去优化他的程序去了,因为处理不过来就是他的事情。而不是你给的问题。当然我们也可以利用这个工具来做线上实时数据的入库或入HDFS,这时你可以与一个叫Flume的工具配合使用,它是专门用来提供对数据进行简单处理,并写到各种数据接受方(比如Kafka)的。
Spark:它是用来弥补基于MapReduce处理数据速度上的缺点,它的特点是把数据装载到内存中计算而不是去读慢的要死进化还特别慢的硬盘。特别适合做迭代运算,所以算法流们特别稀饭它。它是用scala编写的。Java语言或者Scala都可以操作它,因为它们都是用JVM的。
InterSystems SQL命令(也称为SQL语句)以关键字开头,后跟一个或多个参数。其中一些参数可能是子句或函数,由它们自己的关键字标识。
InterSystems SQL关键字包括命令名称,函数名称,谓词条件名称,数据类型名称,字段约束,优化选项和特殊变量。它们还包括 AND , OR 和 NOT 逻辑运算符, NULL 列值指示符以及ODBC函数构造,例如 {d dateval} 和 {fn CONCAT(str1,str2)} 。
聚合函数是SQL固有函数,它计算列的所有值并返回单个聚合值。
这种写法只能在mac routine里,类文件里编译报错。
如果将用户提供的(外部)函数的使用配置为系统范围的选项,则该SQL语句只能调用用户提供的(外部)函数。默认为“否”。默认情况下,尝试调用用户提供的函数会发出 SQLCODE -372 错误。可以使用 %SYSTEM.SQL类的SetAllowExtrinsicFunctions() 方法在系统范围内配置SQL对外部函数的使用。若要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,该显示显示“允许在SQL语句中使用外部函数”选项。
不能使用用户提供的函数来调用 %routine (名称以%字符开头的例程)。
尝试这样做会发出 SQLCODE -373 错误。
InterSystems SQL文字具有以下语法:
文字是一系列代表实际(文字)值的字符。它可以是数字或字符串。
空字符串是文字字符串;它由两个单引号字符( '' )表示。 NULL 不是文字值;它表示没有任何值。
注意:在嵌入式SQL中,不允许在字符串文字中使用以 ## 开头的一些字符序列,如“使用嵌入式SQL”一章的“文字值”中所述。此限制不适用于其他SQL调用,例如动态SQL。
使用单引号( ' )字符作为字符串定界符。 SQL兼容性支持双引号字符( “ )的使用,但由于与定界标识符标准冲突,因此强烈建议不要使用。将一对双引号字符 "" 解析为无效的定界标识符。并生成 SQLCODE -1 错误。
要在字符串中指定单引号字符作为字面字符,请指定一对这样的字符作为字面转义序列。
例如, 'a 'normal' string' 。
双竖条( || )是首选的SQL连接操作符。
它可以用于连接两个数字、两个字符串或一个数字和一个字符串。
下划线( _ )作为SQL连接操作符提供,以保证ObjectScript的兼容性。
此连接操作符只能用于连接两个字符串。
如果两个操作数都是字符串,并且两个字符串都具有相同的排序规则类型,则所得的级联字符串具有该排序规则类型。在所有其他情况下,连接的结果是排序类型 EXACT 。
使用 NULL 关键字表示没有指定值。
在SQL中, NULL 始终是表示数据值因任何原因未指定或不存在的首选方式。
SQL零长度字符串(空字符串)由两个单引号字符指定。
空字符串( " )与空字符串是不同的。
空字符串是一个已定义的值,一个不包含字符的字符串,一个长度为0的字符串。
一个零长度的字符串在内部由非显示字符 $CHAR(0) 表示。
注意:不建议使用SQL零长度字符串作为字段输入值或字段默认值。
使用 NULL 表示数据值的缺失。
在SQL编码中应避免使用SQL零长度字符串。
但是,由于许多SQL操作都会删除末尾的空格,所以只包含空格字符(空格和制表符)的数据值可能会导致SQL的零长度字符串。
注意,不同的SQL length函数返回不同的值: length 、 CHAR_LENGTH 和 DATALENGTH 返回SQL长度。
$LENGTH 返回ObjectScript表示长度。
长度不计算尾随空格;
所有其他长度函数都计算末尾的空格。
NOT NULL数据约束要求字段必须接收一个数据值;
不允许指定NULL而不是值。
这个约束不阻止使用空字符串值。
SELECT 语句的 WHERE 或 HAVING 子句中的 IS NULL 谓词选择空值;
它不选择空字符串值。
IFNULL 函数计算一个字段值,如果字段值为 NULL ,则返回第二个参数中指定的值。
它不会将空字符串值视为非空值。
COALESCE 函数从提供的数据中选择第一个非空值。
它将空字符串值视为非空值。
当 CONCAT 函数或 concenate 操作符( || )连接一个字符串和一个 NULL 时,结果是 NULL 。
如下面的例子所示:
AVG、COUNT、MAX、MIN 和 SUM 聚合函数在执行操作时忽略 NULL 值。
( COUNT * 统计所有行,因为不可能有一个所有字段都为空值的记录。)
SELECT 语句的 DISTINCT 关键字在其操作中包含 NULL ;
如果指定的字段有空值, DISTINCT 返回一个空行.
AVG 、 COUNT 和 MIN 、聚合函数受空字符串值的影响。
MIN 函数将空字符串视为最小值,即使存在值为0的行。
MAX 和 SUM 聚合函数不受空字符串值的影响。
对大多数SQL函数提供 NULL 作为操作数将返回 NULL 。
任何以NULL作为操作数的SQL算术操作都返回 NULL 值。
因此,7 +零=零。
这包括二元运算加法( + )、减法( - )、乘法( * )、除法( / )、整数除法( \ )和取模( # ),以及一元符号运算符加号( + )和减号( - )。
算术操作中指定的空字符串将被视为0(零)值。
除法( / ),整数除法( \ ),或对空字符串( 6/ " )取模( # )会导致 DIVIDE 错误。
在SQL中, NULL 的长度是没有定义的(它返回 NULL )。
然而,空字符串的长度被定义为长度为0。
如下面的例子所示:
如本例所示,SQL LENGTH 函数返回SQL长度。
可以使用 ASCII 函数将SQL的零长度字符串转换为 NULL ,示例如下:
但是,对标准 SQL 的某些系统间IRIS扩展对 NULL 和空字符串的长度的处理是不同的。
$LENGTH函数返回这些值的InterSystems IRIS内部表示: NULL 表示为长度为0的已定义值,SQL空字符串表示为长度为0的字符串。
该功能与ObjectScript兼容。
这些值的内部表示方式的另一个重要位置是 %STRING 、 %SQLSTRING 和 %SQLUPPER 函数,它们将空格附加到值中。
因为 NULL 实际上没有值,所以在它后面添加一个空格会创建一个长度为1的字符串。
但是一个空字符串确实有一个字符值,所以在它后面加上一个空格会创建一个长度为2的字符串。
如下面的例子所示:
注意,这个例子使用的是 CHAR_LENGTH ,而不是 LENGTH 。
因为 LENGTH 函数删除了末尾的空格,所以 LENGTH(%STRING(NULL)) 返回长度为0的字符串;
LENGTH(%STRING(")) 返回长度为2的字符串, 因为 %STRING 追加的是前导空格,而不是尾随空格。
当SQL NULL 输出到ObjectScript时,它由ObjectScript空字符串( "" )表示,长度为0的字符串。
当SQL零长度字符串数据输出到ObjectScript时,它由包含 $CHAR(0) 的字符串表示,该字符串长度为1。
在ObjectScript中,没有值通常用空字符串( "" )表示。
当这个值被传递到嵌入式SQL中时,它会被视为空值,如下面的例子所示:
如果指定了一个未定义的输入主机变量,嵌入式SQL将其值视为 NULL 。
当将NULL或空字符串值从嵌入式SQL传递到ObjectScript时, NULL 被转换为长度为0的字符串,空字符串被转换为长度为1的字符串。
如下面的例子所示:
在下面的例子中,SQL的空字符串加上一个空格被传递为长度为2的字符串:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流