有些Oracle对于新的平台来说是一些棘手的问题,但对于关系型数据库(
MySQL,MS sql Server,Postgres等)来说并不是新鲜事.
@H_403_1@我正在寻找的事情的两个例子
@H_403_1@>许多关系数据库产品处理为您创建一个auto_increment密钥. Oracle不会,您必须手动创建序列,然后创建触发器
>当通过sql Developer界面插入数据时,必须手动提交数据 @H_403_1@PHP相关的积分奖励,因为这是这个假设经验的newb将使用的平台.
>当通过sql Developer界面插入数据时,必须手动提交数据 @H_403_1@PHP相关的积分奖励,因为这是这个假设经验的newb将使用的平台.
注意:我只是在这里解释问题,即Oracle的行为不如其他系统那样. Oracle与其他RDBMS相比有许多优点,但它们不是该主题.
@H_403_1@>你不能没有FROM SELECT.
SELECT 1@H_301_15@ @H_403_1@将失败,您需要:SELECT 1 FROM dual@H_301_15@ @H_403_1@>空字符串和NULL是一样的.SELECT * FROM dual WHERE '' = ''@H_301_15@ @H_403_1@没有回报.
>没有TOP或LIMIT.您将结果限制在WHERE子句中:SELECT * FROM ( SELECT * FROM mytable ORDER BY col ) WHERE rownum < 10@H_301_15@ @H_403_1@正是这样,使用子查询,因为ROWNUM在ORDER BY之前被评估.
>您无法将相关子查询嵌套多于一个级别.这将失败:SELECT ( SELECT * FROM ( SELECT dummy FROM dual di WHERE di.dummy = do.dummy ORDER BY dummy ) WHERE rownum = 1 ) FROM dual do@H_301_15@ @H_403_1@这是个问题.
> NULL值不被索引.此查询将不会使用索引进行排序:SELECT * FROM ( SELECT * FROM mytable ORDER BY col ) WHERE rownum < 10@H_301_15@ @H_403_1@,除非col被标记为NOT NULL. @H_403_1@注意,它不是没有索引的NULL值,而不是列.您可以在可空列中创建索引,非NULL值将进入索引. @H_403_1@但是,当查询条件假定NULL值可能满足它时,索引将不会被使用. @H_403_1@在上面的示例中,您希望返回所有值(包括NULL).那么索引不知道非NULL值,因此无法检索它们.SELECT * FROM ( SELECT * FROM mytable ORDER BY col ) WHERE rownum < 10@H_301_15@ @H_403_1@但这个查询将使用索引:SELECT * FROM ( SELECT * FROM mytable WHERE col IS NOT NULL ORDER BY col ) WHERE rownum < 10@H_301_15@ @H_403_1@,因为非NULL值不能满足条件.
>默认情况下,NULL最后排序,而不是首先(如Postgresql中,但与MysqL和sql Server不同) @H_403_1@这个查询:SELECT * FROM ( SELECT 1 AS id FROM dual UNION ALL SELECT NULL AS id FROM dual ) q ORDER BY id@H_301_15@ @H_403_1@将返回id --- 1 NULL@H_301_15@ @H_403_1@要像sql Server和MysqL一样排序,请使用:SELECT * FROM ( SELECT 1 AS id FROM dual UNION ALL SELECT NULL AS id FROM dual ) q ORDER BY id NULLS FIRST@H_301_15@ @H_403_1@请注意,除非后者没有从子查询中使用,否则它会破坏rownum顺序(如上所述)
>“MYTABLE”和“mytable”(双引号)是不同的对象.SELECT * FROM mytable -- wihout quotes@H_301_15@ @H_403_1@将从前者中选出,而不是后者.如果前者不存在,查询将失败.CREATE TABLE mytable@H_301_15@ @H_403_1@创建“MYTABLE”而不是“mytable”.
>在Oracle中,所有隐式锁(由DML操作产生的)都是行级,并且不会升级.那就是没有行不受事务的影响可以隐式锁定. @H_403_1@作家绝对不会阻止读者(反之亦然). @H_403_1@要锁定整个表,您应该发出一个显式的LOCK TABLE语句. @H_403_1@行锁存储在数据页上.
>在Oracle中,没有“CLUSTERED索引”,有“索引组织表”.默认情况下,表是堆组织的(与InnoDB不同的是sql Server和MysqL). @H_403_1@在Oracle世界中,“集群存储”意味着组织几个表,以便共享公共密钥(来自多个表)的行也共享一个数据页. @H_403_1@单个数据页可以从多个表中托管多个行,这使得该键上的连接超级快速.