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