SQL 기본 문법

프로그램 설치 및 로그인이 완료되었으니 기본 문법에 대해 설명드리고자 합니다. SQL은 구조적인 언어여서 문법 자체가 정형화되어있기 때문에 구문이 정해져있습니다. 따라서 다른 언어들에 비해 난이도가 낮은데 몇몇 조건을 추가하다보면 성능이 떨어져서 조회 속도가 느려지게 됩니다. 여기서 쿼리를 어떻게 짰는지에 따라 성능이 달라진다고 합니다. 쿼리를 효과적으로 만드는 분들을 튜너라고 부르는데 수 년간 DB관리를 하는 소수의 분들이 이런 포지션에서 일을 하신다고 합니다.

절 이름 기능
SELECT 데이터 조회
FROM 테이블 지정
WHERE 데이터 조회 조건
GROUP BY 특정 칼럼에 대해 그룹 단위로 묶기
SELECT GROUP BY 이후 조건
ORDER BY 정렬 기준 설졍



목차


기본적인 데이터 조회


SELECT *
  FROM EMP;

SELECT 절은 원하는 데이터를 조회하는 가장 기본적인 절입니다. FROM은 데이터를 조회할 테이블을 지정하는 절입니다. 위 쿼리는 EMP라는 테이블에서 모든 컬럼을 출력하라는 의미입니다. 여기서 주의하실 점이 있는데 테이블 EMP는 모든 계정에서 볼 수 있는 것이 아니라 로그인 시 입력한 SCOTT계정의 소유 테이블이기 때문에 원래 문법은 SCOTT.EMP가 맞습니다. 하지만 본인 소유의 테이블을 조회할 경우에는 본인의 이름을 편의상 생략해도 됩니다. 이에 관련된 내용은 추후 계정 권한 파트에서 다시 설명드리도록 하겠습니다.



SELECT ENAME, SAL
  FROM EMP;

이 쿼리는 테이블 EMP에서 ENAME, SAL 컬럼을 조회하는 쿼리입니다. 쿼리 실행시 아래와 같이 출력될 것입니다.

ENAME SAL
SMITH 800
JONES 2975
BLAKE 2850



SELECT에서 자주 사용하는 함수만 설명드리고 데이터 조회 조건으로 넘어가도록 하겠습니다.


Alias

Alias 기능은 쿼리를 실행할 때 보이는 컬럼의 이름을 바꿔서 출력합니다. 단순 조회시에는 그리 필요한 기능이 아니지만 현업에서는 가독성을 위해 자주 사용하는 기능 중 하나입니다.

Alias는 아래와 같이 사용합니다.

SELECT ENAME AS 이름, SAL
  FROM EMP;
이름 SAL
SMITH 800
JONES 2975
BLAKE 2850



따로 주의할 점이 있다면 Alias로 사용할 이름에 빈 칸이 있으면 문법 오류가 발생하게 됩니다. 지정할 이름에 빈 칸을 넣어야 하는 경우 이름 양 끝에 ““를 붙이면 문법 오류를 막을 수 있습니다.

SELECT ENAME AS "사원의 이름", SAL
  FROM EMP;
사원의 이름 SAL
SMITH 800
JONES 2975
BLAKE 2850



Concat 연산자

CONCAT 연산자는 출력할 컬럼들끼리 붙여주는 역할을 합니다. 컬럼 사이에 ,(콤마)가 아닌 || 를 입력하면 됩니다. 예를 들어 ENAME이 JAMES고 DEPTNO가 10일때 SELECT절에 ENAME||DEPTNO를 입력하면 JAMES10이라고 출력이 됩니다.

SELECT ENAME||'-'||JOB
  FROM EMP;
ENAME||’-‘||JOB
SMITH-CLERK
JONES-MANAGER
BLAKE-MANAGER



중복 제거

DISTINCT는 중복되는 행을 제거하는 기능입니다. 예를 들어 DEPTNO 컬럼에 10, 20, 10, 30, 20, 10 이렇게 데이터가 있을 때 DISTINCT DEPTNO를 하면 10, 20, 30만 출력이 됩니다.

SELECT DISTINCT DEPTNO
  FROM EMP;
DISTINCT DEPTNO
10
20
30




WHERE 데이터 조회 조건

데이터 조회 시 필요한 부분만 출력하기 위해서는 조회 조건을 설정해주어야 합니다. 조건을 설정하는 절이 WHERE절인데 FROM 밑에 입력해주시면 됩니다.

SELECT *
  FROM EMP
 WHERE JOB = 'MANAGER';
EMPNO ENAME JOB
7566 JONES MANAGER
7698 BLAKE MANAGER
7782 CLARK MANAGER

가장 기본적인 연산자인 = 부터 사용해보았습니다. 주의하실 점이 있다면 문자 조건을 설정할 때는 문자 양옆에 ''(작은따옴표)를 입력해주셔야 합니다. 그렇지 않으면 컬럼명으로 인식하기 때문에 문법 오류가 발생하게 됩니다. 위 쿼리에서도 JOB이 MANAGER인 조건을 걸 때 MANAGER 양 옆에 ''를 붙였습니다.


다음으로는 숫자 조건을 걸어서 데이터를 조회해보도록 하겠습니다.



SELECT *
  FROM EMP
 WHERE SAL >= 2000
   AND SAL <= 3000;
EMPNO ENAME SAL
7566 JONES 2975
7698 BLAKE 2850
7782 CLARK 2450


조건을 하나 더 추가하기 위해 AND 연산자를 사용했습니다. AND 앞의 조건과 뒤의 조건 모두 만족시키는 데이터만 조회하는 쿼리가 되었습니다. AND 외에도 여러 조건 중 하나만 만족시켜도 되는 OR 연산자도 있습니다.


BETWEEN 연산자

위 쿼리는 다른 방법으로도 구현할 수 있는데요. 몇 이상 몇 이하인지 설정할 수 있는 BETWEEN이라는 연산자가 있습니다. 예를 들어 30이상 100이하로 설정하고 싶으면 WHERE절에 컬럼명 BETWEEN 30 AND 100이라고 적으면 됩니다. 미만과 초과를 고려하지 않는다면 BETWEEN을 사용하는 것이 더 쉬워보입니다.

SELECT *
  FROM EMP
 WHERE SAL BETWEEN 2000 AND 3000;



이쯤에서 의문점이 하나 생겼을 것입니다. 문자컬럼에 대해 여러 조건을 거는 방법이 있지 않을까? 예를 들어 JOB이 ‘MANAGER’인 사람 뿐만 아니라 ‘CLERK’인 사람도 같이 출력하게끔 말입니다. 물론 OR연산자를 사용하면 가능하지만 시각적으로 더 편하게 작성하기 위해서 IN 연산자를 활용하는 방법에 대해 알려드리겠습니다.


IN 연산자

IN 연산자는 괄호 내에 있는 문자를 해당하는 줄을 모두 출력하는 연산자입니다. 예를 들어 JOB이 ‘MANAGER’, ‘CLERK’인 사람 모두를 출력하기 위해서는 아래와 같이 쿼리를 작성하시면 됩니다.

SELECT *
  FROM EMP
 WHERE JOB IN ('MANAGER','CLERK');
EMPNO ENAME JOB
7369 SMITH CLERK
7566 JONES MANAGER
7698 BLAKE MANAGER


LIKE 연산자

LIKE 연산자는 문자 패턴을 확인하여 데이터를 조회할 수 있는 패턴 연산자입니다. 조건과 완전히 일치하는 것을 찾는 것이 아닌 비슷한 데이터를 찾아내는 것입니다. 예를 들어 이름이 ‘C’로 시작하는 사원을 검색하는 경우 LIKE 'C%' 이런 식으로 조건을 걸면 됩니다.

SELECT *
  FROM EMP
 WHERE ENAME LIKE 'A%';
EMPNO ENAME JOB
7499 ALLEN SALESMAN

예시 외에도 다른 패턴으로도 조회가 가능한데 아래를 참고하시면 됩니다.

  • S% : S로 시작하는 자료
  • %S% : S를 포함하는 자료
  • _ : 임의의 한 글자를 의미
    • _S% : 두번째에 A가 들어가는 자료
    • _S___ : 두 번째에 S가 오는 5글자 자료


NOT 연산자

NOT 연산자는 부정 연산자로 조건에 일치하는 데이터를 제외하고 출력을 합니다.

SELECT *
  FROM EMP
 WHERE ENAME NOT LIKE 'A%';
EMPNO ENAME JOB
7369 SMITH CLERK
7521 WARD SALESMAN
7566 JONES MANAGER


DUAL TABLE 더미 테이블

  • 테이블이 필요없는 연산이 필요할 때 FROM 절에 입력하는 테이블이다.
  • 간혹 더미 테이블이 필요없는 툴도 있다.(ex: HEIDISQL 등)
SELECT 1 + 1
  FROM DUAL;
1 + 1
2


NULL : 공백

미입력된 상태로 데이터 구조를 처음 접하는 사람은 0과 착각하는 경우가 있는데 NULL은 0조차 입력되지 않은 텅 비어있는 상태를 의미합니다.

간단한 예를 들면 1 + 01이지만 1 + NULL은 계산할 수 없기 때문에 NULL이 출력이 됩니다.



다음 내용

GROUP BY 절에 들어가기 앞서서 자주 사용하는 함수들에 대해서 다뤄보려고 합니다.

  • 대소문자 치환
  • 문자에서 원하는 위치의 글자 추출
  • 공백 제거
  • 특정 문자를 원하는 문자로 치환
  • 반올림/modulo 등의 숫자함수
  • 날짜 함수
  • 데이터 형 변환 함수 등