[数据库基础]Oracle查询优化改写_01

从今天开始,我跟大家一起学习Oracle的基础知识。孔子曰:“温故而知新,可以为师矣”。学过的东西,也要经常回顾一下,才能记得更牢,用的更溜。

1, 查看表结构
方法一:

SQL>  DESC EMP;
Name     Type         Nullable Default Comments 
-------- ------------ -------- ------- -------- 
EMPNO    NUMBER(4)                              
ENAME    VARCHAR2(10) Y                         
JOB      VARCHAR2(9)  Y                         
MGR      NUMBER(4)    Y                         
HIREDATE DATE         Y                         
SAL      NUMBER(7,2)  Y                         
COMM     NUMBER(7,2)  Y                         
DEPTNO   NUMBER(2)    Y

在command window中,可以用此命令来查看表结构。例子中用来查看emp(员工表)的结构信息,包含字段名称、字段类型、长度和是否可空的信息。
方法二:
光标放在表名称上面,同时按住Ctrl和鼠标左键,就会弹出表的详细信息页面。选择“列”,可以查看关于表字段的详细信息,和方法一的结果相同。
方法三:
光标放在表名称上面,单击鼠标右键,在弹出的菜单中,选择“描述”,和方法一的结果相同。

2, 将空值转换成实际值
这里写图片描述
要求:返回多个值中第一个不为空的值。

SELECT COALESCE(C1,C2,C3,C4,C5,C6) AS C
FROM V;

返回结果:
这里写图片描述
可以看到,相对于nvl来说,coalease支持多个函数,能很方便的返回第一个不为空的值。如果上面的语句改写为nvl,就要嵌套很多层。

select nvl(nvl(nvl(nvl(nvl(c1, c2), c3), c4), c5), c6) as c
from v;

3,对于多个条件的组合,要使用括号,这样在维护语句时可以不必再考虑优先级的问题,而且很容易通过各种工具找到各组合条件的起止位置。

SELECT T.EMPNO, T.ENAME, T.HIREDATE, T.SAL 
FROM EMP T
WHERE (T.DEPTNO = '10'
OR T.COMM IS NOT NULL
OR (T.DEPTNO = '20'AND T.SAL <= 2000));

4,拼接列

SELECT 'TRUNCATE TABLE '|| T.OWNER||'.' ||T.TABLE_NAME ||';'
FROM ALL_TABLES T
WHERE T.OWNER = 'SCOTT';

用SQL来生成SQL,当你有大量相似的SQL需要生成时,可以先写一个语句,然后进行修改,直接用基础数据或数据字典来批量生成。

5,在Select语句中使用条件逻辑

要求:按员工工资分档次统计人数。

SELECT T1.档次 , COUNT(*) as 人数
FROM 
(SELECT 
    CASE 
      WHEN T.SAL <= 1000 THEN '0-1000'
      WHEN T.SAL <= 2000 THEN '1000-2000'
      WHEN T.SAL <= 3000 THEN '2000-3000'
      WHEN T.SAL <= 4000 THEN '3000-4000'
      WHEN T.SAL <= 5000 THEN '4000-5000'
    END AS 档次,
    T.ENAME,
    T.SAL
FROM EMP T)T1
GROUP BY  档次
ORDER BY 1

返回结果:

档次 人数
0-1000 2
1000-2000 6
2000-3000 5
4000-5000 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值