[SQL] 2. SQL 기본 및 활용 - Chapter 1. SQL 기본 ① 관계형 데이터베이스. SELECT, 함수
2023 유선배 SQL개발자(SQLD) 과외노트를 읽고 내용을 정리한 글입니다.
관계형 데이터베이스 개요
관계형 데이터베이스 (RDB, Relational Database)
: 관계형 데이터 모델에 기초를 둔 데이터베이스
- 관계형 데이터베이스에서의 설계는 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것으로 시작된다.
RDBMS (Relational Database Management System)
: RDB를 관리 ㆍ감독하기 위한 시스템
- Oracle, SQL Server(MSSQL), MySQL, MariaDB, PostgreSQL 등
TABLE
- 관계형 데이터베이스에서는 모든 데이터를 2차원 테이블 형태로 표현한다.
- 테이블은 관계형 데이터베이스의 기본 단위이고, 일반적으로 데이터베이스는 여러 개의 테이블로 구성된다.
- 엑셀 작성 시 흔히 이용하는 표 형식을 떠올리면 된다.
- 세로 열을 Column(컬럼)이라고 한다.
- 가로 행을 Row(로우)라고 한다.
- 데이터를 저장하는 주된 목적은 데이터를 활용하는 데에 있고 우리는 그것을 테이블 형태로 조회하고 변경하고 삭제할 수 있다.
SQL (Structured Auery Language)
: 관계형 데이터베이스에서 데이터를 다루기 위해 사용하는 언어
SELECT문
SELECT
: 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
SELECT 컬럼1, 컬럼2, . . .
FROM 테이블 WHERE 컬럼1 = '아무개';
- 컬럼을 따로 명시하지 않고 * 을 쓰면 전체 컬럼이 조회된다.
- 조회되는 컬럼의 순서는 테이블의 컬럼 순서와 동일하다.
- 별도의 WHERE절이 없으면 테이블의 전체 Row가 조회된다.
SELECT * FROM 테이블;
- 테이블명이나 컬럼명에 별도의 별칭을 붙여줄 수 있다.
- 여러 개의 테이블을 JOIN하거나 서브쿼리가 있을 때 컬럼명 앞에 테이블명을 같이 명시해야 하는 경우 테이블명은 비교적 길기 때문에 짧게 줄여 쓰기 위해 별칭을 붙여준다.
SELECT BAND.BAND_NAME, BAND_MEMBER.MEMBER_NAME
FROM BAND, BAND_MEMBER
WHERE BAND.BAND_CODE = BAND_MEMBER.BAND_CODE;
↓
SELECT B.BAND_NAME, BM.MEMBER_NAME
FROM BAND B, BAND_MEMBER BM
WHERE B.BAND_CODE = BM.BAND_CODE;
산술 연산자
: 수학에서 사용하는 사칙연산의 기능을 가진 연산자
연산자 | 의미 | 우선순위 |
( ) | 괄호로 우선순위를 조정할 수 있음 | 1 |
* | 곱하기 | 2 |
/ | 나누기 | |
+ | 더하기 | 3 |
- | 빼기 |
합성 연산자 ( || )
: 문자와 문자를 연결할 때 사용하는 연산자
SELECT 'S'||'Q'||'L'||'개'||'발'||'자'|| AS SQLD
FROM DUAL;
▽ 결과
SQLD | |
1 | SQL개발자 |
함수
문자함수
CHR(ASCII 코드)
: ASCII 코드를 인수로 입력했을 때 매핑되는 문자가 무엇인지 알려주는 함수
- ASCII 코드는 총 128개의 문자를 숫자로 표현할 수 있도록 정의해 놓은 코드
SELECT CHR(65) FROM DUAL;
▽ 결과
CHR(65) | |
1 | A |
LOWER(문자열)
: 문자열을 소문자로 변환해주는 함수
SELECT LOWER('JENNIE') FROM DUAL;
▽ 결과
LOWER('JENNIE') | |
1 | jennie |
UPPER(문자열)
: 문자열을 대문자로 변환해주는 함수
SELECT UPPER('JENNIE') FROM DUAL;
▽ 결과
UPPER('JENNIE') | |
1 | JENNIE |
LTRIM(문자열 [,특정문자])
[ ]는 옵션
: 특정 문자를 따로 명시해주지 않으면 문자열의 왼쪽 공백을 제거하고, 명시해주었을 경우 문자열을 왼쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않으면 멈춘다.
- MSSQL의 경우 공백 제거만 가능하다.
SELECT LTRIM(' JENNIE') FROM DUAL;
SELECT LTRIM('블랙핑크', '블랙') FROM DUAL;
▽ 결과
LTRIM(' JENNIE') | |
1 | JENNIE |
LTRIM('블랙핑크','블랙') | |
1 | 핑크 |
RTRIM(문자열 [,특정문자])
[ ]는 옵션
: 특정 문자를 따로 명시해주지 않으면 문자열의 오른쪽 공백을 제거하고, 명시해주었을 경우 문자열을 오른쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않으면 멈춘다.
- MSSQL의 경우 공백 제거만 가능하다.
SELECT RTRIM('JENNIE ') FROM DUAL;
SELECT RTRIM('블랙핑크', '핑크') FROM DUAL;
▽ 결과
RTRIM('JENNIE ') | |
1 | JENNIE |
RTRIM('블랙핑크','핑크') | |
1 | 블랙 |
TRIM([위치] [특정문자] [FROM] 문자열)
[ ]는 옵션
: 옵션이 하나도 없을 경우 문자열의 왼쪽과 오른쪽 공백을 제거하고, 그렇지 않을 경우 문자열을 위치(LEADING or TRAILING or BOTH)로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춘다. LTRIM, RTRIM과 달리 특정 문자는 한 글자씩만 지정할 수 있다.
- MSSQL의 경우 공백 제거만 가능하다.
SELECT TRIM(' JENNIE ') FROM DUAL;
SELECT TRIM(LEADING '블' FROM '블랙핑크') FROM DUAL;
SELECT TRIM(TRAILING '크' FROM '블랙핑크') FROM DUAL;
▽ 결과
TRIM(' JENNIE ') | |
1 | JENNIE |
TRIM(LEADING '블' FROM '블랙핑크') | |
1 | 랙핑크 |
TRIM(TRAILING '크' FROM '블랙핑크') | |
1 | 블랙핑 |
SUBSTR(문자열, 시작점 [,길이] )
[ ]는 옵션
: 문자열의 원하는 부분만 잘라서 변환해주는 함수
- 길이를 명시하지 않았을 경우 문자열의 시작점부터 문자열의 끝까지 반환된다.
- MSSQL의 경우 SUBSTRING(문자열)
SELECT SUBSTR('블랙핑크제니',3,2) FROM DUAL;
SELECT SUBSTR('블랙핑크제니',3,4) FROM DUAL;
▽ 결과
SUBSTR('블랙핑크제니',3,2) | |
1 | 핑크 |
SUBSTR('블랙핑크제니',3,4) | |
1 | 핑크제니 |
LENGTH(문자열)
[ ]는 옵션
: 문자열의 길이를 반환해주는 함수
- MSSQL의 경우 LEN(문자열)
SELECT LENGTH('JENNIE') FROM DUAL;
▽ 결과
LENGTH('JENNIE') | |
1 | 6 |
REPLACE(문자열, 변경 전 문자열 [,변경 후 문자열])
[ ]는 옵션
: 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿔주는 함수
- 변경 후 문자열을 명시해주지 않으면 문자열에서 변경 전 문자열을 제거한다.
SELECT REPLACE('블랙핑크제니','제니','지수') FROM DUAL;
SELECT REPLACE('블랙핑크제니','블랙') FROM DUAL
▽ 결과
REPLACE('블랙핑크제니','제니','지수') | |
1 | 블랙핑크지수 |
REPLACE('블랙핑크제니','블랙') | |
1 | 핑크제니 |
숫자 함수
ABS(수)
: 수의 절대값을 반환해주는 함수
SELECT ABS(-1) FROM DUAL;
▽ 결과
ABS(-1) | |
1 | 1 |
SIGN(수)
: 수의 부호를 반환해주는 함수
- 양수이면 1, 음수이면 -1, 0이면 0을 반환
SELECT SIIGN(-7) FROM DUAL;
▽ 결과
SIGN(-7) | |
1 | -1 |
ROUND(수 [,자릿수])
[ ]는 옵션
: 수를 지정된 소수점 자릿수까지 반올림하여 반환해주는 함수
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 반올림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환
SELECT ROUND(163.76,1) FROM DUAL;
SELECT ROUND(163.76,-2) FROM DUAL;
▽ 결과
ROUND(163.76,1) | |
1 | 163.8 |
ROUND(163.76,-2) | |
1 | 200 |
TRUNC(수 [,자릿수])
[ ]는 옵션
: 수를 지정된 소수점 버림하여 반환해주는 함수
- 자릿수를 명시하지 않았을 경우 기본값은 0이며 버림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환한다.
SELECT TRUNC(54.29,1) FROM DUAL;
SELECT TRUNC(54.29,-1) FROM DUAL;
▽ 결과
TRUNC(54.29,1) | |
1 | 54.2 |
TRUNC(54.29,-1) | |
1 | 50 |
CEIL(수)
: 소수점 이하의 수를 올림한 정수를 반환해주는 함수
- MSSQL의 경우 CEILING(문자열)
SELECT CEIL(72.86) FROM DUAL;
SELECT CEIL(-33.4) FROM DUAL;
▽ 결과
CEIL(72.86) | |
1 | 73 |
CEIL(-33.4) | |
1 | -33 |
FLOOR(수)
: 소수점 이하의 수를 버림한 정수를 반환해주는 함수
SELECT FLOOR(22.3) FROM DUAL;
SELECT FLOOR(-22.3) FROM DUAL;
▽ 결과
FLOOR(22.3) | |
1 | 22 |
FLOOR(-22.3) | |
1 | -23 |
MOD(수1, 수2)
: 수1을 수2로 나눈 나머지를 반환해주는 함수
SELECT MOD(15,7) FROM DUAL;
SELECT MOD(15,-4) FROM DUAL;
▽ 결과
MOD(15,7) | |
1 | 1 |
MOD(-15.-4) | |
1 | -3 |
날짜 함수
SYSDATE
: 현재의 연, 월, 시, 분, 초를 반환해주는 함수
- MSSQL의 경우 GETDATE()
SELECT SYSDATE FROM DUAL;
▽ 결과
SYSDATE | |
1 | 2023-03-11 12:57:08 |
EXTRACT(특정 단위 FROM 날짜 데이터)
: 날짜 데이터에서 특정 단위 (YEAR, DAY, HOUR, MINUTE, SECONDE)만을 출력해서 반환해주는 함수
- MSSQL의 경우 DATEPART(특정 단위, 날짜 데이터)
SELECT
EXTRACT ( YEAR FROM SYSDATE ) AS YEAR
EXTRACT ( MONTH FROM SYSDATE ) AS MONTH
EXTRACT ( DAY FROM SYSDATE ) AS DAY
FROM DUAL;
▽ 결과
YEAR | MONTH | DAY | |
1 | 2023 | 3 | 11 |
ADD_MONTHS(날짜 데이터, 특정 개월 수)
: 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환해주는 함수
- 날짜의 이전 달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 반환된다.
- MSSQL의 경우 DATEADD(특정 개월 수, 날짜 데이터)
SELECT
ADD_MONTHS(TO_DATE('2023-12-31','YYYY-MM-DD'),-1) AS PREV_MONTH
ADD_MONTHS(TO_DATE('2023-12-31','YYYY-MM-DD'),1) AS NEXT_MONTH
FROM DUAL;
▽ 결과
PREV_MONTH | NEXT_MONTH | |
1 | 2023-11-30 00:00:00 | 2024-01-31 00:00:00 |
변환 함수
명시적 형변환과 암시적 형변환
- 명시적 형변환
: 변환 함수를 사용하여 데이터 유형 변환을 명시적으로 나타냄
- TO_NUMBER(문자열) : 문자열 -> 숫자형
- TO_CHAR(수 or 날짜 [,포맷]) : 수나 날짜형의 데이터를 포맷 형식의 문자형으로 변환해주는 함수
- TO_DATE(문자열, 포맷) : 포맷 형식의 문자형의 데이터를 날짜형으로 변환해주는 함수
- 암시적 형변환
: 데이터베이스가 내부적으로 알아서 데이터 유형을 변환함
NULL 관련 함수
NVL(인수1, 인수2)
: 인수1의 값이 NULL일 경우 인수2를 반환하고, NULL이 아닐 경우 인수1을 반환해주는 함수
- MSSQL의 경우 ISNULL(인수1, 인수2)
NULLIF(인수1, 인수2)
: 인수1과 인수2가 같으면 NULL을 반환하고 같지 않으면 인수1을 반환해주는 함수
COALESCE(인수1, 인수2, 인수3 ...)
: NULL이 아닌 최초의 인수를 반환해주는 함수
CASE
- 함수와 성격이 같기는 하지만 표현 방식이 함수라기보다는 구문에 가깝다고 할 수 있다.
- 문장으로는 '~이면 ~이고, ~이면 ~이다' 식으로 표현되는 구문이고, 필요에 따라 각 CASE를 여러 개로 늘릴 수도 있다.
- 같은 기능을 하는 함수로는 Oracle의 DECODE 함수가 있다.