Iriton's log
[SQLD] SQL 기본 본문
*본 포스트는 '유선배 SQL개발자 과외노트' 도서를 참고하여 작성되었습니다.
01. 관계형 데이터베이스 개요
- 데이터베이스
- 용도와 목적에 맞는 데이터들끼리 모아서 저장
- 여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합
- 관계형 데이터베이스
- RDB(Relational Database)
- 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것으로 시작
- RDBMS는 이러한 RDB를 관리감독하기 위한 시스템
- Oracle, SQL Server, MySQL 등등
- TABLE
- 세로 열을 Column
- 가로 행을 Row
- 관계형 데이터베이스의 기본 단위
- 일반적으로 데이터베이스는 여러 개의 테이블로 구성
- 테이블 형태로 데이터 조회/변경
- SQL(Structured Query Language)
- DB에서 데이터를 다루기 위해 사용하는 언어
02. SELECT 문
- SELECT
SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 컬럼1='아무개';
-
- 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
- 컬럼을 따로 명시하지 않고 *(asterisk)를 쓰면 전체 컬럼이 조회
- 조회되는 컬럼의 순서는 테이블 컬럼의 순서와 동일
- WHERE 절이 별도로 없을 경우에 전체 Row가 조회
SELECT * FROM 테이블
- 테이블명이나 컬럼명에 별도의 Allias를 붙일 수 있다.
- 여러 개의 테이블을 JOIN 하거나 서브 쿼리가 있을 때 컬럼명 앞에 테이블 명을 같이 명시해야 하는 경우, 테이블명은 비교적 길기 때문에 짧게 줄여 쓰기 위함.
- Alias를 붙일 때는 앞에 AS를 넣어도 되고 넣지 않아도 된다.
- 테이블명에서 Alias를 설정했을 경우 테이블명 대신 Alias를 사용해야 한다.
- ex) SELECT TAB.COL FROM TAB T WHERE COL=’A’; → 문법 에러 발생
-
SELECT BAND.BAND_NAME, BAND_MEMBER.MEMBER_NAME FROM BAND, BAND_MEMBER WHERE BAND.BAND_CODE = BAND_MEMBER.BAND_CODE;
- Alias 적용 후
-
SELECT B.BAND_NAME, BM.MEMBER_NAME FROM BAND B, BAND_MEMBER BM WHERE B.BAND_CODE = BM.BAND_CODE;
- 산술 연산자
- 수학에서 사용하는 사칙연산의 기능을 가진 연산자
- NUMBER DATE 유형의 데이터와 같이 사용할 수 있다.
*연산에서 NULL이 포함되어 있으면 결과값은 NULL이 된다.
- 합성 연산자
- 문자와 문자를 연결할 때 사용하는 연산자
03. 함수
(1) 문자 함수
- CHR(ASCII 코드)
- ASCII 코드로 인수를 입력했을 때 매핑되는 문자가 무엇인지 알려주는 함수
- LOWER(문자열)
- 문자열을 소문자로 변환
- UPPER(문자열)
- 문자열을 대문자로 변환
- LTRIM(문자열 [, 특정문자]) *[ ]는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 왼쪽 공백을 제거
- 명시해주었을 경우 문자열을 왼쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- RTRIM(문자열 [, 특정문자]) *[ ]는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 오른쪽 공백을 제거
- 명시해주었을 경우 문자열을 오른쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- TRIM([위치] [특정 문자] [FROM] 문자열) *[ ]는 옵션
- 옵션이 하나도 없을 경우 문자열의 왼쪽과 오른쪽 공백을 제거
- 그렇지 않을 경우 문자열을 위치(LEADING or TRAILING or BOTH)로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- SUBSTR(문자열, 시작점 [, 길이]) *[ ]는 옵션
- 문자열의 원하는 부분만 잘라서 반환
- 길이를 명시하지 않았을 경우 문자열의 시작점부터 문자열의 끝까지 반환
- SQL Server(MSSQL)의 경우 SUBSTRING(문자열)
- LENGTH(문자열)
- 문자열의 길이를 반환
- REPLACE(문자열, 변경 전 문자열 [, 변경 후 문자열]) *[ ]는 옵션
- 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿈
- 변경 후 문자열을 명시해 주지 않으면 문자열에서 변경 후 문자열을 제거
- LPAD(문자열, 길이, 문자)
- 문자열이 설정한 길이가 될 때까지 왼쪽을 특정 문자로 채우는 함수
(2) 숫자 함수
- ABS(수)
- 수의 절댓값 반환
- SIGN(수)
- 수의 부호를 반환
- 0이면 0 반환
- ROUND(수 [, 자릿수])
- 수를 지정된 소수점 자릿수까지 반올림하여 반환
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 반올림된 정수로 반환
- 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환
- TRUNC(수 [, 자릿수])
- 수를 지정된 소수점 자릿수까지 버림하여 반환
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 버림된 정수로 반환
- 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환
- CEIL(수)
- 소수점 이하의 수를 올림한 정수를 반환해주는 함수
- FLOOR(수)
- 소수점 이하의 수를 버림한 정수를 반환
- MOD(수1, 수2)
- 수1을 수2로 나눈 나머지를 반환
(3) 날짜 함수
- SYSDATE
- 현재의 연 월 일 시 분 초를 반환
- nls_date_format에 따라서 sysdate의 출력 양식은 달라질 수 있음.
- EXTRACT(특정 단위 FROM 날짜 데이터)
- 특정 단위(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)만 출력해서 반환
- ADD_MONTHS(날짜 데이터, 특정 개월 수)
- 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환
- 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 반환
(4) 변환 함수
명시적 형변환 함수
- TO_NUMBER(문자열)
- 문자열을 숫자로
- TO_CHAR(수 OR 날짜 [, 포맷])
- 수나 날짜형의 데이터를 포맷 형식의 문자형으로
- TO_DATE(문자열, 포맷)
- 포맷 형식의 문자형의 데이터를 날짜형으로
(5) NULL 관련 함수
- NVL(인수1, 인수2)
- 인수1의 값이 NULL일 경우 인수2를 반환
- NULL이 아닐 경우 인수1을 반환
- NULLIF(인수1, 인수2)
- 인수1과 인수2가 같으면 NULL을 반환
- 같지 않으면 인수1을 반환
- COALESCE(인수1, 인수2, 인수3 …)
- NULL이 아닌 최초의 인수를 반환
- NVL2(인수1, 인수2, 인수3)
- 인수1이 NULL이 아닌 경우 인수2를 반환하고 NULL인 경우 인수3을 반환
(6) CASE
- 함수와 성격이 같긴 하지만 표현 방식이 구문에 가깝다.
- 문장으로 ~이면 ~이고, ~이면 ~이다. 식으로 표현되는 구문
- 필요에 따라 각 CASE를 여러 개로 늘릴 수 있다.
04. WHERE 절
INSERT를 제외한 DML문을 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문
(1) 비교 연산자
연산자 | 의미 |
= | 같음 |
< | 작음 |
≤ | 작거나 같음 |
> | 큼 |
≥ | 크거나 같음 |
(2) 부정 비교 연산자
연산자 | 의미 |
!= | 같지 않음 |
^= | 같지 않음 |
<> | 같지 않음 |
not 칼럼명 = | 같지 않음 |
not 칼럼명 > | 크지 않음 |
(3) SQL 연산자
연산자 | 의미 |
BETWEEN A AND B | A와 B의 사이(A,B 포함) |
LIKE ‘비교 문자열’ | 비교 문자열을 포함 %는 문자열을 의미 _는 하나의 문자를 의미 |
IN (LIST) | LIST 중 하나와 일치 |
IS NULL | NULL 값 |
(4) 부정 SQL 연산자
연산자 의미
NOT BETWEEN A AND B | A와 B의 사이 아님(A,B 미포함) |
NOT IN (LIST) | LIST 중 일치하는 것이 없음 |
IS NOT NULL | NULL 값이 아님 |
(5) 논리 연산자
02. SELECT 문
- SELECT
- 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
- 컬럼을 따로 명시하지 않고 *(asterisk)를 쓰면 전체 컬럼이 조회
- 조회되는 컬럼의 순서는 테이블 컬럼의 순서와 동일
- WHERE 절이 별도로 없을 경우에 전체 Row가 조회
SELECT * FROM 테이블
- 테이블명이나 컬럼명에 별도의 Allias를 붙일 수 있다.
- 여러 개의 테이블을 JOIN 하거나 서브 쿼리가 있을 때 컬럼명 앞에 테이블 명을 같이 명시해야 하는 경우, 테이블명은 비교적 길기 때문에 짧게 줄여 쓰기 위함.
- Alias를 붙일 때는 앞에 AS를 넣어도 되고 넣지 않아도 된다.
- 테이블명에서 Alias를 설정했을 경우 테이블명 대신 Alias를 사용해야 한다.
- ex) SELECT TAB.COL FROM TAB T WHERE COL=’A’; → 문법 에러 발생
- SELECT B.BAND_NAME, BM.MEMBER_NAME FROM BAND B, BAND_MEMBER BM WHERE B.BAND_CODE = BM.BAND_CODE;
- SELECT BAND.BAND_NAME, BAND_MEMBER.MEMBER_NAME FROM BAND, BAND_MEMBER WHERE BAND.BAND_CODE = BAND_MEMBER.BAND_CODE;
- SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 컬럼1='아무개';
- 산술 연산자
- 수학에서 사용하는 사칙연산의 기능을 가진 연산자
- NUMBER DATE 유형의 데이터와 같이 사용할 수 있다.
- *연산에서 NULL이 포함되어 있으면 결과값은 NULL이 된다.
- 합성 연산자
- 문자와 문자를 연결할 때 사용하는 연산자
03. 함수
(1) 문자 함수
- CHR(ASCII 코드)
- ASCII 코드로 인수를 입력했을 때 매핑되는 문자가 무엇인지 알려주는 함수
- LOWER(문자열)
- 문자열을 소문자로 변환
- UPPER(문자열)
- 문자열을 대문자로 변환
- LTRIM(문자열 [, 특정문자]) *[ ]는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 왼쪽 공백을 제거
- 명시해주었을 경우 문자열을 왼쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- RTRIM(문자열 [, 특정문자]) *[ ]는 옵션
- 특정 문자를 따로 명시해주지 않으면 문자열의 오른쪽 공백을 제거
- 명시해주었을 경우 문자열을 오른쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- TRIM([위치] [특정 문자] [FROM] 문자열) *[ ]는 옵션
- 옵션이 하나도 없을 경우 문자열의 왼쪽과 오른쪽 공백을 제거
- 그렇지 않을 경우 문자열을 위치(LEADING or TRAILING or BOTH)로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춤
- SQL Server(MSSQL)의 경우 공백 제거만 가능
- SUBSTR(문자열, 시작점 [, 길이]) *[ ]는 옵션
- 문자열의 원하는 부분만 잘라서 반환
- 길이를 명시하지 않았을 경우 문자열의 시작점부터 문자열의 끝까지 반환
- SQL Server(MSSQL)의 경우 SUBSTRING(문자열)
- LENGTH(문자열)
- 문자열의 길이를 반환
- REPLACE(문자열, 변경 전 문자열 [, 변경 후 문자열]) *[ ]는 옵션
- 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿈
- 변경 후 문자열을 명시해 주지 않으면 문자열에서 변경 후 문자열을 제거
- LPAD(문자열, 길이, 문자)
- 문자열이 설정한 길이가 될 때까지 왼쪽을 특정 문자로 채우는 함수
(2) 숫자 함수
- ABS(수)
- 수의 절댓값 반환
- SIGN(수)
- 수의 부호를 반환
- 0이면 0 반환
- ROUND(수 [, 자릿수])
- 수를 지정된 소수점 자릿수까지 반올림하여 반환
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 반올림된 정수로 반환
- 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환
- TRUNC(수 [, 자릿수])
- 수를 지정된 소수점 자릿수까지 버림하여 반환
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 버림된 정수로 반환
- 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환
- CEIL(수)
- 소수점 이하의 수를 올림한 정수를 반환해주는 함수
- FLOOR(수)
- 소수점 이하의 수를 버림한 정수를 반환
- MOD(수1, 수2)
- 수1을 수2로 나눈 나머지를 반환
(3) 날짜 함수
- SYSDATE
- 현재의 연 월 일 시 분 초를 반환
- nls_date_format에 따라서 sysdate의 출력 양식은 달라질 수 있음.
- EXTRACT(특정 단위 FROM 날짜 데이터)
- 특정 단위(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)만 출력해서 반환
- ADD_MONTHS(날짜 데이터, 특정 개월 수)
- 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환
- 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 반환
(4) 변환 함수
명시적 형변환 함수
- TO_NUMBER(문자열)
- 문자열을 숫자로
- TO_CHAR(수 OR 날짜 [, 포맷])
- 수나 날짜형의 데이터를 포맷 형식의 문자형으로
- TO_DATE(문자열, 포맷)
- 포맷 형식의 문자형의 데이터를 날짜형으로
(5) NULL 관련 함수
- NVL(인수1, 인수2)
- 인수1의 값이 NULL일 경우 인수2를 반환
- NULL이 아닐 경우 인수1을 반환
- NULLIF(인수1, 인수2)
- 인수1과 인수2가 같으면 NULL을 반환
- 같지 않으면 인수1을 반환
- COALESCE(인수1, 인수2, 인수3 …)
- NULL이 아닌 최초의 인수를 반환
- NVL2(인수1, 인수2, 인수3)
- 인수1이 NULL이 아닌 경우 인수2를 반환하고 NULL인 경우 인수3을 반환
(6) CASE
- 함수와 성격이 같긴 하지만 표현 방식이 구문에 가깝다.
- 문장으로 ~이면 ~이고, ~이면 ~이다. 식으로 표현되는 구문
- 필요에 따라 각 CASE를 여러 개로 늘릴 수 있다.
04. WHERE 절
INSERT를 제외한 DML문을 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문
(1) 비교 연산자
연산자 의미
= | 같음 |
< | 작음 |
≤ | 작거나 같음 |
> | 큼 |
≥ | 크거나 같음 |
(2) 부정 비교 연산자
연산자 의미
!= | 같지 않음 |
^= | 같지 않음 |
<> | 같지 않음 |
not 칼럼명 = | 같지 않음 |
not 칼럼명 > | 크지 않음 |
(3) SQL 연산자
연산자 의미
BETWEEN A AND B | A와 B의 사이(A,B 포함) |
LIKE ‘비교 문자열’ | 비교 문자열을 포함 |
%는 문자열을 의미 | |
_는 하나의 문자를 의미 | |
IN (LIST) | LIST 중 하나와 일치 |
IS NULL | NULL 값 |
(4) 부정 SQL 연산자
연산자 | 의미 |
NOT BETWEEN A AND B | A와 B의 사이 아님(A,B 미포함) |
NOT IN (LIST) | LIST 중 일치하는 것이 없음 |
IS NOT NULL | NULL 값이 아님 |
(5) 논리 연산자
연산자 | 의미 |
AND | 모든 조건이 TRUE |
OR | 하나 이상의 조건이 TRUE |
NOT | TRUE면 FALSE, FALSE면 TRUE |
05. GROUP BY, HAVING 절
(1) GROUP BY
- 데이터를 그룹별로 묶을 수 있도록 해주는 절
- GROUP 뒤에 수단의 전치사인 BY가 붙었기 때문에 GROUP BY 뒤에는 그룹핑의 기준이 되는 컬럼이 오게 됨.
- 컬럼은 하나가 될 수도 있고 그 이상이 될 수도 있다.
(2) 집계 함수
- 데이터를 그룹별로 나누면 그룹별로 집계 데이터를 도출하는 것이 가능해진다.
COUNT(*) 전체 Row를 Count
COUNT(컬럼) | 컬럼값이 NULL인 Row를 제외하고 Count하여 반환 |
COUNT(DISTINCT 컬럼) | 컬럼값이 NULL이 아닌 Row에서 중복을 제거한 Count를 반환 |
SUM(컬럼) | 컬럽값들의 합계를 반환 |
AVG(컬럼) | 컬럼값들의 평균을 반환 |
MIN(컬럼) | 컬럼값들의 최솟값을 반환 |
MAX(컬럼) | 컬럼값들의 최댓값을 반환 |
(3) HAVING
- GROUP BY 절을 사용할 때 WHERE 절처럼 사용하는 조건절
- 주로 데이터를 그룹핑 한 후 특정 그룹을 골라낼 때 사용
- 논리적으로 GROUP BY 절 이후에 수행되기 때문에 그룹핑 후에 가능한 집계 함수로 조건을 부여할 수 있다.
- 또한 논리적으로 SELECT 절 전에 수행되기 때문에 SELECT 절에 명시되지 않은 집계 함수로도 조건을 부여할 수 있다.
- 주의할 점은 WHERE 절을 사용해도 되는 조건까지 HAVING 절로 써버리면 성능상 불리할 수 있다.(오류는 안 난다)
- WHERE 절에 필터링이 선행되어야 GROUP BY를 할 데이터량이 줄어들기 때문이다.
- GROUP BY는 비교적 많은 비용이 드는 작업이므로 수행 전에 데이터량을 최소로 줄여놓는 것이 바람직하다.
06. ORDER BY 절
(1) ORDER BY
- SELECT 문에서 논리적으로 맨 마지막에 수행
- ORDER BY 절을 사용하여 SELECT한 데이터를 정렬할 수 있으며 ORDER BY 절을 따로 명시하지 않으면 데이터는 임의의 순서대로 출력
- ORDER BY 절 뒤에는 정렬의 기준이 되는 컬럼이 오게 되는데 컬럼은 하나가 될 수도 있고 그 이상이 될 수도 있다.
- ORDER BY 절 뒤에 오는 칼럼에는 옵션이 붙을 수 있으며 종류는 다음과 같다.
- ASC: 오름차순(Ascending)
- DESC: 내림차순(Descending)
- 옵션 생략 시 ASC가 기본값이 된다.
07. JOIN
(1) JOIN이란?
- 각기 다른 테이블을 한 번에 보여줄 때 쓰는 쿼리
(2) EQUI JOIN
- Equal 조건으로 JOIN하는 것으로 가장 흔히 볼 수 있는 JOIN 방식
(3) Non EQUI JOIN
- Equal 조건이 아닌 다른 조건으로 JOIN하는 방식
(4) 3개 이상 TABLE JOIN
- 좀 더 확장하여 3개 이사의 테이블을 JOIN 가능
(5) OUTER JOIN
- JOIN 조건에 만족하지 않는 행들도 출력되는 형태
08. STANDARD JOIN
(1) INNER_JOIN
- JOIN 조건에 충족하는 데이터만 출력되는 방식
- SQL과의 차이점은 JOIN 조건을 ON 절을 사용하여 작성해야 한다는 점
(2) OUTER_JOIN
- JOIN 조건에 충족하는 데이터
- OUTER JOIN에는 몇 가지 종류가 있는데 이는 JOIN 조건에 충족하지 않지만 출력이 되는 데이터를 판별하는 기준
- LEFT OUTER JOIN
- SQL에서 왼쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN
- 오른쪽 테이블에 JOIN 되는 데이터가 있든지 말든지 일단 나는 출력되고 본다는 식.
- RIGHT OUTER JOIN
- SQL에서 오른쪽에 표기된 테이블의 데이터는 무조건 출력되는 방식
- 왼쪽 테이블에 JOIN되는 데이터가 있든지 말든지 일단 나는 출력되고 본다는 식
- 대신 왼쪽 테이블에 JOIN되는 데이터가 없는 Row들은 왼쪽 테이블 컬럼의 값이 NULL
- FULL OUTER JOIN
- 왼쪽, 오른쪽 테이블의 데이터가 모두 출력되는 방식
- LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합
- NATURAL JOIN
- A 테이블과 B 테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN이 되는 방식
- CROSS JOIN
- 비슷한 맥락으로 CROSS JOIN은 A 테이블과 B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식
'DataBase > Study' 카테고리의 다른 글
[SQLD] SQL 활용 (0) | 2024.05.22 |
---|---|
[SQLD] 데이터 모델과 SQL (0) | 2024.03.26 |
[SQLD] 데이터 모델링의 이해 (1) | 2024.03.26 |
Comments