입력
타입 & 전체 정보 출력
desc personnel;
select * from tab;
select pname ||' '||pno from personnel;
select ' 사원번호' || pno ||'의 이름은'||pname '입니다' from personnel;
select * from personnel where job = 'SALESMAN'; --비교는 반드시 대문자
--사원의 급여가 2000이하인 사원
SELECT * FROM PERSONNEL
WHERE PAY <= 2000;
--90년 12월17일에 입사한 사원
SELECT * FROM PERSONNEL
WHERE STARTDATE = '90-12-17'; --문자처리할때만 ' '
SELECT * FROM PERSONNEL WHERE STARTDATE = '1990/12/17'; --이것도 가능
--이름이 JAMES인 사원
SELECT * FROM PERSONNEL WHERE PNAME = 'JAMES';
--부서번호(DNO)가 10번이고, 급여(PAY)가 3000이상인 사원
SELECT * FROM PERSONNEL WHERE DNO = 10 AND PAY >= 3000;
--직업이 SALESMAN이고 90년 이후에 입사한 사원 검색
SELECT * FROM PERSONNEL WHERE JOB = 'SALESMAN' AND STARTDATE > '90-12-31'; --'91-01-01'도 가능
--91년 9월에 입사한 사원
SELECT * FROM PERSONNEL WHERE STARTDATE >= '91-09-01' AND STARTDATE < '91-10-01' ;
----------------------------------------------
--부서번호가 30번이거나 급여가 3000이상인 사원
SELECT * FROM PERSONNEL WHERE DNO = 30 OR PAY>=3000;
--직업이 SALESMAN이거나 1990년 이후에 입사한 사원
SELECT * FROM PERSONNEL WHERE JOB = 'SALESMAN' OR STARTDATE > '90-12-31';
----------------------------------------------
--업무가 SALESMAN,CLERK인 사원
SELECT * FROM PERSONNEL WHERE JOB = 'SALESMAN' OR JOB = 'CLERK';
SELECT * FROM PERSONNEL WHERE JOB IN ('SALESMAN','CLERK'); --문자열 연산자 IN
--업무가 SALESMAN,CLERK이 아닌 사원
SELECT * FROM PERSONNEL WHERE JOB <> 'SALESMAN' AND JOB <> 'CLERK'; --둘다 부정이면 긍정 AND
SELECT * FROM PERSONNEL WHERE JOB NOT IN ('SALESMAN','CLERK');
SELECT * FROM PERSONNEL WHERE NOT JOB IN ('SALESMAN','CLERK');
-- 급여가 1000에서 2000사이의 사원
SELECT * FROM PERSONNEL WHERE PAY >= 1000 AND PAY <= 2000;
SELECT * FROM PERSONNEL WHERE PAY BETWEEN 1000 AND 2000;
-- 91년 9월에 입사한 사원
SELECT * FROM PERSONNEL WHERE STARTDATE BETWEEN '91-09-01' AND '91-09-30';
--부서번호가 20과 30사이인 사원
SELECT * FROM PERSONNEL WHERE DNO BETWEEN 20 AND 30; --중간 사이값도 EX, 21,22...나옴
SELECT * FROM PERSONNEL WHERE DNO IN (20,30);
% : 와일드카드 : 어디에든 매치 가능
- ex) 90% : 90으로 시작 + 뒤에 ~~~~
- ex) %90 : 앞에 ~~~~ + 90으로 끝나야 함
--이름이 A로 시작되는 사원
SELECT * FROM PERSONNEL WHERE PNAME LIKE 'A%'; -- WHERE PNAME = A*인 문자 = A로 시작하는 모든 이름 가져와
--사원번호 111_인 사원
SELECT * FROM PERSONNEL WHERE PNO LIKE '111_'; --언더바 자리수
SELECT * FROM PERSONNEL WHERE PNO LIKE '1__1';
--90년도에 입사한 사원
SELECT * FROM PERSONNEL WHERE STARTDATE LIKE '%02%'; --연도 필요 없고, 2월달에 입사한 사원
SELECT * FROM PERSONNEL WHERE REGEXP_LIKE(PNO, '11[^2]'); --3번째가 2가 아닌 데이터
SELECT * FROM PERSONNEL WHERE REGEXP_LIKE(PNO, '1[1,2]'); --두세번째에 1또는 2가 나오도록
SELECT REGEXP_SUBSTR('SUZI@NAVER.COM', '[^@]+') FROM DIVISION; --뒤에 몇자가 되어도 상관없음 , 골뱅이가 아닌 데이터 -- TABLE에 있는 데이터 개수 만큼 실행됨
SELECT REGEXP_SUBSTR('SUZI@NAVER.COM', '[^@]+') FROM PERSONNEL;
SELECT REGEXP_SUBSTR('SUZI@NAVER.COM', '[^@]+') FROM DUAL; -- 결과 값 하나니까 DUAL쓰기 (오라클에만 존재)
SELECT * FROM DUAL; --데이터 하나 '
SELECT (100+20) FROM DUAL; --존재하지않는 데이터를 SELECT했을 때 DUAL의 가상테이블을 만듦
SELECT MANAGER FROM PERSONNEL;
SELECT * FROM PERSONNEL WHERE MANAGER = NULL; --값 X
--DESC PERSONNEL;
--MANAGER = 숫자임
SELECT * FROM PERSONNEL WHERE MANAGER IS NULL;
SELECT * FROM PERSONNEL WHERE MANAGER IS NOT NULL; --NULL이 아닌 데이터
--업무가 MANAGER이고 급여가 1500이상인 사원 또는 업무가 SALESMAN인 사원을 찾으시오
SELECT * FROM PERSONNEL WHERE (JOB = 'MANAGER' AND PAY > = 1500) OR = 'SALESMAN'; --AND가 먼저 연산됨
SELECT * FROM PERSONNEL WHERE (JOB = 'MANAGER' OR JOB = 'SALESMAN') AND PAY >= 1500;
SELECT * FROM PERSONNEL WHERE JOB IN ('PRESIDENT', 'SALESMAN') AND PAY >= 1500;
SELECT ROUND(45.275,1) FROM DUAL; -- 2까지 표시하는데 7이 반올림돼서 45.3
SELECT ROUND(45.275,-1) FROM DUAL; --5까지 표시하는데 5에서 반올림돼서 50
-- 1 2 3 4 . 5 6 7
-- -4 -3 -2 -1 0 1 2 3
SELECT ROUND(45.275,0) FROM DUAL; -- .2니까 반올림못해서
SELECT ROUND(45.675) FROM DUAL; --,0을 생략하면 뒤에서 반올림
SELECT PNO,PNAME,PAY,ROUND(PAY,-2) FROM PERSONNEL;
SELECT TRUNC (45.245,2) FROM DUAL;
SELECT TRUNC (45.245,-1) FROM DUAL;
SELECT PNO,PNAME,PAY,TRUNC(PAY,-2) FROM PERSONNEL;
SELECT CEIL(461.11) FROM DUAL;
SELECT FLOOR(461.99) FROM DUAL;
SELECT MOD(10,3) FROM DUAL;
SELECT ABS(-123) FROM DUAL;
SELECT SIGN(100/30), SIGN(-100/30), SIGN (100-100) FROM DUAL;
SELECT POWER(2,4) FROM DUAL;
SELECT SQRT(9) FROM DUAL ;
SELECT UPPER('ORACLE') FROM DUAL;
SELECT LOWER('ORACLE') FROM DUAL;
SELECT * FROM DIVISION
WHERE DNAME = UPPER('SALES'); -- 튜닝 (하드웨어 / SQL)
select initcap ('korea fighting') from dual;
select pname || dno from personnnel; --여러개 컬럼 가능
select concat(pname,dno) from personnel;
select 'KOREA' || 'FIGHTING' from dual;
select concat('KOREA','FIGHTING') from dual;
select length('KOREA') from dual;
select length('korea fighting') form dual; --공백의 개수도 세어줌
select substr('ABCDEFG',1,3) from dual;--ABC
select substr('ABCDEFG',3,2) from dual; --CD
select substr('ABCDEFG',-3,2) from dual; --마이너스(-)는 뒤에서 세기 EF
select substr('ABCDEFG',-4) from dual; --뒤에서 4자리부터 끝까지 출력 DEFG
select instr('ABCDEFG','C') from dual; --C
select instr('AAAAAAA','A') from dual; --1 (처음 찾는 A)
select instr('ABCDEFG','a') from dual; --0 (사용하지 않는 숫자이므로)
select rpad(pname,15,'*') from personnel; --15자리 중 오른쪽 나머지 부분 *채우기
select rpad (substr ('940523-2754624',1,8),14,'*') jumin from dual;
select rtrim('ABBBBBB','B')from dual; --오른쪽에 있는 B다지우기
select rtrim('A ',' ')from dual;
select ltrim('BBBABBB','B')from dual; -- B를 지우다가 다른 알파벳(A)를 만나면 멈춤
select sysdate from dual; --현재 시스템 시간 불러옴
select sysdate + 10 from dual; -- 10일 후
select startdate,startdate-1,startdate+1 from PERSONNEL;
--사원들이 오늘까지 근무한 년수를 구하시오
select sysdate, startdate, round((sysdate - startdate)/365) || '년차' years from PERSONNEL;
select startdate,round(startdate,'YEAR') from personnel; --년을 기준으로 반올림 함
select startdate,round(startdate,'MONTH') from personnel; --15일 기준으로 반올림 함
select startdate,trunc(startdate,'MONTH') from personnel; -- 15일 기준으로 버림
--months_between : 두 날짜사이의 개월수
select round(months_between(sysdate, '2002-06-01'))/12 from dual;
--last_day : 입사한달의 말일
select startdate,last_day(startdate) from personnel;
--next_day : 다음번에 오는 요일
select next_day(sysdate,'월요일') from dual;
--add_months : 24개월 뒤
select add_months(sysdate,24) from dual;
--extract : 년월일 추출
SELECT STARTDATE,
EXTRACT(YEAR FROM STARTDATE) YEAR,
EXTRACT(MONTH FROM STARTDATE) MONTH,
EXTRACT(DAY FROM STARTDATE) DAY
FROM PERSONNEL;
--변환함수
select sysdate,to_char(sysdate,'D') from dual; --주의 수
select sysdate,to_char(sysdate,'DY') from dual;
select sysdate,to_char(sysdate,'RM') from dual;
select sysdate,to_char(sysdate,'YYYY') from dual;
select sysdate,to_char(sysdate,'DD') from dual;
select sysdate,to_char(sysdate,'MM') from dual;
select sysdate,to_char(sysdate,'MON') from dual;--월
select sysdate,to_char(sysdate,'YYYY-MM-DD') from dual;
select sysdate,to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; -- 15시 등 24시간 단위로 표시
select sysdate,to_char(sysdate,'YYYY-MM-DD HH24:MI:SS:SSSS') from dual;
SELECT TO_CHAR(12506,'99,999')FROM DUAL; -- 콤마 찍힘
--서수로 보여짐
select sysdate,to_char(sysdate,'DD') from dual;
select sysdate,to_char(sysdate,'DDSP') from dual; --영어
select sysdate,to_char(sysdate,'DDTH') from dual;--th
select sysdate,to_char(sysdate,'DDSPTH') from dual;--서수th
--to_date강제 날짜 바꾸기
select to_date('12-6월-23','YY-MONTH-DD') +1 from dual; --(문자 ,날짜로 바꾸고) +날짜는 연산이 가능하니까 +1
select to_date('11:05','HH:MI') from dual;
--to_number : 숫자로 형변환
select to_number(123) + 100 from dual; 0
select to_number('abc')+100 from dual; -- 문자 -> 숫자 xxxxx
select bonus,nvl(bonus,0) from personnel; --없으면 0 있으면 bonus
select manager, nvl(manager,'none manger') from personnel; --x manager는 숫자니까
select manager, nvl(to_char(manager),'none manger') from personnel; --문자로 변환
파생컬럼 : pay*1.2 등 select한 순간에만 보여짐
특정 조건이 만족되면 해당 값을 반환하는 함수 - 다양한 값을 비교
-각 사원의 급여를 부서번호가 10인경우 10% 보너스, 부서번호가 20인경우 20%보너스,
--나머지는 30%를 더해서 출력하시오
select pname,bonus,dno,pay,decode(dno,10,pay*1.1,20,pay*1.2,pay*1.3) "인상분" from personnel;
--급여가 3500이상인 경우 'GOOD'을, 미만인 경우에는 'POOR'로 출력
--decode + sign을 이용하시오
select pname,pay,decode(sign(pay-3500),1,'GOOD','POOR')GRADE from PERSONNEL; --sign(pay-3500) = 위 예제 dno