oreacle中sql关键字的使用

 

1、数据集合的操作

--并集,将两个集合中的所有数据都进行显示,但是不包含重复的数据
select * from emp where deptno =30 union
select * from emp where sal >1000;
--全集,将两个集合的数据全部显示,不会完成去重的操作
select * from emp where deptno =30 union all
select * from emp where sal >1000;
--交集,两个集合中交叉的数据集,只显示一次
select * from emp where deptno =30 intersect 
select * from emp where sal >1000;
--差集,包含在A集合而不包含在B集合中的数据,跟A和B的集合顺序相关
select * from emp where deptno =30 minus 
select * from emp where sal >1000;

 

2、模糊查询关键字的使用:

%:表示任意个字符,包括零个;

_:表示一个任意字符;

3、case when then的使用   注意:Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略

SELECT
    s.s_id,
    s.s_name,
    s.s_sex,
    CASE
WHEN s.s_sex = '1' THEN ''
WHEN s.s_sex = '2' THEN ''
ELSE '其他'
END as sex,
 s.s_age,
 s.class_id
FROM
    t_b_student s
WHERE
    1 = 1
<select id="selectAllProblems" resultMap="BaseResultMap">

    select id,column_name,problem_id, car_mode, title
    from (
    select t1.id,
    (case
    when #{lang} = 'zh' then t1.column_name
    when #{lang} = 'en' then t1.english_column_name
    when #{lang} = 'fr' then t1.french_column_name
    when #{lang} = 'es' then t1.spanish_column_name
    when #{lang} = 'ru' then t1.russian_column_name
    end) as column_name,
    t2.id as problem_id,
    t2.car_mode,
    (case
    when #{lang} = 'zh' then t2.problem_title
    when #{lang} = 'en' then t2.english_problem_title
    when #{lang} = 'fr' then t2.french_problem_title
    when #{lang} = 'es' then t2.spanish_problem_title
    when #{lang} = 'ru' then t2.russian_problem_title
    end) as title
    from oms_content_manage_column t1,
    oms_content_manage_problem t2
    where t1.id = t2.problem_column_id
    <if test="title != null and title != ''">
        and (case
        when #{lang} = 'zh' then t2.problem_title
        when #{lang} = 'en' then t2.english_problem_title
        when #{lang} = 'fr' then t2.french_problem_title
        when #{lang} = 'es' then t2.spanish_problem_title
        when #{lang} = 'ru' then t2.russian_problem_title
        end) like '%' || #{title} || '%'
    </if>
    and t1.column_state = '1'
    and t2.problem_subsystem in ('01', '03')
    and t2.problem_state = '1'
    and t2.display_flag = '1'
    and t2.car_mode = #{autoType}
    and t2.del_flag = 0
    and t1.del_flag = 0
    order by t1.column_sort desc,t2.problem_sort desc
    )
    union all
    select id,column_name,problem_id, car_mode, title
    from (
    select t1.id,
    (case
    when #{lang} = 'zh' then t1.column_name
    when #{lang} = 'en' then t1.english_column_name
    when #{lang} = 'fr' then t1.french_column_name
    when #{lang} = 'es' then t1.spanish_column_name
    when #{lang} = 'ru' then t1.russian_column_name
    end) as column_name,
    t2.id as problem_id,
    t2.car_mode,
    (case
    when #{lang} = 'zh' then t2.problem_title
    when #{lang} = 'en' then t2.english_problem_title
    when #{lang} = 'fr' then t2.french_problem_title
    when #{lang} = 'es' then t2.spanish_problem_title
    when #{lang} = 'ru' then t2.russian_problem_title
    end) as title
    from oms_content_manage_column t1,
    oms_content_manage_problem t2
    where t1.id = t2.problem_column_id
    <if test="title != null and title != ''">
        and (case
        when #{lang} = 'zh' then t2.problem_title
        when #{lang} = 'en' then t2.english_problem_title
        when #{lang} = 'fr' then t2.french_problem_title
        when #{lang} = 'es' then t2.spanish_problem_title
        when #{lang} = 'ru' then t2.russian_problem_title
        end) like '%' || #{title} || '%'
    </if>
    and t1.column_state = '1'
    and t2.problem_subsystem in ('01', '03')
    and t2.problem_state = '1'
    and t2.display_flag = '1'
    and t2.car_mode is null
    and t2.del_flag = 0
    and t1.del_flag = 0
    order by t1.column_sort desc,problem_sort desc
    )
</select>
select
    id,
    case when column_name is not null then '' else '' end as columnName,
    case when english_column_name is not null then '' else '' end as englishColumnName,
    case when french_column_name is not null then '' else '' end as frenchColumnName,
    case when spanish_column_name is not null then '西' else '' end as spanishColumnName,
    case when russian_column_name is not null then '' else '' end as russianColumnName
from oms_content_manage_column
and case when t.AUDIT_ROLE = 'national_service_manager' then t2.COUNTRY_CODE else #{countryList[0]} end
in
<foreach collection="countryList" item="country" open="(" close=")" separator=",">
    #{country,jdbcType=VARCHAR}
</foreach>

 

4、in/not in 的作用:  

(1)in 常用于条件表达式(where)中,它的作用是对某个范围内的数据进行操作,查询或删除。字段值只要满足这个范围之内的任意一个即可

(2)not in 作用是查询不在某个范围内的数据,字段值同时不满这个范围的所有值。

  2、语法:
     (1)select * from TableName(表名) where 字段 in (value1,value2,…);

     (2)select * from TableName(表名) where 字段 not in (value1,value2,…);

     (3)select 字段1,字段2,… from 表名 where 字段 in/not in (value1,value2,…);

5、EXIST   和not exist 关键字的使用   in和not in的区别

SELECT   ID,NAME   FROM   A   WHERE   EXIST   (SELECT   *   FROM   B   WHERE   A.ID=B.AID) 
执行结果为 
1       A1 
2       A2 
原因可以按照如下分析 
SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=1) 
---> SELECT   *   FROM   B   WHERE   B.AID=1有值,返回真,所以有数据

SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=2) 
---> SELECT   *   FROM   B   WHERE   B.AID=2有值,返回真,所以有数据

SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=3) 
---> SELECT   *   FROM   B   WHERE   B.AID=3无值,返回假,所以没有数据

NOT   EXISTS   就是反过来 
SELECT   ID,NAME   FROM   A   WHERE NOT   EXIST   (SELECT   *   FROM   B   WHERE   A.ID=B.AID) 
执行结果为 
3       A3 
=========================================================================== 
EXISTS   =   IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因 
SELECT   ID,NAME   FROM   A    WHERE ID   IN   (SELECT   AID   FROM   B) 

NOT   EXISTS   =   NOT   IN   ,意思相同不过语法上有点点区别 
SELECT   ID,NAME   FROM   A   WHERE ID NOT   IN   (SELECT   AID   FROM   B)

  链接如下:https://www.cnblogs.com/xuanhai/p/5810918.html

6、oreacle中list的使用

判断list

<if test="countryList == null or countryList.size == 0">
是否在集合中:
<if test="roleSet != null and roleSet.size > 0">
    and t.AUDIT_ROLE in
    <foreach collection="roleSet" item="role" open="(" close=")" separator=",">
        #{role,jdbcType=VARCHAR}
    </foreach>
</if>

 

7、oreacle中时间比较 获取当前时间 时间比较范围

  如果都是date类型可以直接比较:

  

<if test="repairStartDate!=null and endRepairDate!=null "  >
    AND o.REPAIR_TIME between  #{repairStartDate} and  #{endRepairDate}
</if>

  更改日期类型格式比较:

  select trunc(123.128,2) from dual; --截断数据,按照位数去进行截取,但是不会进行四舍五入的操作

and to_char(t.item_Date,'yyyy-MM-dd') = to_char(#{omsOldMaterialHandleVO.itemDate},'yyyy-MM-dd')

  当前时间在某个时间范围内:

  当前日期进行截取  yy截取到年 mm截取到月 dd截取到日

select TO_CHAR (
        TRUNC (SYSDATE, 'yy'),
        'YYYY-MM-DD hh24:mi:ss'
        ) from  dual;

 

AND TO_CHAR (
        TRUNC (SYSDATE, 'dd'),
        'YYYY-MM-DD hh24:mi:ss'
        ) BETWEEN TO_CHAR (
        ra.RECTIFICATION_ENDTIME,
        'YYYY-MM-DD hh24:mi:ss'
        )
        AND TO_CHAR (
        TRUNC (ra.RECTIFICATION_ENDTIME) + 30,
        'YYYY-MM-DD hh24:mi:ss'
        )

8、NVL关键字的使用

  1、NVL(表达式A,表达式B)

如果表达式A为空值,NVL返回值为表达式B的值,否则返回表达式A的值。该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式A和表达式B的数据类型必须为同一个类型。

例:

nvl(clue_num,0):如果clue_num为空,则返回0;否则返回clue_num的值

2、NVL2(表达式A,表达式B,表达式C)

如果表达式A为空,则返回表达式C的值;如果表达式A不为空,则返回表达式B的值。
例:
nvl(sex,0,1):如果sex为空,则返回1;否则返回0
 

9、listagg关键字使用: 使用  listagg() WITHIN GROUP ()  将多行合并成一行(比较常用)

SELECT
OCP.*, su.realName AS currentHandlerName,
(
SELECT
listagg (
CAST (
su1.realname AS VARCHAR2 (500)
),
','
) WITHIN GROUP (

ORDER BY
OCA.SERVICE_INCENTIVE_ID
)
FROM
oms_ser_incentive_result OCA

https://blog.csdn.net/sinat_36257389/article/details/81004843

其中cast函数的使用:

一、转换列或值

语法:cast( 列名/值 as 数据类型 )

用例:

1)、转换列

--将empno的类型(number)转换为varchar2类型。

select cast(empno as varchar2(10)) as empno from emp;

 10、oreacle中group by  设计到分组会取最大值 最小值  和的值计算 max  min  sum

例如: 设计的案例可以查询如下:

https://www.cnblogs.com/haozhengfei/p/e6a9a2f95b0b85887857e00176e800a8.html

https://baijiahao.baidu.com/s?id=1664040284917893293&wfr=spider&for=p

11、oracle之nulls last

select * from 表 where 条件 order by 某个字段 (asc/descv) nulls last;

nulls first和nulls last是Oracle Order by支持的语法
如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)
如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后 (不管是asc 还是 desc)

12、oreacle之关联Update

UPDATE OMS_CARINFO_RECTIFICATION t1
SET T1.is_repair ='1'
WHERE t1.lathe_number= '20H86BX-0105' and EXISTS(SELECT 1 FROM RECTIFICATION_ACTIVITY_INFO T2 WHERE  t1.service_id = t2.id and t2.RECTIFICATION_ACTIVITY_NUM = 'B20220101')   ;


UPDATE (
select   t1.is_repair     from OMS_CARINFO_RECTIFICATION  t1,RECTIFICATION_ACTIVITY_INFO  t2 where t1.service_id = t2.id and  t2.RECTIFICATION_ACTIVITY_NUM = 'B20220101' and t1.lathe_number= '20H86BX-0105'
)t
set is_repair='1';

 13、oreacle值coalesec 

  coalesec(case1,case2) 如果第一个为空的话,取第二个的值。

14、row_number() over(partition by 列名1 order by 列名2 desc)的使用

  表示根据 列名1 分组,然后在分组内部根据  列名2 排序,而此函数计算的值就表示每组内部排序后的顺序编号,可以用于去重复值

select * 

FROM
dms_warranty_material dm
LEFT JOIN dms_warranty_order do ON dm.warranty_order_no = do.WARRANTY_ORDER_NO
LEFT JOIN (
SELECT
*
FROM
(
SELECT
ah. ID,
ah.audit_by,
ah.audit_time,
ah.audit_role,
ah.main_id,
ah.audit_type,
ROW_NUMBER () OVER (
PARTITION BY ah.main_id
ORDER BY
ah.audit_time DESC
) AS code_id
FROM
dms_warranty_audit_history ah
WHERE
ah.del_flag = 0
AND ah.audit_role LIKE '%OVERSEA%'
AND ah.audit_type = '00'
)
WHERE
code_id = 1
) oah ON oah.main_id = do. ID
LEFT JOIN (
SELECT
*
FROM
(
SELECT
ah. ID,
ah.audit_by,
ah.audit_time,
ah.audit_role,
ah.main_id,
ah.audit_type,
ROW_NUMBER () OVER (
PARTITION BY ah.main_id
ORDER BY
ah.audit_time DESC
) AS code_id
FROM
dms_warranty_audit_history ah
WHERE
ah.del_flag = 0
AND ah.audit_role LIKE '%SETTLE%'
AND ah.audit_type = '00'
)
WHERE
code_id = 1
) sah ON sah.main_id = do. ID
WHERE
dm.del_flag = 0

 

 其中 在关联字表的时候,where 写在主表外面 和写在字表里面是有区别的。写在字表里面是 过滤字表的数据,写在外面是过滤主表的数据。

 15.为了防止sql注入 不等于用 1 <> 1

16.exists关键字

/*exists(sub-query),当exists中的子查询语句能查到对应结果的时候,
意味着条件满足
相当于双层for循环
--现在要查询部门编号为10和20的员工,要求使用exists实现
*/
select * from emp where deptno = 10 or deptno = 20;
--通过外层循环来规范内层循环
select *
  from emp e
 where exists (select deptno
          from dept d
         where (d.deptno = 10 or d.deptno = 20)
           and e.deptno = d.deptno)

17.取两个日期的交集之和

SUM (LEAST (table.date,#{req.date1}) - GREATEST (table.date1,#{req.date1}))

 18.判断数据是否包含     find_in_set

  

 19.当我们在写sql的时候,不便于查询条件的时候

${ew.customSqlSegment}在使用时,相当与 where + queryWrapper内的条件
${ew.sqlSegment}相当于queryWrapper内的条件  
xml文件:@Param(Constants.WRAPPER)  Wrapper<对象> wrapper111
https://blog.csdn.net/web15870359587/article/details/123424173

20,如果我们要查询不是固定的列,那么可以用${},

在Mybatis中,${column} 会被直接替换,而 #{value} 会使用 ? 预处理。 注意:#{value}预处理:!!!----->对于使用#{}形式导入的参数,会在预处理的时候加上''单引号,

参考:https://www.cnblogs.com/bulter/p/14940517.html

21.关于update的理解:首先要查询到要更新的那一条数据,通过existx来判断,如果为true拿到这条数据。然后通过逐个字段更新。主表只可以用在字表的最外层上。

UPDATE 表名称 表昵称 表昵称.字段名 = ( SELECT t1.字段名 FROM ( SELECT pt.字段名, pt.order_code, pt.part_code, ROW_NUMBER () OVER ( PARTITION BY pt.part_code, pt.order_code ORDER BY pt.create_time ASC ) AS code_id FROM oms_lack_parts pt WHERE pt.del_flag = 0 ) t1 WHERE t1.code_id = 1 AND t1.order_code = 表昵称.order_code AND t1.part_code = 表昵称.part_code ), 表昵称.unmet_Basic_Amount = ( SELECT SUM (unmet_Basic_Amount) FROM oms_lack_parts t1 WHERE t1.part_code = 表昵称.part_code AND t1.order_code = 表昵称.order_code ), --数量 表昵称.reject_Times = ( SELECT SUM (reject_Times) FROM oms_lack_parts t1 WHERE t1.part_code = 表昵称.part_code AND t1.order_code = 表昵称.order_code ) WHERE EXISTS ( SELECT 0 FROM ( SELECT tt. ID, tt.part_code, tt.order_code, tt.lack_code, tt.lack_status, tt.create_time, ROW_NUMBER () OVER ( PARTITION BY tt.part_code, tt.order_code ORDER BY tt.create_time ASC ) AS code_id, ROW_NUMBER () OVER ( PARTITION BY tt.part_code, tt.order_code ORDER BY tt.create_time DESC ) AS code_id2, tt.字段名 FROM oms_lack_parts tt INNER JOIN ( SELECT T .PART_CODE, T .order_code FROM OMS_LACK_PARTS T WHERE T .DEL_FLAG = '0' GROUP BY T .PART_CODE, T .ORDER_CODE HAVING COUNT (T .PART_CODE) > 1 ) t1 ON tt.part_code = t1.part_code AND tt.order_code = t1.order_code INNER JOIN oms_order_bill ob ON tt.order_code = ob.order_code AND ob.del_flag = 0 AND ob.supplier_code = '0000802964' ) T WHERE T .code_id2 = 1 AND T . ID = 表昵称. ID );

 

22.多行转一行 用的方法:WMSYS.WM_CONCAT排序

 

 

 

posted @ 2022-03-06 16:26  Jerry&Ming  阅读(221)  评论(0)    收藏  举报