PengTory

SQL (feat. Oracle) 본문

데이터베이스

SQL (feat. Oracle)

펭토리 2023. 2. 22. 09:45

1. SQL이란? (Structured Query Language)

  • 구조적 질의 언어
  • 데이터베이스와의 통신을 위한 언어
  • 데이터를 조회, 정의, 조작하기 위한 언어

2. SQL의 분류

DML (Data Manipulation Language)

- 데이터 조작 언어

- 데이터를 조회하거나, 검색, 등록, 수정, 삭제

 

DDL (Data Definition Language)

- 데이터 정의 언어

- 테이블 생성, 수정, 변경, 삭제

 

DCL (Data Control Language)

- 데이터베이스 접근 권한 제어 언어

 

TCL (Transaction Control Language)

- 트랜잭션(논리적 작업 단위) 제어를 위한 언어

 

 

기타 지식

GUI: Graphic User Interface

CLI: Command Line Interface

UI(User Interface): 사용자와 컴퓨터 사이

API(Application Program Interface): 내가 만든 프로그램과 남이 만든 프로그램 사이에서 통신하게 해주는 것

 

3. DML의 종류

  • Insert: 테이블에 새로운 행 삽입
INSERT INTO 테이블명 [(열이름1, 열이름2, ...)]
VALUES (값1, 값2, ...);

(위 문법에서 대괄호는 생략이 가능하다는 의미이다.)

insert into member values('hong', '홍길동', 30, 'hong@gmail.com');

-> 다음처럼 생략도 가능하다. 단, 컬럼순서와 values값의 순서가 같아야만 가능하다!

 

  • Update: 테이블에 있는 행의 내용 수정
UPDATE 테이블명 SET
열이름1 = 값1, 열이름2 = 값2...
[ WHERE 조건식 ];

 

  • Delete: 테이블의 행을 삭제
DELETE FROM 테이블명 [ WHERE 조건식 ];

 

  • Select: 테이블의 행을 조회
SELECT 열이름 [as 별칭]...
FROM 테이블명
[WHERE 조건식]
[ORDER BY 열이름 [ASC or DESC]];

ASC: 

select문은 추가적인 사항이 많기 때문에 아래에 따로 빼서 정리하겠다.

 

+)  COMMIT과 ROLLBACK

COMMIT: 트랜잭션을 정상적으로 데이터베이스에 적용하고 작업 내용을 데이터베이스에 저장하는것

커밋을 하지 않으면 작업이 처리된것처럼 보이지만 실제 데이터베이스에 저장되는 것이 아니라 임시 공간인 temp에 저장되는 것이다.

 

ROLLBACK: 작업 중 문제 발생 시 현재 트랜잭션의 변경 내역을 취소하고, 종료 트랜잭션 발생 이전 시점으로 되돌리는것, 작업 내용을 취소하는 것

 

롤백이 필요한 이유 :

예를들어 A가 B에게 10000원을 보낸다고 생각해보자.  A의 계좌에서 10000원을 빼주고 B의 계좌에 1000원을 넣어주는 과정이 이루어질 것이다. 만약 A의 계좌에서 10000원이 나간 후 에러가 발생한다면 A의 돈은 나가기만 하고 B에게 전해지지 않을 것이다. 이러한 경우 Rollback이 이루어져 A의 계좌에서 10000원이 나간 사실을 되돌려야 한다. 이러한 과정을 트랜잭션이라 하며 금융과 같은 경우 트랜잭션은 필수이다.

 

4. SELECT문

select문을 사용할때는 어디서 가져올것인지, 어떻게 가져올것인지, 어떤 값을 출력할 것인지 세가지를 먼저 고민하고 작성하자

 

< SQL 작성 규칙 > (문법적 규칙은 아니지만 실무에서 관례적으로 사용 )

1) SQL은 대소문자를 구분하지 않지만, 예약어는 대문자로, 나머지 (열명, 테이블명 등)는 소문자로 표기

2) 가독성을 위해 여러 줄, 공백을 이용해 작성(명령어의 일부는 나눌 수 없음)

3) 구조적(Structured) 코드는 들여쓰기 이용(가독성 향상)

SELECT 
    name, weight 
FROM student
WHERE weight > 60
ORDER BY weight ASC;

SELECT * FROM 테이블이름: 전체 정보 가져오기

 

ALIAS(별칭) -> SELECT empno AS 직원번호, ename AS 직원명, deptno 부서명 FROM emp;

 

리터럴 값으로 출력 열 추가 -> SELECT empno, ename, deptno, ‘회사명’ AS company FROM emp;

 

중복제거 -> SELECT DISTINCT deptno FROM emp;

(DISTINCT보다 GROUP BY 가 실제로 더 많이 쓰임)

 

(부서코드가 20, 40인 직원명과 부서코드)

SELECT 
    ename, deptno
FROM emp
WHERE deptno = 20 OR deptno= 40;

SELECT 
    ename, deptno
FROM emp
WHERE deptno IN (20,40);

OR로 사용할 수도 있지만 IN을 사용할 수도 있다.

반대로 사용할 때는 IN 대신 NOT IN을 사용한다.

 

LIKE 연산자

- 특정 단어를 포함된 데이터를 추출할 때 사용

- % : 0개 이상의 문자

- _ : 1개의 문자

-- 김씨 다 나옴 (%기 때문에 전부 김씨면 전부 다 나옴)
SELECT * FROM student WHERE name LIKE '김%';

-- ~인 으로 끝나는 사람 다 나옴
SELECT * FROM student WHERE name LIKE '%인';

-- 김X 만 나옴! (_는 한개의 문자만 나오기 때문에 외자만 가능)
SELECT * FROM student WHERE name LIKE '김_';

-- 이름검색 '영'이 들어가는 사람
SELECT * FROM student WHERE name LIKE '%영%';

 

UNION과 UNION ALL (집합 연산자)

 

UNION ALL을 사용하면 중복 허용

SELECT studno, name, major1
FROM student
WHERE major1 = 202
UNION ALL
SELECT
    studno, name, major1
FROM student
WHERE major2 = 101;

UNION을 사용하면 중복된 내용이 삭제된 것을 볼 수 있음

SELECT studno, name, major1
FROM student
WHERE major1 = 202
UNION
SELECT
    studno, name, major1
FROM student
WHERE major2 = 101;

단 UNION과 UNION ALL은 조금 느리다는 단점이 있다.

각자의 계산을 하고 UNION, UNION ALL의 계산이 진행된다.

 

NULL

  • 값이 없다는 의미
  • 값 자체가 존재하지 않음
  • 숫자의 0, 문자의 ‘’ 과는 다름
  • 값이 없으므로 연산 불가

데이터가 null인 값을 찾을때는 IS NULL, IS NOT NULL을 사용한다.

 

아래와 같은 경우 salary*12+bonus를 하면 연봉이 나와야할 것 같다. 그러나 몇몇 결과 값에 null이 들어가있는 것을 확인할 수 있다. 그 이유는 보너스가 없는 직원 (즉 bonus가 null)의 경우 계산이 불가능하기 때문이다. 따라서 이러한 경우 아래와 같이 함수를 사용해 해결해줘야한다.

SELECT ename, salary, salary*12 + bonus FROM emp;

만약 값이 null인 경우 다른 값으로 처리해주고 싶을때는 NVL이라는 함수를 사용한다.

SELECT ename, salary, salary*12+NVL(bonus,0) FROM emp;

 

NVL, NVL2 함수

  • 위 함수는 Oracle에 존재하는 함수이다.
  • 값이 null인 경우 처리하는 함수 
  • NVL은 null인 경우만 체크 
  • NVL2는 null인 경우와 그렇지 않은 경우 따로 처리
  • NVL2(컬럼, 값이 null이 아닌 경우, 값이 null인 경우)
SELECT ename, salary, bonus, NVL2(bonus,'O', 'X') FROM emp

'데이터베이스' 카테고리의 다른 글

SQL 학습 정리  (0) 2023.02.24
JOIN이란? (feat. oracle)  (0) 2023.02.23
GROUPING - GROUP BY 와 HAVING(feat. oracle)  (0) 2023.02.23
Oracle 리스너란?  (0) 2023.02.22
데이터베이스 이론  (0) 2023.02.21