카테고리 없음

[SQL] DML-SELECT

왕초보코딩러 2024. 2. 1. 14:50
728x90

SQL문법

코드를 마치면 반드시 세미콜론(;)을 써야한다

줄바꿈과 개행이 자유롭기 때문에 가독성을 위해 줄바꿈과 개행을 사용한다

가독성을 위해 예약어는 대문자를 사용한다

 

 

MySQL을 기준으로 작성했습니다


SELECT문

테이블에 입력된 데이터를 조회하기 위해 사용

원하는 컬럼과 행을 조회할 수 있음

 

SELECT문 작성 순서

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

 

SELECT문 해석 순서

1. FROM(데이터베이스와 테이블 결정)

2. WHERE(조건을 만족하는 row들만 추출)

3. GROUP BY(row들을 그루핑. 그루핑 후 하나의 row는 하나의 그룹이 됨)

4. HAVING(조건을 만족하는 그룹들만 추출)

5. SELECT(조회)

6. ORDER BY(정렬)

7. LIMIT(일부 row만 추출)

 

MySQL에서

HAVING, ORDER BY 제외 SELECT절의 AS를 이용한 별칭은 사용할 수 없다


SELECT와 FROM절

SELECT [컬럼1], [컬럼2], ... , [컬럼n]
FROM [데이터베이스 이름].[테이블 이름];

SELECT * 를 사용하면 모든 컬럼을 조회한다

 

FROM에서 데이터베이스는 꼭 쓰지않아도 되지만, 테이블 이름의 중복 방지를 위해 쓴다

데이터베이스 이름을 쓰고 싶지 않다면

미리 이 데이터베이스를 사용한다고 지정하면 된다

USE [데이터베이스 이름];

SELECT [컬럼1], [컬럼2], ... , [컬럼n]
FROM [테이블 이름];

 

DISTINCT

중복된 데이터 한 번만 조회

SELECT DISTINCT [컬럼] FROM [테이블 이름];

 

AS

Alias(별칭)을 만들어 사용한다

SELECT [컬럼] AS [별칭]
FROM [테이블 이름];

별칭에 공백이 있다면 백틱(`)으로 묶어준다

별칭이 조회 시 컬럼명에 나타난다

+컬럼뿐만 아니라 테이블 이름에도 별칭 사용이 가능하다

 

CONCAT()

SELECT CONCAT(컬럼1, '-', 컬럼2) AS 별칭
FROM [테이블 이름];

CONCAT의 괄호 안을 묶어서 하나의 컬럼으로 만들어준다


WHERE절

조건을 작성한다

 

AND OR

조건1 AND 조건2 : 조건1, 조건2 모두 만족해야 SELECT됨

조건1 OR 조건2 : 조건1, 조건2 중 하나만 만족해도 SELECT됨

AND가 OR보다 연산자 우선순위가 높다

조건이 많다면 괄호()로 묶어줘 가독성을 높인다

 

비교 연산자

=, <, >, <=, >=

#2020-01-01 이후면 SELECT
WHERE 컬럼 >= '2020-01-01';
#30보다 작으면 SELECT
WHERE 컬럼 < 30;

 

BETWEEN a AND b

#20~29 사이면 SELECT
WHERE 컬럼 BETWEEN 20 AND 29;

#20~29 제외 SELECT
WHERE 컬럼 NOT BETWEEN 20 AND 29;

 

LIKE

_와 %

#010으로 시작하고, 뒤가 8자리인 문자열
WHERE 컬럼 LIKE '010________';
#070으로 시작하는 문자열
WHERE 컬럼 LIKE '070%';
#강남구가 포함된 문자열
WHERE 컬럼 LIKE '%강남구%';

_ : 문자열 한 개를 뜻함

% : 임의의 길이의 문자열(길이가 0이어도 됨)

 

문자열 안에 %가 있다면 이스케이프(\)를 사용한다

 

 

BINARY

문자열 대소문자 구분

#G로 시작하는 문자열(g로 시작하는 문자열은 포함 안함)
WHERE 컬럼 LIKE BINARY 'G%'

#g로 시작하는 문자열(G로 시작하는 문자열은 포함 안함)
WHERE 컬럼 LIKE BINARY 'g%'

 

IN (list)

list값 중 하나라도 일치하면 조건 만족

#값1 아니면 값2인 것만 SELECT
WHERE 컬럼 IN (값1, 값2);

#값1, 값2가 아닌 것만 SELECT
WHERE 컬럼 NOT IN (값1, 값2);

 

칼럼을 여러 개 사용하여 대응되도록 하는 IN 조건 지정 가능

#칼럼1과 칼럼2에 대응되도록 입력 가능
WHERE (컬럼1, 컬럼2) IN ((컬럼1의 값, 컬럼2의 값), (컬럼1의 값, 컬럼2의 값));

 

부정 비교 연산자

같지 않음

<>   

!=   

NOT 컬럼명 =

#조건: 30이 아닌 것만 
WHERE 컬럼 <> 30;
WHERE 컬럼 != 30;
WHERE NOT 컬럼 = 30;

 

NULL 값

IS NULL: NULL인 것만 조회

IS NOT NULL: NULL이 아닌 것만 조회

SELECT * FROM [테이블 이름]
WHERE [컬럼] IS NULL;

SELECT * FROM [테이블 이름]
WHERE [컬럼] IS NOT NULL;

 

NULL을 대체하기

COALESCE(컬럼, 대체할 것)

SELECT
    COALESCE(컬럼1, 대체할 값),
    COALESCE(컬럼2, 대체할 값)
FROM [테이블 이름];

컬럼1 값이 NULL이 아니라면 그 값을 리턴, NULL이라면 대체할 값을 리턴

컬럼2 값이 NULL이 아니라면 그 값을 리턴, NULL이라면 대체할 값을 리턴

 

SELECT
    COALESCE(컬럼1, 컬럼2, ... , 컬럼n)
FROM [테이블 이름];

컬럼 1 값이 NULL이라면 컬럼 2 값 보기

컬럼 2 값도 NULL이라면 컬럼 3 값 보기

...

컬럼 n까지

 

https://wnwa.tistory.com/35

 

[MySQL] COALESCE 함수로 NULL 값 처리하기 (feat. IFNULL 차이점)

기본 사용법 SELECT COALESCE(칼럼1, 칼럼2, 칼럼3, ... , 칼럼 N, ...) FROM table; 칼럼1이 NULL이 아니면 칼럼1을 반환되고 NULL이면 칼럼2를 반환. 칼럼2가 NULL이 아니면 칼럼2를 반환하고 칼럼1과 칼럼2 모두 N

wnwa.tistory.com

 


산술 함수 사용

ABS() : 해당 컬럼의 각 row의 값을 절대값으로 바꾼다

SQRT() : 해당 컬럼의 각 row의 값을 제곱근으로 바꾼다

CEIL() : 해당 컬럼의 각 row의 값을 올림한다

FLOOR() : 해당 컬럼의 각 row의 값을 내림한다

ROUND() : 해당 컬럼의 각 row의 값을 반올림한다

 

컬럼끼리의 산술

+, -, * , /, %

 

집계 함수 사용

COUNT() : 해당 컬럼의 NULL 제외 row의 수를 구한다

MIN(), MAX() : 해당 컬럼의 최소값과 최대값을 구한다

AVG() : 해당 컬럼의 row들의 평균을 구한다

SUM() : 해당 컬럼의 row들의 합을 구한다

STD() : 해당 컬럼의 표준편차를 구한다

 

 

집계 함수를 이용한 SELECT문

#가능
SELECT AVG(컬럼)
FROM [테이블];

#가능
SELECT AVG(컬럼), MIN(컬럼), MAX(컬럼)
FROM [테이블];

#에러
SELECT 컬럼, AVG(컬럼)
FROM [테이블];

SELECT문에서 집계함수만 넣는 것은 가능하지만

다른 컬럼과 함께는 사용이 불가능

+WHERE절에 집계 함수는 사용 불가능(서브 쿼리를 이용해야 함)

 

전체 row의 수 구하기(NULL값을 포함한 모든 행 수 계산)

COUNT(*)

SELECT COUNT(*) FROM [테이블 이름];

 

COUNT(컬럼명) : NULL값 제외한 행 수 계산

 

특정 컬럼의 NULL 수 구하기

SELECT COUNT(*) - COUNT(컬럼) FROM [테이블 이름];

SELECT COUNT(컬럼) FROM [테이블 이름]
WHERE 컬럼 IS NULL;

 

 

GROUP BY

그룹 나누기

컬럼의 값을 기준으로 그룹으로 묶는다

HAVING

그룹에 조건을 추가한다

SELECT 컬럼1, 컬럼2 FROM [테이블 이름]
GROUP BY 컬럼1, 컬럼2
HAVING [그룹에 대한 조건];

그룹을 여러 컬럼을 이용하여 나눌 수 있다

GROUP BY를 사용한 SELECT 절에는 GROUP BY에 사용한 컬럼과 집계 함수만 사용할 수 있다

집계 함수를 사용할 때는 GROUP BY에서 사용한 컬럼이 아니어도 사용할 수 있다.

 

집계 함수와 GROUP BY

컬럼 값을 기준으로 나뉜 그룹마다 집계 함수가 적용된다

 

부분 총계

WITH ROLLUP

SELECT
FROM [테이블 이름]
GROUP BY 컬럼1, 컬럼2 WITH ROLLUP
HAVING [그룹에 대한 조건];

SELECT와 GROUP BY 절에서 상위 컬럼(먼저 써준 컬럼)의 부분총계를 구한다

 

https://prinha.tistory.com/entry/MySQL-WITH-ROLLUP-%ED%95%AD%EB%AA%A9%EB%B3%84-%ED%95%A9%EA%B3%84%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%84%EC%B2%B4-%ED%95%A9%EA%B3%84-%EA%B5%AC%ED%95%98%EA%B8%B0

 

[MySQL] WITH ROLLUP - 항목별 합계에 대한 전체 합계 구하기

WITH ROLLUP 그룹별로 합계를 한 번에 구할 때 사용한다. GROUP BY를 사용하면 GROUP BY 뒤에 나오는 컬럼별로 합계를 구해주는데, 항목별 합계에 전체 합계가 같이 나오게 하는 것이 WITH ROLLUP이다. 1) WITH

prinha.tistory.com

 


ORDER BY

SELECT
FROM
WHERE
ORDER BY 기준컬럼1 ASC/DESC, 기준컬럼2 ASC/DESC, ...;

기준을 여러 개로 두고 할 수 있다

ASC: 오름차순

DESC: 내림차순

 

숫자형 TEXT 데이터 타입과 INT/DOUBLE 데이터 타입의 정렬 기준이 다르니 조심!

TEXT 데이터 타입: 문자열 하나씩 비교('123', '19'면 오름차순 시 '123' -> '19')

INT/ DOUBLE 데이터 타입: 숫자의 크기 비교(123, 19면 오름차순 시 19 -> 123) 

 

정렬을 위해 형변환이 필요할 때

CAST(컬럼 AS 바꾸고 싶은 데이터 타입)

 

TEXT 데이터 타입을 INT로 바꿔고 싶다면

CAST(컬럼1 AS SIGNED)

 

TEXT 데이터 타입을 DOUBLE로 바꿔고 싶다면

CAST(컬럼1 AS DECIMAL)

 

+TEXT 데이터 타입으로 바꾸고 싶다면

CAST(컬럼1 AS CHAR)

 


LIMIT

추출될 데이터 개수 지정

#처음 row부터 개수 만큼의 데이터를 본다
LIMIT 개수;

#해당 인덱스 번호부터 개수 만큼의 데이터를 본다
LIMIT 인덱스, 개수

row의 인덱스는 0부터 시작한다

 


IF문 구현

단일 조건

IF()

SELECT 
    IF([조건], [True일 시 반환할 값], [False일 시 반환할 값])
FROM [테이블 이름];

 

https://hellogk.tistory.com/22

 

쿼리의 조건문 사용시 oracle에는 decode가있고 mysql에는 if가 있다

안녕하세요 이번에 다루고자 하는 내용은 sql 쿼리문 중 true / false 조건에 따른 단일 조건 함수에 대해서 작성하고자 합니다. 지난 포스팅은 다중조건인 CASE WHEN문을 사용했었는대요 물론 CASE문만

hellogk.tistory.com

 

 

다중 조건

CASE END

컬럼의 값을 기준으로 조건을 판단하고, 새 컬럼 생성

WHEN 조건, THEN 조건이 참일 때 반환할 값, ELSE 거짓일 때 반환할 값

SELECT
    (CASE
    	WHEN 조건1 THEN 참일 때 반환할 값
    	WHEN 조건2 THEN 참일 때 반환할 값
    	...
        ELSE 반환할 값
    END) AS 별칭
FROM [테이블 이름];

 


< 문자열 다루기 >

문자열 일부를 추출하는 함수

SUBSTRING(컬럼, 시작 문자 번호, 추출할 개수)

#phone_num 컬럼의 8번째 글자부터(1번부터 시작) 4자리
SUBSTRING(phone_num, 8, 4)

 

문자열 길이 리턴 함수

LENGTH()

SELECT LENGTH(컬럼)
FROM [테이블 이름];

 

문자열 왼쪽, 오른쪽에 특정 문자열을 추가하는 함수

LPAD(), RPAD()

SELECT RPAD(컬럼, 자리 수, '채울 문자열')
FROM [테이블 이름];

#30이었다면 00030이 됨
SELECT LPAD(age, 5, '0')
FROM [테이블 이름];

 

문자열 모두 대문자, 소문자로 바꿔주는 함수

UPPER(), LOWER()

SELECT UPPER(컬럼), LOWER(컬럼)
FROM [테이블 이름];

 

문자열의 양쪽, 왼쪽, 오른쪽의 공백을 없애주는 함수

TRIM(), LTRIM(), RTRIM()

SELECT TRIM(컬럼), LTRIM(컬럼), RTRIM(컬럼)
FROM [테이블 이름];

 

 

 

< 날짜 다루기(DATE 타입) >

년, 월, 일만 추출

#년만 추출
YEAR(컬럼)
#월만 추출
MONTH(컬럼)
#일만 추출
DAYOFMONTH(컬럼)

 

날짜의 차이 구하기

#날짜1 - 날짜2
DATEDIFF('날짜1', '날짜2')

며칠인지 수로 반환

오늘 날짜 date타입으로 반환: CURDATE()

 

날짜 더하기, 날짜 빼기

DATE_ADD(date 컬럼, INTERVAL 일 DAY)
DATE_SUB(date 컬럼, INTERVAL 일 DAY)

DATE타입으로 반환

 

DATETIME 타입

날짜 + 시간까지

#date -> unix timestamp
UNIX_TIMESTAMP(date 컬럼)

#unix timestamp -> datetime
FROM_UNIXTIME(unix timestamp 컬럼)