1. IBM 的DB2
作为关系数据库领域的开拓者和领航人,IBM在1977年完成了System R系统的原型,1980年开始提供集成的数据库服务器—— System/38,随后是SQL/DSforVSE和VM,其初始版本与SystemR研究原型密切相关。DB2 forMVSV1 在1983年推出。该版本的目标是提供这一新方案所承诺的简单性,数据不相关性和用户生产率。1988年DB2 for MVS 提供了强大的在线事务处理(OLTP)支持,1989 年和1993 年分别以远程工作单元和分布式工作单元实现了分布式数据库支持。最近推出的DB2 Universal Database 6.1则是通用数据库的典范,是第一个具备网上功能的多媒体关系数据库管理系统,支持包括Linux在内的一系列平台。
2. Oracle
Oracle 前身叫SDL,由Larry Ellison 和另两个编程人员在1977创办,他们开发了自己的拳头产品,在市场上大量销售,1979 年,Oracle公司引入了第一个商用SQL 关系数据库管理系统。Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的 *** 作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
3. Informix
Informix在1980年成立,目的是为Unix等开放 *** 作系统提供专业的关系型数据库产品。公司的名称Informix便是取自Information 和Unix的结合。Informix第一个真正支持SQL语言的关系数据库产品是Informix SE(StandardEngine)。InformixSE是在当时的微机Unix环境下主要的数据库产品。它也是第一个被移植到Linux上的商业数据库产品。
4. Sybase
Sybase公司成立于1984年,公司名称“Sybase”取自“system”和“database” 相结合的含义。Sybase公司的创始人之一Bob Epstein 是Ingres 大学版(与System/R同时期的关系数据库模型产品)的主要设计人员。公司的第一个关系数据库产品是1987年5月推出的Sybase SQLServer1.0。Sybase首先提出Client/Server 数据库体系结构的思想,并率先在Sybase SQLServer 中实现。
5. SQL Server
1987 年,微软和IBM合作开发完成OS/2,IBM 在其销售的OS/2 ExtendedEdition 系统中绑定了OS/2Database Manager,而微软产品线中尚缺少数据库产品。为此,微软将目光投向Sybase,同Sybase 签订了合作协议,使用Sybase的技术开发基于OS/2平台的关系型数据库。1989年,微软发布了SQL Server 1.0 版。
6. PostgreSQL
PostgreSQL 是一种特性非常齐全的自由软件的对象——关系性数据库管理系统(ORDBMS),它的很多特性是当今许多商业数据库的前身。PostgreSQL最早开始于BSD的Ingres项目。PostgreSQL 的特性覆盖了SQL-2/SQL-92和SQL-3。首先,它包括了可以说是目前世界上最丰富的数据类型的支持;其次,目前PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统.
7.mySQL
mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是: www.mysql.com
本篇文章继续围绕SQL的语法重点为大家介绍 子查询 的使用。
使用子查询进行过滤
在SQL中SELECT语句用于查询,之前所使用的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。然而SQL还可以创建子查询,即嵌套在其他查询中的查询。
示例:
数据表:本次使用的数据库表都是 关系表 。订单存储在两个表中,每个订单包含订单编号、客户ID、订单日期,在Orders表中存储为一行。各订单的物品存储在相关的OrderItems表中。Orders表不存储顾客信息,只存储顾客ID。顾客实际信息存储在Customers表中。
若现在需要检索出订购RGAN01的所有顾客,应怎样检索? 步骤如下:
① 检索包含物品RGAN01的所有订单的编号。
② 检索具有前一步骤列出的订单编号的所有顾客的ID。
③ 检索前一步骤返回的所有顾客ID的顾客信息。
上述每个步骤都可 单独作为一个查询 来进行。
可将一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句,也可使用 子查询 来将3个查询组合成一条语句。
① 第一个语句含义明确,是对prod_id为RGAN01的所有订单物品检索其order_num列。
分析: 通过该语句知道了哪个订单包含要检索的物品。
② 下一步查询与上述语句检索出的订单20007和20008相关的顾客ID。此处可利用IN子句。
下面可结合上述两个查询,将第一个查询变为子查询。
分析:在SELECT语句中, 子查询总是从内向外处理 。在处理上述SELECT语句时,DBMS实际上执行了两个 *** 作。
首先执行了 圆括号()内的查询 ,此查询返回两个订单号: 20007 和 20008 .
接着这两个值以IN *** 作符要求的逗号分隔的格式传递给外部查询的WHERE子句。 外部查询变为:
该语句检索的结果和前面硬编码WHERE子句返回的结果相同。
③ 由上述语句得出订购物品RGAN01的所有顾客ID: 100004 和 100005 .下一步检索这些顾客ID的顾客信息。
也可将其中的WHERE子句转换为子查询,就不用硬编码这些顾客ID了。
分析: DBMS实际上必须执行三条SELECT语句才能完成上述语句。最里面的子查询返回订单号,此列用于外面的子查询的WHERE子句。外面的子查询返回顾客ID列,此顾客ID列用于最外层查询的WHERE子句。最外层查询返回最终所需的数据。
由此可见,在WHERE子句中使用子查询可编写出功能强大灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际应用中由于 性能的限制 ,不宜嵌套太多子查询。
注意: 作为子查询的SELECT语句只能查询 单个列 ,检索多个列将返回错误。另外使用子查询并不总是执行该类数据检索的最有效方法。
作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。
示例: 需要显示Customers表中每个顾客的订单总数。订单与相应的顾客ID都存储在Orders表中。要执行这个 *** 作,需要以下步骤:
① 从Customers表中检索顾客列表。
② 对于检索出的每个顾客,统计其在Orders表中的订单数目。
这里我们可以应用之前介绍的 SELECT COUNT(*) 对表中的行进行计数,并通过一条WHERE子句来过滤某个特定的顾客ID,仅对该顾客的订单进行计数。
如下对顾客1000001的订单进行计数:
要对每个顾客执行COUNT(*)需要将其作为一个子查询,如下:
分析: 该SELECT语句对Customers表中的每个顾客返回三列:cust_name、cust_state和orders。orders是一个 计算字段 ,它由圆括号中的子查询建立。该子查询对检索出的每个顾客执行一次。此例中, 该子查询执行了5次 ,因为检索出了5个顾客。
子查询中的WHERE子句与之前使用的WHERE子句略有不同,因为它使用了 完全限定列名 ,而不只是列名(cust_id)。它指定表名和列名(Orders.cust_id和Customers.cust_id)。下面的WHERE子句告诉SQL,比较Orders表中的cust_id和当前正从Customers表中检索出的cust_id:
在有可能混淆列名时必须用一个 句点分隔表名和列名 。此例中,有两个cust_id列:一个在Customers中,另一个在Orders中。若不采用完全限定名,DBMS会认为要对Orders表中的cust_id自身进行比较。因为:
上述语句总返回Orders表中订单的总数,而该 结果不是我们想要的 ,如下:
由上可知,在构造语句时,若涉及到多个表,而不对同一列名加以区分则会引起DBMS抛出错误信息。
好的做法是,当在SELECT语句中 *** 作多个表时, 使用完全限定列名来避免歧义 。
最后总结一下子查询的特点:
① 子查询必须括在圆括号中。
② 子查询的SELECT子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
③ 子查询不能使用ORDER BY,不过主查询可以。在子查询中,GROUP BY可以起到同ORDER BY相同的作用。
④ 返回多行数据的子查询只能同多值 *** 作符一起使用,比如IN *** 作符。
⑤ SELECT 列表中不能包含任何对BLOB、ARRAY、CLOB或者NCLOB类型值的引用。
⑥ 子查询不能直接用在聚合函数中。
⑦ BETWEEN *** 作符不能同子查询一起使用,但是BETWEEN *** 作符可以用在子查询中。
以上便是本次介绍的全部内容,下篇文章将为大家讲解 连接 和 高级连接 的使用。
我们下期再见!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)