FUNCTIONS
Document prepared by: AN.Murugappan
1 .SINGLE ROW FUNCTION - THIS FUNCTION PERFORM ACTION ON SINGLE ROW (INPUT VALUES 1) 2. MULTPLE ROW FUNCTION THIS FUNCTION PERFORM ACTION ON SOME SET OF ROWS (INPUT VALUES > 1) SINGLE ROW FUNCTIONS
1.CHARACTER FUNCTION
CASE FUNCTION
UPPER( ) LOWER( ) INITCAP( ) CONCAT( ) SUBSTR( ) INSTR( ) LENGTH( ) LPAD | RPAD ( ) REPLACE( ) TRANSLATE( ) TRIM( )
CHARACTER FUNCTION
2.NUMBER FUNCTION`
ROUND( ) TRUNC( ) MOD( ) POWER( )
3.DATE FUNCTION
SYSDATE MONTHS_BETWEEN( ) ADD_MONTHS( ) NEXT_DAY( ) LAST_DAY( )
4.CONVERSION
TO_NUMBER( ) TO_DATE( ) TO_CHAR( )
5.GENERAL FUNCTION
NVL( ) NVL2( ) NULIF( ) COALSCE( )
CONTROL STATEMENTS
DECODE CASE
MULIPLE ROW FUNCTIONS GROUP FUNCTION AGGRECATING FUNCTION MIN( ) MAX( ) SUM( ) AVG( ) COUNT( )
GROUP BY HAVING
1. CHARACTER FUNCTION
- CASE MANUPLICATION - CHARACTER MANUPLICATION
CASE MANUPLICATION CASE FUNCTIONS UPPER(MY DOCUMENT) LOWER(MY DOCUMENT) INITCAP(MY DOCUMENT) RESULT MY DOCUMENT my document My Document
SELECT UPPER('my first query'),LOWER('my first query'),INITCAP('my first query') from dual;
CHARACTER MANUPLICATION CONCAT ( ) SUBSTR ( ) INSTR ( ) LPAD | RPAD ( ) REPLACE ( ) TRANSLATE ( ) LTRIM | RTEIM ( )
SELECT CONCAT ('Muthu','Karthi') FROM DUAL;
SELECT SUBSTR ('MURUGAPPAN', 1, 5) FROM DUAL;
SELECT SUBSTR ('MURUGAPPAN',-3, 3) FROM DUAL;
SELECT INSTR ('MURUGAPPAN','A') FROM DUAL;
SELECT INSTR ('MURUGAPPAN','A', 1, 2) FROM DUAL;
SELECT LPAD ('2500', 10,'*') FROM DUAL;
SELECT RPAD ('2500', 10,'*') FROM DUAL;
SELECT REPLACE ('MURUGAPPAN','AN','BC') FROM DUAL; - STRING BASED
SELECT TRANSLATE ('MURUGAPPAN CSE-A','UA','AB') FROM DUAL; CHARACTER BASED
SELECT TRIM ('M' FROM 'MAN') FROM DUAL;
SELECT LTRIM ('000000011230000', 0) FROM DUAL;
SELECT RTRIM ('000000011230000', 0) FROM DUAL;
SELECT LTRIM (RTRIM ('000000011230000', 0), 0) FROM DUAL;
2. NUMBER FUNCTIONS ROUND ( ) TRUNC ( ) MOD ( ) POWER ( ) ROUND ( ) SELECT ROUND (23.446, 2), ROUND (23.444, 2) FROM DUAL;
SELECT ROUND (23.744, 0), ROUND (23.244, 0) FROM DUAL;
SELECT ROUND (23.444,-1), ROUND (23.644,-1) FROM DUAL;
SELECT ROUND (27.644,-1), ROUND (27.644,-2), ROUND (567.644,-2) FROM DUAL;
TRUNC ( ) SELECT TRUNC (234.5678, 2) FROM DUAL; SELECT TRUNC (234.5678, 3) FROM DUAL; SELECT TRUNC (234.5678, 0) FROM DUAL;
SELECT TRUNC (234.5678,-1) FROM DUAL;
MOD ( ) SELECT MOD (12, 5) FROM DUAL; SELECT MOD (12, 2) FROM DUAL; SELECT MOD (12,-5) FROM DUAL; SELECT MOD (-12, 5) FROM DUAL; POWER ( ) SELECT POWER (2, 2) FROM DUAL; SELECT POWER (5, 2) FROM DUAL; RESULT: 4 RESULT: 25 RESULT: 2 RESULT: 0 RESULT: 2 RESULT: -2
3. DATE FUNCTIONS SYSDATE + MONTHS_BETWEEN ( ) ADD_MONTHS ( ) NEXT_DAY ( ) LAST_DAY ( )
ORACLE DATE FORMAT: DD-MM-YY
SYSDATE + -
SELECT SYSDATE FROM DUAL; SELECT SYSDATE+1 FROM DUAL; SELECT SYSDATE-1 FROM DUAL;
MONTHS_BETWEEN
SELECT MONTHS_BETWEEN (SYSDATE,'21-JAN-89') FROM DUAL;
SELECT ROUND (MONTHS_BETWEEN (SYSDATE,'21-JAN-89'), 0) AS MONTHS FROM DUAL;
THERE IS NO OTHER FUNCTION TO FIN DOUT THE YEAS BETWEEN SO WE USE MONTHS_BETWEEN/12
SELECT ROUND (MONTHS_BETWEEN (SYSDATE,'21-JAN-89')/12, 0) || YEARS FROM DUAL;
ADD_MONTHS
SELECT ADD_MONTHS ('12-FEB-11', 1) FROM DUAL; SELECT ADD_MONTHS ('12-FEB-11', 2) FROM DUAL;
SELECT ADD_MONTHS ('12-FEB-11',-1) FROM DUAL; SELECT ADD_MONTHS ('12-FEB-11',-2) FROM DUAL;
NEXT_DAY
SELECT NEXT_DAY ('31-JUL-11','WEDNESDAY') FROM DUAL; SELECT NEXT_DAY ('31-JUL-11','FRIDAY') FROM DUAL;
LAST_DAY SELECT LAST_DAY (SYSDATE) FROM DUAL; SELECT LAST_DAY ('21-FEB-11') FROM DUAL; SELECT LAST_DAY ('21-FEB-00') FROM DUAL; SELECT LAST_DAY ('21-JAN-11') FROM DUAL;
4. TYPE CONVERSIONS
TO_NUMBER ( ) TO_DATE ( ) TO_CHAR ( )
SELECT 5+5 FROM DUAL;
TO_NUMBER
CONVERSION -IMPLICIT CONVERSION -EXPLICIT CONVERSION
TO_NUMBER ( ) IMPLICIT CONVERSION
SELECT 5 + '15' FROM DUAL;
TO_NUMBER ( ) EXPLICIT CONVERSION
SELECT 5+TO_NUMBER ('15') FROM DUAL;
TO_CHAR ( ) IMPLICIT CONVERSION
SELECT 5 || 'B5' FROM DUAL;
TO_CHAR ( ) EXPLICIT CONVERSION
SELECT TO_CHAR (5) || 'B5' FROM DUAL
TO_DATE ( )
SELECT * FROM EMPLOYEES;
SELECT FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE FROM EMPLOYEES WHERE HIRE_DATE='21-SEP-89';
IF I WRITE THE ABOVE QUERY BY USING THE DATE IN THIS FORMAT '21-SEP1988'
TO_DATE IMPLICIT CONVERSION
SELECT FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE FROM EMPLOYEES WHERE HIRE_DATE='21-SEP-1989';
TO_DATE EXPLICIT CONVERSION
SELECT FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE FROM EMPLOYEES WHERE HIRE_DATE = TO_DATE ('21-SEP-1989','DD-MM-YYYY');
SELECT FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE FROM EMPLOYEES WHERE HIRE_DATE=TO_DATE ('SEP-21-1989','MM-DD-YYYY');
TO_CHAR
SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR (SYSDATE,'DD-MM-YYYY') FROM DUAL;
DD MM MON
- DATE - TO SHOW THE MONTH LIKE THIS (07) - TO SHOW THE MONTH LIKE THIS (JUL)
MONTH - TO SHOW THE MONTH LIKE THIS (JULY) YY - TO SHOW THE YEAR LIKE THIS (11)
YYYY - TO SHOW THE YEAR LIKE THIS (2011) YEAR - TO SHOW THE YEAR LIKE THIS ()
SELECT TO_CHAR (SYSDATE,'DD') FROM DUAL; SELECT TO_CHAR (SYSDATE,'MM') FROM DUAL; SELECT TO_CHAR (SYSDATE,'MONTH') FROM DUAL; SELECT TO_CHAR (SYSDATE,'YY') FROM DUAL; SELECT TO_CHAR (SYSDATE,'YYYY') FROM DUAL; SELECT TO_CHAR (SYSDATE,'YEAR') FROM DUAL;
HH:MM:SS - 12 HOURS CLOCH
SELECT TO_CHAR (SYSDATE,'HH:MM:SS') FROM DUAL;
HH24: MM:SS - 24 HOURS CLOCH
SELECT TO_CHAR (SYSDATE,'HH24: MM:SS) FROM DUAL;
D (1-SUNDAY 2-MONDAY 3-TUESDAY 4-WEDNESDAY 5-THURSDAY 6-FRIDAY 7-SATURDAY)
SELECT TO_CHAR (SYSDATE,'D') FROM DUAL;
DDSPTH SELECT TO_CHAR (SYSDATE,'DDSPTH') FROM DUAL;
DDTH SELECT TO_CHAR (SYSDATE,'DDTH') FROM DUAL; 5. GENERAL FUNCTIONS NVL ( ) NVL2 ( ) NULIF ( ) COALSCE ( )
NVL - NVL ACCEPT TWO ARGUMENTS IF THE VALUE OF FIRST ARGUMENT IS NULL MEANS IT CAN BE REPLACE BY THE SECOND VALUE ELSE IT DISPLAY THE FIRST ARGUMENTS
SELECT COMMISSION_PCT, NVL (COMMISSION_PCT, 0) FROM EMPLOYEES;
* IN NVL BOTH ARGUMENTS SHOULD BE IN SAME FORMAT
SELECT NVL (TO_CHAR (COMMISSION_PCT),'NO') FROM EMPLOYEES;
NVL2 - IT CONTAIN 3 ARGUMENT IF THE VALUE OF THE FIRST ARGUMENT IS NULL MEANS IT DISPLAY THE THIRD ARGUMENT ELSE IT DISPLAY THE SECOND ARGUMENT
SELECT COMMISSION_PCT, NVL2 (COMMISSION_PCT, 1, 0) FROM EMPLOYEES;
NULLIF ACCEPT TWO ARGUMENTS IF BOTH THE VALUES ARE SAME MEANS IT RETURN NULL VALUE ELSE RETURN THE VALUE OF THE FIRST ARGUMENT
SELECT NULLIF (1, 1) FROM DUAL; SELECT NULLIF (2, 1) FROM DUAL; SELECT NULLIF (1, 2) FROM DUAL;
2 1
COALESEC
SELECT COALESCE (NULL, NULL, NULL, 45, NULL, NULL) FROM DUAL; CONTROL STATEMENTS DECODE CASE DECODE IT IS A FUNCTION OPERATOR ARE NOT ALLOWED TO USED INSIDE THE DECODE STATEMENT IF THE VALUE IS EXACTLY MATCHED THEN ONLY IT RETURN THE VALUE SELECT DISTINCT (DEPARTMENT_ID), DECODE (DEPARTMENT_ID, 10,'IT', 20,'BPO', 30,'KPO', 40,'ADMIN', 50,'HR','NILL') FROM EMPLOYEES
CASE
SELECT DISTINCT (DEPARTMENT_ID), CASE WHEN DEPARTMENT_ID = 10 THEN 'IT' WHEN DEPARTMENT_ID IN (20, 30) THEN 'BPO' WHEN DEPARTMENT_ID BETWEEN 40 AND 70 THEN 'KPO' ELSE 'XXX' END AS "DEPARTMENT_NAME" FROM EMPLOYEES ORDER BY 1;
ADVANTAGE OF USING CASE WE USE ALL OPERATORS WRITTEN IN MULTIPLE LINE FAST EXECUTION COMPARE TO DECODE
GROUP FUNCTIONS
MIN ( ) MAX ( ) SUM ( ) COUNT ( ) AVG ( )
MAX ( ) SELECT MAX (SALARY) FROM EMPLOYEES;
MIN ( ) SELECT MIN (SALARY) FROM EMPLOYEES;
SUM ( ) SELECT SUM (SALARY) FROM EMPLOYEES;
COUNT ( ) SELECT COUNT (SALARY) FROM EMPLOYEES;
SELECT COUNT (*) FROM EMPLOYEES;
* IS ONLY APPLICABLE FOR COUNT NOT FOR OTHER FUNCTIONS
SELECT COUNT (1) FROM EMPLOYEES;
AVG ( ) CREATE TABLE AVG (VALUE1 NUMBER (3));
INSERT INTO AVG VALUES (25); INSERT INTO AVG VALUES (25); INSERT INTO AVG VALUES (25); INSERT INTO AVG VALUES (25);
INSERT INTO AVG VALUES ('');
SELECT * FROM AVG;
THIS TABLE CONTAINS 5 VALUES
SELECT AVG (VALUE1) FROM AVG
100/5 = 20 BUT IT SHOWS 25 SO AVG () NOT CONSIDER NULL VALUES. INORDER TO AVOID IT WE USE NVL FUNCTION
SELECT AVG (NVL (VALUE1, 0)) FROM AVG
GROUP BY: IF YOU WANT TO SELECT ANY COLUMN WITH THE GROUP FUNCTION YOU HAVE TO GROUP THE COLUMN BY USING THE CLAUSE GROUP BY HAVING IS A CLAUSE USED BY GROUP FUNCTIONS WHILE IMPLEMENTING THE CONDITION SELECT DEPARTMENT_ID, MAX (SALARY) FROM EMPLOYEES
GROUP BY DEPARTMENT_ID HAVING MAX (SALARY) > 10000;
SELECT DEPARTMENT_ID, COUNT (DEPARTMENT_ID) A, CASE WHEN COUNT (DEPARTMENT_ID) = 45 THEN 'FIRST_RANK' WHEN COUNT (DEPARTMENT_ID) = 34 THEN 'SECOND_RANK' END FROM EMPLOYEES GROUP BY DEPARTMENT_ID HAVING COUNT (DEPARTMENT_ID) > 30;
ORDER OF CLAUSEES SELECT DEPARTMENT_ID, COUNT (EMPLOYEE_ID) FROM EMPLOYEES WHERE SALARY > 2000 GROUP BY DEPARTMENT_ID HAVING
COUNT (EMPLOYEE_ID) > 2 ORDER BY 2 DESC;
---------------------------------------------------------------------------------------------------------------------