Database/SQL 개발자

[SQL] SQL 기본

IT수정 2024. 9. 11. 11:40

데이터베이스

데이터들을 저장하는 공간

 

관계형 데이터베이스

흔히 RDB(Relational Database)라고 불리는 관계형 데이터베이스는 말 그대로 관계형 데이터 모델에 기초를 둔 데이터베이스이다. 설계는 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것으로 시작된다. RDBMS는 이러한 RDB를 관리, 감독하기 위한 시스템이며, 우리가 익히 알고 있는 Oracle, SQL Server, MySQL 등이 이에 속한다.

 

TABLE

테이블은 관계형 데이터베이스의 기본 단위이고 일반적으로 데이터베이스는 여러 개의 테이블로 구성된다. 이렇게 데이터를 저장하는 주된 목적은 데이터를 활용하는 데에 있고 우리는 그것을 테이블 형태로 조회하고 변경하고 삭제할 수 있다.

 

SQL(Structure Query Language)

관계형 데이터베이스에서 데이터를 다루기 위해 사용하는 언어

 

SELECT 문

저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어

SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 컬럼1 = '아무개';

 

칼럼을 따로 명시하지 않고 * (asterisk)를 쓰면 전체 칼럼이 조회되며 조회되는 칼럼의 순서는 테이블의 칼럼의 순서와 동일하다. 그리고 별도의 WHERE 절이 없으면 테이블 전체 Row가 조회된다.

SELECT * FROM 테이블;

 

테이블명이나 컬럼명에 별도의 별칭(Alias)을 붙여줄 수 있는데, 붙여주는 목적은 이름이 너무 길 경우 짧게 줄여 쓰기 위해서이다.

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 AS B, BAND_MEMBER AS BM
WHERE B.BAND_CODE = BM.BAND_CODE;

 

산술 연산자

수학에서 사용하는 사칙연산의 기능을 가진 연산자

연산자 의미 우선순위
() 괄호로 우선순위를 조정할 수 있음 1
* 곱하기 2
/ 나누기
+ 더하기 3
- 빼기

 

합성 연산자

문자와 문자를 연결할 때 사용하는 연산자

SELECT 'S'||'Q'||'L' AS SQL FROM DUAL; -- SQL

 

문자 함수

1. CHR(ASCII 코드)

ASCII 코드는 총 128개의 문자를 숫자로 표현할 수 있도록 정의해 놓은 코드이다. CHR(= CHAR) 함수는 ASCII 코드를 인수로 입력했을 때 매핑되는 문자가 무엇인지를 알려주는 함수이다.

 

2. LOWER(문자열)

문자열을 소문자로 변환해주는 함수

 

3. UPPER(문자열)

문자열을 대문자로 변환해주는 함수

 

4. LTRIM(문자열 [,특정 문자]) *[]는 옵션

특정 문자를 따로 명시해주지 않으면 왼쪽 공백을 제거. 명시했을 경우 문자열을 왼쪽부터 한 글자씩 특정 문자와 비교하여 특정 문자에 포함되어 있으면 제거하고 포함되지 않았으면 멈춘다.

SELECT LTRIM('블랙핑크', '블랙') FROM DUAL; -- 핑크

 

5. RTRIM(문자열 [,특정 문자]) *[]는 옵션

LTRIM와 똑같은 기능을 하며 오른쪽 공백을 제거한다는 차이점이 있다.

SELECT RTRIM('블랙핑크', '핑크') FROM DUAL; -- 블랙

 

6. TRIM([위치] [특정 문자] [FROM] 문자열) *[]는 옵션

옵션이 하나도 없을 경우 문자열의 왼쪽 오른쪽 공백을 제거하고, 그렇지 않을 경우 문자열을 위치로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춘다. LTRIM, RTRIM과는 달리 특정 문자는 한 글자만 지정할 수 있다.

SELECT TRIM(LEADING '블' FROM '블랙핑크') FROM DUAL; -- 랙핑크
SELECT TRIM(TRAILING '크' FROM '블랙핑크') FROM DUAL; -- 블랙핑

 

7. SUBSTR(문자열, 시작점 [,길이])

문자열의 원하는 부분만 잘라서 반환해 주는 함수. 길이를 명시하지 않았을 경우 끝까지 반환

SELECT SUBSTR('블랙핑크제니', 3, 2) FROM DUAL; -- 핑크

 

8. LENGTH(문자열)

문자열의 길이를 반환해주는 함수

SELECT LENGTH('JENNIE') FROM DUAL; -- 6

 

9. REPLACE(문자열, 변경 전 문자열 [, 변경 후 문자열])

문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿔주는 함수. 변경 후 문자열을 명시하지 않으면 문자열에서 변경 전 문자열을 제거한다.

SELECT REPLACE('블랙핑크제니', '제니', '지수') FROM DUAL; -- 블랙핑크지수
SELECT REPLACE('블랙핑크제니', '블랙') FROM DUAL; -- 핑크제니

 

숫자 함수

1. ABS(수)

수의 절댓값을 반환해 주는 함수

SELECT ABS(-1) FROM DUAL; -- 1

 

2. SIGN(수)

수의 부호를 반환해주는 함수. 양수이면 1, 음수이면 -1, 0이면 0을 반환

SELECT SIGN(-7) FROM DUAL; -- -1
SELECT SIGN(7) FROM DUAL; -- 1

 

3. ROUND(수, [, 자릿수])

수를 지정된 소수점 자릿수까지 반올림하여 반환해 주는 함수. 자릿수를 명시하지 않았을 경우 기본값은 0이며 반올림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부를 반올림하여 반환

SELECT ROUND(163.76, 1) FROM DUAL; -- 163.8
SELECT ROUND(163.76, -2) FROM DUAL; -- 200

 

4. TRUC(수 [, 자릿수])

수를 지정된 소수점 자릿수까지 버림 하여 반환해주는 함수. 자릿수를 명시하지 않았을 경우 기본값은 0이며 버림된 정수로 반환하고 자릿수가 음수일 경우 지정된 정수부에서 버림하여 반환

SELECT TRUNC(54.29, 1) FROM DUAL; -- 54.2
SELECT TRUNC(54.29, -1) FROM DUAL; -- 50

 

5. CEIL(수)

소수점 이하의 수를 올림 한 정수를 반환해 주는 함수

SELECT CEIL(72.86) FROM DUAL; -- 73
SELECT CEIL(-33.4) FROM DUAL; -- -33

 

6. FLOOR(수)

소수점 이하의 수를 버림 한 정수를 반환해 주는 함수

SELECT FLOOR(22.3) FROM DUAL; -- 22
SELECT FLOOR(-22.3) FROM DUAL; -- -23

 

7. MOD(수 1, 수 2)

수 1을 수 2로 나눈 나머지를 반환해 주는 함수. 두 번째 인자값이 0이면 첫 번째 인자값이 결과로 도출된다. 또한 두 인자값이 모두 음수이면 나머지도 그대로 음수값으로 도출된다.

SELECT MOD(15, 7) FROM DUAL; -- 1

 

날짜 함수

1. SYSDATE

현재의 연, 월, 일, 시, 분, 초를 반환

 

2. EXTRACT(특정 단위 FROM 날짜 데이터)

날짜 데이터에서 특정 단위만을 출력해서 반환해주는 함수

SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;

 

3. ADD_MONTHS(날짜 데이터, 특정 개월수)

날짜 데이터에서 특정 개월수를 더한 날짜를 반환해주는 함수. 날짜의 이전 달이나 다음 달에 기준 날짜의 일자가 존재하지 않으면 해당 월의 마지막 일자가 반환된다.

SELECT ADD_MONTHS(TO_DATE('2021-12-31', 'YYYY-MM-DD'), -1) FROM DUAL; -- 2021-11-30

 

변환 함수

형변환

암시적 형변환 : 데이터베이스가 내부적으로 알아서 데이터 유형을 변환

명시적 형변환 : 변환 함수를 사용하여 데이터 유형 변환을 명시적으로 나타냄

 

1. TO_NUMBER(문자열)

문자열을 숫자형으로 변환해 주는 함수

SELECT TO_NUMBER('1234') FROM DUAL;

 

2. TO_CHAR(수 or 날짜 [, 포맷])

수나 날짜형의 데이터를 포맷 형식의 문자형으로 변환해주는 함수

SELECT TO_CHAR(1234) FROM DUAL;

 

3. TO_DATE(문자열, 포맷)

포맷 형식의 문자형의 데이터를 날짜형으로 변환해주는 함수

포맷 표현 의미 포맷 표현 의미
YYYY HH 시(12)
MM HH24 시(24)
DD MI
    SS

 

SELECT TO_DATE('20210602', 'YYYYMMDD') FROM DUAL; -- 2021-06-02

 

NULL 관련 함수

1. NVL(인수 1, 인수 2) = ISNULL

인수 1의 값이 NULL일 경우 인수 2를 반환하고 NULL이 아닐 경우 인수 1을 반환해 주는 함수

 

2. NULLIF(인수 1, 인수 2)

인수 1과 인수 2가 같으면 NULL을 반환하고 같지 않으면 인수 1을 반환해 주는 함수

 

3. COALESCE(인수 1, 인수 2, 인수,...)

NULL이 아닌 최초의 인수를 반환해 주는 함수

 

CASE

CASE는 함수와 성격이 같기는 하지만 표현 방식이 함수라기보다는 구문에 가깝다고 할 수 있다. 문장으로는 '~이면 ~이고, ~이면 ~이다' 식으로 표현되는 구문이고 필요에 따라 각 CASE를 여러 개로 늘릴 수 있다.

CASE SUBWAY_LINE
WHEN '1' THEN 'BLUE'
WHEN '2' THEN 'GREEN'
WHEN '3' THEN 'ORANGE'
[ELSE 'GRAY']
END

 

WHERE 절

INSERT를 제외한 DML 문을 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문이다.

SELECT 컬럼명1, 컬럼명2 ... FROM 테이블명 WHERE 조건절;

 

비교 연산자

연산자 의미
= 같음
< 작음
<= 작거나 같음
>
>= 크거나 같음

 

부정 비교 연산자

연산자 의미
!= 같지 않음
^=
<>
not 컬럼명 =
not 컬럼명 > 크지 않음

 

논리 연산자

논리 연산자는 ( ) > NOT > AND > OR 순으로 처리된다.

 

SQL 연산자

연산자 의미
BETWEEN A AND B A와 B의 사이(A, B 포함)
LIKE '비교 문자열' 비교 문자열을 포함
IN (LIST) LIST 중 하나와 일치
IS NULL NULL 값

 

GROUP BY 절

데이터를 그룹별로 묶을 수 있도록 해주는 절이다.

 

집계 함수

COUNT(*) 전체 Row를 Count하여 반환
COUNT(컬럼) 컬럼값이 Null인 Row를 제외하고 Count하여 반환
COUNT(DISTINCT 컬럼) 컬럼값이 Null이 아닌 Row에서 중복을 제거한 Count를 반환
SUM(컬럼) 컬럼값들의 합계를 반환
AVG(컬럼) 컬럼값들의 평균을 반환
MIN(컬럼) 컬럼값들의 최솟값을 반환
MAX(컬럼) 컬럼값들의 최댓값을 반환

 

HAVING 절

GROUP BY 절을 사용할 때 WHERE 절처럼 사용하는 조건절. 주로 데이터를 그루핑 한 후 특정 그룹을 골라낼 때 사용한다.

 

ORDER BY 절

SELECT 한 데이터를 정렬. 기본값 오름차순(ASC). 내림차순으로 정렬하려면 DESC를 붙인다.

 

SELECT 문의 논리적 수행 순서

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

 

JOIN

데이터베이스에서 조인은 각기 다른 테이블을 한 번에 보여줄 때 쓰는 쿼리이다.

 

EQUI JOIN

Equal(=) 조건으로 JOIN하는 것으로 가장 흔히 볼 수 있는 방식이다.

 

Non EQUI JOIN

Equal(=) 조건이 아닌 다른 조건(BETWEEN, >, >=, <, <=)으로 JOIN하는 방식이다.

 

3개 이상 TABLE JOIN

JOIN 쿼리를 확장해서 3개 이상의 테이블을 JOIN할 수 있다.

 

OUTER JOIN

앞서 본 JOIN과 다르게 JOIN 조건에 만족하지 않는 행들도 출력되는 형태이다.

 

STANDARD JOIN

ANSI SQL 중 하나로 쉽게 말해 Oracle에서도 돌아가고 MySQL에서도 돌아가는 JOIN 쿼리라고 생각하면 된다.

 

INNER JOIN

JOIN 조건에 충족하는 데이터만 출력되는 방식이다. JOIN 조건을 ON 절을 사용하여 작성해야 한다.

 

OUTER JOIN

JOIN 조건에 충족하는 데이터가 아니어도 출력될 수 있는 방식이다. LEFT와 RIGHT, FULL 종류가 있다.

 

LEFT OUTER JOIN
왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환한다.
오른쪽 테이블에 일치하는 레코드가 없으면 NULL로 표시한다.

RIGHT OUTER JOIN
오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환한다.
왼쪽 테이블에 일치하는 레코드가 없으면 NULL로 표시한다.

FULL OUTER JOIN
두 테이블의 모든 레코드를 반환한다.
일치하는 레코드가 없으면 NULL로 표시한다.

 

NATURAL JOIN

A 테이블과 B 테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 갖고 있을 경우 JOIN되는 방식이다.

 

CROSS JOIN
A 테이블과 B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식이다. 다른 말로 Cartesian Product 라고 표현하기도 한다.

 

 

 

 

'Database > SQL 개발자' 카테고리의 다른 글

노랭이 이론 1~33  (11) 2024.09.23
[SQL] 관리 구문  (1) 2024.09.12
[SQL] SQL 활용  (0) 2024.09.11
[SQL] 데이터 모델과 SQL  (1) 2024.09.11
[SQL] 데이터 모델링의 이해  (1) 2024.09.10