Oracle数据库语法的使用

1、加索引

方式一:
要为Oracle数据库中的具体字段加索引,可以按照以下步骤操作:

  1. 确认需要添加索引的字段:首先,确定哪些字段需要添加索引。通常情况下,需要为经常被查询的字段添加索引,例如常用于WHERE子句的字段或JOIN操作的字段。

  2. 查看现有的索引:使用DESCRIBE命令查看该表的索引情况。例如,如果要为名为"employees"的表添加索引,可以使用以下查询语句:

    DESCRIBE employees;
    

    这将显示表的结构,包括索引信息。

  3. 创建索引:使用CREATE INDEX命令创建索引。以下是一个示例,用于为名为"employees"表中的"last_name"字段创建索引:

    CREATE INDEX idx_last_name ON employees(last_name);
    

    这将在"last_name"字段上创建一个名为"idx_last_name"的索引。

  4. 验证索引:可以再次使用DESCRIBE命令验证索引是否被成功创建。也可以执行相应的查询来验证索引是否被使用,以及是否提高了查询性能。例如,执行以下查询来查找包含特定字符串的员工:

    SELECT * FROM employees WHERE last_name LIKE '%Smith%';
    

    如果查询速度有显著提升,说明索引创建成功并生效。

重要提示:索引的创建需要一定的资源和时间,因此应谨慎添加。不宜为每个字段都添加索引,否则可能导致性能下降。需要根据具体的查询需求和数据量来决定是否添加索引。另外,在添加索引之后,数据库中的数据更新或插入操作可能会变慢,因为需要维护索引的数据结构。

方式二:

要查询Oracle数据库中表的索引情况,可以使用以下SQL查询语句:

  1. SELECT * FROM user_indexes WHERE table_name = ‘your_table_name’;
    将 “your_table_name” 替换为要查询索引的表名。这将返回与该表相关的所有索引的详细信息,包括索引名称、所属表名、索引类型、列名等。

如果你是该表的拥有者而不是当前用户,可以使用下面的语句:

  1. SELECT * FROM all_indexes WHERE owner = ‘your_schema_name’ AND table_name = ‘your_table_name’;
    将 “your_schema_name” 替换为表所属的模式(或者简单地省略该条件以查询当前用户所拥有的表),将 “your_table_name” 替换为要查询索引的表名。

请注意,这些查询只查询与表相关的索引。如果你希望查询整个数据库中所有的索引,请使用 dba_indexes 视图,但需要具有足够的权限才能访问该视图。

2、主键ID自增

oracel 数据库新增表后,主键ID自增需要添加序列:命令如下:
CREATE SEQUENCE "APPS"."表名_SQUE" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 CACHE 20

3、基础语法

  1. 查询某个字段是否有重复数据 YOUR_FIELD 字段 YOUR_TABLE表名
SELECT YOUR_FIELD, COUNT(YOUR_FIELD) AS Duplicates
FROM YOUR_TABLE
GROUP BY YOUR_FIELD
HAVING COUNT(YOUR_FIELD) > 1;
  1. 修改表字段类型
alter table CUX_OM_PROJECT_SO_CONFIG add tmp_col DATE(7);-- 添加临时列
 
update CUX_OM_PROJECT_SO_CONFIG set tmp_col =  ; --将目标字段中数据加入到临时列中
 
update CUX_OM_PROJECT_SO_CONFIG set END_DATE = null; --将目标字段数据清空
 
alter table CUX_OM_PROJECT_SO_CONFIG modify ( END_DATE NUMBER(1)); --更改目标字段类型
 
update CUX_OM_PROJECT_SO_CONFIG set END_DATE = tmp_col; --将临时列数据加回到目标字段中
 
alter table CUX_OM_PROJECT_SO_CONFIG drop column tmp_col; --清除临时列
 
SELECT DISTINCT END_DATE  FROM CUX_OM_PROJECT_SO_CONFIG;
SELECT DISTINCT tmp_col  FROM CUX_OM_PROJECT_SO_CONFIG;
  1. 基于A字段多条数据,获取B字段最大的一条数据
-- 查询思路:为了按照 c.PRODUCT_CODE 进行分组,并取出每个 PRODUCT_CODE 下 DETAIL_ID 取最大的那一条记录,可以使用子查询结合 ROW_NUMBER() 或 MAX() 函数。我们确保从 TECH_PROBLEM_CLOSED 表中每个 PRODUCT_CODE 获取 DETAIL_ID 最大的一条记录。以下是通过使用 ROW_NUMBER() 函数的查询示例:
SELECT
            detailId,
            billNo,
            testField,
            problemCategory,
            briefDesc,
            detailDesc,
            productCode
        FROM
            (
                SELECT
                    c.DETAIL_ID AS detailId,
                    c.BILL_NO AS billNo,
                    c.TEST_FIELD AS testField,
                    c.PROBLEM_CATEGORY AS problemCategory,
                    c.BRIEF_DESC AS briefDesc,
                    c.DETAIL_DESC AS detailDesc,
                    c.PRODUCT_CODE AS productCode,
              			-- 根据物料编码 PRODUCT_CODE多条情况下,取 DETAIL_ID 最大的一条数据
                    ROW_NUMBER ( ) OVER ( PARTITION BY c.PRODUCT_CODE ORDER BY c.DETAIL_ID DESC ) AS rn
                FROM
                    TECH_PROBLEM_CLOSED c
                WHERE
                    c.PRODUCT_CODE = #{itemNum}
            )
        WHERE
            -- 只取一条数据  
            rn = 1;

--优化说明:
--使用 ROW_NUMBER(): 我们在 PARTITION BY c.PRODUCT_CODE 中对 PRODUCT_CODE 进行分组,并使用 ORDER BY c.DETAIL_ID DESC 确保 DETAIL_ID 最大的记录排在前面。ROW_NUMBER() 将为每个 PRODUCT_CODE 分组中的行分配一个唯一的序号。

--过滤结果: 外层查询使用 WHERE rn = 1 来选择每组中的最大 DETAIL_ID 记录。

--保留条件: SQL中包含了 WHERE 子句以过滤产品代码。
  1. 基于某个字段的内容前几位进行去重
SELECT
    DETAIL_ID,
    MASTER_ID,
    ITEM_NUMBER,
    ITEM_NAME,
    ITEM_TYPE 
FROM
    (
    SELECT
        DETAIL_ID,
        MASTER_ID,
        ITEM_NUMBER,
        ITEM_NAME,
        ITEM_TYPE,
        ROW_NUMBER() OVER (PARTITION BY SUBSTR(ITEM_NUMBER, 1, 6) ORDER BY DETAIL_ID) AS rn 
    FROM
        "CUX_TECH_PROJECT_NEW_ITEM" 
    ) 
WHERE
    rn = 1;
--优化说明:
--使用 SUBSTR 函数:在 PARTITION BY 子句中,使用 SUBSTR(ITEM_NUMBER, 1, 6) 来只考虑 ITEM_NUMBER 的前6位进行分组。这是实现您的需求的关键。

--保持原有逻辑:查询的主要逻辑保持不变。依然是通过 ROW_NUMBER() 对分组结果进行排序并筛选出每组的第一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值