- 데이터베이스
데이터베이스
특정 기업이나 조직, 개인이 필요에 따라 데이터를 일정한 형태로 저장해 놓은 것
DBMS(Database Management System)
효율적인 데이터 관리와 예기치 못한 사건으로 인한 데이터 손상을 피하고, 필요한 데이터를 복구하기 위한 강력한 기능의 소프트웨어
SQL (Structured Query Language)
데이터 정의, 데이터 조작, 데이터를 제어하기 위해 사용하는 언어
명령어 종류 | 명령어 |
데이터 조작어 (DML, Data Manipulation Language) |
SELECT INSERT UPDATE DELETE |
데이터 정의어 (DDL, Data Definition Language) |
CREATE ALTER DROP RENAME |
데이터 제어어 (DCL, Data Control Language) |
GRANT REVOKE |
트랜잭션 제어어 (TCL, Transaction Control Language) |
COMMIT ROLLBACK |
테이블
- Table
- Column
- Row
- Field : 칼럼과 행이 겹치는 하나의 공간
데이터 유형
데이터 유형 | 설명 |
CHARACTER(s) | - 고정길이 문자열 정보 - s는 byte 단위, 최대길이는 DB별로 다르다. - s보다 작은 값이 들어오면, 그 차이만큼 공간으로 채워진다. |
VARCHAR(s) | - 가변길이 문자열 정보 - s는 byte 단위, 최대길이는 DB별로 다르다. - 최대 LIMIT이 s byte 만큼이다. |
NUMERIC | - 정수, 실수 등 숫자정보 - NUMERIC, DECIMAL, DEC, SMALLINT, INTEGER, INT, BIGINT, FLOAT, REAL, DOUBLE PRECISION |
DATETIME | - 날짜와 시각정보 |
SELECT문
합성연산자
-- ORACLE 문자와 문자 연결
SELECT STRING || STRING
-- SQL server 문자와 문자 연결
SELECT STRING + STRING
-- 모두 문자와 문자 연결
SELECT CONCAT(STRING, STRING)E
함수
- 내장함수 : p.152
- 문자형 함수 : p.153
- 숫자형 함수 : p.158
- 날짜형 함수 : p. 162
- 변환형 함수 : p.165
- CASE 표현 : p. 168
- NULL 관련 함수 : p.172
WHERE 절
문자유형 비교 방법
비교연산자 양쪽이 모두 CHAR | - 길이가 서로 다르면 작은쪽에 스페이스 추가해 길이를 같게 한 후 비교 - 서로 다른 문자가 나올대까지 비교 - 달라진 첫 번째 문자의 값에 따라 크기 결정 - 문자 끝 블랭크 수만 다르면, 서로 같은 값으로 결정 |
비교연산자 어느 한 쪽이 VARCHAR | - 서로 다른 문자가 나올 때까지 비교 - 길이가 다르면, 짧은 것이 끝날때까지 비교 후, 길이가 긴 것이 크다고 판단 - 길이가 같고 다른것이 없다면, 같다고 판단 - VARCHAR 는 NOT NULL 까지 길이를 말한다. 즉 문자 끝 블랭크도 문자로 취급 |
상수값과 비교 | - 상수 쪽을 변수 타입과 동일하게 바꾸고 비교 - 변수 쪽이 CHAR/VARCHAR 유형 타입이면, 위의 CHAR/VARCHAR 유형 타입의 경우를 적용 |
논리연산자
- NOT
- AND
- OR
-- NOT 예문
SELECT *
FROM Products
WHERE NOT (CategoryID IN (1, 2, 3));
SELECT *
FROM Employees
WHERE NOT (Department = 'HR');
-- 부정 연산자로서도 같은 방식으로 사용되나보다
부정연산자
- NOT BETWEEN a AND B
: a와 b를 포함하지 않고, a와 b 값 사이에 있지 않다.
GROUP BY, HAVING 절
GROUP BY 절
- SQL 문에서 FROM 절과 WHERE 절 뒤에 오며, 데이터들을 작은 소그룹으로 분류해
소그룹에 대한 항목별로 통계 정보를 얻을 때 추가로 사용된다. - GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용한다.
- HAVING 절은 GROUP BY 절의 기준 항목이나 소그룹의 집계함수를 이용한 조건을 표시할 수 있다.
- GROUP BY 절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING 절에서 제한 조건을 두어 조건을 만족하는 내용만 출력한다.
- P.207 사용예시
- GROUP BY 절에 ALIAS 이름을 사용할 수 없다.
HAVING 절
- WHERE 절은 FROM 절에 정의된 집합의 개별 행에 적용되는 조건절이다.
- WHERE절의 조건에 맞는 행이 GROUP BY 절의 대상이 되는 것이다.
- 그 후 결과 집합의 행에 HAVING 조건절이 적용된다.
- ORACLE 에서는 GROUP BY 절과 HAVING 절의 순서를 바꾸어도 에러가 없고, 동일한 결과가 나온다.
그러나 논리적으로 순서를 지키는 것을 권고한다.
HAVING SUM(COLUMN_NAME) > 100
- HAVING절에서 집계함수 사용도 가능하다
집계함수와 NULL 처리
- 빈칸을 NULL이 아닌 것으로 표현하기 위해 NVL(), ISNULL()과 같은 함수를 사용하는 경우가 많다.
- 다중행 함수는 입력값으로 전체 건수가 NULL 인경우만 함수의 결과가 NULL 이 나온다.
- 일부만 NULL인경우는 NULL을 제외하고 연산한다.
- 같은 결과를 얻을 수 있다면, 굳이 불필요한 부하가 발생하도록 NVL(), ISNULL()과 같은 함수를 사용할 필요가 없다.
-- 이거보단
SUM(NVL(COLUMN_NAME, 0))
-- 이렇게 하란뜻
NVL(SUM(COLUMN_NAME), 0)
- 이러한 부분을 고려하면 데이터 건수만큼 연산이 일어나게 해 시스템의 자원을 낭비하는걸 방지할 수 있다.
ORDER BY 절
- GROUP BY 절을 사용하면 그룹핑 기준에 사용된 칼럼과 집계함수에 사용될 수 있는 숫자형 데이터 컬럼덜의 집합을 새로 만드는데, 개별 데이터는 필요 없으므로 저장하지 않는다.
- 즉, GROUP BY 이후 수행 절인 SELECT 절이나 ORDER BY 절에서 개별 데이터를 사용하는 경우 에러가 발생한다.
JOIN
-- EQUI JOIN
SELECT ...
FROM TABLE1, TABLE2
WHERE TABLE1.COL = TABLE2.COL
-- ANSI/ISO JOIN
SELECT ...
FROM TABLE1 INNER JOIN TABLE2
ON TABLE1.COL = TABLE2.COL
Non EQUI JOIN
- 비등가 조인 p.238
- 두 개의 테이블 간에 논리적인 연관 관계를 갖고 있으나, 칼럼 값들이 서로 일치하지 않는 경우에 사용된다.
- '=' 연산자가 아닌 다른 연산자(BETWEEN, >, >=, <, <=)를 이용해 JOIN을 수행한다.
- 데이터 모델에 따라 불가능한 경우도 있다.
OUTER JOIN
- 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.
-- ORACLE
SELECT ...
FROM TABLE1, TABLE2
WHERE TABLE2.COL(+) = TABLE1.COL;
- 위 코드에서 OUTER JOIN의 기준이 되는 테이블은 [TABLE1] 이다.
- 즉 (+) 표시 반대편에 있는 테이블이 OUTER JOIN의 기준 테이블이 된다.
- (+) 표시가 누락될 경우, INNER JOIN으로 수행한다.
- 조인의 실패한 행들의 경우, 기중테이블은 칼럼들의 값이 표시되고, 그외 테이블에서 가져오는 칼럼들은 NULL로 표시된다.
### 관계형 데이터베이스의 큰 장점이면서 SQL 튜닝의 중요 대상이 되는 조인을 잘못 기술하면,
시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원인이 되므로 조인 조건은 신중하게 작성해야 한다.
표준 조인
ANSI/ISO SQL에서 표시하는 FROM 절의 조인 형태
- INNER JOIN
- NATURAL JOIN
- USING 조건절
- ON 조건절
- CROSS JOIN
- OUTER JOIN
FROM 절 조인형태
- ANSI/ISO SQL 표준방식은 ON 조건절을 통해 JOIN 조건과 데이터 제한 조건을 분리해 기술하는 것이다.
- 기존 JOIN 문법은 WHERE절에 JOIN 조건과 데이터 제한 조건이 같이 사용돼 용도가 불분명한 경우가 발생할 수 있었다.
INNER JOIN
- 내부 조인이라고 하며 조인 조건을 만족하는 행들만 반환한다.
NATURAL JOIN
- 두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN을 수행한다.
- NATURAL JOIN이 명시되면 추가로 USING 조건절, ON 조건절, WHERE 절에서 조인 조건을 정의할 수 없다.
SELECT A.NAME, B.EMAIL, DEPT
FROM TABLE1 A NATURAL JOIN TABLE2 B
- DEPT라는 공통 컬럼을 자동으로 인식해 JOIN을 처리한 것이다.
- 조인에 사용된 칼럼들은 같은 데이터 유형이어야 한다.
- ALIAS나 테이블 명과 같은 접두사를 붙일 수 없다.
- 간혹 모델링상 부주의로 같은 칼럼명이어도, 다른 용도의 데이터를 저장하는 경우도 있으니 주의해서 사용해야 한다.
- INNER JOIN의 경우 첫번재 테이블, 두변째 테이블의 칼럼 순서대로 데이터가 출력된다.
- NATURAL JOIN은 조인에 사용된 같은 이름의 컬럼을 하나로 처리한다. (INNER는 별개)
- [*] 사용해 별도의 컬럼 순서를 지정하지 않으면, NATURAL JOIN의 기준이 되는 컬럼들이 다른 컬럼보다 먼저 출력된다.
USING 조건절
- FROM 절에 USING 조건절을 이요하면 같은 이름을 가진 컬럼들 중 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있다.
- SQL Server는 지원하지 않는다.
SELECT *
FROM TABLE1 JOIN TABLE2
USING (COLUMN_NAME)
- 별도의 컬럼순서를 정하지 않으면 USING 조건절의 기준이 되는 컬럼이 먼저 출력된다.
- USING JOIN은 조인에 사용된 같은 이름의 컬럼을 하나로 처리한다.
- USING 조건절에서 사용한 조인 컬럼에 대해 ALIAS 나 테이블이름과 같은 접두사를 붙일 수 없다.
ON 조건절
- NATURAL JOIN과 달리 이름이 다른 컬럼명을 조인 조건으로 사용한다.
- ON 조건절에선 ALIAS나 테이블명과 같은 접두사를 명확하게 지정해줘야 한다.
CROSS JOIN
- 테이블간 조인 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
- 즉, 양쪽 집합의 M*N 건의 데이터 조합이 발생한다.
FULL OUTER JOIN
- RIGHT JOIN과 LEFT JOIN의 결과를 합집합으로 처리한 결과와 동일하다.
- 단, 조인에 성공한 행들은 한 번만 표시한다.
'학교 > SQLD' 카테고리의 다른 글
[SQLD] 2.2.4~8 SQL 활용 (0) | 2025.01.06 |
---|---|
[SQLD] 2.2.1~3 SQL 활용 (0) | 2024.12.23 |
[SQLD] 1.2.2 조인 / 1.2.3 모델이 표현하는 트랜잭션의 이해 / 1.2.4 Null 속성의 이해 / 1.2.5 본질식별자 vs. 인조식별자 (0) | 2024.12.19 |
[SQLD] 1.2.1 정규화 (3) | 2024.12.18 |
[SQLD] 1.1.4. 관계 / 1.1.5. 식별자 (0) | 2022.03.09 |