프로그래머로 레벨업!/데이터베이스

정확하고 다양한 결과 추출

zeechive 2024. 4. 1. 14:51

- 어디서 가져올지 > 어떻게 가져올지 > 어떤 값을 출력할지 의 순서대로 

 

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를 사용하면 정렬된 값이 나온다.