아이티윌_데이터 분석 55기/강의내용 필기_SQL

#1) 1일차_오라클과 오렌지 설치하기, SELECT문

ecosso 2026. 3. 8. 17:46

 개강 첫 날이라 오전은 대부분 오리엔테이션으로 진행되었다.

 

 그리고 본 강의에서 앞으로 사용할 오라클, 오렌지 설치 및 간단한 SELECT문에 대해 배웠다. SQL이라고 하면 구인공고에서 필수로 요구하는 기술 정도로만 알고 있었을 뿐이지 어떻게, 왜 사용해야하는지 알지 못하는 상황이라 처음 접하는 분야여서 긴장하고 있었는데 강사님이 기본 개념부터 차근차근 친절하게 알려주셔서 잘 따라올 수 있었다.

 

 필기한 내용을 다시 정리하는 과정에서 헷갈리거나 궁금했었던 부분들이 있었다는 것을 깨닫게 되었고, 그 부분들은 책을 찾아보고 검색하면서 조금 더 내용을 보완했다. 이래서 조금씩이라도 좋으니 매일 공부한 것들을 다시 정리해 포스팅하라 하신 것이구나 싶어졌다.

 

대략적인 목차는 다음과 같다. :

 

01. 설치 및 기본 구성

 -01 DB / DBMS / IDE / SQL

 -02 환경세팅 순서

 -03 ORACLE 설치

 -04 Orange for ORACLE 설치

 -05 데이터베이스 접속

 -06 Orange for ORACLE 단축키

 

02. SELECT문

 -01 SELECT문의 구조와 처리 순서

 -02 SELECT문 실습


 

01. 설치 및 기본 구성

 -01 DB / DBMS / SQL / IDE

  > 데이터(Data) : 현실 세계에서 관찰하거나 측정한 가공되지 않은 '사실' 또는 '값', 문자, 숫자, 기호 등으로 표현될 수 있음

     정형데이터 : 형태가 정해져 있으며 표의 형태로 기록 가능한 데이터 (ex : 문자, 숫자 등)

     반정형데이터 : 형태가 정해져 있지 않지만 규칙이 존재함 (ex : html 소스, 로그 등)

     비정형데이터 : 형태가 정해져 있지 않음 (ex : 텍스트, 음성 등)

 

  > 데이터베이스(Database) : 데이터를 체계적으로 저장한 공간, 데이터 간의 관계를 정의하고 일정한 규칙에 따라 관리하여 데이터의 의미를 명확하게 만듦

 

  > 데이터베이스 관리 시스템(Database Management system, DBMS) : 데이터베이스 관리를 도와주는 프로그램

     1) RDBMS - 정형데이터 저장 및 관리 (ex : DB2, ORACLE, SQLserver, MySQL, Postgresql 등)

     2) NoSQL - 반정형, 비정형데이터 저장 및 관리 (ex : MongoDB 등)

 

  > RDBMS (Relational DBMS) : 관계형 데이터 모델을 사용하는 DBMS, 표와 표 사이의 관계를 명확하게 정의하고 관리

     이 부분이 다소 헷갈렸는데 2일차 수업을 듣고나니 이해가 갔다.

     예를 들어 1번 테이블에 '전공 코드' 열이 있고 값이 각 전공의 고유 번호인 01, 02, 03으로 있다면, 전공에 대한 2번 테이블은 전공 코드, 전공 열에 각자 01 - 수학과, 02 - 생물학과같은 식으로 나누어져 있어 데이터가 지나치게 중복되는 것을 막아준다.

     굳이 1번 테이블에서까지 수학과, 통계학과, 생물학과 등 같은 글자를 수없이 반복해 기록되어 있을 필요가 없다는 것이다.

 

  > SQL(Structured Query Language) : 관계형 데이터베이스와 소통하기 위해 만들어진 표준 언어, 저장소(DB)에서 데이터를 불러오고 기본적인 처리를 수행

     1) DDL (Data Definition Language) : 데이터 정의

   객체(만들 수 있는 대상) 생성(CREATE), 구조 수정(ALTER), 테이블 구조와 데이터 모두 삭제(DROP), 테이블 구조는 유지하지만 데이터만 전체 삭제(TRUNCATE), 

   Auto Commit을 지원하며, DDL에 포함되는 명령어를 실행할 시 COMMIT하지 않아도 자동으로 반영된다.

따라서 COMMIT 이전으로 돌아갈 수 없다.

 

     2) DML (Data Manipulation Language) : 데이터 수정

   객체 구조는 변경하지 않고 데이터만 변경(입력, 수정, 삭제).

   입력(INSERT), 수정(UPDATE), 삭제(DELETE), 병합(MERGE).

   MERGE는 오래된 테이블을 새 참조 테이블처럼 만들어라 -> INSERT, UPDATE, DELETE를 동시에 진행하는 느낌

   COMMIT 혹은 ROLLBACK 실행이 반드시 필요하다. 먼저 수정을 시작한 사람이 COMMIT/ROLLBACK을 해주지 않으면 다음 수정자가 작업을 할 수 없다.

   

     3) DCL (Data Control Language) : 권한 부여 및 회수

   권한 부여(GRANT), 권한 회수(REVOKE)

 

     4) TCL (Transaction Control Language)

   저장(COMMIT), 취소(ROLLBACK)

 

     5) DQL (Data Query Language) *비공식적 언어

   조회(SELECT)

 

 * 삭제(DROP, TRUNCATE, DELETE)에 대해서

  DROP : 테이블 전체 삭제, 구조 모두를 삭제

  TRUNCATE : 데이터 전체 삭제, 일부 삭제 불가

  DELETE : 행 단위의 삭제 (ex : 특정 조건을 만족하는 데이터만 삭제)

 

  조건에 상관없이 빠르게 삭제를 원한다면 TRUNCATE, 조금 느려도 조건을 만족한 데이터만 삭제해야 한다면 DELETE를 사용

  TRUNCATE는 복구가 되지 않으며, DELETE는 COMMIT만 하지 않았다면 이전으로 돌아갈 수 있다. 

 

  > IDE(Integrated Development Environment) : 개발에 필요한 여러 도구를 하나로 모아놓은 프로그램, 코드를 작성하고, 실행하고, 결과를 확인하는 작업을 한 곳에서 할 수 있게 해주는 통합 작업 환경

 

  => 이 강의에서는 ORACLE 11g, Orange for ORACLE을  사용하기로 했다.


 -02 환경세팅 순서

  1) ORACLE (RDBMS) 설치

  2) Orange for ORACLE (IDE) 설치

  3) ORANGE 접속

  4) 테스트 데이터 생성

 


 -03 ORACLE 설치

  사진이 많아 접은글 안에 집어넣었다.

더보기

  1) ORACLE 설치파일은 반드시 하나의 경로에 압축을 해제

 

  2) My Oracle Support를 통해 보안 갱신 수신(W)은 체크 해제 후 다음 버튼 클릭, 전자 메일 주소가 지정되지 않았다는 팝업이 떠도 예 버튼 클릭

 

  3) 설치 옵션 : 데이터베이스 생성 및 구성(C) 설정으로 설치 진행

 

  4) 데스크톱 클래스(D) 설정 후 설치 진행

 

  5) 단일 인스턴스 데이터베이스 설치(S) 설정 후 설치 진행

     이는 Grid 설치옵션 시 단일 인스턴스 데이터베이스인지, Real Application Clusters(RAC) 데이터베이스인지 선택할 수 있다.

     DB가 존재하고 그것을 다루는 서버(instance)가 1개라면 단일 인스턴스, 하나의 DB를 다루는 서버가 여러개라면 RAC라고 한다.

     그리고 이런 RAC를 클러스터(Cluster)라고 부른다.

 

     RAC는 카드, 증권사와 같은 경우 많이 이용하며 어떠한 문제가 있어 서버가 제 기능을 수행하지 못하더라도 DB 조회 등이 기능할 수 있도록 해준다.

  6) 설치 유형은 고급설치(A)로 설정 후 설치 진행

 

  7) 언어는 기본적으로 영어, 한국어가 선택되어 있으나 다른 언어를 원한다면 추가해준 후 설치 진행

 

  8) 데이터베이스 버전은 Enterprise Edition을 선택하되, 우측 하단의 옵션 선택 버튼을 눌러 '모두 선택 해제' 후 설치 진행

     (이번 강의에서 사용하지 않을 기능을 제외해서 설치 용량을 줄인다)

 

  9) 경로 확인 후 설치 진행

     설치 위치는 기본적으로 설정되나, 만약 이후 설치에 문제가 생기면 같은 경로에 재설치가 불가능하다. 이럴 때는 dbhom_뒤의 숫자를 바꾸어 재설치를 진행하면 된다고 한다

 

  10) 일반용/트랙잭션 처리(G) 설정 후 설치 진행

     트랜젝션은 데이터베이스에서 하나의 작업 단위를 의미하며, 하나의 혹은 일련의 연속적인 업무를 수행할 시 (계좌이체, 물품 주문 등) 주로 사용한다. 예를 들어 계좌이체 중 송금, 본인인증 등 하나가 실패하면 계좌이체 전체 과정이 모두 실패로 돌아가는 것을 생각하면 된다. 주로 고객 친화적 업무에서 볼 수 있으며, 실시간으로 짧게 처리되는 단건의 업무에 사용된다.

     데이터 웨어하우징은 기업 내부에서 이용하며 대용량 데이터의 처리 및 분석에 이용된다.

 

  11) 데이터베이스 이름은 'orci'로 설정 후 설치 진행

 

  12) '샘플 스키마' 탭에서 샘플 스키마로 데이터베이스 생성(R) 체크 후 설치 진행

 

  13) 이후로는 특별히 설정할 사항이 없다. 다음과 같은 옵션에 체크가 되어 있는지 확인 후 설치를 진행

 

  14) '모든 계정에 동일한 비밀번호 사용' 체크 후 사용하고자 하는 비밀번호를 입력 후 설치 진행

     이 비밀번호를 잃어버리거나 오타가 들어가있으면 이후에 찾기가 어렵다고 한다. caps lock 키가 켜져있지는 않은지 확인하는 것이 좋다.

     금번 강의에서는 모두가 같은 쉬운 비밀번호를 사용하는 상황이라 설치를 진행하려하면 비밀번호가 Oracle 권장 표준을 따르지 않아 그대로 비밀번호를 설정해도 괜찮냐는 팝업이 뜨는데, 그냥 설치를 진행하면 된다.

 

  15) 데이터베이스 생성 후 우측 하단의 '비밀번호 관리' 버튼 클릭

 

  16) SCOTT, HR의 계정 잠금 해제 및 비밀번호 입력, 이후 확인을 눌러 설치 진행

 

  17) 설치 완료!

     가끔 설치 과정에서 오류가 생기면 설치 진행률 70% 선에서 오류가 발생한다고 하는데, 그렇게 되면 재설치를 진행해야 한다고 한다.

     압축을 동일 경로에 해제하지 않았거나, 뭔가 다른 문제가 있으면 발생하는 오류라고 하는데 나는 학원과 집 모두 문제가 발생하지 않아 어떤 과정에서 오류가 일어나는지는 확인하기 어려웠다.

     .NET 관련 팝업이 뜨면 설치를 진행해주면 되고, 윈도우 보안 관련으로 팝업이 몇 번 뜨는데 그것도 그냥 무시하고 설치 진행을 눌러주면 된다.


 -04 Orange for ORACLE 설치

   Orange for ORACLE의 주의점은 DBMS를 무엇을 사용하느냐에 따라 설치파일이 다르기 때문에, Orange for 뒤에 따라오는 이름이 내가 사용하고자하는 DBMS과 일치하는지 정도만 확인하면 된다.

   이 설치는 특별히 무언가 설정해야하는 일이 없기 때문에 평범하게 설치를 진행해주면 된다.


 -05 데이터베이스 접속

  1) 데이터베이스가 설치된 서버에 직접 접속

   윈도우 아이콘 옆의 실행창에 'cmd'를 입력하여 명령 프롬포트를 실행해준다.

 

   이후 띄어쓰기에 유의하며 'sqlplus scott/oracle'을 입력 후 엔터를 누르면 오라클에 접속되었다는 메시지가 출력되고, 에러 없이 다음과 같은 메시지가 나오면 정상적으로 구동하고 있음을 확인할 수 있다.

 

  이제 select * from emp; 를 입력하여 엔터를 누르면 다음과 같이 scott이라는 사용자가 emp라는 테이블에서 조회 가능한 정보가 출력되는데, 한 눈에 정보를 확인하기에는 어려움이 있어보인다.

  그래서 테이블을 조회하거나 편집하기에 어려움이 있어 Orange for ORACLE과 같은 IDE를 사용한다.

 

  2) IDE를 통한 데이터베이스 접속

   아까 설치를 진행한 Orange for ORACLE을 실행한다. 

 

  Orange를 실행하면 다음과 같은 창이 보이는데, 여기서 TNS Name과 Username, Password를 입력할 예정이다.

 

  TNS Name는 ORACLE을 설치하며 전역 데이터베이스 이름을 ORCL로 설정해주었으니 그대로 선택해주면 된다. 또한 Username/Password는 잠금해제 및 비밀번호 설정을 해주었던 SCOTT, HR 중 우선 SCOTT, 설정한 비밀번호를 입력 후 Connet 버튼을 누른다.

 

  이후 회색의 화면만이 보일텐데, 우선 좌측 상단에 ORCL 데이터베이스의 SCOTT 계정으로 접속이 되었음을 확인할 수 있다. 그리고 1 - SCOTT@ORCL 중 1 아래의 작은 SQL TOOL 버튼을 눌러 실습할 준비를 완료하면 된다.


 -06 Orange for ORACLE 단축키

ctrl + enter : 커서가 위치한 SQL문 실행

F5 : SQL문 전체 실행 

ctrl +  l : 부분 실행 

 

ctrl +  - : 주석 처리

ctrl + shift + - : 주석 해제

 

ctrl +  u : 소문자 변환

ctrl +  shift + u : 대문자 변환

 

ctrl + n : 새 접속

ctrl + shift +  \f : 포맷 정렬

 

ctrl + t : 새 탭 열기

ctrl + o : 파일 불러오기


02. SELECT문

 -01 SELECT문의 구조와 처리 순서

  SELECT문은 하나 이상의 테이블의 데이터를 조회하기 위한 SQL문장이며, 6개의 절로 구성된다.

  또한 SELECT는 생략할 수 없다.

  SQL 쿼리 작성 시 다음과 같은 순서로 작성하며 각 절의 역할은 다음과 같다. :

 

  SELECT       최종 출력 형태 정의(컬럼 선택, 데이터 변형, 계산 등)

  FROM          데이터가 저장된 출처(테이블) 명시

  WHERE       필터링(원하는 행 선택)

  GROUP BY  그룹 연산(성별, 성적 평균 등)

  HAVING       그룹 선택

  ORDER BY  정렬

 

  그러나 처리 순서는 다음과 같다. : FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY


 -02 SELECT문 실습

  1) 기본 조회

  우선 테이블이 어떻게 구성되어 있는지 확인하기 위하여 전체 컬럼을 조회한다.

 

  SELECT *

     FROM emp; 

 

  다음과 같은 구성이며, * 는 모든 컬럼(열)을 조회하는 것이며, from 뒤에는 원하는 테이블명을 입력해주면 된다. 세미콜론으로 문장을 종료한다. emp 테이블로 실습할 예정이므로 나는 저 쿼리를 그대로 실행하였으며 다음과 같은 테이블을 확인할 수 있었다.

 

  emp 테이블은 EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO 열로 구성되어 있음을 확인할 수 있다. 이제 emp 테이블의 구성을 확인하였으니 원하는 열만 조회할 수 있다. * 대신 원하는 열의 이름을 입력하면 되며, EMPNO, ENAME, SAL, DEPTNO만을 조회하겠다.

 

SELECT EMPNO, ENAME, SAL, DEPTNO
  FROM EMP;

 

 

 원하는 열만 조회되었음을 확인할 수 있다.

 또한 표현식(연산 혹은 함수)를 전달할 수도 있으며, 급여에 해당되는 SAL열에 1.1을 곱하여 10% 인상된 급여를 확인하되, 사번, 이름, 인상된 급여, 부서번호를 조회하겠다.

 

SELECT EMPNO, ENAME, SAL * 1.1, DEPTNO
  FROM EMP;

 

 

  인상된 급여를 확인할 수 있다.


 

  2) 컬럼 별칭(alias) 지정

  그러나 SAL*1.1가 무엇을 의미하는지, DEPNO는 또 무엇인지 한 눈에 알아보기가 쉽지 않다. 그래서 컬럼 별칭(alias)을 지정해주기로 한다. 컬럼 별칭은 임시 컬럼명이며 데이터 원본 자체가 변경되지는 않는다. 조회시에만 내가 원하는 명칭으로 확인할 수 있게 보여주는 것이다.

  '열의 이름 as 별칭' 형태로 지정 가능하며, as는 생략할 수 있다. 또한 SELECT문의 처리 순서 중 SELECT문 다음으로 처리되는 ORDER BY절에서만 해당 명칭을 사용할 수 있다. SELECT 이전까지 SAL이라는 명칭을 사용하다 SELECT에서 'SAL은 급여이다.' 라고 지정해주었는데, SELECT 전 단계에서 급여라는 명칭을 알 수 있지 않기 때문이다.

 

  또한 컬럼 별칭에는 단지 몇 가지의 규칙이 존재한다. :

   1) 숫자로 시작할 수 없으며, 문자로 시작한 경우 중간에 포함이 가능

   2) 특수기호 포함 불가(_, #, &는 제외)

   3) 공백 포함 불가

 

  단지 이 모든 별칭에 대한 규칙을 무시하고 내가 원하는 형태로 컬럼 별칭을 지정하고 싶다면, " " 큰따옴표 안에 원하는 별칭을 넣어 지정하면 된다.

  EMPNO를 사번, ENAME을 사원명, SAL*1.1을 10% 인상된 급여, DEPNO를 부서번호로 지정해서 다시 조회해보겠다.

 

SELECT EMPNO AS 사번, ENAME AS 사원명,  SAL * 1.1 "10% 인상된 급여", DEPTNO 부서번호
 FROM EMP;

 

 

  이전보다 훨씬 더 알아보기 편해졌다. 또한 10% 인상된 급여 역시 숫자가 먼저 나오는 별칭으로 지정된 것을 확인할 수 있다.


 

  3) DISTINCT를 이용한 중복행 제거

 

  엑셀의 중복된 값 제거와 같은 기능이 있다. DISTINCT를 이용하여 내가 조회하고자하는 열이 어떠한 값으로 구성되어 있는지 한 눈에 확인할 수 있다. 만약 모든 값들이 전부 다른 형태라면 굳이 이용할 필요는 없겠지만, 부서번호가 정해져있을 때 이 테이블에는 몇 개의 부서가 존재하는지, 번호는 어떻게 구성되어 있는지 확인할 때 사용할 수 있다.

  DISTINCT는 중복되는 행을 제거 후 출력해주며, SELECT 절 바로 뒤에 단 한 번만 사용 가능하다. 우선 부서번호인 DEPTNO의 구성을 확인해보겠다.

 

SELECT DISTINCT DEPTNO
  FROM EMP;

 

 

  emp 테이블의 부서번호는 10, 20, 30으로 총 3개의 부서에 대한 정보가 존재함을 확인할 수 있다.

  또한 각 부서별로 직업이 어떻게 나뉘어져 있는지도 확인할 수 있다. 

 

SELECT DISTINCT DEPTNO, JOB
  FROM EMP;

 

 

  각 부서별 직원들이 어떤 직업을 가지고 있는지 알 수 있다. 


 

  4) 연결 연산자(||) 사용

 

  원하는 문자 혹은 열의 값들을 합해서 조회할 수도 있다. 더미테이블(가상 테이블)을 이용하여 예를 들어서 다음과 같은 쿼리를 입력하면, AB 열과 CD 의 값을 가진 테이블이 다음과 같이 생성된다.

 

SELECT 'AB', 'CD'
  FROM DUAL;

 

 

  그러나 AB, CD를 원하는 것이 아니라 ABCD라는 값을 원한다면 다음과 같이 연결 연산자를 사용하면 된다.

 

SELECT ENAME||'_'||DEPTNO 
  FROM EMP;

 

 

  그렇다면 emp 테이블에서 이름_부서번호의 형태로 조회를 하려면 어떻게 하면 될까? 다음과 같이 중간에 ' ' 작은 따옴표를 사용하며 _ 라는 문자를 지정해주고, 사원명과 부서번호를 뜻하는 값을 원하는 순서에 맞추어 작성하면 된다.

 

SELECT ENAME||'_'||DEPTNO 
  FROM EMP;

 

 

  SMITH라는 사원은 20번 부서, MARTIN은 30번 부서... 등 원하는 값이 출력된 것을 확인할 수 있다.


 

  4) DESC

 

 그렇다면 테이블 안에서 각 열이 어떤 값을 가지고 어떻게 구성되어 있는지 DESC를 사용해 알 수 있다. 열 이름, 배치 순서, 각 열별 데이터 타입, NULL 허용 여부 등을 확인할 수 있다. emp 테이블의 레이아웃을 확인해보겠다.

 

DESC EMP;

 

 

  EMPNO는 사번을 의미하는 열로 모두에게 주어지는 번호이기에 NULL을 허용하지 않고, 숫자로 4자리까지 작성 가능함을 알 수 있다. 그 아래로는 텍스트인지, 날짜인지 등을 알 수 있는데, 실제로 예전에 R을 쓸 때 분명히 숫자임에도 불구하고 계속해서 오류가 나서 당황했었던 기억이 있었다.

 

  내가 보기에는 23, 46과 같이 숫자인데 R은 그것이 숫자가 아니라고 계속해서 말하는 것이었다. 이후에 알아보니 내가 읽기에는 숫자였지만, 데이터타입은 텍스트로 지정이 되어있었던 상황이었다. 프로그램이 인지하기엔 이건 숫자가 아니라 문자인데 대체 뭘 계산하라는 것이냐고 끊임없이 내게 되물었던 웃지 못할 상황이었다.

 

  물론 as.numeric() 을 통해서 이건 그럼에도 불구하고 숫자다! 라고 명령해서 해결이 되었지만 어떤 데이터를 입력하기 전에 무엇을 입력할 것인지, 데이터의 형태는 정말로 숫자만 들어갈 것인지, 아니면 그 외에 다른 형태의 데이터가 들어갈 가능성도 있는지, 혹은 내가 받은 데이터 프레임이 어떤 값만을 입력할 수 있는지 등을 미리 고려하고 살펴보는 것이 이후에 곤란한 상황에 처하는 것을 막아준다는 교훈을 얻을 수 있었다.

 

  그리고 문자열이면 문자열이지 대체 VARCHAR2는 무엇일까. 왜 VARCHAR1은 없는 것일까 잠시 고민했는데 검색해보니 당연히 존재하고 있었다. CHAR는 고정길이, VARCHAR2는 가변길이라는 차이가 있다는데 공백을 기억하냐 그렇지 않냐에 따른 차이로 저장 공간을 절약할 것인지, 공백을 기억할 것인지 등에 따라 사용하는 것 같았다.

  또한 VARCHAR와 VARCHAR2는 현재 비슷한 기능을 수행한다고 한다. 그런데 가급적이면 나중에 업데이트시에 문제가 생길 수 있으니 VARCHAR2를 사용하길 권장한다는 내용이 적혀있었다. (Oracle Data Types)

 

  공식문서를 어떻게 찾을지 고민중이었는데 감사한 분이 이렇게나 친절하게 설명해주셨다. : [Oracle] 오라클 CHAR, VARCHAR, VARCHAR2의 차이점

 

  이전과 같은 실수를 하지 않기 위해서 잘 모르는 데이터타입이 생기면 찾아보는 습관이 있다. 약간씩은 명칭이 다른 느낌이라 아직은 낯설지만 이렇게 필요할 때마다 조회가 가능한 문서들만큼 감사한 것도 없다.