4-1) MySQL 문법(SELECT)

Hyoin Jeong·2022년 7월 14일

사용할 테이블 : [channel테이블][session 테이블]

  • 테이블(들)에서 레코드들(혹은 레코드수)을 읽어오는데 사용
  • WHERE를 사용해 조건을 만족하는 레코드

사용방법

SELECT 필드이름1, 필드이름2,FROM 테이블이름
WHERE 선택조건
GROUP BY 필드이름1, 필드이름2, ...
ORDER BY 필드이름 [ASC|DESC] -- 필드 이름 대신에 숫자 사용 가능
LIMIT N;

예제

SELECT * -- *는 모든 필드를 지칭하는 표현
FROM prod.session; -- 앞서 USE prod;를 수행했다면 FROM session도 사용 가능
SELECT *
FROM prod.session
LIMIT 10;
SELECT DISTINCT channel_id -- 유일한 채널 ID를 알고 싶은 경우
FROM prod.session;
SELECT channel_id, COUNT(1) -- 채널 ID별 카운트를 하려면 GROUP BY/COUNT 함수!!
FROM prod.session
GROUP BY 1; -- 1을 쓰면 select의 첫번째 필드로 그루핑하는 것! = channel_id
SELECT COUNT(1) -- 테이블의 모든 레코드 수 카운트. COUNT(*). 하나의 레코드
FROM prod.session;
SELECT * -- channel 테이블의 모든 레코드들을 표시
FROM prod.channel;
SELECT COUNT(1)
FROM prod.session
WHERE channel_id = 5; -- channel이 Facebook경우만 레코드수 카운트

CASE WHEN

  • 필드 값의 변환을 위해 사용 가능
    • CASE WHEN 조건 THEN 참일때 값 ELSE 거짓일때 값 END 필드이름
  • 여러 조건을 사용하여 변환하는 것도 가능
CASE
WHEN 조건1 THEN1
WHEN 조건2 THEN2
ELSE3
END 필드이름
SELECT channel_id, CASE
WHEN channel_id in (1, 5, 6) THEN 'Social-Media'
WHEN channel_id in (2, 4) THEN 'Search-Engine'
ELSE 'Something-Else'
END channel_type
FROM prod.session;

NULL

  • 값이 존재하지 않음을 나타내는 상수. 0 혹은 ""과는 다름
  • 필드 지정시 값이 없는 경우 NULL로 지정 가능
    • 테이블 정의시 디폴트 값으로도 지정 가능
  • 어떤 필드의 값이 NULL인지 아닌지 비교는 특수한 문법을 필요로 함
    • field1 is NULL 혹은 field1 is not NULL
  • NULL이 사칙연산에 사용되면 그 결과는? → 무조건 NULL
    • SELECT 0 + NULL, 0 - NULL, 0 * NULL, 0/NULL

COUNT 함수 제대로 이해하기

Untitled

SELECT COUNT(1) FROM prod.count_test -> 7
SELECT COUNT(0) FROM prod.count_test -> 7
SELECT COUNT(NULL) FROM prod.count_test -> 0
SELECT COUNT(value) FROM prod.count_test -> 6
SELECT COUNT(DISTINCT value) FROM prod.count_test -> 4
  • COUNT()에 들어가는 문자가 NULL이 아니라면 모두 카운트 하는 것 → 1이나 0이 들어가도 답은 같음
  • COUNT()에 들어가는 문자가 NULL이면 카운트 하지 않음 → 무조건 0
  • COUNT(value)는 value필드를 보면 NULL이 있으니 그것을 제외하고 카운트 → 6
  • COUNT(DISTINCT value)는 중복을 제거하고 value(필드이름)로 카운트하니까 NULL도 제외하고 카운트 → 4

WHERE

  • IN
    • WHERE channel_id in (3, 4)
      ■ WHERE channel_id = 3 OR channel_id = 4
    • NOT IN
  • LIKE
    • LIKE: 대소문자 구별 없이 문자열 매칭 기능을 제공해줌
    • WHERE channel LIKE 'G%' -> 'G*' - 문자열이 G로 시작하는 것
    • WHERE channel LIKE '%o%' -> 'o' - 문자열에 o가 들어있는 것
    • NOT LIKE
  • BETWEEN
    • 날짜 범위에 사용 가능
  • 위의 오퍼레이터들은 CASE WHEN 사이에서도 사용가능

IN & LIKE/ILIKE 예제

SELECT COUNT(1)
FROM prod.session
WHERE channel_id IN (4, 5);

channel_id가 4또는 5인 레코드의 카운트

SELECT COUNT(1)
FROM prod.channel
WHERE channel LIKE '%G%';

channel이름이 G를 포함한 레코드의 카운트

SELECT DISTINCT channel
FROM prod.channel
WHERE channel LIKE '%o%';

channel 이름에 o가 들어간 레코드들 중 중복을 제거한 카운트

SELECT DISTINCT channel
FROM prod.channel
WHERE channel NOT LIKE '%o%';

channel 이름에 o가 들어가지 않은 레코드들 중 중복을 제거한 카운트


STRING Functions

  • LEFT(str, N) - 왼쪽부터 N개의 문자를 가져옴
  • REPLACE(str, exp1, exp2) - 첫번째 string의 exp1패턴을 찾아서 exp2로 바꿔줌
  • UPPER(str) - 대문자로 변환
  • LOWER(str) - 소문자로 변환
  • LENGTH(str) - 길이를 반환
  • LPAD, RPAD - 특정 문자를 패딩
  • SUBSTRING - 특정위치에서 부터 문자를 추출
  • CONCAT - 필드를 붙여서 새롭게 만듬
SELECT
LENGTH(channel),
UPPER(channel),
LOWER(channel),
LEFT(channel, 4),
RPAD(channel, 15, '-'),
LPAD(channel, 15, '-')
FROM prod.channel;

ORDER BY

  • 디폴트 순서는 오름차순 (작은 값이 먼저 나옴)
    • ORDER BY 1 ASC
  • 내림차순(Descending)을 원하면 “DESC”
    • ORDER BY 1 DESC
  • 여러 개의 필드를 사용해서 정렬하려면
    • ORDER BY 1 DESC, 2, 3 - select된 첫번째 필드를 보고 내림차순 정렬을 하는데 만약 같다면 두번째 필드값을 보고 오름차순!으로 정렬하고 또 같다면 세번째 필드값을 보고 오름차순
  • NULL 값 순서는?
    • NULL 값들은 오름차순 일 경우 (ASC), 처음에 위치함
    • NULL 값들은 내림차순 일 경우 (DESC) 마지막에 위치함
SELECT value
FROM prod.count_test
ORDER BY value DESC;

→ 431100NULL

SELECT value
FROM prod.count_test
ORDER BY value ASC;

→ NULL001134


타입 변환

  • DATE Conversion:
    • NOW
    • 타임존 관련 변환 - 서울 to 도쿄 시간
      ■ CONVERT_TZ(now(), 'GMT', 'Asia/Seoul')
    • DATE, WEEK, MONTH, YEAR, HOUR, MINUTE, SECOND, QUARTER, MONTHNAME
    • DATEDIFF
    • DATE_ADD
    • ...
  • STR_TO_DATE, DATE_FORMAT

예제1

SELECT
created, CONVERT_TZ(created, 'GMT', 'Asia/Seoul') seoul_time,
YEAR(created) y, QUARTER(created) q, MONTH(created) m, MONTHNAME(created) mnn,
DATE(created) d, HOUR(created) h, MINUTE(created) m, SECOND(created) s
FROM session
LIMIT 10;

결과1

Untitled

예제2

SELECT created,
DATEDIFF(now(), created) gap_in_days,
DATE_ADD(created, INTERVAL 10 DAY) ten_days_after_created
FROM session
LIMIT 10;

결과2

Untitled

예제3

SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y'); -- 2013-05-01

Type Casting

  • 1/2의 결과는?
    • 0이 됨. 정수간의 연산은 정수가 되어야하기 때문
      • 분자나 분모 중의 하나를 float로 캐스팅해야 0.5가 나옴
      • 이는 프로그래밍 언어에서도 일반적으로 동일하게 동작함
    • 뒤에서 예제를 살펴볼 예정
  • 어떻게 Type을 변환하나? → cast 함수를 사용
    • cast(category as float)
    • convert(expression, float)

예제

0개의 댓글