11GConcepts(翻译第七章)SQL(结构化查询语言)(二)

2014-11-24 10:18:21 · 作者: · 浏览: 14
以后会立即发生一个COMMIT或ROLLBACK。上面例子中,INSERT语句后面跟着ALTER TABLE语句,那么数据库把两条INSERT语句就提交了。如果ALTER TABLE语句成功,那么数据库提交这个语句,否则,数据库rollback这个语句。两种情况 无论哪种情况,前面两个INSERT语句也早已经提交了。

Data ManipulationLanguage(DML) statements(数据库操作语言 语句)

Data manipulationlanguage(DML)语句查询或操作schema objects中的数据库。DDL语句则是使你可以改变数据库的结构,DML语句使你能查询或修改内容。举个例子,ALTER TABLE改变表的结构,而INSERT 添加一行或多行到表中。

DML语句是最频繁使用的SQL语句,它使你可以:

·从一个或多个表(或视图)中检索或取回数据(SELECT)

·添加新的数据行到表或视图中(INSERT),可以指定特定的列,或使用使用子查询来获取以及操作已经存在的数据。

·改变表中已存行上的列值(UPDATE)

·通过条件来更新或插入行到一个表或视图中(MERGE).

·删除表(或视图)中的行(DELETE)

·查看SQL语句的执行计划(EXPLAIN PLAN)。

·将表或视图锁住,临时限制其他用户的访问(LOCK TABLE)。

下面例子使用DML来查询employees表。这个例子还使用DML在employees表中插入一个行,更新这行,然后删除了它:

SELECT * FROM employees;

INSERT INTO employees (employee_id,last_name, email, job_id, hire_date, salary)

VALUES (1234, 'Mascis', 'JMASCIS', 'IT_PROG', '14-FEB-2008', 9000);

UPDATE employees SET salary=9100 WHEREemployee_id=1234;

DELETE FROM employees WHERE employee_id=1234;

一些DML语句组成的一个逻辑工作单元,叫做transaction(事务)。举个例子,一个事务用来将转移一笔钱需要包含三个单独的操作:从存储账户中减少,在支付账户上增加,记录这个转移到账户历史表。和DDL不同,DML语句不会隐式提交当前的事务。

SELECT statements(SELECT 语句)

一个查询(query) 就是一个从表或事务中检索数据的操作。SELECT你唯一可以用来查询数据的语句。通过SELECT 语句检索回来的数据集合 称之为result set(结果集)。

下表显示了SELECT语句中必须的关键字,以及两个最常用的关键字。这个表同样关联了SELECT语句和这些关键字组合在一起时的功能。

关键字

是否必须

描述

功能性

SELECT

Yes

指定哪些列要在结果中显示。投影中显示表所有列中的一部分列。

一个表达式(expression)是 一个或多个值,operators(操作符),以及处理这些值的SQL函数 的组合.

在SELECT 之后,FROM 之前出现的一系列表达式, 它们统称为 SELECT list.

投影

FROM

Yes

指定要从哪个表或视图中检索数据

结合,连接

WHERE

No

指定一个条件(condition)来筛选(filter)行,产生表中行的子集。一个condition指定了 一个或多表达式以及逻辑(Boolean)操作符。然后返回TRUE,FALSE或UNKNOWN中的其中一个值。

挑选

ORDER BY

No

指定行要显示的顺序。

Joins(联合)

一个join是一个查询 组合 两个或多个表,视图或物化视图 中的行。下面例子就是join了employees和departments表(FROM子句),只选择符合标准的行(WHERE子句),以及使用投影来返回两列的数据(SELECT)。语句后面跟着这个案例的返回数据:

SELECT email, department_name

FROM employees JOIN departments

ON employees.department_id = departments.department_id

WHERE employee_id IN (100,103)

ORDER BY email;

EMAIL DEPARTMENT_NAME

-------------------------------------------------------

AHUNOLD IT

SKING Executive

下图显示了projection以及join的选择 的操作(上面例子)。

\

绝大部分 join 都有最少一个 join condition(join 条件),要么在FROM 自己,要么在WHERE子句。它比较两个表中的两列。数据库如果join condition求的值等于TRUE,将把两个表中的两行,组合成一行。基于join conditons,索引,以及可用的统计信息,优化器来决定表join时的顺序

Join有以下几种类型:

·Inner joins

一个inner join指两个或多个表join 只返回满足join条件的行。举个例子,如果join条件是employees.department_id=departments.department_id,那么不满足这个条件的行,将不返回。

·Outer joins

一个outer join 返回所有满足join条件的行,以及同样返回 某个表的行,(没有满足条件)。举个例子,employees和departments表的left outer join 将把employees表的行都返回,即使有些行在departments表中没有匹配的。一个right outer join 则会把departments的所有行都返回,即便这些行没有与employees中的匹配。

·Cartesian products(笛卡尔乘积)

如果一个join查询中的两个表,没有join条件,那么数据库将返回它们的笛卡尔乘积。一个表中的每一行都会于另外一表的每行进行组合。举个例子,如果employees表有107行,而departments表有27行,那么笛卡尔乘积将包括107*27行。笛卡尔乘积用处不大

Subqueries and ImplicitQueries(子查询,以及隐式查询)

一个子查询,就是一个嵌套在其他语句当中的SELECT语句。当你需要执行多个查询来解决一个问题时,子查询非常有用。

一个语句中,每个查询部分叫做一个query block。下面例子,括号里的子查询叫inner query block。这个inner SELECT语句会把location id等于1800的所有的部门的ID检索回来。这些ID被 outer query block需要,outer query block 把部门id符合 子查询的 雇员姓名返回。

SELECT first_name, last_name

FROM employees

WHERE department_id

IN (SELECT depar