1 SQL 시작(기본 + 단일행 함수)
출처: 서진수 강사님 오라클 취업반 강의
환경 설정 하기
설치환경 : OEL5 + Oracle 11g(11.2.0.1)
설치 완료 후 할일
1. test_data_eng.sql 파일을 /home/oracle 로 옮겨 주기
- 만일 다른 리눅스에서 옮기는 경우
[oracle@localhost ~]$ scp /home/oracle/test_data_eng.sql 192.168.15.112:/home/oracle/
2. 아래의 명령어 실행하기
$sqlplus /as sysdba 관리자 계정으로 로그인
startup (만일 꺼져 있는 경우)
SQL> alter user scott 연습용 계정의 권한을 풀어주기
2 identified by tiger account unlock ;
SQL> conn scott/tiger 연습용 계정으로 접속하기
SQL> @test_data_eng.sql sql 불러오기
SQL> select * from professor 테스트
wget http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap-0.42.tar.gz
http://oracle-base.com/articles/linux/rlwrap.php
오라클 연습용 계정으로 로그인하기
[oracle@MINSUNG ~]$ sqlplus scott/tiger
오라클 서버가 꺼져있을때 켠 후 로그인 하기
Enter user-name: sys / oracle as sysdba 시스템 계정인 oracle로 로그인 하기
SQL>startup db를 실행 시키고
SQL>conn scott/tiger 연습용 계정으로 접속한다
사용자 계정으로 프롬프트 바꾸기
SQL> set sqlprompt "_USER>"
SQL 이란
사람 ↔ DBMS ↔DATABASE
(SQL)
SELECT 명령어 활용
문법 : SELECT [ 칼럼명 OR 표현식 ] FROM [ 테이블 명, 뷰 명 ]
□ 모든 칼럼 조회
SQL> SELECT * 모두 선택 한다
2 FROM EMP ; EMP 테이블의 모든 값을
※ 세미클론은 종료의 의미
※ 대문자 = 키워드 소문자(칼럼이름 조건)를 구분해서 연습하도록
※ 공백에 주의 할것
※ 여러개 컬럼은 , 로 구분
□ 테이블 이름을 조회
SQL> SELECT * FROM tab ;
※ 쿼리를 작성하기 전에 실행하고 생각할것
□ 칼럼 별칭 사용
SQL> SELECT name "이름1" , name AS "이름2"
2 FROM student ;
□ 중복 제거
※ 칼럼의 중복을 제거 하는 것
※ 10g R2 부터는 정열을 사용하지 않아서 성능이 향상됨
※ 현재는 HASH 알고리즘 기법을 사용함
- 기억할 것은 10g R2 부터 DISTINCT 명령이 정렬을 지원해주지 않음
※ 반드시 SELECT 키워드 다음에 와야함
SCOTT>SELECT DISTINCT deptno
2 FROM emp ;
DEPTNO
----------
30
20
10
□
SCOTT>SELECT ename , job
2 FROM emp
3 WHERE job = 'CLERK' ;
□ NULL
의미는 값을 모른다는 의미
NULL = NULL
값을 모름 = 값을 모름 -> 값은 값을 모름
NULL 은 = 연산이 안됨
WHERE comm = NULL ; 안됨
SCOTT>SELECT empno , ename , comm
2 FROM emp
3 WHERE comm IS NULL ;
□ order by 대신
SCOTT>create index idx_emp_ename
2 on emp(ename);
Index created.
SCOTT>select ename
2 from emp
3 where ename > '0' ;
문자열 함수
□ 첫글자 대문자 로 바꾸어 주기
SQL> SELECT ename , INITCAP(ename) "INITCAP"
2 FROM emp
3 WHERE deptno = 10 ;
※ 공백을 기준으로 작성됨
ENAME INITCAP
---------- ----------
CLARK Clark
KING King
MILLER Miller
□ 대문자 소문자로 변환 하기
SQL> SELECT ename , LOWER(ename) "LOWER" , UPPER(ename) "UPPER"
2 FROM emp
3 WHERE deptno = 10 ;
ENAME LOWER UPPER
---------- ---------- ----------
CLARK clark CLARK
KING king KING
MILLER miller MILLER
□ 바이트 갯수, 칼럼 갯수 조 회
SQL> SELECT ename , LENGTH(ename) "컬럼의 갯수" , LENGTHB(ename) "컬럼의 바이트수"
2 FROM emp ;
SQL> SELECT '하하하 하' "문장" , LENGTH('하하하 하') "칼럼의 갯수"
2 , LENGTHB('하하하 하') "바이트의 수"
3 FROM dual ;
문장 칼럼의 갯수 바이트의 수
--------- ----------- -----------
하하하 하 5 9
※ 공백은 1바이트 인듯 함
□ 사용자로 입력 받기
SQL> SELECT ename , LENGTH(ename) "칼럼의 갯수"
2 FROM emp
3 WHERE LENGTH(ename) = LENGTH('&input') ;
Enter value for input: kfkfds
ENAME 칼럼의 갯수
---------- -----------
MARTIN 6
TURNER 6
MILLER 6
□ CONCAT()
SQL> SELECT CONCAT(ename , job) "합치기 함수"
2 FROM emp
3 WHERE deptno = 10 ;
□SUBSTR()
칼럼 길이 늘려 놓기
SQL> COL "1번" FOR a10
SQL> COL "2번" FOR a10
SQL> COL "3번" FOR a10
※ 왼쪽(0번)에서 7 칸만큼 샘을 한다음 오른쪽으로 2만큼 출력
SQL> SELECT ename ,sal
2 FROM emp
3 WHERE '00' = SUBSTR(sal , 3,2) ;
□ SUBSTRB()
해당 바이트 만큼 출력
SQL> SELECT '맛있는라면' "라면" , SUBSTR('맛있는라면' , 1,2) "SUBSTR"
2 , SUBSTRB('맛있는라면' ,1,2) "SUBSTRB"
3 FROM dual ;
라면 SUBS SU
---------- ---- --
맛있는라면 맛있 맛
SQL> SELECT 'a-b-c-d' , INSTR('a-b-c-d' , '-' , -1,3) "INSTR"
2 FROM dual ;
'A-B-C- INSTR
------- ----------
a-b-c-d 2
※ -1 번째 (d)에서 시작해서 왼쪽으로 - 가 3개 까지 검색 후 오른쪽부터샘한 위치
SQL> SELECT 'a-b-c-d' "test1" , INSTR('a-b-c-d' , '-' , -6,2) "INSTR"
2 FROM dual ;
test1 INSTR
------- ----------
a-b-c-d 0
※ -6 번째 (-)에서 시작해서 왼쪽으로 - 가 2개 까지 검색 후 오른쪽부터샘한 위치
여기서는 넘어가서 0으로 체크됨
□ 종합 문제
SQL> SELECT name , tel , SUBSTR(tel, 1, INSTR(tel, ')') -1 )
2 FROM student
3 WHERE deptno1 = 201 ;
※ name 칼럼, tel 칼럼을 출력 후에 SUBSTR 함수를 사용 하여 tel에 1번째 자리부터 tel 칼럼에서 ) 첫번 째로 찾은 번호의 -1 만큼 출력한다
NAME TEL SUBSTR(TEL,1,INSTR(TEL,')')-1)
------------------------------ --------------- ------------------------------
Demi Moore 02)6255-9875 02
Macaulay Culkin 02)312-9838 02
Wesley Snipes 053)736-4981 053
Steve Martin 02)6175-3945 02
Sean Connery 02)381-5440 02
Christian Slater 031)345-5677 031
□ LPAD( ) 함수
- 문 법: LPAD(‘문자열’ 또는 컬럼명, 자리수 , ’채울문자’ )
SQL> SELECT LPAD(ename , 9 , '12345') "LPAD"
2 FROM emp
3 WHERE deptno = 10 ;
□ RPAD( ) 함수
SQL> SELECT name ,jumin ,
2 REPLACE(jumin , SUBSTR(jumin , 7,7) , '-/-/-/-' ) "REPLACE"
3 FROM student
4 WHERE deptno1 = 101 ;
SQL> SELECT name , tel ,
2 REPLACE(tel, SUBSTR(tel, 5,3) , '***') "REPLACE"
3 FROM student
4 WHERE deptno1 = 102 ;
숫자 관련 함수
□ 1) ROUND( ) 함수
- 문 법: ROUND(숫자 , 출력을 원하는 자리수)
SCOTT>SELECT ROUND(987.123 , 0) "ROUND1" ,
2 ROUND(987.123 , 2) "ROUND2" ,
3 ROUND(987.123 , -1) "ROUND3"
4 FROM dual ;
ROUND1 ROUND2 ROUND3
---------- ---------- ----------
987 987.12 990
□ 2) TRUNC( ) 함수
이 함수는 ROUND 와 사용법은 동일하며 차이점은 무조건 버림을 한다는 것입니다.
- 문 법: TRUNC(숫자 , 원하는 자리수)
SCOTT>SELECT TRUNC(12345.9999,2) "TRINC1" ,
2 TRUNC(12345.9999,0) "TRUNC2" ,
3 TRUNC(12345.9999,-2) "TRUNC3"
4 FROM dual;
TRINC1 TRUNC2 TRUNC3
---------- ---------- ----------
12345.99 12345 12300
□ 3) MOD( ) , CEIL( ) , FLOOR( ) 함수
SCOTT>SELECT MOD(101,10) "101/10" ,
2 CEIL(123.10) "CEIL" ,
3 FLOOR(123.10) "FLOOR"
4 FROM dual ;
SCOTT>SELECT ROWNUM "ROWNO" , CEIL(rownum/3) "TEAMNO" , ename
2 FROM emp ;
ROWNO TEAMNO ENAME
---------- ---------- ----------
1 1 SMITH
2 1 ALLEN
3 1 WARD
4 2 JONES
5 2 MARTIN
6 2 BLAKE
7 3 CLARK
8 3 KING
9 3 TURNER
10 4 ADAMS
11 4 JAMES
12 4 FORD
13 5 MILLER
※ 3명씩 조를 나누는 상황에서 CEIL 함수를 많이 사용
□ 4) POWER( ) 함수
이 함수는 숫자 1의 숫자 2의 승수를 구해주는 함수입니다.
- 문 법: POWER( 숫자1 , 숫자2)
SCOTT>SELECT POWER(3,3) "3^3"
2 FROM dual ;
날자 관련 함수
□ 1) SYSDATE 함수
-오라클이 설치된 곳에 OS 시간은 절대로 바꾸지 말것
SCOTT>SELECT SYSDATE
2 FROM dual ;
SCOTT>ALTER SESSION SET NLS_DATE_FORMAT='RRRR-MM-DD:HH24:MI:SS' ;
Session altered.
SCOTT>SELECT SYSDATE FROM dual ;
SYSDATE
-------------------
2015-03-10:23:56:15
□ MONTHS_BETWEEN 함수
이 함수는 두 날짜를 입력 받아서 두 날짜 사이의 개월 수를 출력하는 함수입니다
입력전에 먼저 작업하기(14/09/11 방식으로 입력 하도록 )
SCOTT>ALTER SESSION SET NLS_DATE_FORMAT = 'YY/MM/DD' ;
Session altered.
SCOTT>SELECT MONTHS_BETWEEN( '14/09/30' , '14/08/30')
2 FROM dual ;
SCOTT>SELECT MONTHS_BETWEEN( '14/09/15' , '14/08/30')
2 FROM dual ;
□ ADD_MONTHS( ) 함수
ADD_MONTHS 함수는 주어진 날짜에 숫자만큼의 달을 추가 하는 함수
SCOTT>SELECT SYSDATE , ADD_MONTHS(SYSDATE ,1 )
2 FROM dual ;
□ NEXT_DAY( ) 함수
주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환해주는
SCOTT>SELECT SYSDATE , NEXT_DAY(SYSDATE , 'MON')
2 FROM dual ;
SYSDATE NEXT_DAY
-------- --------
15/03/11 15/03/16
□5) LAST_DAY( ) 함수
LAST_DAY 함수는 주어진 날짜가 속한 달의 가장 마지막 날을 출력해주는 함수입니다
SCOTT>SELECT SYSDATE , LAST_DAY(SYSDATE) , LAST_DAY('14/05/01')
2 FROM dual ;
SYSDATE LAST_DAY LAST_DAY
-------- -------- --------
15/03/11 15/03/31 14/05/31
□ 날자에서 ROUDNE() , TRUNC()
SCOTT>ALTER SESSION SET NLS_DATE_FORMAT= 'YYYY-MM-DD-HH24:MI:SS' ;
Session altered.
SCOTT>SELECT SYSDATE , ROUND(SYSDATE), TRUNC(SYSDATE)
2 FROM dual ;
형 변환 함수
□1) 묵시적(자동) 형 변환과 명시적(수동) 형 변환
묵시적
SCOTT>SELECT 2+ '2'
2 FROM dual ;
※ 묵시적 형변환은 성능을 느리게 함
□ TO_CHAR 함수 (날짜 -> 문자로 형 변환하기) - 날자에서 활용할때-
- 문 법: TO_CHAR(원래 날짜 , ‘원하는 모양’)
SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'YYYY') "YYYY" ,
2 TO_CHAR(SYSDATE, 'RRRR') "RRRR" ,
3 TO_CHAR(SYSDATE, 'YY') "YY" ,
4 TO_CHAR(SYSDATE, 'RR') "RR" ,
5 TO_CHAR(SYSDATE, 'YEAR') "YEAR"
6 FROM dual ;
SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'MM') "MM" ,
2 TO_CHAR(SYSDATE, 'MON') "MON" ,
3 TO_CHAR(SYSDATE, 'MONTH') "MONTH"
4 FROM dual ;
SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'DD') "DD" ,
2 TO_CHAR(SYSDATE, 'DAY') "DAY" ,
3 TO_CHAR(SYSDATE, 'DDTH') "DDTH"
4 FROM dual ;
[ 년도 ]
‘YYYY’ – 연도를 4자리로 표현합니다. 예: 2014
‘RRRR’ – 2000년 이후에 Y2K 버그로 인해 등장한 날짜 표기법으로 연도 4자리 표기법입니다.
‘YY’ – 연도를 끝의 2 자리만 표시합니다. 예 : 14
'RR' - 연도를 마지막 2 자리만 표시합니다. 예: 14
‘YEAR’ – 연도의 영문 이름 전체를 표시합니다.
[ 월 ]
MM – 월을 숫자 2자리로 표현합니다. 예: 10
MON – 유닉스용 오라클에서 월을 뜻하는 영어 3글자로 표시합니다. 예: OCT
윈도용 오라클일 경우는 MONTH 와 동일합니다.
MONTH – 월을 뜻하는 이름 전체를 표시합니다
[ 일 ]
DD – 일을 숫자 2자리로 표시합니다. 예: 26
DAY – 요일에 해당하는 명칭을 표시하는데 유닉스용 오라클에서는 영문으로 나오고
윈도용 오라클에서는 한글로 나옵니다.
DDTH – 몇 번째 날인지를 표시합니다.
[ 시간 ]
HH24 – 하루를 24시간으로 표시합니다
HH – 하루를 12 시간으로 표시합니다.
분 : MI 로 표시합니다.
초 : SS 로 표시합니다.
문제1
select studno , name , birthday
from student
where to_char(birthday,'MM') <02 ;
STUDNO NAME BIRTHDAY
---------- ------------------------------ ------------
9511 Billy Crystal 23-JAN-76
9514 Bill Murray 20-JAN-76
9712 Sean Connery 05-JAN-78
문제2
select empno, ename , hiredate
from emp
where to_char(hiredate,'MM') <=03 ;
EMPNO ENAME HIREDATE
---------- ---------- ------------
7499 ALLEN 20-FEB-81
7521 WARD 22-FEB-81
7934 MILLER 23-JAN-82
□ case
select name , SUBSTR(jumin,3,2) "month" , CASE WHEN SUBSTR(jumin,3,2) BETWEEN '01' AND '03' THEN '1/4' WHEN SUBSTR(jumin,3,2) BETWEEN '04' AND '06' THEN '2/4' WHEN SUBSTR(jumin,3,2) BETWEEN '07' AND '09' THEN '3/4' WHEN SUBSTR(jumin,3,2) BETWEEN '10' AND '12' THEN '4/4' END "QUARTER"from student ;
NAME mont QUA
------------------------------ ---- ---
James Seo 10 4/4
Rene Russo 02 1/4
Sandra Bullock 06 2/4
Demi Moore 12 4/4
Danny Glover 03 1/4
Billy Crystal 01 1/4
Nicholas Cage 04 2/4
Micheal Keaton 09 3/4
Bill Murray 01 1/4
Macaulay Culkin 10 4/4
Richard Dreyfus 11 4/4
Tim Robbins 04 2/4
Wesley Snipes 09 3/4
Steve Martin 02 1/4
Daniel Day-Lewis 12 4/4
Danny Devito 08 3/4
Sean Connery 01 1/4
Christian Slater 08 3/4
Charlie Sheen 03 1/4
Anthony Hopkins 02 1/4
03.11
정규식 함수
□ REGEXP_LIKE(칼럼 , ' 정규식' ) ;
※ 작은 따옴표안에 공백도 인식하니 조심할것
SCOTT>SELECT *
2 FROM t_reg
3 WHERE REGEXP_LIKE(text, '[a-z]') ;