oracle 同义词 synonym 为数据库对象建立同义词后,当dba对数据库对象(table,view,序列)做了一个简单改动之后,如名字或者结构改变,则不需要重新更改并编译应用.在数据库字典中有定义,不需要进行任何存储.
oracle别名alias,With as 生成一个临时表,对于复杂的数据查询,可以减少资源消耗、提高性能。9i引入。
with alias as (sql_statement) select * from alias
PHP code:
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as scott
SQL>
SQL> WITH emp AS (SELECT * FROM dept)
2 SELECT * FROM emp
3 ;
DEPTNO DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
with后面等于建立了一个临时表,把复杂的查询放在这儿,只运行一次
后面语句中可以多次引用,提高了效率:
但是它的机制和临时表一样,所以没有index,而且不适合大数据量,最好是返回小数据量的记录数,但是查询又比较复杂的东西
语句如:
with temp as ( select ....) --complex query
select * from temp, a
union
select * from temp, b --多次引用
....
ORACLE把它叫做: subquery_factoring_clause
Oracle9i SQL Reference
http://download-west.oracle.com/ ... ts_103a.htm#2075668
SQL的alias,可以对表和列取别名,使查询程序更易阅读和书写。
假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。
现在,我们希望列出 "John Adams" 的所有定单。
我们可以使用下面的 SELECT 语句:
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p
, Product_Orders AS po
WHERE p.LastName='Adams'
WHERE p.FirstName='John'
不使用别名的 SELECT 语句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Hansen'
WHERE Persons.FirstName='Ola'
从上面两条 SELECT 语句您可以看到,别名使查询程序更易阅读和书写。
SQL Server 2005引入了一个同义词的概念,这是一个单部分的名字,它可以替换在许多SQL语句中的一个两、三或四部分的名字。使用同义词可以让你减少输入,而且还能提供一个抽象层来为你保护底层对象的改变。为了理解其工作原理,让我们先看一下创建同义词的语法。下面是CREATE SYNONYM语句的语法:
CREATE SYNONYM [schema_name.]synonym_name FOR object_name
在此,object_name是一个SQL Server对象(全称限定已经足以能够标识出这个对象)的名字,而synonym_name是你想赋给它的新名字。如果你不想为同义词指定一种模式,那么SQL Server使用当前的用户的默认模式。当你创建同义词时,相应的对象不需要存在,因为同义词是迟绑定的:当你实际上使用同义词时,SQL Server仅仅检查基对象。
例如,在AdventureWorks示例数据库中,你可以以下列方式创建一个同义词:
CREATE SYNONYM ProdCat
FOR AdventureWorks.Production.ProductCategory
之后,你可以继续使用在SQL语句中的同义词了。例如:
SELECT * FROM ProdCat
图1显示出相应的结果:
当你使用完一个同义词后,你可以使用DROP SYNONYM语句来去掉它,它具有你期望的语法格式:
DROP SYNONYM [schema_name.]synonym_name
对于同义词的使用上也存在一些限制。对于初学者来说,你不能为任何东西都创建一个同义词。SQL Server 2005比以前引入了更多的对象,但是同义词仅限于应用于核心集的最有用的一些对象中:
· 表
· 视图
· 存储过程
· CLR存储过程
· CLR函数
· 复制过滤过程
· 扩展存储过程
· SQL标量,表值以及内联表值函数
关于在什么情况下使用同义词还存在一些限制。一般来说,你可以在下面这些T-SQL语句中使用一个同义词:
· SELECT
· sub-selects
· UPDATE
· INSERT
· DELETE
· EXECUTE
如果你仔细考虑一下,那么第二个表不应该太奇怪:它包含了最常用的where语句。注意,你不能在一个DDL语句中参考一个同义词。如果你想使用ALTER TABLE来改变ProductCategory表中的内容,那么,你需要使用基表而不是使用ProdCat同义词。
为了创建一个同义词,你需要CREATE SYNONYM权限。在创建一个同义词后,它就有了与其自己相关联的GRANT,DENY和REVOKE许可权。
四. 把同义词作为一个抽象层
除了节省你的输入时间外,同义词还可以用作你的数据库的不稳定的或经常更新部分的一个抽象层。这是因为同义词及其基对象之间的绑定仅在运行时刻检查,而不是在设计时刻。
为了说明这个问题,如果你重新定义ProdCat同义词,请研究下面发生什么情况:
DROP SYNONYM ProdCat
CREATE SYNONYM ProdCat
FOR AdventureWorks.Production.ProductCategory
SELECT * FROM ProdCat
DROP SYNONYM ProdCat
CREATE SYNONYM ProdCat
FOR AdventureWorks.Production.Culture
SELECT * FROM ProdCat
注意,当你任何时候想改变一个同义词时,你需要使用DROP和CREATE;不存在ALTER SYNONYM语句。图2显示出运行这个批处理语句的结果。
![]()
注意,在此,语句SELECT * FROM ProdCat与前面的第二次执行结果悬殊很大,因为同义词被重新定义以参考一个不同的表。
当然,你可以把这种行为应用于你自己的应用程序中。例如,假定你有一个程序,它需要分析来自于多种数据库的顾客数据。不是把基表与单个数据库连接起来或断开连接,或编写复杂的选择表格进行分析的SQL,而是使用同义词。定义一个同义词,例如DataTable,来参考你想使用的数据的四部分名字,并且重新定义它-无论何时你想要切换源数据。
当然,这种迟绑定也是一把双刃剑。因为SQL Server并不追踪是否一个同义词指向任何东西,它也不会进行任何模式绑定排序。如果你删除一个应用于另一个语句中的同义词,那么你可能直到试图运行该语句时才发现出了问题。
五. 小结
你能够开发自己的下一个SQL Server应用程序而不使用同义词吗?当然可以。它们并没有为数据库表带来根本性的新内容;你可以总是使用完全限定名字-在任何你想使用一个同义词的地方。但是有时把这些"小东西"加入到你的产品是一件不错的事情,就因为它们能够实现更少的输入和带给开发者一种更容易的体验。也许在一个应用程序的开发过程的某一阶段同义词将仅会节省你10分钟时间,但是所有这些小的10分钟相加应该是个不少的数目吧!