DML | DDL | TCL | DCL | |
용도 | 데이터 조작 | 데이터 정의 | 트랜잭션 제어 | 권한 부여 |
명령어 | SELECT(DQL), INSERT, UPDATE, DELETE |
CREATE, ALTER, DROP | COMMIT, ROLLBACK | GRANT, REMOVE |
SELECT문
: 데이터를 조회하거나 검색할 때 사용하는 명령어(DQL)
- RESULT SET: SELECT 구문을 통해 조회된 데이터의 결과물. 조회된 행들의 집합.
SELECT문은 이렇게 작성한다.
SELECT 컬럼명1, 컬럼명2, ...
FROM 테이블명
WHERE 조건식;
- SELECT
조회하려는 테이블의 컬럼명을 기술한다.
테이블의 모든 컬럼들을 조회할 경우 컬럼명을 쓰지 않고 '*'만 작성한다.
- FROM
조회하려는 테이블명을 기술한다.
- WHERE (기술할 조건이 없으면 생략 가능)
행을 선택하는 조건을 기술한다. 여러 제한 조건을 가질 수 있으며, 이들은 논리 연산자로 연결된다.
☞ 실행 순서: FROM → WHERE → SELECT
[예시]
=기본=
1. EMPLOYEE 테이블의 전체 직원들의 직번과 이름, 급여 조회하기
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE;
EMP_ID(사번), EMP_NAME(직원명), SALARY(급여) 컬럼을 조회한다. EMPLOYEE 테이블로부터.
2. EMPLOYEE 테이블의 전체 직원들의 모든 컬럼 조회하기
SELECT *
FROM EMPLOYEE;
별표 * 를 SELECT에 기술하면 EMPLOYEE 테이블의 모든 컬럼이 조회된다.
=컬럼값을 통한 산술 연산=
3. EMPLOYEE 테이블로부터 직원명, 월급, 연봉(월급 * 12) 조회하기
SELECT EMP_NAME, SALARY, (SALARY * 12)
FROM EMPLOYEE;
EMP_NAME(직원명), SALARY(월급), SALARY*12(연봉)을 조회한다. EMPLOYEE 테이블로부터.
=컬럼명에 별칭 붙이기=
4. EMPLOYEE 테이블로부터 직번, 직원명, 월급, 연봉을 별칭 붙여서 조회하기
SELECT EMP_ID AS 직번, EMP_NAME AS "직원명", SALARY 월급, (SALARY * 12) "연봉(보너스 미포함)"
FROM EMPLOYEE;
① '컬럼명 AS 별칭', ② '컬럼명 AS "별칭"', ③ '컬럼명 별칭', ④ '컬럼명 "별칭"'
숫자나 특수문자가 포함될 경우에는 큰따옴표(" ")를 사용한다.
=리터럴=
5. EMPLOYEE 테이블로부터 직번, 직원명, 월급, 단위(원) 조회하기
SELECT EMP_ID, EMP_NAME, SALARY, '원' 단위
FROM EMPLOYEE;
위에서 '단위'는 별칭이므로 생략해도 된다.
임의로 지정한 문자열(작은따옴표 ' ')을 SELECT절에 기술하면 그 테이블에 존재하는 데이터처럼 조회된다.
=DISTINCT=
6. EMPLOYEE 테이블로부터 부서코드를 중복값 없이 조회하기
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;
DISTINCT는 해당 컬럼명 앞에 기술하며, 조회하려는 컬럼에 중복된 값을 제외한 값을 조회하고 싶을 때 사용한다.
DISTINCT는 SELECT절에서 단 한 번만 기술할 수 있다.
※비교
6-1. EMPLOYEE 테이블로부터 부서코드 조회하기
SELECT DEPT_CODE
FROM EMPLOYEE;
DISTINCT를 사용했을 때와 달리 중복된 값들이 출력된다.
=비교 연산자=
⊙ 비교 연산자
: >, <, <=, >=, !=, =
- != 외에 ^=, <>도 같은 의미(일치하지 않음)
- = → Java와 C에서는 ==로 기술하지만 데이터베이스에서는 =로 기술
7. EMPLOYEE 테이블로부터 월급이 300만 원 이상인 직원들의 모든 컬럼 조회하기
SELECT *
FROM EMPLOYEE
WHERE SALARY >= 3000000;
'A >= B' (A가 B보다 크거나 같다)
8. EMPLOYEE 테이블로부터 부서코드가 D6인 직원들의 이름과 부서코드 조회하기
SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6';
문자나 날짜 리터럴은 작은따옴표(' ')를 사용한다.
8-1. EMPLOYEE 테이블로부터 부서코드가 D6이 아닌 직원들의 이름, 부서코드, 월급, 단위(원) 조회하기
SELECT EMP_NAME, DEPT_CODE, SALARY, '원'
FROM EMPLOYEE
WHERE DEPT_CODE != 'D6';
--WHERE DEPT_CODE ^= 'D6';
--WHERE DEPT_CODE <> 'D6';
주석 처리된 두 개의 코드들도 != 와 같은 일치하지 않는다는 의미의 코드이다.
셋 중에 어느 코드를 기술하든 같은 값이 나온다.
=논리 연산자=
⊙ 논리 연산자
: 여러 개의 조건을 연결할 때 사용한다.
- AND : 그리고, ~이면서(Java에선 &&)
- OR : 또는, ~이거나(Java에선 ||)
- NOT : 논리 부정(Java에선 !)
9. EMPLOYEE 테이블에서 부서코드가 D9이면서 월급이 400만 원 이상인 직원들의 이름과 부서코드, 월급 조회하기
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9' AND SALARY >= 4000000;
부서코드가 D9"이면서" 월급이 400만 원 이상이므로 논리 연산자 AND를 사용하여 두 조건을 연결한다.
9-1. EMPLOYEE 테이블에서 부서코드가 D9이거나 월급이 400만 원 이상인 직원들의 이름과 부서코드, 월급 조회하기
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9' OR SALARY >= 4000000;
부서코드가 D9"이거나" 월급이 400만 원 이상이므로 논리 연산자 OR를 사용하여 두 조건을 연결한다.
=BETWEEN AND=
⊙ BETWEEN AND
: A 이상 B 이하인 범위에 대한 조건을 제시할 때 사용한다.
- 비교할 컬럼명 BETWEEN A AND B
10. 월급이 250만 원 이상이고 300만 원 이하인 직원들의 직번과 이름, 월급 조회하기
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 2500000 AND 3000000;
"월급"이 250만 원 "이상"이고 300만 원 "이하"이므로
비교할 컬럼명은 SALARY,
BETWEEN AND에서 낮은 숫자가 먼저 들어가야 하므로
BETWEEN 2500000(이상) AND(이고) 3000000(이하)이 된다.
11. 월급이 250만 원 미만이고 600만 원 초과인 직원들의 직번과 이름, 월급 조회하기
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 2500000 AND 6000000;
위 문제는 미만, 초과인 범위에 대한 조건을 제시하였으므로 논리 부정 연산자인
NOT을 사용하면 된다.
즉, 월급이 250만 원 이상이고 600만 원 이하가 "아닌" 직원들과 같은 말이므로
BETWEEN 2500000 AND 6000000 앞에 NOT을 붙이면 미만, 초과가 된다.
12. 입사일이 '00/01/01'부터 '02/01/01'까지인 직원들의 모든 컬럼 조회하기
SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '00/01/01' AND '02/01/01';
비교할 컬럼이 HIRE_DATE(입사일)이고 작은따옴표('')를 사용하여 날짜를 표시한다.
만약 위의 입사일 조건이 아닌 직원들을 조회하고 싶다면 논리 부정 연산자 NOT을 붙이면 된다.
=LIKE=
⊙ LIKE '특정 패턴'
: 비교하고자 하는 컬럼값이 지정한 특정 패턴에 만족할 경우 조회한다.
- 비교할 컬럼명 LIKE '특정 패턴'
- 특정 패턴은 %와 _로 제시한다.
- % : 0글자 이상 비교
비교할 컬럼명 LIKE '문자%' : 컬럼값 중에 '문자'로 시작하는 것을 조회한다.
비교할 컬럼명 LIKE '%문자' : 컬럼값 중에 '문자'로 끝나는 것을 조회한다.
비교할 컬럼명 LIKE '%문자%' : 컬럼값 중에 '문자'가 포함되는 것을 조회한다.
- _ : 1글자 비교
비교할 컬럼명 LIKE '_문자' : 해당 컬럼값 중에 '문자' 앞에 무조건 1글자가 존재하는 경우 조회한다.
비교할 컬럼명 LIKE '__문자' : 해당 컬럼값 중에 '문자' 앞에 무조건 2글자가 존재하는 경우 조회한다.
13. 성이 김 씨인 직원들의 직번과 이름, 이메일 조회하기
SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMP_NAME LIKE '김%';
EMP_NAME 컬럼에서 '김'이라는 문자로 시작하는 이름을 조회해야 하므로 LIKE '김%'으로 입력하면 된다.
14. 이름에 '하'가 포함된 직원들의 이름과 주민등록번호 조회하기
SELECT EMP_NAME, EMP_NO
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';
EMP_NAME 컬럼에서 '하'라는 문자가 포함된 직원들을 뽑아내면 되므로
LIKE '%하%'로 입력하면 된다.
15. 이름이 '팔'로 끝나는 직원들의 이름, 입사일 조회하기
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%팔';
EMP_NAME 컬럼에서 '팔'이라는 문자로 끝나는 것을 뽑아내면 되므로
LIKE '%팔'로 입력하면 된다.
15-1. 전화번호 첫 세 자리가 010이 아닌 직원들의 이름과 전화번호 조회하기
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
우선 PHONE 컬럼에서 '010'으로 시작하는 문자를 뽑아내려면
LIKE '010%'로 입력한다. 그리고 010이 아닌 값을 가져와야 하므로
논리 부정 연산자인 NOT을 앞에 붙이면 된다.
16. 이름의 가운데 글자가 '차'인 직원의 이름 조회하기
SELECT EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '_차_';
한 글자만 비교하면 되므로 '_'를 사용한다. '차'라는 문자는 이름 가운데 글자여야 하므로
'차'의 앞뒤로 문자가 반드시 1글자 있어야 한다.(이름이 세 글자인 경우)
그러므로 LIKE '_차_'로 입력하면 된다.
17. 전화번호 4번째 자리가 3으로 시작하는 직원들의 직번과 이름, 전화번호 조회하기
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '___3%';
보통 전화번호가 10자리이거나 11자리이다.
위 문제에서 전화번호 4번째 자리가 3으로 시작한다 했으므로 우선 앞번호 3글자는 반드시 '3'이라는 문자 앞에 있어야 한다. 이땐 '_'를 사용하는데 3자리이므로 '___3'이 된다.
그 다음 '3'으로 시작하는 문자를 뽑아내야 하므로 '%'를 사용한다. 그럼 LIKE '___3%'이 된다.
=IS NULL=
⊙ IS NULL
: 해당 값이 NULL인지 비교한다.
- 비교할 컬럼 IS NULL : 컬럼값이 NULL일 경우
- 비교할 컬럼 IS NOT NULL : 컬럼값이 NULL이 아닐 경우
18. 보너스를 받지 못하는 직원들의 이름과 월급, 보너스 조회하기
SELECT EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;
보너스를 받지 못하면 BONUS 컬럼에 입력된 값이 없을 것이므로
해당 컬럼값은 NULL이다.
그럼 'BONUS IS NULL'이 된다.
만약 보너스를 받는 직원들을 조회한다면, 위와 달리 BONUS 컬럼에 값이 입력되어 있을 것이므로 'BONUS IS NOT NULL'이 된다.
19. 보너스를 받지만 아직 부서 배치가 되지 않은 직원들의 이름과 부서코드, 보너스 조회하기
SELECT EMP_NAME, DEPT_CODE, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL AND DEPT_CODE IS NULL;
보너스를 받으면 NULL이 아니므로 'BONUS IS NOT NULL'이 된다.
그리고 부서 배치가 되지 않았으면 부서 코드가 없을 것이므로
'DEPT_CODE IS NULL'이 된다. 위 문제는 두 조건 모두 직원들에게 해당되어야 하므로 AND로 연결한다.
=IN=
⊙ IN
: 비교할 컬럼값에 제시한 목록들 중 일치하는 값이 있는지 판단한다.
- 비교할 컬럼명 IN(값1, 값2, ...)
20. 직급코드가 J1, J3, J4인 직원들의 모든 컬럼 조회
SELECT *
FROM EMPLOYEE
WHERE JOB_CODE IN('J1', 'J3', 'J4');
JOB_CODE 컬럼에 'J1'와 'J3', 'J4'라는 문자 중에 해당하는 값이 있는지 확인한 후 있으면 모두 뽑아낸다.
만약 직급코드 J1, J3, J4가 아닌 직원들을 조회하고 싶다면, 'J1'와 'J3', 'J4'라는 문자가 아니면 되므로 NOT을 붙이면 된다.
=연결 연산자=
⊙ 연결 연산자(||)
: 여러 컬럼값들을 하나의 컬럼인 것처럼 연결시켜주며, 컬럼과 리터럴(임의의 문자열)도 연결할 수 있다.
21. '@@번 OOO의 월급은 \원입니다.' 라고 출력하기
SELECT EMP_ID || '번 ', EMP_NAME || '의 월급은 ', SALARY || '원입니다.'
FROM EMPLOYEE;
연결 연산자 없이 리터럴을 입력하면 칸이 구분되어 출력된다.
그런데 연결 연산자 ||를 입력한 후 리터럴을 입력하면 마치
한 컬럼인 것처럼 보여준다.
=ORDER BY=
⊙ ORDER BY
: 최종 조회된 결과물에 대해 정렬 기준을 세워주는 구문이며, SELECT문에서 가장 마지막에
기술하는 구문일 뿐만 아니라 가장 마지막에 실행되는 구문이다.
- ORDER BY [정렬하려는 컬럼명 또는 별칭] [ASC/DESC](생략 가능) [NULLS FIRST
/NULL LAST](생략 가능)
- 오름차순/내림차순
ASC : 오름차순(생략 시 기본값)
DESC : 내림차순
- 정렬하려는 컬럼값에 NULL이 있을 경우
NULLS FIRST : 해당 NULL값들을 먼저 보여준다.(내림차순일 경우 기본값)
NULLS LAST : 해당 NULL값들을 나중에 보여준다.(오름차순일 경우 기본값)
22. 보너스 기준으로 정렬하기
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
ORDER BY BONUS;
ORDER BY BONUS에 오름차순이나 내림차순 기술이 생략되어 있으면 오름차순이 기본값이다. 그리고 오름차순일 경우에 NULL값은 나중에 보여진다.
굳이 적자면 'ORDER BY BONUS ASC NULLS FIRST;'가 된다.
만약 내림차순으로 기술되어 있다면, 내림차순일 경우 NULL값은 나중에 보여지므로
'ORDER BY BONUS DESC NULLS LAST;'가 된다.
이때 'NULLS LAST'는 생략 가능하므로 'ORDER BY BONUS DESC'도 가능하다.
=연산자 우선순위=
⊙ 연산자 우선순위
0번째: ( )
1번째: 산술 연산자(+, -, *, /, %)
2번째: 연결 연산자(||)
3번째: 비교 연산자(>, <, >=, <=, =, !=)
4번째: IS NULL, LIKE, IN'
5번째: BETWEEN AND
6번째: NOT
7번째: AND
8번째: OR
23. 직급코드 J2 또는 J7 중 월급을 200만 원보다 많이 받는 직원들의 이름과 급여, 직급코드 조회하기
SELECT EMP_NAME, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE (JOB_CODE = 'J2' OR JOB_CODE = 'J7') AND SALARY > 2000000;
직급코드에 소괄호 ()를 하지 않으면 연산자 우선순위에 따라 AND가 OR보다 먼저 연산되어 잘못된 값이 나올 수 있다.
그러므로 OR로 연결된 두 조건이 AND보다 먼저 실행되어야 할 경우 두 조건을 소괄호 쳐서 우선순위를 높여주어야 한다.