JOIN, UNION, 데이터베이스 생성하기
2024. 2. 27. 00:46ㆍBackend 취업준비/SQL
JOIN
- 두개 이상의 테이블을 엮어 결과를 얻어냄
- 테이블을 연결하려면 키가 있어야 한다
- 열을 기반으로 데이터 간의 연결을 수행한다. 두 테이블의 속성을 전부 합치고, 속성의 값이 없는 경우 자동으로 null이 할당된다
INNER JOIN
- JOIN만 작성하면 기본적으로 INNER JOIN
- 두 테이블에서 join condition을 만족하는 튜플들로 결과 테이블을 만듦
ON 뒤에 오는 join condition을 만족하는 튜플들을 가져온다 (비교연산자 = 말고도 <, >, != 등 가능) - 각 테이블의 튜플들을 조합한다
- 교집합과 비슷한 형태
OUTER JOIN
두 테이블에서 join condition을 만족하는 튜플들도 포함하여 결과 테이블을 만듦
UNION
- 두 개 이상의 SELECT 문의 결과 집합을 결합하여 단일 결과 집합으로 만드는 데 사용
- 주로 두 개 이상의 테이블이 아닌 단일 테이블에서 여러 조건에 따라 결과를 합치는 데 사용
- 결과 집합의 중복을 제거하는 DISTINCT와 함께 사용될 수 있다. 이렇게 하면 중복된 행이 제거되고 결과에는 고유한 행만 포함
- UNION ALL은 UNION과 비슷하지만 중복된 행을 제거하지 않고 모든 결과를 포함
- 서로 다른 조건에 따른 결과를 단일 결과 집합으로 만드는 데 유용
- UNION을 쓰기 보다 SELECT문을 잘 작성하여 처리할 수 도 있다
서브 쿼리
- select문에서의 사용 : 외부 SELECT 문에서 실행될 때마다 그 결과를 가져와서 각 행에 대해 쿼리의 결과에 포함시킨다
- from에서의 사용 : FROM절의 서브 쿼리의 경우 서브 쿼리의 결과를 마치 가상의 테이블처럼 사용
- where에서의 사용 : 서브 쿼리에서 조회한 이름만 필터링, 외부 쿼리의 조건에 의해 내부 쿼리에서 조회한 결과를 제한할 때 사용
테이블 생성
DDL
CREATE | 새로운 테이블을 생성 |
ALTER | 기존 테이블 구조 변경 |
DROP | 테이블 삭제 |
RENAME | 기존 테이블 이름 변경 |
TRUNCATE | 기존 테이블 초기화 |
예제로 많이 사용했던 학생 정보를 저장할 테이블을 생성하는 SQL 문
CREATE TABLE test_db.students (
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
address VARCHAR(255) NOT NULL
)
데이터베이스 이름 | 어떤 데이터베이스 하위에 테이블을 생성할 지 |
테이블 이름 | 생성하려는 테이블의 이름 |
열 | 열의 이름 |
데이터 타입 | 해당 열의 데이터 타입 (ex. 정수, 문자열, 날짜, …) |
제약조건 | [NOT NULL | DEFAULT | PRIMARY KEY] 등의 옵션을 줄 수 있다 |
데이터 타입
종류 | 설명 | |
정수 | 정수형 데이터를 저장 | INT |
부동 소수점 방식 | 정확하지 않다 | FLOAT, DOUBLE |
고정 소수점 방식 | 정확하다 | DECIMAL |
고정 크기 문자열 | 최대 몇 개의 문자를 가지는 문자열을 저장할 지 결정 저장된 문자열의 길이가 최대길이보다 작으면 나머지를 space로 채워서 저장 |
CHAR(n) |
가변 크기 문자열 | 최대 몇 개의 문자를 가지는 문자열을 저장할 지 결정 저장될 문자열 크기 만큼만 저장 |
VARCHAR(n) |
날짜 | 년 월 일을 저장 (2023-12-01) | DATE |
시간 | 시 분 초를 저장 (08:38:27) | TIME |
날짜와 시간 | 날짜 시간 같이 표현 (2023-12-01 08:38:27) | TIMESTAMP |
논리 | (true/false/null) | BOOL |
제약 조건
NOT NULL
|
해당 열에 NULL 값을 허용하지 않는다는 의미
|
DEFAULT
|
데이터를 입력 시 해당 열에 아무런 값도 입력되지 않은 경우 기본으로 사용할 값 지정
|
UNIQUE
|
UNIQUE로 설정된 열에는 중복된 값을 저장할 수 없다.
NULL은 중복 된다(postgresSQL, mySQL 외에 다른 RDBMS에서는 다를 수 있음) |
PRIMARY KEY
|
하나의 테이블에 있는 데이터들을 식별하기 위한 기준입니다.
|
FOREIGN KEY(외래키)
|
테이블간에 관계를 나타낼 때 사용하는 Key로, 다른 테이블의 기본키를 참조해 외래키로 사용합니다.
|
CHECK
|
속성 값 범위를 제한하고 싶을 때 사용
|
외래키 설정
기본 : FK와 PK와 도메인이 같아야 하고 PK에 없는 values를 FK가 값으로 가질 수 없다
RESTRICT
- 대부분의 DBMS 시스템에서는 DEFAULT 설정으로 RESTRICT가 적용
- 일반적으로 데이터 무결성을 유지하기 위해 가장 안전한 옵션
- 외래키 제약조건이 설정된 경우 참조된 행이 삭제되는 것을 방지하여 데이터 일관성을 유지
- RESTRICT 제약 조건을 사용하게 되는 경우, 자식 테이블의 모든 레코드를 삭제해야만 부모 테이블의 레코드를 삭제가능
- 자식 테이블의 행이 부모 테이블의 행을 참조하지 않는 상태가 된다면 부모 테이블의 해당 레코드를 삭제 가능
CASCADE
- 참조된 테이블의 레코드가 삭제될 때, 해당 레코드를 참조하는 다른 테이블의 레코드도 함께 삭제
- 즉, 부모 테이블의 행(row)이 삭제되면 관련된 자식 테이블의 행도 자동 삭제
- 자식 테이블의 행을 삭제하는 것은 부모 테이블의 행에 영향을 미치지 않음
- 자동 삭제가 되기 때문에 의도치 않은 삭제가 되지 않도록 주의해야 한다
SET NULL
- 해당 외래키의 속성값을 null로 대체
- 원천행이 사라지더라도 그걸 참조하는 행들은 원천행이 사라졌다는 흔적이 남은 채 남아있도록 하기 위해 set null을 사용한다
외래키 제약 조건에 대한 설명
- 외래키 제약 조건은 의존도를 높여준다
- 안전하게 테이블을 사용하고 싶을 때 좋은 기능이다
- 데이터 변경 작업이 예상되는 경우에는 불리할 수 있다
출처
'Backend 취업준비 > SQL' 카테고리의 다른 글
ALTER, index, DCL, 정규화 (2) | 2024.02.28 |
---|---|
SQL 기초 (0) | 2024.02.24 |