[Oracle] SQL문법 1.SQL 기본문법

작성일     업데이트:

카테고리:

태그:

SQL(Structured Query Language)

SQL 이란

  • 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어이다
  • 원하는 데이터를 찾는 방법이나 절차를 기술하는 게 아닌 조건을 기술하여 작성한다

  • 주요 용어

    1. 행(Row), 튜플
    2. 컬럼, 도메인
    3. 기본키(Primary Key)
    4. 외래키(Foreign Key)
    5. Null
    6. 컬럼값, 속성값
  • 분류

    분류 용도 명령어
    DQL (Data Query Language) 데이터 검색 SELECT
    DML (Data Manipulation Language) 데이터 조작 INSERT(추가), UPDATE(수정), DELETE(삭제)
    DDL (Data Definition Language) 데이터 정의 CREATE(생성), DROP(삭제), ALTER(수정/삭제/추가)
    DCL (Data Control Language) 데이터 제어 GRANT(권한부여), REVOKE(권한해제)
    TCL (Transaction Control Language) 트랜잭션 제어 COMMIT(정상저장), ROLLBACK(취소)
    • SLELCT를 위처럼 DQL로 따로 빼기도 하지만 대부분 DML로 포함시킨다


주요 데이터 타입

데이터 타입 하위 데이터 타입 설명
NUMBER 숫자
CHARACTER CHAR 고정길이 문자(최대 2000바이트)
VARCHAR2 가변길이 문자(최대 4000바이트)
LONG 가변길이 문자(최대 2기가 바이트)
DATE 날짜
LOB CLOB 가변길이 문자(최대 4기가 바이트)
BLOB Binary Data


[ NUMBER ]

  • NUMBER[ ( P [ , S ] ) ]

    • [ ] : 생략가능
    • P : 표현할 수 있는 전체 숫자 자리 수 (1 ~ 38)
    • S : 소수점 이하 자리 수 (-84 ~ 127)
    • 정수/실수 관계 없이 사용하는 자료형이다


[ CHARACTER ]

  • 공통사항

    • [ ] : 생략가능
    • SIZE : 포함될 문자(열)의 크기
      => 숫자/영문자/특수문자 : 1글자당 1byte
      => 한글/한자 : 1글자당 3byte
    • 데이터는 ‘‘를 사용하여 표기하고 대·소문자를 구분
  • CHAR( SIZE [ ( byte | char ) ]

    • 지정한 크기보다 작은 문자(열)가 입력되면 남는 공간은 공백으로 채움
      => 고정된 길이를 가진다
    • 최대 2000byte 까지 저장가능
    • 주로 들어올 값의 글자수가 정해져 있을 경우 사용한다
      => ex) 성별 , 주민번호 등
    • 나중에 java 등과 연동했을 때 안에 공백이 포함되어있다면 뜻하지 않은 오류가 발생할 가능성이 높아서 아래 VARCHAR 활용을 추천한다


  • VARCHAR2( SIZE [ ( byte | char ) ]

    • 크기가 0인 값은 NULL로 인식
    • 공간대비 저장되는 글자가 크다면 오류발생
    • 최대길이 4000byte 까지 가능하다
    • VAR는 가변, 2는 2개를 의미한다
    • 주로 들어온 값의 글자수가 정해져 있지 않은경우 사용한다
    • 매개변수에 CHAR가 들어온 경우 byte단위로 데이터를 체크하지 않고 문자의 갯수로 체크한다
  • NVARCHAR

    • 문자열의 바이트가 아닌, 문자 갯수 자체를 길이로 취급한다
    • 유니코드를 지원하기 위한 자료형이다


[ DATE ]

  • DATE
    • 일자(세기/년/월/일) 및 시간(시/분/초) 정보를 관리한다
    • 기본적으로 화면에 년/월/일 정보만 표기한다
    • 날짜 연산 및 비교 가능하다
연산 결과 타입 설명
날짜 + 숫자 DATE 날짜에서 숫자만큼 며칠 후
날짜 - 숫자 DATE 날짜에서 숫자만큼 며칠 전
날짜 - 날짜 NUMBER 두 날짜의 일수 차
날짜 + 숫자/24 DATE 날짜 + 시간


SELECT문

  • 데이터를 조회한 결과를 Result Set이라고 하는데 SELECT구문에 의해 반환된 행들의 집합을 의미한다
  • Result Set은 0개 이상의 행이 포함될 수 있고 특정 기준에 의해 정렬 가능하다
  • 한 테이블의 특정 컬럼, 행, 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회가 가능하다


[ 표현법 ]

[ SELECT 구조  실행순서 ]
5. SELECT [DISTINCT] 조회하고자 하는 칼럼명 나열 / * / 리터럴 / 산술연산식 / 함수 / 별칭부여
1. FROM 조회하고자 하는 테이블명 / 인라인쿼리 / 가상테이블(DUAL)
2. WHERE 조건식 (그룹함수를 사용할  없음)
3. GROUP BY 그룹 기준에 해당하는 칼럼명 / 함수식
4. HAVING 그룹 함수식에 대한 조건식
6. ORDER BY 정렬기준용 컬럼명 / 별칭 / 컬럼의 순번 [ASC / DESC] [NULLS FIRST / NULLS LAST];
  • SELECT

    • 조회하고자 하는 컬럼명을 기술한다
    • 여러 컬럼을 조회하는경우 쉼표로 구분하며 전체 컬럼 조회는 쉼표 대신 * 기호를 사용한다
    • 조회 결과는 기술한 컬럼 명 순으로 나열된다
    • DISTINCT : 중복행을 제거하는 옵션
  • FROM

    • 조회 대상 컬럼이 포함된 테이블명을 기술한다
  • WHERE

    • 행을 선택하는 조건을 기술한다
    • 여러개의 제한 조건을 걸 수 있으며 각각 논리 연산자로 연결시킨다
    • 제한 조건을 만족시키는 행들만 Result Set에 포함된다
    • 조회하고자 하는 테이블에 특정 조건을 제시해서 조건을 만족하는 데이터만을 조회하고자 할때 사용한다
    • 그룹함수를 사용할 수 없다
  • GROUP BY

    • 그룹을 묶어줄 기준을 제시 할 수 있는 구문으로 그룹함수와 함께 쓰인다
    • 데이터들을 원하는 그룹으로 나눌 때 사용한다
    • 그룹함수는 단 한개의 결과값만 산출하기 때문에 그룹이 여러개일 경우 오류가 발생한다
      => 따라서 여러개의 결과값을 산출하기 위해 그룹함수가 적용될 그룹의 기준을 기술하여 사용하는 것
  • HAVING

    • GROUP BY절과 함께 쓰이며 그룹에 대한 조건을 제시하고자 할 때 사용된다
    • WHERE절은 SELECT에 대한 조건을 제시하고 HAVING절은 GROUP BY절에 대한 조건을 제시한다
    • 그룹 함수를 사용할 수 있다
  • ORDER BY

    • 특정 컬럼의 데이터를 중심으로 오름차순/내림차순 정렬을 시킨다
    • 표현법 : ORDER BY [칼럼명/별칭/컬럼순번] [ASC/DESC](생략가능) [NULLS FIRST/NULLS LAST](생략가능)
    • ASC : 오름차순 12345 (기본값)
    • DESC : 내림차순 54321 (최신순 정렬)
    • NULLS FIRST : null 값들을 가장 먼저 정렬
    • NULLS LAST : null 값들을 가장 뒤에 정렬
    구분 오름차순(ASC) 내림차순(DESC)
    숫자 작은 값부터 정렬 큰 값부터 정렬
    문자 사전 순서대로 정렬 사전 순서 반대로 정렬
    날짜 빠른 날짜 순서로 정렬 늦은 날짜 순서로 정렬
    NULL 가장 마지막에 나옴 가장 먼저 나옴
  • 실행순서

    • FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
      => SQL은 코드가 위에서부터 실행되지 않고 논리적인 흐름에 따라, 실행되는 순서가 섞여있으니 주의


[ 활용 ]

  • 컬럼 값 산술 연산

    SELECT EMP_NAME, SALARY * 12, (SALARY + (SALARY*BONUS)) * 12
    
    • 컬럼 값에 대해 산술 연산(+ - / *)을 기술하여 결과를 조회할 수 있다
    • 산술연산 과정에서 null값이 존재할 경우 산술 연산 결과마저도 null이 된다
  • 컬럼 별칭

    SELECT EMP_NAME AS 이름, SALARY*12 "연봉(원)"
    
    • 컬럼의 별칭을 지을 수 있다
    • 표현법 : 컬럼명 AS 별칭, 컬럼명 AS “별칭”, 컬럼명 별칭, 컬럼명 “별칭”
    • 위처럼 컬럼명 뒤에 기술하여 별칭을 짓는다
      => AS와 쌍따옴표는 생략 가능 (공백으로 구분) => 숫자/특수문자가 포함되는 경우에는 꼭 쌍따옴표를 사용해야 한다 => SQL에서 홀따옴표와 쌍따옴표는 기능이 다르니 주의할 것, 꼭 쌍따옴표로 표기해야 한다
      • (‘)홑따옴표 : 문자열을 감싸주는 기호
      • (“)쌍따옴표 : 컬럼명 등을 감싸주는 기호(식별자로 봄)
    • SELECT 절에서 부여한 별칭은 WHERE 절에서 사용할 수 없다 (WHERE 절부터 실행되기 때문)
  • 리터럴

    SELECT EMP_ID, SALARY, '원' AS 단위
    
    • 임의로 지정한 문자열(‘‘)을 SELECT절에 기술하면 실제 그 테이블에 존재하는 데이터처럼 활용및 조회가 가능하다
      => 문자나 날짜 리터럴은 ‘’ 기호를 사용한다
    • 리터럴은 Result Set의 모든 행에 동일한 내용(위에서 임의로 기술한 문자열 그대로)으로 반복 표시된다
  • DISTINCT

    SELECT DISTINCT JOB_CODE
    
    • 칼럼에 중복된 값을 딱 한번만 조회하고자 할 때 사용한다
    • 칼럼에 포함된 데이터 중 중복값을 제외하고 동일데이터는 1회만 표시한다
    • SELECT 절에 DISTINCT 구문은 1회만 기술 가능하다
      => 한번 불리면 불러온 칼럼들 모두를 한줄(튜블)로 취급해서 중복을 제거한다 => 하나의 칼럼에서만 중복을 제거하는 것이 아니라는 것을 주의
  • || 연결 연산자

    -- 컬럼과 컬럼 연결
    SELECT EMP_ID || EMP_NAME || SALARY
    -- 컬럼과 리터럴을 연결
    SELECT EMP_NAME || '의 월급은'  || SALARY || '원 입니다.'
    
    • 여러 컬럼을 하나의 컬럼인 것 처럼 연결 가능하다
    • 컬럼과 리터럴을 연결 할 수도 있다


연산자

[ 논리 연산자 ]

연산자 설명
AND 여러 조건이 동시에 TRUE일 경우에만 TRUE값 반환
OR 여러 조건들 중에 어느 하나의 조건만 TRUE이면 TRUE값 반환
NOT 조건에 대한 반대 값으로 반환(NULL 제외)


[ 비교연산자 ]

  • 연산자 종류
연산자 설명
= 같다
> , < 크다 / 작다
>= , =< 크거나 같다 / 작거나 같다
<> , != , ^= 같지 않다
BETWEEN AND 특정 범위에 포함되는지 비교
LIKE / NOT LIKE 문자 패턴 비교
IS NULL / IS NOT NULL NULL 여부 비교
IN / NOT IN 비교 값 목록에 포함/미포함 되는지 여부 비교
  • 연산자 우선순위
우선순위 연산자
0 ( )
1 산술 연산자
2 연결 연산자
3 비교 연산자
4 IS NULL , LIKE, IN
5 BETWEEN AND
6 논리 연산자 – NOT
7 논리 연산자 – AND
8 논리연산자 – OR
  • NOT은 자바에서의 ! 논리부정 연산자처럼 결과값을 뒤집는다
  • 표현식 사이의 관계를 비교하기 위해 사용한다
  • 비교결과는 논리결과 (TRUE/FALSE/NULL) 중 하나가 된다
  • 단 비교하는 두 컬럼 값/표현식은 서로 동일한 데이터 타입이어야 한다


BETWEEN AND
WHERE SALARY BETWEEN 3500000 AND 6000000;
WHERE SALARY NOT BETWEEN '90/01/01' AND '03/01/01';
  • 몇 이상 몇 이하인 범위에 대한 조건을 제시할 때 사용한다
  • BETWEEN으로 DATE형식 간에도 비교가 가능하다


LIKE
WHERE EMP_NAME LIKE '전%';
WHERE EMP_NAME LIKE '_지_';
WHERE EMAIL LIKE '__\_%' ESCAPE '\';
  • 표현법 : 컬럼명 LIKE '특정 패턴'
  • 비교하고자 하는 컬럼 값이 내가 지정한 특정 패턴에 만족될 경우 true를 리턴한다
  • 특정 패턴 부분에 %_를 와일드 카드로 사용한다

  • %

    • 0개 이상의 임의의 문자열을 의미한다
    • ‘문자%’ : 컬럼 값중에 ‘문자’로 시작하는 것을 조회
    • ‘%문자’ : 컬럼 값중에 ‘문자’로 나는 것을 조회
    • ‘%문자%’ :컬럼 값중에 ‘문자’가 포함되는 것을 조회
  • _

    • 문자 1개를 의미한다
    • ‘_문자’ : 컬럼 값중에 ‘문자’ 앞에 1글자가 존재하는 경우 조회
    • ‘__문자’ : 컬럼값중에 ‘문자’ 앞에 2글자가 존재하는 경우 조회
    • ‘문자_’ : 컬럼값중에 ‘문자’ 뒤에 1글자가 존재하는 경우 조회
    • 위와 같은 식으로 _ 를 앞뒤로 여러개 이어붙여 조건을 검사할 수 있다
  • ESCAPE OPTION

    • 표현법 : 컬럼명 LIKE '특정 패턴' ESCAPE '문자열'
    • 와일드 카드 문자와 패턴의 특수문자가 동일한 경우 어떤것을 패턴으로 결정하는지 구분하지 못하게 되는 것을 방지하고자 사용한다
    • ESCAPE ‘문자열’ -> ‘문자열’ 바로뒤에 있는 한글자는 와일드카드로 인식하지 않겠다는 뜻
    • ‘문자열’에는 사용하고 싶은 문자들을 숫자에 상관없이 자유롭게 지정 가능하다


IS NULL과 IS NOT NULL
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;
  • null 여부를 비교하는 연산자
  • IS NULL : 컬럼 값이 null인 경우 true를 반환
  • IS NOT NULL : 컬럼 값이 NULL 이 아닌 경우 true를 반환


IN
WHERE DEPT_CODE IN ('D6', 'D8', 'D5');
  • 비교대상 칼럼 값에 내가 제시한 목록 중 일치하는 값이 있는지 판단한다
  • 표현법 : 컬럼명 IN(값, 값, 값, 값, ...)
  • = 과 AND를 써도 동일한 조건검사를 할 수 있지만 그 가짓수가 많을때 IN을 쓰면 코드가 훨씬 간결해진다

댓글남기기