Oracle陷入了经验丰富的新事物

Ala*_*orm 12 php mysql sql-server oracle postgresql

对于刚接触平台的人来说,Oracle有什么问题,但对于关系数据库(MySQL,MS SQL Server,Postgres等)来说并不陌生.

我正在寻找的那种事情的两个例子

  1. 许多关系数据库产品处理为您创建auto_increment键.Oracle没有,您必须手动创建序列,然后创建触发器

  2. 通过SQL Developer界面插入数据时,您必须手动提交数据

PHP相关问题的奖励积分,因为这是假设有经验的newb将使用的平台.

Qua*_*noi 23

注意:我只解释这里的陷阱,即Oracle行为不像其他系统那样的情况.Oracle比其他RDBMS人有很多好处,但他们不是帖子的主题.

  • 你不能SELECT没有FROM.

    SELECT  1
    
    Run Code Online (Sandbox Code Playgroud)

    会失败,你需要:

    SELECT  1
    FROM    dual
    
    Run Code Online (Sandbox Code Playgroud)
  • 空字符串和NULL是一样的东西.

    SELECT  *
    FROM    dual
    WHERE   '' = ''
    
    Run Code Online (Sandbox Code Playgroud)

    没有回报.

  • 既没有TOP也没有LIMIT.您在WHERE条款中限制结果:

    SELECT  *
    FROM    (
            SELECT  *
            FROM    mytable
            ORDER BY
                    col
            )
    WHERE   rownum < 10
    
    Run Code Online (Sandbox Code Playgroud)

    正是这样,使用子查询,因为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
    
    Run Code Online (Sandbox Code Playgroud)

    这是个问题.

  • NULL值未编入索引.此查询不会使用索引进行排序:

    SELECT  *
    FROM    (
            SELECT  *
            FROM    mytable
            ORDER BY
                    col
            )
    WHERE   rownum < 10
    
    Run Code Online (Sandbox Code Playgroud)

    ,除非col标记为NOT NULL.

    请注意,它不是索引的NULL ,而不是.您可以在可空列上创建索引,非NULL值将进入索引.

    但是,当查询条件假定NULL值可能满足它时,将不使用索引.

    在上面的示例中,您希望返回所有值(包括NULLs).然后索引不知道非NULL值,因此无法检索它们.

    SELECT  *
    FROM    (
            SELECT  *
            FROM    mytable
            ORDER BY
                    col
            )
    WHERE   rownum < 10
    
    Run Code Online (Sandbox Code Playgroud)

    但是这个查询将使用索引:

    SELECT  *
    FROM    (
            SELECT  *
            FROM    mytable
            WHERE   col IS NOT NULL
            ORDER BY
                    col
            )
    WHERE   rownum < 10
    
    Run Code Online (Sandbox Code Playgroud)

    因为非NULL价值不能满足条件.

  • 默认情况下,NULLs的最后排序,不是第一个(像PostgreSQL,但不像MySQLSQL Server)

    这个查询:

    SELECT  *
    FROM    (
            SELECT  1 AS id
            FROM    dual
            UNION ALL
            SELECT  NULL AS id
            FROM    dual
            ) q
    ORDER BY
            id
    
    Run Code Online (Sandbox Code Playgroud)

    将返回

    id
    ---
    1
    NULL
    
    Run Code Online (Sandbox Code Playgroud)

    要有点像在SQL ServerMySQL,这样使用:

    SELECT  *
    FROM    (
            SELECT  1 AS id
            FROM    dual
            UNION ALL
            SELECT  NULL AS id
            FROM    dual
            ) q
    ORDER BY
            id NULLS FIRST
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,rownum除非后者未在子查询中使用(如上所述),否则它会中断顺序

  • "MYTABLE""mytable"(双引号)是不同的对象.

    SELECT  *
    FROM    mytable -- wihout quotes
    
    Run Code Online (Sandbox Code Playgroud)

    将从前者中选择,而不是从后者中选择.如果前者不存在,则查询将失败.

    CREATE TABLE mytable
    
    Run Code Online (Sandbox Code Playgroud)

    创造"MYTABLE",而不是"mytable".

  • Oracle,所有隐式锁(由DML操作产生)都是行级的,永远不会升级.也就是说,不受事务影响的行可以被隐式锁定.

    作家永远不会阻止读者(反之亦然).

    要锁定整个表,您应该发出一个显式LOCK TABLE语句.

    行锁存储在数据页上.

  • Oracle,没有" CLUSTERED索引",有"索引组织表".默认情况下,表是堆组织(不像SQL ServerMySQLInnoDB).

    Oracle世界上,"集群存储"意味着组织多个表,以便共享公共密钥(来自多个表)的行也共享数据页.

    单个数据页承载多个表中的多行,这使得此键上的连接速度非常快.