본문 바로가기
학습 과정 공유 및 후기/SQLD

[ SQLD ] Oracle SQL (1) - SELECT문

by 커피마시는어린왕자 2020. 5. 19.

 

 

사람과 대화를 하기 위해서는 언어가 필수적이다.

 

컴퓨터도 마찬가지이다. Do as the Romans Do 라는 속담이 있듯,

 

컴퓨터 세계에는 '그들'의 언어를 배워야 대화를 할 수 있다. 그것이 개발자(Developer)가 꾸준히 배워나가야 하는 것.

 

SQL은 Structured Query Language의 줄임말로, 

 

관계형 데이터베이스(DBMS : Database Management System)와 대화하기 위해 존재하는 언어이다.

 

궁극적으로 SQL을 배우는 목적은, 데이터베이스에서 내가 원하는 정보를 선택하고, 필요로 따라 변경하기 위함이다.

 

아래 예제 문제를 통해서 실전으로 SELECT문을 익혀보자. 

 


Oracle SQL 예제 문제

 

Q1. 사원 테이블에서 사원번호가 7788인 사원의 사원번호, 이름, 월급을 출력하라

더보기
SELECT EMPNO, ENAME, SALFROM EMP

WHERE EMPNO = 7788;

// ‘7788’로 처리하면 7788을 숫자가 아닌 문자로 인식




Q2. 사원 테이블에서 ‘SMITH’의 사원번호, 이름, 월급을 출력하라

더보기
SELECT EMPNO, ENAME, SAL

FROM EMP

WHERE ENAME = ‘SMITH’;




Q3. 사원테이블에서 입사일이 1980년 12월 17일인 사원의 모든 데이터를 출력하라

더보기
SELECT *

FROM EMP

WHERE HIREDATE = ‘80/12/17’;




Q4. 직업이 ‘SALESMAN’인 사원의 이름, 월급, 직업을 출력하라

더보기
SELECT ENAME,SAL,JOB 

FROM EMP

WHERE JOB = ‘SALESMAN’;

 



Q5. 부서번호가 10인 사원의 부서번호, 이름, 월급을 출력하라

더보기
SELECT DEPTNO, ENAME, SAL

FROM EMP

WHERE DEPTNO = 10;




Q6. 사원테이블에서 봉급이 3000 이상인 사원의 이름과 봉급을 출력하자

더보기
SELECT ENAME, SAL FROM EMP

WHERE SAL >= 3000;




Q7. 사원테이블에서 직업이 ‘SALESMAN’이 아닌 사원의 이름과 직업을 출력하자

더보기
!= , <> : 모두 ‘다르다, 같지 않다’는 의미



 SELECT ENAME, JOB FROM EMP

 WHERE JOB <> 'SALESMAN';

 



Q8. 사원테이블에서 봉급이 2000 이상인 사원의 이름, 매니저, 부서번호를 출력하자.

더보기
SELECT ENAME, MGR, DEPTNO FROM EMP

WHERE SAL >=2000;





Q9. 직업이 ‘SALESMAN’이고 월급이 2000 이상인 사원의 이름과 월급, 직업을 출력.

더보기
(AND, OR 연산자 가능)

SELECT ENAME, SAL, JOB FROM EMP

WHERE JOB = 'SALESMAN' AND SAL >=2000;

 

 



Q10. 사원 테이블에서 월급이 1000 이상 3000 이하인 사원의 이름과 봉급을 출력하자.

더보기
(AND 연산자)

SELECT ENAME, SAL 

FROM EMP 

WHERE SAL BETWEEN 1000 AND 3000;

(=WHERE SAL >=1000 AND SAL <=3000;)






Q11. 사원테이블에서 사원번호가 7788, 7902, 7369번인 사원의 사원번호와 이름을 출력하자.

더보기
SELECT EMPNO, ENAME FROM EMP

WHERE EMPNO = 7788 OR EMPNO = 7902 OR EMPNO = 7369;




SELECT EMPNO, ENAME FROM EMP

WHERE EMPNO IN (7788,7902,7369);

 

 



Q12. LIKE 연산자 (%, _)

 

사원 테이블에서 이름이 S로 시작하는 사원의 이름을 출력하자.

더보기
SELECT ENAME

FROM EMP

WHERE ENAME LIKE ‘S%’;




 

Q13. 사원 테이블에서 이름의 두 번째 글자가 O인 사원의 이름을 출력하자.

더보기
SELECT ENAME

FROM EMP

WHERE ENAME LIKE ‘_O%’;




Q13. 사원 테이블에서 이름의 두 번째 글자가 O이며 마지막 글자가 S인 사원의 이름을 출력하자.

더보기
SELECT ENAME

FROM EMP

WHERE ENAME LIKE ‘_O%S’;




Q14. TEST의 구조를 살펴보자.

더보기
DESC TEST;

 

 

Q15. TEST가 가진 모든 데이터를 삭제하자.

더보기
DELETE TEST;

SELECT COUNT(*) FROM TEST;

 

 

Q16. TEST 칼럼에 NAME칼럼을 추가해보자. [기존 테이블을 수정한다 - ADD]

더보기
// 테이블 생성시 CREATE, 수정 시 ALTER 키워드 사용

ALTER TABLE TEST 

ADD NAME VACHAR2(10);

DESC TEST; // TEST의 구조를 본다.

 

 

Q17. 테이블을 삭제하자.

더보기
DROP TABLE TEST;



Q18. 주소록 테이블을 생성하자

더보기
CREATE TABLE ADDRESS(

NAME VARCHAR2(10),

ADDR VARCHAR2(10)

);



Q19. 데이터를 입력해보자.

더보기
INSERT INTO 테이블명 VALUES (‘홍길동’,’서울시’);

INSERT INTO 테이블명 VALUES (‘정길동’,’부산’);

INSERT INTO 테이블명 VALUES (‘최길동’,’인천’);




Q20. ADDRESS 테이블의 이름 중, 두 번째 글자가 ‘길’인 데이터 전체 출력

더보기
SELECT * FROM ADDRESS
WHERE ENAME LIKE '_길%';




Q21. 주소가 ‘시’로 끝나는 데이터 출력

더보기
SELECT * FROM ADDRESS

WHERE ADDR LIKE ‘%시’;





Q22. 이름이 최로 시작하거나 주소가 ‘시’로 끝나는 데이터 전체 출력

더보기
SELECT * FROM ADDRESS

WHERE NAME LIKE ‘최%’ OR ADDR LIKE ‘%시‘;





Q23. ADDRESS 테이블의 데이터를 전체 삭제한다.

더보기
DELETE ADDRESS;

// DROP 명령어가 아니기에 데이터는 사라지지만, TABLE의 구조는 남아있다.



Q24. 칼럼을 추가하자

더보기
ALTER TABLE ADDRESS

ADD TEL VARCHAR(15);



DESC ADDRESS;




Q25. 데이터 추가

더보기
INSERT INTO ADDRESS VALUES('111','111','11_11_11');

INSERT INTO ADDRESS VALUES('222','222','22_22_22');

INSERT INTO ADDRESS VALUES('333','333','031_000_000');

 

 

Q26. TEL 중 4번째 글자가 _ 인 데이터를 찾아 출력

더보기
SELECT * FROM ADDRESS

WHERE TEL LIKE ‘___@_%’ ESCAPE ‘@’;

 




Q27. TEL  00_00_00만 찾아보자.

더보기
SELECT * FROM ADDRESS

WHERE TEL LIKE ‘___@_%’ ESCAPE ‘@’;

 



Q28. ADDRESSS 테이블을 삭제하자.

더보기
DROP TABLE ADDRESS;



Q29. 사원 테이블에서 사원의 이름과 봉급을 가지고 TEST라는 테이블을 생성하자.

더보기
CREATE TABLE TEST

AS

SELECT ENAME, SAL

FROM EMP;




Q30. TEST 테이블을 이름순으로 정렬을 해보자.

 

더보기
===============================

SELECT

FROM

WHERE

ORDER BY 칼럼명, 칼럼의 인덱스 +  ASC - 오름차순, DESC - 내림차순

===============================


SELECT * 

FROM TEST

ORDER BY ENAME;





SELECT * 

FROM TEST

ORDER BY 1;

// 1 : 첫번째 칼럼 순으로 정렬

 

 

Q31. TEST 테이블을 봉급을 기준으로 내림차순 정렬을 해보자.

 

더보기
SELECT * FROM TEST 

ORDER BY SAL DESC;

// ORDER BY 2 DESC; 와 동일한 결과



// SELECT * FROM TEST ORDER BY 1 ASC, 2 DESC처럼, 두 칼럼을 기준으로 정렬하는 건 불가능하다. 
// 실행하면 1 ASC만 실행된다.

 

 




Q32. ORACLE에 내장되어 있는 ROWID(칼럼의 색인, 고유 주소)를 출력해보자.

ROWID

------------------

AAAE5qAABAAALDZAAA

AAAE5qAABAAALDZAAB

AAAE5qAABAAALDZAAC

AAAE5qAABAAALDZAAD

AAAE5qAABAAALDZAAE

AAAE5qAABAAALDZAAF

AAAE5qAABAAALDZAAG

AAAE5qAABAAALDZAAH

AAAE5qAABAAALDZAAI

AAAE5qAABAAALDZAAJ

AAAE5qAABAAALDZAAK



ROWID

------------------

AAAE5qAABAAALDZAAL



12 rows selected.



SQL> SELECT COUNT(*) FROM TEST;



  COUNT(*)

----------

        12



더보기
SQL> SELECT ROWID FROM TEST;