您的位置:首页 > 数据库 > Oracle

oracle数据库中的函数和对应的表关系

2017-08-05 16:25 477 查看

--1、字符函数
--Lower():将指定的字段或者查询的的指定列的字段转为小写;
--一次只能指定一条内容

SELECT * FROM EMP T;

SELECT LOWER('ASDFGGH') FROM EMP T;

SELECT LOWER(T.ENAME) FROM EMP T;

SELECT LOWER(T.JOB) FROM EMP T;

--Upper():将指定的字段或者查询的的指定列的字段转为大写;

SELECT UPPER('aaaaaa') FROM EMP T;

SELECT UPPER(T.ENAME) FROM EMP T;

--Initcap():首字母转为大写,后面位上的字母转为小写

SELECT INITCAP('aAAAAAA') FROM EMP T;

SELECT INITCAP(T.ENAME||T.JOB) FROM EMP T;

--Concat():字符串的连接,将两个字段放在一起

--只有两个参数;

SELECT CONCAT('AAAAA','BBBBB') LIANJIE FROM EMP T;

SELECT CONCAT(T.ENAME,T.JOB)  CONTACT FROM EMP T;



--Substr():截取指定的字符串,含有三个参数

--超出的则不对其做处理;

--*如果指定的一个开始参数是负数,则是从后面往前面进行截取,但是获取的结果顺序不变;

--*如果开始或结束的参数只有一个的情况,正数是从指定的开始位数到末尾;负数是从后面开始截取指定的位数;


SELECT SUBSTR('ABCDEFG',1,3) FROM EMP T;

SELECT SUBSTR('ABCDEFG',3) FROM EMP T;

SELECT SUBSTR('ABCDEFG',-3) FROM EMP T;

SELECT SUBSTR(T.ENAME,2,5) FROM EMP T;

--SELECT SUBSTR('ABCDEFG',1,-3) FROM EMP T;

SELECT SUBSTR(T.ENAME,-2,5) FROM EMP T;

--length():获取指定字符串的个数(可以是数字)

SELECT LENGTH('abcdef') FROM EMP T;

SELECT LENGTH(T.ENAME) FROM EMP T;

SELECT LENGTH(T.ENAME||T.JOB) FROM EMP T;

SELECT LENGTH(T.MGR) FROM EMP T;



--NVL():空值置换,含有两个参数;


SELECT NVL(T.COMM,0) FROM EMP T;

--2、数值函数

--Rou
4000
nd():对数字进行四舍五入,含有两个参数,第二位参数为0,表示保留整数部分,不做处理;

--1表示保留个分位,-1表示保留个位;


SELECT ROUND(123.123,0) FROM EMP T;

SELECT ROUND(123.456,1) FROM EMP T;

SELECT ROUND(123.456,-1) FROM EMP T;

SELECT ROUND(T.SAL,-3) FROM EMP T;

--Trunc():获取不进行四舍五入的运算,含有两个参数

--*小数部分不做处理,整数部分直接省去指定位数上的值


SELECT TRUNC(129.431,0) FROM EMP T;

SELECT TRUNC(129.431,2) FROM EMP T;

SELECT TRUNC(129.431,-2) FROM EMP T;

--Mod():取余数,含有两个参数

--???

--*如果除数是负数,结果按照正数进行输出;

--*只有被除数是负数的情况下,运算结果才为负数,且不管除数的正负;

--使用单引号括数字不影响结果;


SELECT MOD(-123.456,2) FROM EMP T;

SELECT MOD(123.456,36) FROM EMP T;

SELECT MOD(T.EMPNO,30) FROM EMP T;

SELECT MOD(T.EMPNO,'-30') FROM EMP T;

--3、日期函数

--Months_Between(date1,date2) 计算两个日期之间的相差的月份

--多出的天数是按照多出天数除以31所得;


SELECT T.HIREDATE+60 ,T.HIREDATE ,MONTHS_BETWEEN( T.HIREDATE+60,T.HIREDATE) FROM EMP T;
--不能使用别名参与运算

--SELECT T.HIREDATE+62 hh ,T.HIREDATE kk ,MONTHS_BETWEEN( hh,kk) FROM EMP T;

--可以结合函数TO_DARE():转换日期的格式;

SELECT MONTHS_BETWEEN(TO_DATE( '2017-08-01','yyyy-mm-dd'),TO_DATE('2017-07-16','yyyy-mm-dd')) FROM EMP T;

--不能直接写上时间,计算机不能识别当前格式,需要转换为时间格式;

SELECT MONTHS_BETWEEN('2017-08-01','2017-07-16') FROM EMP T;

--Add_Months():加月份,直接加在月份数,含有两个参数;

SELECT ADD_MONTHS(TO_DATE('2017-08-01','yyyy-mm-dd'),5) FROM EMP T;

SELECT T.HIREDATE, ADD_MONTHS(T.HIREDATE,6) FROM EMP T;

--Next_Day():得到下一个星期几所对应的日期

--将指定的星期需

--*第二个参数指定数字是以星期天为第一天开始,并且只能是1——7的数字;

--第二个参数为中文;


SELECT NEXT_DAY(TO_DATE('2017-08-01','yyyy-mm-dd'),1) FROM EMP T;

SELECT NEXT_DAY(TO_DATE('2017-08-01','yyyy-mm-dd'),'星期一') FROM EMP T;

SELECT TO_DATE('2017/08/01','yyyy.mm.dd') FROM EMP T;
--此处会报错;

SELECT NEXT_DAY(TO_DATE('2017-08-01','yyyy-mm-dd'),'friday') FROM EMP T;

--Last_Day():获取指定日期所在月份的最后一天的日期,含有一个参数;

SELECT LAST_DAY(TO_DATE('2017-02-01','yyyy-mm-dd')) FROM EMP T;

SELECT T.HIREDATE, LAST_DAY(T.HIREDATE) FROM EMP T;

--Round():对指定日期进行四舍五入,含有两个参数;

--第二个参数指定的是年则操作月,指定月则操作日

--入的规则:月大于等于7进一年;日大于等于16进一月,(DAY)周是周三和周三之后进一周,以周日为进退日;舍则相反


SELECT ROUND(TO_DATE('2017-07-01','yyyy-mm-dd'),'YEAR') FROM EMP T;

SELECT T.HIREDATE, ROUND(T.HIREDATE,'YEAR') FROM EMP T;

SELECT T.HIREDATE, ROUND(T.HIREDATE,'MONTH') FROM EMP T;

SELECT T.HIREDATE, ROUND(T.HIREDATE,'DAY') FROM EMP T;

SELECT ROUND(TO_DATE('2017-08-01','yyyy-mm-dd'),'DAY') FROM EMP T;

--4、转换函数

--*TO_NUMBER():转为数字格式,在字符串中注意的是可以转为数字的才可以进行转换

--日期格式不能转为数字


SELECT TO_NUMBER(TO_DATE('2017-07-01','yyyy-mm-dd')) FROM EMP T;

SELECT TO_NUMBER('000012000') FROM EMP T;
--出现错误字符

SELECT TO_NUMBER('$12345.678') FROM EMP T;
--可以实现进制转换,下是十六进制转为十进制

SELECT TO_NUMBER('88f','xxxx') FROM EMP T;

--TO_DATE():转换日期格式,含有两个参数

--两个参数的格式要一致;


SELECT TO_DATE('2017-08-01','yyyy-mm-dd') FROM EMP T;

SELECT TO_DATE('2017-08-01 21:14:30','yyyy-mm-dd hh24:mi:ss') FROM EMP T;

--TO_CHAR():将日期格式转为字符串;

SELECT TO_CHAR(TO_DATE('2017-08-01 23:12:30','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') FROM EMP T;

--5分组函数

--注意:WHERE后面不能加分组函数,要想使用分组函数作为条件,必须在GROUP BY后面加HAVING;

--AVG(DISTINCT|ALL):求平均值

--group by 后面只能是列名

--GROUP BY子句中若出现多列时是按照多列联合唯一进行分组

--HAVING后面可以跟分组中的字段名和分组函数,不在分组中字段名,不能跟在HAVING后面

--一般在在select后面指定了列,最好在分组中使用该列,在分组中使用的列则建议在select后面出现


SELECT T.DEPTNO,AVG(T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,AVG(DISTINCT T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,AVG(ALL T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,AVG(ALL T.SAL) AVGSAL 

FROM EMP T 

WHERE T.DEPTNO>10

 GROUP BY T.Deptno

-- HAVING T.DEPTNO>10;

--having后面不能是别名进行运算

HAVING AVG(T.SAL)>1000

ORDER BY AVGSAL;

--MAX (DISTINCT|ALL)  求列的最大值

SELECT T.DEPTNO,MAX(DISTINCT T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,MAX(ALL T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,MAX(ALL T.SAL) MAXSAL 

FROM EMP T 

WHERE T.DEPTNO>10

 GROUP BY T.Deptno

-- HAVING T.DEPTNO>10;

--having后面不能是别名进行运算

HAVING MAX(T.SAL)>1000

ORDER BY MAXSAL;

--MIN (DISTINCT|ALL):  求列的最小值

SELECT T.DEPTNO,MIN(DISTINCT T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,MIN(ALL T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,MIN(ALL T.SAL) MINSAL 

FROM EMP T 

WHERE T.DEPTNO>10

 GROUP BY T.Deptno

-- HAVING T.DEPTNO>10;

--having后面不能是别名进行运算

HAVING MIN(T.SAL)<1000

ORDER BY MINSAL;



--SUM (DISTINCT|ALL):  求列的总和


SELECT T.DEPTNO,SUM(DISTINCT T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,SUM(ALL T.SAL) FROM EMP T GROUP BY T.Deptno;

SELECT T.DEPTNO,SUM(ALL T.SAL) SUMSAL 

FROM EMP T 

WHERE T.DEPTNO>10

 GROUP BY T.Deptno

-- HAVING T.DEPTNO>10;

--having后面不能是别名进行运算

HAVING MAX(T.SAL)>100

ORDER BY SUMSAL;

--6多表查询:

--基本语法:


--SELECT  table.column, table.column

--FROM  table1, table2

--WHERE  table1.column1 = table2.column2;

SELECT T1.EMPNO,T2.DEPTNO 

FROM EMP T1,DEPT T2

 WHERE T1.EMPNO!=T2.DEPTNO;

--避免笛卡尔积

SELECT * FROM EMP T,DEPT



--采用连接查询

--通常采用主键和外键进行表的连接

--有重复的列名一定要通过表名分隔,建议重不重复都加上表名,可以大幅度地提高性能

--可以为表名提供别名,操作更加方便一旦给表创建了别名,标识列时只能通过表的别名,不能是表的真名

--外连接  (+)

--外连接,如果匹配不到数据,就以空值补充,要想再添加条件约束,可以在where后面直接添加

--左外连接等同于在“=”右边加“+”,将“=”左边表中未匹配的记录也查找出来

--右外连接等同于在“=”左边加“+”,将“=”右边表中未匹配的记录也查找出来

--外连接只能出现在表达式的一边,以等于号这边为主,(+)为次

--包含外连接的条件不允许  使用in 操作符  使用or操作符连接到另外一个条件



SELECT T1.EMPNO,T2.DEPTNO 

FROM EMP T1,DEPT T2

 WHERE T1.EMPNO=T2.DEPTNO(+)

 ORDER BY T1.EMPNO;

 

 SELECT T1.DEPTNO EM,T2.DEPTNO DE, T2.DNAME DNA

 FROM EMP T1,DEPT T2

WHERE T1.DEPTNO = T2.DEPTNO (+)

ORDER BY EM;

--内连接:inner join

SELECT * FROM EMP E INNER JOIN DEPT T ON E.DEPTNO=T.DEPTNO;

--全连接:full outer join

SELECT * FROM EMP E FULL OUTER JOIN DEPT T ON E.DEPTNO=T.DEPTNO;

--Join()join语法:

select column ... from table1 [left | right]join table2 on table1.id=table2.id;

--如果要加条件,可以在后面添加where 条件  连接后面需要加on

--右连接,是以后面的那张表为主,前面的为此,在对应关系中如果后表有对应的内容,前表没有,则补空;

SELECT T.EMPNO,T.ENAME,D.DEPTNO,D.DNAME FROM EMP T RIGHT JOIN DEPT D ON T.DEPTNO=D.DEPTNO WHERE D.DEPTNO>10;

--左连接则相反,有就对应,没有则为空

SELECT T.EMPNO,T.ENAME,D.DEPTNO,D.DNAME FROM EMP T LEFT JOIN DEPT D ON T.DEPTNO=D.DEPTNO WHERE D.DEPTNO>10;

 

--自连接:

--一张表保存的数据,有上下级关系,可以把表分成两张表来做关联


SELECT WORKER.EMPNO,WORKER.ENAME,WORKER.MGR

FROM (SELECT * FROM EMP T) WORKER,(SELECT * FROM DEPT T) MGR

WHERE WORKER.MGR=MGR.EMPNO AND MGR.EMPNO=7839

--集合运算符

--union:在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,

--删除重复的记录再返回结果。(将两条查询的结果放在一起)

--删除掉重复的记录是整条重复的

--集合运算符是对两个集合操作的,两个集合列表中的列的个数要保持一致,,

--列表中根据顺序,列的字段类型要保持一致至少能隐式转换),

--最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果);

--集合运算对行进行比较时,认为两个NULL值相等。


SELECT * FROM EMP T WHERE T.MGR=7902

UNION

SELECT * FROM  EMP T WHERE  T.MGR=7698

--union all:将两个结果合并后就返回且不进行排序。

--这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据。


SELECT T.EMPNO,T.ENAME FROM EMP T

UNION ALL

SELECT T1.DEPTNO,T1.DNAME FROM DEPT T1

UNION ALL

SELECT T2.EMPNO,T2.ENAME FROM EMP T2



--minus:两个结果集的差操作,第一个结果集减去第二个结果集中的记录(在第一个结果集也存在的公共记录),

--按默认规则排序,返回的结果集中不包括重复行。


SELECT T.EMPNO,T.ENAME FROM EMP T

MINUS

SELECT T1.EMPNO,T1.ENAME FROM EMP T1 WHERE T1.EMPNO=1587;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息