새소식

인기 검색어

카테고리 없음

[DATABASE] SELECT문 정리

  • -

예시 테이블

위의 예시 테이블을 이용하여 기본 문법을 알아보도록 하자.

 

1. SELECT FROM

더보기

 - 데이터베이스 SQL문을 작성할 때에 가장 기본이 되는 것은 SELECT 문과 FROM 문이다.

 - SELECT는 조회할 열을 선택하는 것이고 FROM은 이 열이 어떤 테이블인지 조회하는 구문이다.

 

select * from emp;
결과1

 

애스터리스크(*)은 전체를 선택한다는 의미이다.

위 구문은 emp 테이블의 모든 열을 선택한다는 의미이므로 결과1과 같이 테이블의 전체 정보가 출력되었다.

 

select ename, empno, sal from emp;
결과2

 

결과 2에서는 모든 정보가 아닌 emp테이블에서 이름, 사원번호, 급여만 조회되는 것을 알 수 있다.

select문에서 ename과 empno, sal을 선택했기 때문이다.

 

조회할 데이터가 아주 많을 경우에는 단순히 위의 예시처럼 조회를 하면 알아보기 힘든 경우가 있다.

이 때 오름차순, 내림차순, 중복제거 등을 이용하면 훨씬 보기에 좋을 것이다.

 

 

2. DISTINCT (중복 제거)

더보기

 - 조회한 데이터의 내용에서 불필요한 중복을 제거하고 특정 데이터 종류만 확인

 

위의 예시 테이블에서 각 직책 별 부서 번호를 조회하고 싶다고 가정해보자.

select job, deptno from emp;

라고 했을 때

결과3

결과 3처럼 모든 직책에 대한 부서번호가 나오게 된다.

이를 DISTINCT 를 이용하면

select distinct job, deptno from emp;
결과4

위와 같이 중복되는 부분은 삭제하고 중복되지 않은 결과들만 모아서 출력해준다.

 

3. ORDER BY

더보기

- ORDER BY 구문은 선택한 열을 정렬할 때 사용한다.

 - ORDER BY 정렬하려는 열 이름(여러 열 지정 가능) [정렬 옵션];

옵션을 지정하지 않을 경우에는 기본값으로 오름차순 정렬이 사용된다.

 

select distinct job, deptno from emp order by job;

위 결과에서 직업 순으로 정렬한다는 의미이다.

 

결과 5

 

별다른 옵션이 지정되지 않았으므로 JOB 내의 이름들이 A-Z 순으로 오름차순 정렬이 된 것을 볼 수 있다.

 

반대로 DEPTNO(사원번호) 순으로 정렬할 수도 있다.

select distinct job, deptno from emp order by deptno;
결과 6

 

결과 6에서는 DEPTNO가 낮은 수부터 큰 수 순으로 정렬이 된 것을 볼 수 있다.

 

여러 열을 지정하거나 내림차순으로 정렬도 가능하다.

select distinct job, deptno from emp order by job asc, deptno desc;

직업을 오름차순으로, 사원번호를 내림차순으로 정렬 해보자.

결과 7

 

결과 7에서 알 수 있듯이 직업은 A-Z 순이지만 같은 CLECK 직업의 DEPTNO(부서번호)는 30-10 순으로 내림차순 정렬 된 것을 알 수 있다.

 

WHERE 절은 조회할 행을 선별하기 위한 조건식이다. 조건식의 결과 값이 true인 행만 출력한다.

즉 내가 원하는 열 값만 출력하거나 수정할 수 있게 해준다.

 

간단한 예시를 보자

select * from emp where deptno = 30;

 

예시 1

 

emp 테이블의 모든 정보를 조회하지만 where 절을 통해서 deptno(부서번호) 가 30인 정보만 출력하도록 했다.

 

이와 같이 where 뒤에는 조건식이 들어와야 하므로 연산자가 잇따르는 경우가 많다.

 

 

1) 논리 연산자

더보기

 

- A AND B : A와 B 조건을 모두 만족하는 것

 - A OR B : A 또는 B의 조건을 만족하는 것 (둘중에 하나라도 만족하는 것)

 - NOT A: 논리 부정 연산자.  (A가 아닌 것)

 

AND 연산자를 이용하면 여러개의 조건식을 모두 만족시키는 결과를 찾을 수 있다.

 

select * from emp where deptno = 30 and job = 'CLERK';
예시 2

 

마찬가지로 OR 연산자를 이용하면 여러가지 조건식 중 최소 하나 이상을 만족시키는 결과를 보여준다.

select * from emp where deptno = 30 or job = 'CLERK';
예시 3

 

위의 두 예시 모두

1. 부서번호가 30

2. 직업이 CLERK

라는 두가지 조건을 가지고 있지만 AND 연산자를 사용하느냐, OR 연산자를 사용하느냐 에 따라 결과가 달라진 것을 볼 수 있다.

 

select * from emp where not job = 'CLERK';
예시 4

 

NOT 연산자를 이용하면 직업이 CLERK 인 사원은 제외하고 결과가 출력된 것을 볼 수 있다.

 

 

2) 비교 연산자

더보기

비교 연산자

비교 연산자를 통해 급여가 얼마 이상인 사원의 정보 등을 출력할 수 있다.

📌등가 비교 연산자에서 !=, <>, ^= 는 모두 NOT과 동일한 역할을 수행한다.

 

등가 비교 연산자를 제외하면 일상 생활에서도 쉽게 볼수 있는 연산자이므로 간단한 예시를 보고 넘어가도록 하자.

select * from emp where sal>1000 and job != 'SALESMAN';
select * from emp where sal>1000 and job <> 'SALESMAN';
select * from emp where sal>1000 and job ^= 'SALESMAN';

 

예시 5

 

급여가 1000이상이고 직업이 SALESMAN 이 아닌 결과를 출력하는 것이다.

NOT job = 'SALESMAN' 으로 해도 결과는 똑같다.

 

 

 

3) SQL 연산자

더보기

 

- IN (list) : OR와 비슷한 역할을 한다. (리스트에 있는 값 중에서 어느 하나라도 일치하면 된다.)

                  부정 : NOT IN (list) (리스트의 값 모두 포함하지 않는다)

 - BETWEEN A AND B : a와 b의 값 사이에 있으면 된다. (a와 b 값이 포함됨)

                  부정 : NOT BETWEEN A AND B (A와 B 사이의 값을 포함하지 않는다)

 - LIKE : 비교문자열과 형태가 일치하면 된다. (와일드카드 문자 %, _ 사용)

                  부정 : NOT LIKE

 - IS NULL : NULL 값인 경우

                  부정 : NOT IS NULL

 

 

IN

직업이 SALESMAN 또는 MANAGER 인 사원을 알아보려고 할 때,

select * from emp where job = 'SALESMAN' or job = 'MANAGER';

위와 같이 입력해도 되지만 'or job = ' 를 여러번 입력해주어야 하는 번거로움이 있다.

때문에 조건식에 많은 조건이 들어가는 경우 IN (list)를 이용 해주면 간편하다.

list안의 조건을 만족하는 것을 자동으로 보여준다.

select * from emp where job in('SALESMAN','MANAGER');
예시 6

 

두 SQL 문 모두 같은 결과를 출력한다.

 

부정의 경우 NOT IN (list) 로 사용되는데 list에 있는 것이 아닌 경우만 출력된다. (모두 아닌 경우)

 

 

BETWEEN A AND B

between a and b 연산자는 a와 b 사이의 결과를 도출한다(a와 b도 포함한다)

select * from emp where sal between 2000 and 3000;
예시 7

 

위 결과도 마찬가지로

select * from emp where sal >= 2000 and sal <= 3000;

처럼 표현할 수도 있지만 between 연산자를 이용하면 편리하다.

부정의 경우 NOT BETWEEN A AND B 로 사용. A와 B 사이의 값을 포함하지 않는 결과를 보여준다 (A미만 or B초과)

 

 

LIKE

LIKE 연산자는 와일드카드 문자를 사용하여 특정한 값 검색을 할 때 같이 사용되는 문자를 말한다
패턴을 정의하여 검색을 효율적으로 할 수 있다.

 - % : 개수에 관계없이 모든 문자 ex) S% => S로 시작하는 모든 문자열. S도 포함
 - _ : 특정한 위치에 위치한 문자(한글자) ex) _S => 두번째 글자가 S인 문자.  / _S% => 두번째글자가 S로 시작하는 모든 문자열

 

이를 이용하여 사원 이름에 S가 포함되지 않는 사원 데이터를 출력해보도록 하자.

select * from emp where ename not like ('%S%');
예시 8

 

이번에는 2번째 글자가 A로 시작하는 모든 사원 데이터를 출력해본다.

select * from emp where ename like('_A%');
예시 9

 

부정의 경우 NOT LIKE로 사용하고  특정 문자를 포함하지 않는 결과를 출력해준다.

 

 

IS NULL

NULL은 ‘현재 무슨 값인지 확정되지 않은 상태’ 이거나 ‘값 자체가 존재하지 않는 상태’를 나타내는 데이터에 사용한다.

NULL 예시

where 문에서는 조건식의 결과가 null이 되면 출력되지 않는다.

때문에 값이 존재하지 않는 null과의 연산을 하게 되면 결과는 null이 되므로 출력되지 않는다.

ex) null + 100 = null

 

때문에 이 null 값을 확인하기 위해서는 IS NULL 연산자를 사용한다.

select * from emp where comm is not null;

위 예문에서는 comm(추가수당) 이 null 이 아닌 사원 데이터를 출력한다.

예시 10

 

0인 데이터를 출력하더라도 null 인 데이터는 출력하지 않는 것을 볼 수 있다.

 

 

 

4) 집합 연산자

더보기

두 개의 SELECT 문을 연결 할 때 사용하는 연산자이다.

 

🔰UNION / UNION ALL 연산자를 이용할 때는

 - 열의 개수와 순서가 모든 쿼리에서 동일해야 한다.
 - 데이터 형식이 호환되어야 한다.

 

위 두 조건을 만족하여야 한다.

select empno, ename, job, deptno from emp where deptno = 30 UNION
select empno, ename, job, deptno from emp where job = 'SALESMAN';
예시 11

 

부서번호가 30인 사원정보를 출력하는 select 문과 

직업이 SALESMAN 인 사원정보를 출력하는 select 문을 UNION 연산 하였다.

중복 된 결과는 모두 제거되어 있다.

select empno, ename, job, deptno from emp where deptno = 30 UNION ALL
select empno, ename, job, deptno from emp where job = 'SALESMAN';
예시 12

 

union all 을 사용하면 중복되는 값도 제거하지않고 모두 출력되므로

SALESMAN 직업이면서 부서번호가 30인 사원정보가 중복되어 나타나는 것을 확인할 수 있다.

 

 

MINUS 연산자는 차집합을 의미한다.

SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP MINUS
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP WHERE DEPTNO = 10 ;
예시 13

 

emp테이블에서 부서번호가 10인 사원을 뺀 결과를 출력한다.

 

INTERSECT 연산자는 교집합을 의미한다.

SELECT * FROM EMP WHERE JOB = 'SALESMAN' INTERSECT
SELECT * FROM EMP WHERE DEPTNO = 30 ;
예시 14

 

emp 테이블에서 직업이 SALESMAN이고 부서번호가 30인 사원의 교집합만 출력한다.

번외

더보기

🗝️연산자 우선순위

 

NULL은 현재 무슨 값이 확정되지 않은 상태를 나타내기떄문에 연산자체가 무의미해지기떄문에 NULL 포함 연산결과는 결과값이 나오지 않습니다

SELECT ENAME, SAL, SAL*12+COMM AS ANNSAL,COMM FROM EMP;
  • NULL  + 100 = NULL
  • NULL > 100 = NULL
  • ? > 100 = ?

NULL과 같이 사용할 수 있는 연산자는 중에는 OR이 존재합니다

SELECT * FROM EMP WHERE SAL > NULL OR COMM IS NULL;
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.