정확하고 다양한 결과 추출
- 어디서 가져올지 > 어떻게 가져올지 > 어떤 값을 출력할지 의 순서대로
1. WHERE 절 (if문과 비슷...)
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE [조회할 행을 선별하기 위한 조건식];
- SELECT문으로 데이터를 조회할 때 특정 조건을 기준으로 원하는 행을 출력하는데 사용
- 조건실을 (WHERE 옆에 작성) 반드시 갖고 잇으며, 조회 조건을 지정한다.
- WHERE은 FROM 과 SELECT 앞으로 오면 안 된다.
- 조건식 개수의 경우 제한이 없다.
SELECT *
FROM EMP
WHERE DEPTINO = 30; -- deptino 가 30인 값 추출
- 값이 동일하게 추출하기 위해서 ( 갑 비교를 할 때는 자바처럼 == 가 아니라 "="하나만 붙여주면 된다.
- WHERE 절 안에 수식과, 해당 영역의 값이 맞는 경우인 데이터만 출력한다.
2. 여러 개 조건식을 사용하는 AND, OR 연산자
1) and 연산자로 여러 개의 조건 사용하기.
SELECT * FROM EMP
WHERE DEPTNO = 30
AND JOB = 'SALESMAN';
- DEPTNO 가 30이면서, JOB 이 SALESMAN 인 값. (두 개 모두 TRUE인 값만 출력)
비교하는 데이터가 문자열인 경우는 작은 따옴표(' ')로 묶어준다. 앞뒤에 공백이 있다면 공백도 인식
- SQL문에 사용하는 기본 형식은 대, 소문자를 구별하지 않고 사용할 수 있지만,
조건식 안에 문자로 인식되는 문자 또는 문자열 데이터는 대, 소문자를 구별
2) OR 연산자로 여러 개의 출력 조건 사용하기
SELECT *
FROM EMP
WHERE DEPTNO = 30
OR JOB = 'CLERK';
- DEPTNO 가 30이거나, JOB 이 CLERK 인 값. (둘 중에 하나만 TRUE 여도 출력한다.)
+) and와 or 과 비슷하게 사용할 수 있는 수식.
WHERE sal >= 500 and sal <= 1000;
WHERE sal between 500 and 1000;
WHERE DEPTNO = 10 or DEPTNO = 30 ;
WHERE DEPTNO in (10,30);
- 연산 기호가 아닌 키워드 연산자는 앞에 not 을 붙여서 작성할 수 있다.
ex > not between : 두 개 모두 적용하지 않는 식.
3. 연산자 종류와 활용 방법
1) 산술 연산자 : 더하기 + , 빼기 - , 곱하기 * , 나누기 /
2) 비교 연산자 : > , < , >= , <=
- 문자열을 비교할 수 있다. 영어 사전처럼 알파벳 순서로 대소를 비교
- ENAME >= 'F'는 ENAME 열 값의 첫 문자와 대문자 F를 비교했을 때
알파벳 순서상 F와 같거나 F보다 뒤에 있는 문자열을 출력하라는 의미이다.
- 비교 단어가 하나가 아니라 여러 개의 경우, 포함한 문자열보다 앞 부분
3) 등가비교 연산자 :
= | A=B | A값이 B값과 같을 경우 TRUE, 다를 경우 FALSE 반환 |
!= | A!=B | A값과 B값이 다를 경우 TRUE, 같을 경우 FALSE를 반환 |
<> | A<>B | |
^= | A^=B |
4) 논리 부정 연산자 (not)
- NOT연산자를 IN, BETWEEN, IS NULL, LIKE 연산자와 함께 복합적으로 사용하는 경우가 많다.
- 복잡한 여러 개 조건식이 AND, OR로 묶여 있는 상태에서 정반대의 결과를 얻고자 할 때 사용할 수 있다.
5) IN 연산자
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 IN (데이터1, 데이터2, ..., 데이터N);
SELECT * FROM EMP
WHERE JOB IN ('MANAGER', 'SALESMAN', 'CLERK');
- or로 길게 늘어진 조건문을 작성하는 것보다 in 연산자를 작성하여 조건을 만드는 것이 좋다.
6) BETWEEN A AND B 연산자 (<=과, >=이 들어가는 연산자이다.)
SELECT [조회할 열1 이름], [열2 이름], ..., [열N 이름]
FROM [조회할 테이블 이름]
WHERE 열 이름 BETWEEN 최솟값 AND 최댓값;
SELECT * FROM EMP
WHERE SAL BETWEEN 2000 AND 3000;
- 특정 열 값의 최소, 최대 범위를 지정하여 해당 범위 내의 데이터만 조회할 경우 사용할 수 있다.
특정 기간의 일정을 구하려는 경우 작은 따옴표(' ')안에 넣어주면 된다. (자동형변환) 일어남.
SELECT ename, hiredate
FROM EMP
WHERE hiredate between '1981-02-01' and '1981-02-28';
7) LIKE 연산자
- 내용 검색 기능처럼 일부 문자열이 포함된 데이터를 조회할 때(텍스트 포함 값)
_ | 어떤 값이든 상관 없이 한 개의 문자 데이터 의미 |
% | 길이와 상관 없이(문자가 없는 경우도 포함) 모든 문자 데이터를 의미 |
SELECT * FROM EMP
WHERE ENAME LIKE 'S%';
- ENAME 열값이 ENAME 열 값이 대문자 S로 시작하는 데이터를 조회
- 특정 단어로 끝나는 문자를 찾는 경우 '%S' 사용하면 된다. (S뒤에 %가 없으므로, 그 뒤에 문자가 오면 안 된다.)
- 두 번째 글자가 S인 사원 데이터 조회 → '_S%' 이용
- 특정 단어가 포함된 데이터를 추출하기 위해서는 앞뒤로 와일드카드를 붙여주면 된다.
(ex : '%S%' → S가 포함된 값을 추출)
- 와일드 카드 문자가 데이터 일부일 경우 (자주 사용하지는 않는다)
+ ) 데이터에 와일드 카드 기호로 사용되는 _나 % 문자가 데이터로 포함된 경우
ESCAPE절을 사용해준다.
SELECT * FROM SOME_TABLE
WHERE SOME_COLUMN LIKE 'A\_A%' ESCAPE '\';
A_A로 시작하는 문자열을 검색하라는
8) IS NULL 연산자
- NULL 값이란, 데이터 값이 완전히 비어있다는 상태.
- 숫자 0 값은 값 0이 존재한다는 뜻이므로 NULL 과 같지 않다.
의미 | 예 |
값이 존재하지 않음 | 통장을 개설한 적 없는 은행 조객의 계좌 번호 |
해당 사항 없음 | 미혼인 고객의 결혼 기념일 |
노출할 수 없는 값 | 고객 비밀번호 찾기 같은 열람을 제한해야하는 특정 개인 정보 |
확정되지 않은 값 | 미성년자의 출신 대학 |
- 산술 연산자와 비교 연산자로 비교해도 결과 값이 NULL이 된다. (연산 불가능)
특정 열 또는 연산의 결과 값이 NULL인지 여부를 확인하려면 IS NULL 연산자를 사용해야 한다.
SELECT * FROM EMP WHERE COMM = NULL;
// 결과값 존재 X
SELECT * FROM EMP WHERE COMM IS NULL;
// 결과값 존재 O
- 열 값이 NULL이 아닌 데이터만 조회하려면 IS NOT NULL을 사용하면 된다.
- null 값과는 연산이 안 되지만, 값으로 구분하여 추출하는 경우 null 값은 자동으로 나오지 않는다.
where comm >= 500; --500 이상의 값이 나오면서 자동으로 null 값은 추출되지 않는다.
- AND 연산자와 사용하는 경우, TRUE 와 NULL이 함께 비교가 되면 NULL로 마무리가 된다.
(FALSE와 NULL 이라면 FALSE)
- OR 연산자와 사용하는 경우, FALSE와 NULL이 함께 비교가 되면 NULL 값으로 마무리가 된다.
(TRUE와 NULL 이라면 TRUE)
9) 집합 연산자
- 집합 연산자를 사용할 때, 열 개수와 각 열의 자료형이 순서별로 일치해야 한다.
- 컬럼이 동일해야 값이 나오는 것은 아니고, 열의 자료형이 동일하면 오류 없이 추출 값이 나오기는 한다.
UNION | 연결된 SELECT문의 결과 값을 합집합으로 묶어 준다. 결과 값의 중복은 제거된다. |
UNION ALL | 연결된 SELECT문의 결과 값을 합집합으로 묶어 준다. 중복된 결과 값 제거 없이 모두 출력된다. |
MINUS | 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문의 결과 값을 차집합 처리한다. 먼저 작성한 SELECT문의 결과 값 중, 다음 SELECT문에 존재하지 않는 데이터만 출력된다. |
INTERSECT | 먼저 작성한 SELECT문의 결과 값이 같은 데이터만 출력된다. 교집합과 같은 의미이다. |
SELECT empno, ename, sal, deptno FROM EMP
WHERE deptno = 10 // UNION 사용하는 경우, ; 로 마무리하면 안 된다.
UNION
SELECT empno, ename, sal, deptno FROM EMP
WHERE deptno = 20;
- UNION 을 사용하는 경우, ORDER BY 는 처음 추출 뒤에 작성하면 사용 불가능하다.
마지막에 쓰는 것이므로 마지막 순서 뒤에 ORDER BY를 사용하면 정렬된 값이 나온다.