본문 바로가기
SK 행복성장캠퍼스/SQL

2020-09-08, SQL_1일차

by NickNuma 2020. 9. 9.

파이썬을 희한하게 아쉽게 마무리 아닌 마무리를 하고 SQL로 들어왔습니다. (파이썬 포스팅도 아직 끝난게 아니고..;; 하하)


일단 Database는 Oracle SQL를 배우게 됐습니다.  ( 학교에선.. MySQL을 했던건지... 그냥 개론을 배웠던 건지.. 기억이;; 막 join하고 막.. 그랬었는데요...)

일단, DBMS라는 것이 있습니다.
DataBase Management System, 데이터베이스 관리 시스템이죠. 방대한 양의 데이터를 효율적이로 저장하고 관리, 검색할 수 있는 소프트웨어입니다.

초반에는 계층형 데이터베이스, 네트워크 데이터베이스 등이 있었는데 이제 RDB, Relational DataBase가 세계를 장악하고 있습니다. Key라는 것으로 데이터 테이블들의 관계를 형성하고 연계해서 관리, 검색을 할 수 있지요.
(교수님께서 DB도 다른 프로그래밍 언어처럼 객체지향 언어로 만들려고 했는데.. 영.. 탐탁치 않아서 지금까지도 DB 언어는 객체 지향 언어가 아니라 관계형 구조를 띄고 있다고 하셨던게 기억에 납니다.)

대표적인 관계형 데이터베이스 관리 시스템 (RDBMS)로는 Oracle, MS-SQL, MySQL, Sybase, infomix, DB2 등이 있다고 합니다. (근데 세계적으로는 Oracle이 가장 많이 쓰이는 걸로 알고 있습니다.)


데이터를 2차원 테이블로 저장, 관리합니다.

행 ( - ) = 레코드 ( record )
열 ( | ) = 컬럼 ( column )
값이 없는 경우  =>  널(null)값을 갖는다고 한다.

제약 조건 <== 데이터의 무결성을 보장하기 위한 조건

제약조건 타입 설명
primary key

레코드를 식별하기 위한 용도. 내부적으로 unique제약조건과 not null 제약조건을 포함한다. 자동으로 인덱스(index)가 생성됨
<- 반드시 값을 갖아야한다. 중복되지 않아야한다. ->
unique

컬럼에 유일한 값을 저장하기 위한 용도. null 값 포함 가능. 자동으로 인덱스(index)가 생성됨.
<- 중복되지 않아야한다. Null 값이 가능하다. ->
not null 

컬럼에 반드시 값을 저장해야 하는 용도
<- 반드시 값을 갖아야한다. (null 값 허용 x) ->
check  컬럼에 임의의 조건에 일치하는 데이터만 저장하기 위한 용도.   예> 학년이 1학년만 저장, 성별이 ‘남’ 만 저장등
foreign key 하나의 테이블에서 다른 테이블을 참조하기 위해 사용되는 용도로서 ‘참조키’,‘외래키’ 라고 부른다.

 


SQL  - Structured Query Language, 사용자와 관계형 데이터베이스를 연결시켜 주는 표준 검색 언어
        1) ANSI SQL  -  표준화된 SQL문, American National Standards Institute
        2) 비 ANSI SQL - 표준화되지 않은 SQL문 -> 특정한 DBMS에서만 사용 가능

SQL 종류 명령문
Data Query Language(DQL:질의어) SELECT(데이터 검색시 사용)
Data Manipulation Language
(DML:데이터 조작어)
INSERT(데이터 입력)
UPDATE(데이터 수정)
DELETE(데이터 삭제)
MERGE(데이터 병합)
Data Definition Language
(DDL:데이터 정의어)
CREATE(데이터베이스 객체 생성)
ALTER(데이터베이스 객체 변경)
DROP(데이터베이스 객체 삭제)
RENAME(데이터베이스 객체이름 변경)
TRUNCATE(객체 정보 절삭)
Transaction Control Language
(TCL:트랜잭션 처리어)
COMMIT(트랜잭션 작업 반영)
ROLLBACK(트랜잭션 작업 취소)
SAVEPOINT(트랜잭션내 책갈피 설정)
Data Control Language
(DCL:데이터 제어어)
GRANT(권한 부여)
REVOKE(권한 취소)

SQL*PLUS와 마찬가지로 한 라인에 모두 입력해도 되고 여러 줄로 나누어 입력해도 된다.
SQL문은 기본적으로 대소문자를 구별하지 않는다.
사용 가능하고 SQL문장의 끝은 ;(세미콜론)으로 끝난다.

 



1. 특정 계정의 테이블 정보 보기
가장 처음, select * from tab;를 이용해서 DB 안에 어떤 테이블들이 있는지 확인한다.

-- 1. 특정 계정의 테이블 정보 보기
select *
from tab;

SELECT * from tab;

 


2. 테이블의 구조 보기   (describe)
DESC 테이블명, 테이블의 구조를 확인하기 위한 명령어

테이블 구조를 정확하게 알아야 필요한 데이터를 검색하거나 저장할 수 있기 때문에 가장 먼저 확인해보자.

-- 2. 테이블의 구조 보기   (describe)
desc employees;

NUMBER(6)       - 정수, 6자리 저장 가능
NUMBER(6, 2)    -  실수, 전체 자리 6, 소숫점 2번째 자리까지
CHAR(byte)        - Charater, 고정형 (데이터 크기 고정)
VARCHAR2(10)   - Variable Character, 문자 변수, 10byte, 영문 10글자, 한글 5글자
                           (영문자 1byte, 한글 2 bytes) (DBMS - 한글 2bytes or 3bytes)
                        -  가변형 (크기가 데이터에 따라 변함)
DATE                 - 날짜 정보 (YY-MM-DD)

 


3.  칼럼 지정하기
SELECT 문 : SELECT 옆에 column 값을 주어 테이블로부터(FROM) 지정, 출력합니다. 

-- 3. select 문 - 컬럼 지정
SELECT employee_id as empid, last_name, hire_date, salary
FROM employees;

 

 


4. 모든 칼럼을 지정합니다. ===> *

select *
from employees;

 


5. 산술 연산자 사용 가능합니다.
+  SELECT salary+100 FROM employees;
-  SELECT salary-100 FROM employees;
*  SELECT salary*100 FROM employees;
/  SELECT salary/100 FROM employees;

select last_name, salary 월급, salary *12 as 연봉   --as는 선택
from employees;

 


6. 별칭 사용 ( alias )
column 이름 옆에 as를 써서 내가 원하는 이름으로 바꾸어 출력 가능하다. ( 굳이 as를 사용하지 않아도 되긴 함.)
공백이나 특수문자가 포함된 경우에는 반드시 이름을 " "로 감싸줘야한다.

select last_name, salary 월급, salary *12 as 연봉   --as는 선택
from employees;
SELECT last_name as "사원 이름", salary "사원 월급", salary * 12 as "연 봉"
FROM employees;

 


7 - 1. Null 값
--Null 특징
--1) select시 값이 없는 상태 (비어있는 상태)
--2) null값과 연산 => 결과 = Null  ==> 해결법 : NVL(컬럼명, 값)
--3) 값 비교시 가장 큰 값으로 처리
--4) Null값 탐색시에는 is null 연산자를 사용

SELECT last_name 이름, salary 월급, commission_pct 수수료, salary* 12 + commission_pct as 연봉
FROM employees;

 


7 - 2. Null 값 제외 => NVL( 컬럼명, 값 ) : null 값이 나오면 특정 값으로 변환하라

SELECT last_name 이름, salary 월급, commission_pct 수수료, salary * 12+NVL(commission_pct,0) as 연봉
FROM employees;

 


--8. 연결 연산자 ||
연결 연산자(||)를 사용하면 여러 개의 문자열을 연결하여 하나의 문자열로 생성

SELECT last_name || salary as "이름 월급"
from employees;

SELECT last_name || '의 직업은 ' || job_id || ' 입니다' as "사원별 직급"
FROM employees;          -- '사원' <= 리터럴 값 (문자열), 별칭을 위한 " "이 아님

 


9. 중복 데이터 제거
--SELECT DISTINCT 컬럼명
--FROM 테이블명;

SELECT job_id
FROM employees;

SELECT DISTINCT job_id      -- 중복 제거
FROM employees;

 



10. where 조건절

--정수 테이터 가능
SELECT employee_id,last_name,job_id, salary
FROM employees
WHERE salary >= 10000;

 

--문자열 데이터 가능
SELECT employee_id,last_name,job_id, salary
FROM employees
WHERE last_name = 'King';		-- 문자열 ' '

 

--날짜 데이터 가능
SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE hire_date > '07/12/31';	-- 년도/월/일 (날짜 데이터의 기본 포멧), 날짜 ' '

 


11. Between a And b 연산자 ( 이상, 이하 )

SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE salary BETWEEN 7000 AND 8000;

 

SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE hire_date BETWEEN '07/01/01' AND '08/12/31';

비교연산자  
=                    같다 
!= , <> , ^=      같지 않다 
>                    보다 크다 
>=                  보다 크거나 같다 
<                    보다 작다 
<=                  보다 작거나 같다 


12. in 연산자
목록에 지정된 여러 개의 값을 한꺼번에 비교할 때 사용하는 연산자, 내부적으로 OR 연산자로 실행
Where 컬럼명 in (값1, 값2.....) <--- or

SELECT employee_id, last_name, salary, hire_date
FROM employees
WHERE employee_id IN ( 100,200,300 );

 

SELECT employee_id, last_name, salary, hire_date
FROM employees
WHERE last_name IN ( 'King','Abel','Jones');

 

SELECT employee_id, last_name, salary, hire_date
FROM employees
WHERE hire_date IN ( '01/01/13','07/02/07');

 


13. LIKE (_,%) 연산자  : 값 찾기
%     %위치에 0개 이상의 문자(열)과 대체
_       _위치에 반드시 1개 문자와 대체

SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '%ai%';   -- 가운데 ai가 들어가는 last_name의 colum

 

SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '_____d';  -- 6번째 자리가 d로 끝나는 last_name의 column

 

SELECT employee_id,last_name,salary
FROM employees
WHERE last_name LIKE '%d';      -- d로 끝나는 last_name의 column

 


14. 논리 연산자
연산자  설명
AND    두 가지 조건을 모두 만족하는 데이터를 검색한다.
             SELECT * FROM employees WHERE employee_id=100 AND job_id='AD_VP';
OR      두 가지 조건 중에서 한 가지만 만족하더라도 검색한다.
             SELECT * FROM employees WHERE salary >= 30000 OR job_id='AD_VP';
NOT     지정된 조건이 아닌 데이터를 검색한다.
             SELECT * FROM employees WHERE NOT employee_id=100;

SELECT last_name,job_id,salary
FROM employees
WHERE job_id = 'IT_PROG' AND salary >= 5000;

 

SELECT last_name,job_id,salary
FROM employees
WHERE NOT salary < 20000;

 

연산자  설명
!=                                      같지 않다.
^=                                     같지 않다.
<>                                     같지 않다.
NOT 컬럼명 = a                    a와 같지 않다.
NOT 컬럼명 > a                    a보다 크지 않다.
NOT BETWEEN a AND b         a와 b사이에 있지 않다.
NOT IN ( 리스트 )                  리스트와 일치하지 않는다.
IS NOT NULL                        NULL값을 갖지 않는다.

 


15. 연산자 우선순위 설명
1  괄호( )
2  비교 연산자
3  NOT 연산자
4  AND 연산자
5  OR 연산자

SELECT last_name,job_id,salary,commission_pct
FROM employees
WHERE ( job_id ='AC_MGR' OR job_id='MK_REP' )
AND commission_pct IS NULL
AND salary >=4000
AND salary <= 9000;

 

SELECT last_name,job_id,salary,commission_pct
FROM employees
WHERE job_id ='AC_MGR' OR job_id='MK_REP'
AND commission_pct IS NULL
AND salary >=4000
AND salary <= 9000;

 


16. Is Null    ==>  Null값 탐색

SELECT last_name,job_id,salary
FROM employees
WHERE commission_pct = NULL;

SELECT last_name,job_id,salary
FROM employees
WHERE commission_pct IS NOT NULL;


 

오늘에서야 비로소 깨달았다.

하루 8시간 강의다.

그걸 6시에 끝내서 저녁 먹고 8시부터 12시까지. 4시간 동안.

차근차근 하나씩 하나씩 올리는 건 무리다. 불가능이라고 봐도 되지 않을까한다.

고로....

일단 오늘 배운 내용 포스팅은 내가 공부하면서 정리한 것을 올리는 것으로 하고 나 혼자 기억하는 느낌으로 올리는게 맞는 것 같다.

이 내용으로 누군가를 알려준다는건 거의 불가할 듯.

대학 강의처럼 하루 2시간, 3시간이면 집에 가서 포스팅이 가능할텐데. 이건 무리인 듯하다.

내일부터는... 아마 그런식으로 갈 것 같다. 포스팅하면서도 상당히 죄책감 같은걸 느껴왔는데.. 이제 포스팅 목적을 내 기억 되살리기로 하고 새로히 포스팅을 할까한다.

그럼 이만!

반응형

댓글