사람과 대화를 하기 위해서는 언어가 필수적이다.
컴퓨터도 마찬가지이다. 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;
'학습 과정 공유 및 후기 > SQLD' 카테고리의 다른 글
[ SQLD ] Oracle SQL (6) - 서브쿼리 (0) | 2020.05.21 |
---|---|
[ SQLD ] Oracle SQL (5) - 형변환 함수 (0) | 2020.05.20 |
[ SQLD ] Oracle SQL (4) - 숫자함수, 날짜 함수 (0) | 2020.05.20 |
[ SQLD ] Oracle SQL (3) - 문자함수 (0) | 2020.05.20 |
[ SQLD ] Oracle SQL (2) - 집계 함수 [count, max, min, sum, avg] (0) | 2020.05.19 |