Oracle笔记:数据查询函数使用

01 使用COUNT统计表中记录数

SELECT COUNT(1) FROM EMP;
SELECT COUNT(*) FROM EMP;

analyze table EMP compute statistics for table;
SELECT table_name,num_rows FROM USER_TABLES WHERE TABLE_NAME = 'EMP';

SELECT COUNT(COMM) FROM EMP;--不包含空值
SELECT COUNT(SAL) FROM EMP WHERE DEPTNO=30;
SELECT COUNT(*) FROM EMP WHERE DEPTNO=30;
SELECT COUNT(DISTINCT MGR) FROM EMP WHERE DEPTNO=30;--关键字distinct应该写在count()内,不能使用通配符*

02 使用SUM求和

SELECT SUM(COMM) FROM EMP;
SELECT SUM(SAL) FROM EMP;
SELECT SUM(DISTINCT SAL) FROM EMP;
SELECT JOB, SUM(SAL) FROM EMP GROUP BY JOB;

03 使用AVG求平均值

SELECT AVG(SAL) FROM EMP;
SELECT AVG(DISTINCT SAL) FROM EMP;
SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB;

04 返回最大最小值

SELECT MIN(SAL) FROM EMP;
SELECT MAX(DISTINCT SAL) FROM EMP;
SELECT JOB, MIN(SAL) FROM EMP GROUP BY JOB;
--聚合函数不能使用在where语句中;应在having中使用

05 查找并替换字符串

SELECT REPLACE(ENAME,'S','')FROM EMP WHERE EMPNO = 7369;

06 获取字符的ASCII码

SELECT ASCII('A') A,ASCII('a') a, ASCII('1') FROM DUAL;

07 返回字符串长度

SELECT ENAME, LENGTH(ENAME), JOB, LENGTH(JOB) FROM EMP;
SELECT LENGTH('中文zongwen')FROM DUAL;--9
SELECT LENGTH(123)FROM DUAL;--3
SELECT LENGTH(123.11)FROM DUAL;--6

08 使用ROUND确定精度

SELECT ROUND(123.456),--123
    ROUND(123.456, 2),--123.46
    ROUND(123.456, -2),--100
    ROUND(163.456,-2),--200
    ROUND(123.456,4)--123.456
FROM DUAL;

09 CEIL和FLOOR函数

--CEIL(n) 取大于等于数值n的最小整数;
--FLOOR(n)取小于等于数值n的最大整数;
SELECT CEIL(1.5) FROM DUAL;-- 2
SELECT CEIL(-1.5) FROM DUAL;-- -1
SELECT FLOOR(1.5) FROM DUAL;-- 1
SELECT FLOOR(-1.5) FROM DUAL;-- -2

10 日期运算

SELECT 
    SYSDATE AS 返回系统时间,
    TRUNC(SYSDATE,'YYYY') AS 返回当年第一天,
    TRUNC(SYSDATE,'MM') AS 返回当月第一天,
    TRUNC(SYSDATE,'D') AS 返回当前星期的第一天,
    TRUNC(TO_DATE('2020-03-01','yyyy-mm-dd'),'YYYY') AS 返回当年第一天,
    TRUNC(SYSDATE, 'Q') AS 返回当季第一天,
    TRUNC(TO_DATE('2020-03-01','yyyy-mm-dd'),'MM') AS 返回当月第一天,
    TRUNC(TO_DATE('2020-03-01','yyyy-mm-dd'),'D') AS 返回当前星期的第一天,
    ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),12)-1 AS 返回当年最后一天,
    ADD_MONTHS(TRUNC(SYSDATE, 'Q'), 3) - 1 AS 返回当季最后一天,
    LAST_DAY(SYSDATE) AS 返回当月最后一天,
    TRUNC(SYSDATE, 'D') + 7 AS 返回当周最后一天,
    ABS(CEIL(TO_DATE('2020-03-01','yyyy-mm-dd') - TO_DATE('2020-03-03','yyyy-mm-dd'))) AS 返回相差天数,
    (TO_DATE('2012-9-11','YYYY-MM-DD')-TO_DATE('2011-10-1','YYYY-MM-DD')) AS 返回相差天数,
    FLOOR(months_between(SYSDATE,TO_DATE('2010-02-02','yyyy-mm-dd'))/12) AS 返回相差的年份,
    ABS(FLOOR(months_between(SYSDATE,TO_DATE('2021-9-01','YYYY-MM-DD')))) AS 返回相差的月份,
    ADD_MONTHS(SYSDATE,-12) AS 返回日期加年,
    ADD_MONTHS(SYSDATE,1) AS 返回日期加月,
    SYSDATE+1 AS 返回日期加天,
    SYSDATE+1/24 AS 返回日期加时,
    SYSDATE+1/24/60 AS 返回日期加分,
    SYSDATE+1/24/60/60 AS 返回日期加秒,
    NEXT_DAY(SYSDATE,7) AS 返回下周几, --1表示的是周日,2表示的是周一,3表示的是周二,依此类推,参数只能1-7
    TO_CHAR(TO_DATE('2022-10-10','YYYY-MM-DD'),'DDD') AS 返回一年中的第几天,
    TO_CHAR(TO_DATE('2022-10-10','YYYY-MM-DD'),'WW') AS 返回一年中的第几周,
    TO_CHAR(TO_DATE('2022-10-10','YYYY-MM-DD'),'W') AS 返回一月中的第几周
FROM DUAL;

11 日期格式化输出

SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH:MI:SS') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD hh:mm:ss') FROM DUAL;
12NVL NVL2的使用
--NVL(E1,E2);E1为NULL就返回E2,不为NULL就返回E1
--NVL2(E1,E2,E3);E1为NULL就返回E3,不为NULL就返回E2
SELECT NVL(COMM,123) FROM EMP WHERE EMPNO = 7369;
SELECT NVL2(COMM,999,456) FROM EMP WHERE EMPNO = 7499;

12 分析函数over(Partition by…)

row_number() over(partition by 列名1 order by 列名2 desc)
rank() over(partition by 列名1 order by 列名2)
dense_rank() over(partition by 列名1 order by 列名2)

表示根据 列名1 分组,然后在分组内部根据 列名2 排序计算行号码或等级编号

首先看下表数据
在这里插入图片描述
给每个部门雇员按工资排编号

row_number(); 按排序条件生成行号,排序遇到相同值时,默认行号连续排序在这里插入图片描述
rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。
在这里插入图片描述
dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级。
在这里插入图片描述
根据上面分析函数获取的编号,实现按行号按等级查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用子查询也可以实现上面的查询功能
在这里插入图片描述

min()/max() over(partition by …)
查询每位雇员信息的同时算出雇员工资与所属部门最高/最低员工工资的差额
在这里插入图片描述
在这里插入图片描述
lead()/lag() over(partition by … order by …)
lead(列名,n,m): 当前记录后面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录<列名>的值,没有则默认值为null。
lag(列名,n,m): 当前记录前面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录<列名>的值,没有则默认值为null。

计算个人工资与比自己高一位/低一位工资的差额
在这里插入图片描述

下面再列举一些常用的方法在该语法中的应用(注:带order by子句的方法说明在使用该方法的时候必须要带order by):
在这里插入图片描述

DROP TABLE EMP CASCADE CONSTRAINT;

CREATE TABLE EMP(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
);

COMMENT ON COLUMN EMP.EMPNO IS '编码';
COMMENT ON COLUMN EMP.ENAME IS '名称';
COMMENT ON COLUMN EMP.JOB IS '工作';
COMMENT ON COLUMN EMP.MGR IS '主管';
COMMENT ON COLUMN EMP.HIREDATE IS '聘用时间';
COMMENT ON COLUMN EMP.SAL IS '工资';
COMMENT ON COLUMN EMP.COMM IS '提成';
COMMENT ON COLUMN EMP.DEPTNO IS '部门编码';

INSERT INTO EMP
SELECT 7369 AS EMPNO, 'SMITH' AS ENAME, 'CLERK' AS JOB, 7902 AS MGR, TO_DATE('19801217','yyyy-MM-dd') AS HIREDATE, 800 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7499 AS EMPNO, 'ALLEN' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810220','yyyy-MM-dd') AS HIREDATE, 1600 AS SAL, 300 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7521 AS EMPNO, 'WARD' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810222','yyyy-MM-dd') AS HIREDATE, 1250 AS SAL, 500 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7566 AS EMPNO, 'JONES' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810402','yyyy-MM-dd') AS HIREDATE, 2975 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7654 AS EMPNO, 'MARTIN' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810928','yyyy-MM-dd') AS HIREDATE, 1250 AS SAL, 1400 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7698 AS EMPNO, 'BLAKE' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810501','yyyy-MM-dd') AS HIREDATE, 2850 AS SAL, NULL AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7782 AS EMPNO, 'CLARK' AS ENAME, 'MANAGER' AS JOB, 7839 AS MGR, TO_DATE('19810609','yyyy-MM-dd') AS HIREDATE, 2450 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL UNION ALL
SELECT 7788 AS EMPNO, 'SCOTT' AS ENAME, 'ANALYST' AS JOB, 7566 AS MGR, TO_DATE('19821209','yyyy-MM-dd') AS HIREDATE, 3000 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7839 AS EMPNO, 'KING' AS ENAME, 'PRESIDENT' AS JOB, NULL AS MGR, TO_DATE('19811117','yyyy-MM-dd') AS HIREDATE, 5000 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL UNION ALL
SELECT 7844 AS EMPNO, 'TURNER' AS ENAME, 'SALESMAN' AS JOB, 7698 AS MGR, TO_DATE('19810908','yyyy-MM-dd') AS HIREDATE, 1500 AS SAL, 0 AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7876 AS EMPNO, 'ADAMS' AS ENAME, 'CLERK' AS JOB, 7788 AS MGR, TO_DATE('19830112','yyyy-MM-dd') AS HIREDATE, 1100 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7900 AS EMPNO, 'JAMES' AS ENAME, 'CLERK' AS JOB, 7698 AS MGR, TO_DATE('19811203','yyyy-MM-dd') AS HIREDATE, 950 AS SAL, NULL AS COMM, 30 AS DEPTNO FROM DUAL UNION ALL
SELECT 7902 AS EMPNO, 'FORO' AS ENAME, 'ANALYST' AS JOB, 7566 AS MGR, TO_DATE('19811203','yyyy-MM-dd') AS HIREDATE, 3000 AS SAL, NULL AS COMM, 20 AS DEPTNO FROM DUAL UNION ALL
SELECT 7934 AS EMPNO, 'MILLER' AS ENAME, 'CLERK' AS JOB, 7782 AS MGR, TO_DATE('19820123','yyyy-MM-dd') AS HIREDATE, 1300 AS SAL, NULL AS COMM, 10 AS DEPTNO FROM DUAL;
COMMIT;

猜你喜欢

转载自blog.csdn.net/qq_39827640/article/details/106353865
今日推荐