oracle 单表查询

来源:互联网 发布:广州数据分析师培训 编辑:程序博客网 时间:2024/06/11 04:25
1.1 查询表中所有的行与列如下,那么在查询之前还是一样要看一下表的结构

desc emp ;


若领导要看所有员工的信息,其实操作上很简单只需要在select * 后面加上表名即可,这个时候得到的结果是所有行与列的集合;

1.2从表中检索部分行
查看公司有多少销售人员,那么只需要在查询数据时增加一个过滤条件就可以,比喻列是JOB,销售人员条件是where job='SALESMAN';
SELECT  * FROM EMP E WHERE  E.JOB='SALESMAN'

1.3查找空值,什么是空值(NULL)

如果要查询某一列为空的数据,比喻,返回提成(COMM)为空的数据
select * from emp e where e.comm  is null;


查找空值的要点:查找空值时不能用“=”运算符,要用 IS NULL判断,如果用了=运算符效果如下:


同时NULL不支持加、减、乘、除、大小比较、相等比较、否则只能为空。
SELECT * FROM DUAL D WHERE  1>=NULL;
SELECT * FROM dual d WHERE 1<=NULL;
SELECT * FROM dual d WHERE 1+NULL <=10;
 SELECT * FROM dual d WHERE 1+NULL >=10;

没有得到任何结果,对于其它的函数在使用时最好测试一下有NULL时会返回什么结果。
我想把'ABCDE'中的E替换成空值,怎么操作呢?
SELECT REPLACE('ABCDE','E',NULL)  FROM DUAL;

怎么把1替换成空值,其实用上面的语句也可以做到,两种方法如下:
SELECT REPLACE(1,1,NULL) FROM DUAL D;

或者:SELECT GREATEST(1,NULL)  FROM DUAL D;

结束:(END 2017-06-12 0:04)

开始:(START 2017-06-13 21:53)
由于昨天晚上工作上出了一些状况,以及酒店的网络时好时坏没有心情来写博客,在写博客之前还是要吐槽一下这两天的心情,可以说是心力交瘁,来自两个方面家庭和工作,家庭方面是因为奶奶的身体不好父亲也一直操心她的身体希望奶奶身体尽快恢复,虽然父亲不说但是我也能感觉到他心里的焦虑,工作上是因为客户投诉了我们在处理售后机制上总是延迟,而这个项目的负责人又是我,所以晚上我又同客户写了一封道歉信,但无论怎么样工作和生活还是要继续向前走,对自己说加油。
继续今晚的学习:

1.4将空值转换为实际值

SELECT COALESCE(e.comm,0)  FROM emp e;

这个时候有的人会问,为什么不使用NVL函数,我觉得这里如果用NVL函数也可以达到我们想要的结果,但是会嵌套很多层,不好理解,记住COALESCE 这个函数。如下:
CREATE OR REPLACE VIEW x  AS
SELECT NULL AS c1,NULL AS c2,1 AS c3,NULL AS c4,2 AS c5,NULL AS c6 FROM dual d
UNION ALL
SELECT NULL AS c1,NULL AS c2,NULL AS c3,3 AS c4,NULL AS c5,2 AS c6 FROM dual d;
SELECT * FROM x;


SELECT  COALESCE(C1,C2,C3,C4,C5,C6)  AS C FROM V(这样就很方便地返回第一个不为空的值)


1.5 查找满足多个条件的行

由于这两天都在长沙出差一直都没有更新博客,今天是周日从老家返回到武汉,这两天回家主要是看看父母和小孩,有一个月没有回家了,挺想他们的,想想也是我们做项目的有几个能一直陪在家人的身边的,话不多说接着学习。

开始:(START 2017-06-18 19:33)

对于简单的查询来说操作起来也是比较容易的,那么复杂一点该从何分析呢,请看一下例子如下:

要查询部门10中的的所有员工,所有得到提成的员,以及部门20中工资不超过2000dollar的员工。

首先需要把这三个条件整成逻辑表达式的形式:(部门10中所有的员工 OR 所有得到提成的员工OR 工资<=2000  AND 部门号=20);

SELECT * FROM emp e
WHERE
/*部门10中所有的员工 OR 所有得到提成的员工*/
(e.deptno=10 OR e.comm IS NOT NULL)
 OR
  /*部门20中工资不超过20000*/
 (e.sal<=2000 AND e.deptno=20);

这里要注意的是括号的使用(因为在多个条件组合中使用了括号后可以不必要考虑优先级的问题而且很容易找到各个条件的起始位置)。

1.6 从表中检索部分列

前面都是从表中获取所有列,但是常常只需要返回部分列的数据即可,例如:员工编码、员工的名称、雇佣日期、工资所以一般要明确查询哪些列而不用使用"*"号来代替。

select e.empno,e.ename,e.hiredate,e.sal from emp e ;


1.7 为列取有意义的别名

通常我们在项目当中不是每个人都能看懂字母的含义,所以该给列取个别名,可以在字段的AS后面加上别名也可以直接跟上别名即可,请看如下事例:

SELECT e.empno AS 员工编号,e.ename 员工名称,e.sal 工资,e.comm 提成  FROM emp e


1.8 在WHERE子句中引用取别名的列

SELECT * FROM (SELECT E.empno,E.ename,E.sal  工资  FROM emp e) where 工资<3000;


1.9 拼接列

有的人不喜欢看表格的数据,希望返回的数据都像‘CLARK’的工作是‘MANAGER',我们可以通字符串连接符“||”来把各列拼在一起,如下:


1.10 在SELECT 语句中使用条件逻辑

如:当职员工资小于或等于2000美元时,就返回消息“过低”,大于或等于4000美元时就返回消息“过高”,如果在这两个条件之间就返回"ok" 类似这种需求我们也会经常遇到,处理这样的需求可以用CASE WEHN 来判断转化。

SELECT E.ename,E.sal,CASE WHEN E.sal<2000 THEN '过低'
                          WHEN E.SAL>4000 THEN '过高'
                          ELSE 'OK' END AS STATUS  FROM emp e;


但往往这中方式还经常体现在报表中,比如要按工资分档次统计人数

SELECT 档次,count(*)  名次 FROM (SELECT (CASE WHEN E.sal<=1000 THEN '0000-1000'
                          WHEN E.sal<=2000 THEN '1000-2000'
                          WHEN E.sal<=3000 THEN '2000-3000'
                          WHEN E.sal<=4000 THEN '3000-4000'
                          WHEN E.sal<=5000 THEN '4000-5000'
                          WHEN E.sal<=6000 THEN '5000-6000'
                          END )AS 档次 FROM emp e) group by 档次 order by 名次;

1.11 限制返回的行数

通常在查询数据时其实是不需要返回所有数据,比喻要求抽查时只返回2条数据,这个时候就会用到ROWNUM来过滤,ROWNUM依次对每一条数据做一个标示;

SELECT * FROM emp e  where ROWNUM<=2;


如果用ROWNUM=2 来查询会出现什么的情况呢?如下图


可以看到的结果什么数据都没有查出来,这是为什么呢?因为本质上需要把ROWNUM=2的这条记录找出来,就像在班级名次排序一下,知道了第一名才能知道第二名。

SELECT * FROM (SELECT ROWNUM rn,e.* FROM emp e) WHERE rn<=2;


1.12 从表随机返回n条记录(DBMS_RANDOM)

SELECT * FROM (SELECT E.empno,E.ename FROM emp e ORDER BY dbms_random."VALUE"()) WHERE ROWNUM<=3 ;

1.13模糊查询

先建立一个VIEW:

DROP VIEW V;
CREATE OR REPLACE VIEW  V AS
SELECT 'ABCEDF' AS VNAME FROM dual
UNION ALL
SELECT '_BCEFG' AS VNAME FROM dual
UNION ALL
SELECT '_BCEDF' AS VNAME FROM dual
UNION ALL
SELECT '_\BCEDF' AS VNAME FROM dual
UNION ALL
SELECT 'XYCEG' AS VNAME FROM dual;

范例1:查出VNAME中包含字符串“CED”的  正常情况下,我们会这样写:

SELECT * FROM V  v   WHERE V.VNAME LIKE '%CED%' 模糊查询如下:


范例2:查询出VNAME中包含字符串'_BCE'的

正常情况下我会这样:

SELECT * FROM V V WHERE V.VNAME LIKE '_BCE%'那来看看效果:


这个时候看的结果发多了个"ABCEDF".因为LIKE字句中有两个通配符"%" 、"_"(替代一个或多个字符),在这里"_"被当作通配符了,如果遇到这种情况就要用到"转义字符"(ESCAPE)如下:

SELECT * FROM V v  WHERE V.VNAME LIKE '\_BCE%' ESCAPE '\';


截止目前为单表查询说完了,希望在以后的工作中能对自己起到作用。

今天还做了一个POWERBI图表,上图了




end(2017-06-25)




原创粉丝点击