본문 바로가기

Oracle 기본 개념

Oracle이 Miracle이 되는 그 날까지 - SQL문

728x90

 

 

 

SQL문이란?

데이터베이스로부터 데이터
조회, 삭제, 수정, 변경하는 등의 작업
수행할 때 사용하는 언어

 

 

 

 

 

관계형 데이터베이스의 기본구조

 

 

 

 

일반적 개념에 따라 행과 열로 표현하고자 한다 (사실 하라는 대로 하는 거지만^^;;)

 

 

 

 

 

 

관계형 데이터베이스의 키

 

 

 
  1. 후보키 (Cadidate key)

     행 (튜플)을 식별할 수 있는 키
     기본키가 될 수 있는 후보를 후보키

  2. 기본키 (Primary key)
    후보키 중에서 선택한 주키
    행 (튜플)을 유일하게 식별할 수 있는 키
    not null, 중복 x

  3. 대체키 (Alternate key) : 후보키 - 기본키
     후보키가 둘 이상일 대 기본키를 제외한 나머지 후보키

  4. 슈퍼키 (Super key)
     테이블 릴레이션 내에 있는 속성들의 집합으로 구성된 키 (2개로 이루어진 키)

  5. 외래키 (Foreign key)
     참조되는 테이블 릴레이션의 기본키와 대응되어 참조관계를 표현하는 키
     외래키로 지정되면 참조 테이블의 기본키에 없는 값은 입력할 수 없음

 

 

 

 

 

 

 

 

위의 두 개의 데이터집합을 통해 관계형 데이터베이스의 키에 대해 알아보고자 한다

 

일반적으로 성명은 동명이인이 있을 수 있기 때문에 고유하다고 할 수 없고

학번이나 주민번호 같은 경우는 사람을 구분하기 위해 인위적으로 만든 숫자이기 때문에

데이터를 구분할 수 있는 고유한 키가 될 수 있다(즉 학번과 주민번호는 후보키가 된다)

 

 학번과 주민번호 어떤 것이든 기본키로 충분한 자격을 갖추고 있지만

만약 기본키학번이라고 하면 주민번호 대체키가 된다

( 대체키 = 후보키(학번, 주민번호) - 기본키(학번) )

 

학생 데이터집합에서 기본키였던 학번이 수강 데이터 집합에 있음으로써

학생 데이터집합의 데이터를 참조할 수 있게끔 해주는 역할로 이를 외래키라고 한다

이는 기본키가 있던 데이터집합을 기준으로 하기 때문에 기본키에 없는 값을 입력받는 것은 불가능하다

 

수강 데이터집합의 데이터를 구별할 수 있게 해주는 키는 학번이나 과목명 단독으로는 불가능하고 

두 가지를 동시에 키로 잡아야 중복이 되지 않고 고유한 데이터를 추출할 수 있다

 이는 하나의 키가 아닌 두 가지 속성들의 집합으로 구성된 키슈퍼키라고 하고 학번과 과목명의 집합이 이에 해당한다

(한 학생이 두 가지의 과목을 들을 수도 있고, 한 과목을 여러 학생이 신청할 수 있기 때문)

 

 

 

 

 

 


SQL의 종류 중 하나인 DML

DML에는 무엇이 있을까?

    SELECT : 데이터 검색(조회)
INSERT : 새로운 행 입력
UPDATE : 기존의 행 변경
DELETE : 기존의 행 제거

 

 

 

 

 

SELECT 문장

 

 

 

 

 

    SELECT : 하나 이상의 열을 나열
    DISTINCT : 중복을 제거
    * : 모든 열을 선택
    column : 명명된 열을 선택
    AS : 열 별칭을 지정
    alias : 선택된 열을 다른 이름으로 변경
    FROM table : 열을 포함하는 테이블을 명시

 

 

 

 

 

 

SQL문장

 

 

   -  대 소문자를 구별하지 않는다
   -  한 줄 이상일 수 있다
   -  키워드는 단축하거나 줄을 나누어 쓸 수 없다
   -  절은 대개 줄을 나누어서 쓴다
   -  탭과 들여쓰기(indent)는 읽기 쉽게 하기 위해 사용한다

 

 

 

 

 

 

employees 테이블에서

first_name, last_name, salary column(열)을 선택해서 출력

 

 

 

 

 

 

 

 

 

departments 테이블에서 모든 column(열) 출력

 

 

 

 

 

 

 

departments 테이블에서 department_name, location_id column(열) 선택해서 출력

(열은 선택한 순서대로 출력된다! 다음의 예시를 통해 확인해볼 수 있다)

 

 

 

 

 

 

 

 

 

 

위의 예시와 같은 열을 선택했지만

순서를 다르게 했더니 출력값이 다르다

(선입선출)

 

 

 

 

 


 

 

 

출력은 중구난방식으로 되는 걸까?

규칙이 있다구! 함 볼래?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       날짜와 문자 데이터는 왼쪽 정렬
       숫자 데이터는 오른쪽 정렬
       디폴트 열대문자로 출력

 

 

 

 

 

 

 

  • 연산자 우선순위

 

    곱하기와 나누기는 더하기와 빼기보다 우선순위가 높다
    같은 우선순위의 연산자는 좌측에서 우측으로 계산된다
    괄호는 강제로 계산의 우선순위를 바꾸거나 문장을 명료하게 하기 위해 사용된다

 

 

 

     

연산은 숫자 데이터로 이루어진 열만 가능하고

salary + salary * 0.1의 경우 곱하기 먼저 연산이 되고

그 다음으로 더하기가 연산이 된다

 

 

 

 

 

 

 

  • Null의 정의

 

      Null은 이용할 수 없거나, 지정되지 않았거나, 알 수 없거나 또는 적용할 수 없는 값이다
     ( Null은 숫자 0 이나 공백과는 다름 )

 

 

 

 

 

 

 

  • alias(as) 정의

     

      열 헤딩 이름을 변경한다(계산할 때에 유용)
      1) 열 이름과 별칭 사이에 키워드 AS를 넣기도 한다
      2) 공백이나 특수문자 또는 대/소문자가 있으며 이중 인용부호 (“") 가 필요하다

 

 

 

 

 

 

 

 

 

 

 

 

literal 문자 스트링과 연결 연산자

 

 

     SELECT절에 포함된 리터럴은 문자 표현식 또는 숫자이다


     날짜와 문자 리터럴 값단일 인용부호 (' ')안에 있어야 한다
     숫자 리터럴단일 인용부호를 사용하지 않는다
     각각의 문자스트링은 리턴된 각 행에 대한 결과이다


     || 를 이용하면 값을 연결해준다

 

 

 

 

( ' )을 쓰고 싶을 때는 중복으로 쓰면 된다

 

 

 

 

 

 

  • 중복 행과 DISTINCT

 

     디폴트 출력은 중복되는 행을 포함하는 모든 행이다
      SELECT 절에서 DISTINCT 키워드를 사용하여 중복되는 행을 제거한다

 

 

 

distinct 사용하면 중복되는 값을 제거하고 대표적인 값만 출력

 

 

 

 

 

 

 

  • ROWNUM, ROWID

 

       ROWID : 데이터베이스에서 행의 주소를 반환합니다
       ROWNUM : 쿼리에 의해 반환되는 행의 번호를 출력합니다 

 

 

 

 

 

 

선택된 행 제한

 

 

  • WHERE

       WHERE절을 사용하여 리턴되는 행을 제한합니다 (FROM 절 다음에 위치)
       WHERE절은 열 이름, 비교 연산자, 그리고 비교할 열 이름 또는 값의 목록으로 구성된다(별칭은 사용할 수 없음)

     

 

 

   

                                      WHERE : 조건을 만족하는 행으로 질의를 제한

                                      condition(s) : 열 이름, 표현식, 상수 그리고 비교 연산자로 구성

 

 

 

 

 

 

 

다음 예제를 통해 확인해보자

 

 

 

 

 

 

 

 

  • 문자 스트링과 날짜

 

 

     문자 스트링과 날짜 값은 단일 인용부호 ('')로 둘러싸여 있다
     문자 값은 대/소문자를 구분하고, 날짜 값은 날짜 형식을 구분한다
     디폴트 날짜 형식은 'DD - MON - YY' 이다

 

 

 


 

오라클은 날짜를 세기, 년, 월, 일, 시간, 분 그리고 초로 저장

 (디폴트 날짜 형식은 DD MON YY)

위 결과에서 HIRE_DATE의 표시 형식이 04/01/30인 이유는

 SQL Developer의 환경설정

  --> 데이터베이스 

  --> NLS

  --> 날짜 형식 "RR/MM/DD"

 

 

 

 

 

 

 

  • 비교 연산자

 

 

 

 

 

 

 

 

다른 연산자들은 자바에서 본 것과 동일하지만

'같지 않다'를 나타내는 연산자는 다르기 때문에 주의하자!

 

 

 

 

   1) 숫자 데이터를 가진 column - 대소비교 가능

 

 

 2) 문자 데이터를 가진 column  

 

 

3) 날짜 데이터를 가진 column

 

 

 

 

  • between 연산자

      값의 범위에 해당하는 행을 출력하기 위해 BETWEEN 연산자를 사용
      하한 값과 상한 값을 모두 포함한다(단, 하한 값을 먼저 명시)

 

 

 

salary 열의 데이터에서 값이

10000이상 ~ 12000이하인 데이터 추출

 

 

 

 

 

 

 

 

  • IN 연산자

       원하는 데이터 몇 개를 추출해서 비교할 때 사용하기 좋다

 

 

 

 

     manager_id가 101, 102, 103인 경우의 데이터 추출         job_id가 'IT_PROG', 'FI_MGR', 'AD_VP'인 경우의 데이터 추출

 

 

 

 

 

 

 

 

  • LIKE 연산자

 

     검색 스트링 값에 대한 와일드카드 검색을 위해서 LIKE 연산자를 사용한다
     (검색 조건은 리터럴 문자나 숫자를 포함 가능)
   

     %(percent)문자가 없거나 또는 하나 이상을 나타낸다
     _(under score)는 하나의 문자(위치)를 나타낸다

 

 

 

 

 

 

 

 [ LIKE 연산자의 활용 ]

 

 

    연산자는 BETWEEN 비교에 대한 단축키로 사용될 수 있다 

   

    다음 예는, 2003년 1월 1일과 12월 31일 사이에 입사한 모든 사원의 이름과 입사일을 출력

 

 

 

 

② “%” 와 “_” 기호는 리터럴 문자의 결합하여 사용될 수 있다

 

   다음의 예는 이메일의 두 번째 문자가 'A'인 모든 사원의 이름과 이메일을 출력 

 

 

 

 

 

 

 

다음의 다채로운 예시들로 다시 확인해보자  ▼

 

 

 

1) 문자열

 

 

     

      ① 'IT'를 포함한 데이터를 출력하는데, 'IT'가 맨 앞에 오는 단어여야 한다

      ② 'PROG'를 포함한 데이터를 출력하는데, 'PROG'가 맨 뒤에 오는 단어여야 한다

      ③ 'IT'를 포함한 데이터를 출력하는데 'IT' 앞, 뒤로 무엇이 붙든 상관 없다(즉 IT가 포함만 되어 있으면 됨)

 

 

 위의 3가지 SQL문은 모두 같은 데이터 집합을 출력한다

 

 

 

2) 숫자

 

 

     

 

     ① '03'으로 시작하는 hire_date 데이터 추출

  

 

 

     

       ② '15'로 끝나는 hire_date 데이터 추출

 

 

 

 

        ③ '05'을 년도를 표현하고자 하는 게 아니라 월을 표현하기 위한 것이기 때문에

              (_)를 사용해 위치 표시를 하고 MM/DD만 추출

 

 

 

 

 

  • IS NULL 연산자 - NULL값을 테스트

       비교연산자인 '='로는 테스트할 수 없기 때문에 새로운 연산자가 필요한 것이다

 

 

                                                  manager_id IS NULL : manager_id의 값 중에 null값만을 추출

 

 

 

             

                             commission_pct IS NOT NULL : commission_pct의 값 중에 null값이 아닌 값(데이터)을 추출

 

 

 

 

 

 

 

  • 논리연산자

     

       AND양쪽의 조건이 참이어야 TRUE를 리턴
       OR한쪽의 조건이 참이면 TRUE를 리턴
       NOT 연산자는 뒤의 조건에 반대되는 결과를 리턴

 

      

 

 

 

    ① and 연산자

 

 

 

job_id가 'IT_PROG'이면서 salary가 5000이상인 데이터를 추출 (둘 다 만족해야 함)

 

 

 

 

    ② or 연산자

 

job_id가 'IT_PROG'이거나 salary가 5000이상인 데이터를 추출 (둘 중에 하나라도 만족하면 모두 추출)

 

 

 

 

 

 

★  논리 연산자의 우선순위는 다른 모든 비교연산자에 비해 낮다 ( OR 연산자 < AND 연산자 )

 

 

 

 

 

and와 or 연산자 중에서 and 연산자가 더 우선순위가 높기 때문에 

and 연산자로 연결된 job_id가 'FI_MGR'인 조건과

salary가 6000 이상인 조건의 데이터를 충족시키고 

 그 다음으로 job_id가 'IT_PROG'인 데이터가 처리된다

 

 

 

 

위의 예시처럼 and가 or보다 우선순위가 높기 때문에

or로 연결된 조건을 먼저 연산하고 싶다면 괄호로 묶어서 처리해야 한다

 (괄호는 항상 먼저 연산)

 

 

 

 

 

데이터 정렬

 

 

질의에 의해 검색되는 행을 정렬할 수 있다

 

 

 

 

 

 

 

 

 

 

How?

ORDER BY은 SELECT 문장의 가장 뒤에 온다(제발 자꾸 이상한 데에다가 쓰지 말자^^)

 

  ASC : 오름차순으로 정렬(기본값)
  DESC : 내림차순으로 정렬

 

 

 

 

 

다음 예시를 통해 확인해보자  ▼

 

 

 

 오름차순(ASC)은 기본값으로 되어 있기 때문에 DESC처럼 직접 기술하지 않아도 바로 적용된다

 

 

 

 

 

 

 

 

하나의 컬럼이 아닌 여러 컬럼으로 정렬할 수 있다 

   

위의 경우 department_id을 기준으로 내림차순을 하고 이를 기준으로 manager_id를 오름차순을 한다

    (즉 department_id가 110인 경우에 해당하는  manager_id 101, 205를 오름차순으로 정렬)

 

 

 

 

 

ORDER BY절에 열 별칭을 사용할 수 있다 (WHERE절이나 FROM절은 사용 불가)

 

 

 

 

 


 

 

<  연습문제  >

 

 

 

 

'Oracle 기본 개념' 카테고리의 다른 글

Oracle - 트랜잭션이란 무엇인가  (0) 2022.11.21
Oracle - DML  (0) 2022.11.20
Oracle - 서브쿼리  (0) 2022.11.15
Oracle 함수의 모든 것 - 그룹함수  (0) 2022.11.13
Oracle 함수의 모든 것 - 단일 행 함수  (0) 2022.11.09