본문 바로가기

Programing/Database

[DB] 데이터베이스 개념 & SQL언어

데이터베이스 개념 & SQL언어

1. 데이터베이스 개념

# 관계형 데이터모델
  - 2차원 테이블 형태의 데이터베이스를 칭하며 
  - 각 열(column)을 '속성', '컬럼', '필드' 라 부름
  - 각 행(row)를 '튜플(tuple)', '속성값 집합', '레코드'라 부름
  - 도메인(domain) : 하나의 속성이 취할 수 있는 모든 값의 범위
  - 종류 : Oracle, MySQL, MSSQL, IBMDB2, SQLite, MariaDB, Postgre 등

# SQL ( Structured Query Language)
  - 1974년 IBM연구소에서 System R로 시제품_ 집단,그룹화,갱신연산 등
  - 1986년 ASNI(미국표준기구)에서 SQL표준을 채택
  - 여러 상용 DBMS가 존재하며 각각 지원하는 SQL 기능에는 약간 차이가있음
  - 자연어에 가까운 구문 사용하는 것이 장점
  - 분류 : 권한 및 역할에 따라 DQL , DML, DDL, DCL 로 나누어 부름 
  - DQL( Data Query Language) : 사용자가 데이터 조회하는 언어 ex. SELECT
  - DML( Data Manipulation Language) : 데이터를 직접 조작가능 ex. SELECT, INSERT, UPDATE, DELETE   
  - DDL ( Data Definition Language) : 데이터베이스 구축,수정_ 데이터형식,접근방식정의
                                                   ex. CREATE,ALTER,DROP,RENAME,TRUNCATE
  - DCL( Data Control Language) : 데이터접근,사용권한 관리 ex. GRANT, REVOKE


2. SQL 언어

 

2-1. 데이터검색

 [ 기본개념]

  - 데이터베이스 내 테이블에 저장된 데이터검색
  - 결과는 테이블형태로 출력
  - 질의어(SQL) 끝은 세미콜론( ; )으로 구분
  - 특수기호 : ' * ' 전체를 의미,  


[ 예약어 ]

  - DESC {테이블명} : 테이블 컬럼의 데이터타입 조회
  - SELECT : 출력시킬 테이블의 컬럼지정 (+ DISTINCT : 중복제거 조회) ( + AS : 컬럼별칭지정) 
  - FROM : 조회할 테이블 지정
  - WHERE : 조회할 데이터의 조건식 지정
  - GROUP BY : 조회할 데이터의 묶음 지정
  - HAVING : 그룹화하여 조회된 데이터의 조건 지정
  - ORDER BY : 조회할 데이터의 정렬기준 지정 ASC오름차순, DESC내림차순


[ 연산자 ] 

  - 산술연산자 : +, -, *, /
  - 비교연산자 : =, >, <, >=, <=, <>(NOT)
  - 논리연산자 : AND, OR, NOT
  - 범위연산자 : BETWEEN {val_1} AND {val_2}
  - IN 연산자 : 여러가지 값에 대한 OR연산자 대신 사용 ex. IN ( 10, 30 )
  - NOT IN 연산자 : IN의 반대, 아닌값 조건 ex. NOT IN (10, 30)
  - LIKE 연산자 : 값의 일부 정규식으로 지정 ex. {column} LIKE 'A%'


[ 서브쿼리 ]

  - SQL문 안에 다른 SQL문을 중첩하여 사용
  - 괄호로 묶어서 구분
  - 서브쿼리 내 ORDER BY는 의미가 없음
  - 단일행서브쿼리 : 서브쿼리 결과로 1개의 컬럼만 나올 시, 조건식의 '=' 등호와 연계
  - 다중행서브쿼리 : 서브쿼리 결과로 여러 컬럼이 나올 시 조건식의 'IN' 연산자 등과 연계
  - EXISTS : 서브쿼리와만 사용가능, 서브쿼리의 결과가 존재할 경우만 메인쿼리 수행
               ex. SELECT * FROM {table} WHERE EXISTS (SELECT~~)


[ 기타 ]  

  - UNION : 여러개 SQL구문 결과를 묶어줌_컬럼수동일할 경우만
  - NULL : 없는값으로 '0'과는 다름
  - IS NULL & IS NOT NULL : NULL 없는값인지 확인, 등호로 확인 시 (=NULL) 'NULL' 문자열을 의미


[ 단일행 함수 - 문자열 ] 

SQL 단일행 함수

 -  INITCAP, LOWER, UPPER  

SELECT ename, INITCAP(ename), LOWER(ename),UPPER(ename)
FROM scott.emp;

 - LENGTH, LENGTHB  

SELECT LENGTH('홍길동'), LENGTHB('홍길동')
FROM scott.emp;

 - CONCAT 

SELECT ename,job,CONCAT(ename,job)
FROM scott.emp;

 - SUBSTR

SELECT ename, SUBSTR(ename,2,3)
FROM scott.emp;

- REPLACE

SELECT ename, REPLACE(ename,SUBSTR(ename,2,2),'**')
FROM scott.emp;


[ 단일행함수 - 숫자 ] - ROUND, TRUNC, MOD

SELECT ROUND(123.456,2), TRUNC(123.456), MOD(123,10), CEIL(123.456),FLOOR(123.456),POWER(3,4)
FROM dual;


[ 단일행함수 - 날짜 ] - SYSDATE, MONTHS_BETWEEN

- SYSDATE : 시스템 현재 날짜와 시간
- MONTHS_BETWEEN : 두 날짜 사이 개월 수 ( 앞이 더 최신일 경우 양수)
- ADD_MONTHS : 주어진 날짜에 개월을 더함
- NEXT_DAY : 주어진 날짜를 기준으로돌아오는 날짜 출력
- LAST_DAY : 주어진 날짜가 속한 달의 마지막 날짜 출력

SELECT SYSDATE,TO_DATE('210101','YYMMDD'), MONTHS_BETWEEN(SYSDATE,TO_DATE('210101','YYMMDD')) 
FROM dual;


[ 단일행함수 - 변환 ] - TO_CHAR, TO_DATE, NVL, DECODE 

  - TO_CHAR : 숫자 또는 날짜 데이터를 문자형으로 변환
    ( 포맷 : $-달려표기 | 0-자리수유지 | 9-숫자자리 |  ' , ' : 천단위 |  ' . ' : 소수점 ) 
  - TO_NUMBER : 숫자형태를 띈 문자형 데이터를 실제 숫자로 변환
  - TO_DATE : 문자형 데이터를 실제 날짜 데이터로 변환
  - NVL(대상열, 치환값) : NULL값을 만나면 값 치환
  - DECODE(대상열, 조건값, 참일때 값, 거짓일때 값) : 등호조건 참,거짓 값 치환

- Ex. TO_CHAR 

SELECT TO_CHAR(12345.678,'$0999,999.999')
FROM dual;

- Ex. NVL

SELECT ename, comm, NVL(comm,999)
FROM scott.emp;

- Ex. DECODE

SELECT ename, deptno, DECODE(deptno, 30, 'Check','-')
FROM scott.emp;


[ 집계함수 ] - COUNT, SUM, AVG, MAX, MIN

SELECT COUNT(*), COUNT(ename), SUM(sal), AVG(sal), MAX(sal),MIN(sal)
FROM scott.emp
WHERE deptno = 10;


[ 그룹화 ] - GROUP BY, HAVING

SELECT deptno, SUM(sal), AVG(sal)
FROM scott.emp
GROUP BY deptno;

SELECT deptno, SUM(sal)
FROM scott.emp
GROUP BY deptno
HAVING COUNT(*) > 2
ORDER BY deptno;