본문 바로가기

데이터분석캠프 TIL

241127 TIL_ 데이터 분석 과정(SQL 강의 2주차 WHERE, NULL, ORDER BY, GROUP BY, DISTINCT, LIMIT)

1. 명명 규칙 

- 좋은 명명 규칙

> 간결하게 의미를 담아서 

테이블명은 데이터의 내용을 나타내야 한다. 

컬럼명은 각 데이터의 성격을 명확히 표현해야 한다. 

 

> 일관된 형식 유지 

소문자 사용: 일관성을 위해 모두 소문자를 사용한다. 

스네이크 케이스: 단어 사이를 밑줄(_)로 구분한다. 

 

 

2. 주석 처리

? 주석의 역할

  • 코드의 목적 설명: 특정 데이터를 조회하는 이유나 필터링 조건의 의도
  • 실행 방지: 테스트중인 쿼리의 실행을 막기 위해 주석 처리 
  • 가독성 증가: 복잡한 쿼리는 섹션별로 주석을 추가해 가독성 증가 

(1) /**/ 를 통한 주석: Ctrl + Shift + / 

전체적으로 주석을 달고자 할 때 사용함

/* 특정 사용자 데이터를 조회
SELECT user_name, email
FROM users
WHERE user_id = 1;
*/

 

(2) -- 를 통한 주석: Ctrl + / 

원하는 줄만 주석을 달고자 할 때 사용함

-- 전체 사용자 데이터를 조회
# 전체 사용자 데이터를 조회
SELECT *
FROM users;

 

 

3. Null 소개 

  • "값이 없다"는 것을 의미
  • 숫자 0이나 빈 문자열(" ")와는 다른 의미
  • NULL은 직접 비교(=, !=)로 확인할 수 없습니다. NULL은 비교할 수 없는 값으로 간주되기 때문입니다.
  • 대신 IS NULL 또는 IS NOT NULL 조건을 사용해야 합니다.
-- 일반적인 비교연산은 NULL에서 작동하지 않습니다.
SELECT *
FROM 테이블명
WHERE 컬럼명 = NULL; -- 작동하지 않음!

-- NULL 값만 선택
SELECT * 
FROM 테이블명
WHERE 컬럼명 IS NULL;

-- NULL이 아닌 값만 선택
SELECT * 
FROM 테이블명
WHERE 컬럼명 IS NOT NULL;

 

Not Null 이란? 

- 특정 컬럼에 NULL 값을 허용하지 않도록 설정하는 제약 조건. 

 

 

4. 데이터 조회하기

(1) 데이터 선택

  • SELECT: 원하는 데이터를 조회할 수 있는 명령어
  •  *: 모든 열을 조회하고자 할 때 사용함. 
  • FROM: 데이터를 조회할 테이블을 지정함
  •  MySQL에서 각 구문의 끝은 세미콜론(;)으로 마무리해야 함. 
--예시: 직원 정보 테이블에서 모든 데이터를 조회
SELECT * 
FROM employees;

 

--예시: 특정 열만 선택! 이름과 부서 조회
SELECT name, department 
FROM employees;
  • - 열 이름에 별칭을 지정할 때는 AS 를 사용함 
-- 열 이름에 별칭 지정
SELECT name AS '직원명', department AS '부서' 
FROM employees;

 

(2) 중복제거: DISTINCT

테이블에서 중복된 데이터를 제거하려면  DISTINCT키워드를 사용함. 

- 반드시  SELECT절에만 사용해야 함

SELECT DISTINCT city 
FROM employees;

 

(3) 갯수 제한: LIMIT

데이터가 많은 테이블에서 결과를 빠르게 미리 확인할 수 있음

  • 상위 5명의 직원만 조회 
-- 상위 5명의 직원만 조회
SELECT * 
FROM employees 
ORDER BY age DESC 
LIMIT 5;
  • LIMIT offset, count으로 원하는 위치에서 원하는 갯수만큼 조회 
  • offset: 건너뛸 행의 수
    • 즉, 실제로 반환되는 데이터는 **offset+1 번째 행**부터 시작합니다.
  • count: 그 이후에 가져올 행(row)의 수
-- 3번째 행부터 5개의 데이터를 조회
SELECT * 
FROM employees 
ORDER BY age DESC 
LIMIT 2, 5;

-- 1번째 행부터 10번째 데이터 조회
SELECT * 
FROM employees 
ORDER BY age ASC 
LIMIT [0, ]10; #LIMIT 10과 동일하게 동작!

-- 11번째 행부터 20번째 데이터 조회
SELECT * 
FROM employees 
ORDER BY age ASC 
LIMIT 10, 10;

 

(4) ORDER BY

정렬하고자 할 때

일반적으로  SQL은 오름차순 / 내림차순은 DESC지정 해야함

 

5. 데이터 필터링 : WHERE 절 

WHERE 절을 사용하면 특정 조건을 만족하는 데이터만 필터링할 수 있습니다.

예를 들어, 직원 테이블에서 서울에서 근무하는 직원만 조회하고 싶다면 다음과 같이 작성합니다.

 

(1) WHERE

서울에서 근무하는 직원만 조회하고 싶을 경우 

--예시: 특정 조건의 데이터 조회
SELECT * 
FROM employees 
WHERE city = 'Seoul';

 

(2) BETWEEN

특정 범위의 데이터를 조회하고 싶을 때

-- 나이가 30~50 사이인 직원 조회
SELECT * 
FROM employees 
WHERE age BETWEEN 30 AND 50;

 

(3) IN 과 NOT IN 

IN 연산자를 사용하면 여러 값 중 일치하는 데이터를 필터링할 수 있다. 반대로 NOT IN 연산자는 특정 값들을 제외한 데이터를 조회한다. 

-- IN 예시: 특정 도시에서 근무하는 직원 조회
SELECT * 
FROM employees 
WHERE city IN ('Seoul', 'Busan');

-- 특정 직무에 해당하는 직원 조회
SELECT * 
FROM employees 
WHERE job_title IN ('Manager', 'Engineer', 'Analyst');


-- NOT IN 예시: 특정 도시를 제외한 직원 조회
SELECT * 
FROM employees 
WHERE city NOT IN ('Seoul', 'Busan');

 

 

(4) LIKE와 와일드카드

LIKE는 특정 패턴과 일치하는 데이터를 필터링한다. 와일드카드 %와 _를 활용해 정밀한 조건을 걸 수 있다.

  •  LIKE
-- 이름이 '김'으로 시작하는 직원 조회
SELECT * 
FROM employees 
WHERE name LIKE '김%';

-- 이름이 두 글자인 직원 조회
SELECT * 
FROM employees 
WHERE name LIKE '__'; #_가 2개 입니다~!
  • NOT LIKE 
-- 이름이 '김'으로 시작하지 않는 직원 조회
SELECT * 
FROM employees 
WHERE name NOT LIKE '김%';

 

 

(5) AND와 OR 

여러 조건을 결합하고자 할 때 사용함

-- 나이가 30 이상이고, 서울에서 근무하는 직원 조회
SELECT * 
FROM employees 
WHERE age >= 30 AND city = 'Seoul';

-- 나이가 50 미만이거나, 부산에서 근무하는 직원 조회
SELECT * 
FROM employees 
WHERE age < 50 OR city = 'Busan';

 

(6) <>

조건문에서 사용할 수 있는 연산자 

-- 서울이 아닌 도시에서 근무하는 직원 조회
SELECT * 
FROM employees 
WHERE city <> 'Seoul';

SELECT * 
FROM employees 
WHERE city != 'Seoul'; -- 동일한 결과!

 

(7) 괄호 사용 

()를 사용해서 연산 우선순위를 명시적으로 지정할 수 있음 

-- 우선순위를 명확히 하여 올바른 결과 도출
SELECT * 
FROM employees 
WHERE (age >= 30 AND city = 'Seoul') OR (job_title = 'Manager' AND city = 'Busan');

 

6. CASE WHEN

(1) 조건에 따라 데이터를 분류하기 

--예시: 연령대 분류
SELECT name, age,
       CASE 
           WHEN age < 30 THEN '청년'
           WHEN age BETWEEN 30 AND 50 THEN '중년'
           ELSE '노인'
       END AS age_group
FROM employees;

ELSE는 생략 가능하지만, 모든 조건을 다루지 않을 경우 기본값을 지정하기 위해 사용하는 것이 좋다. 

 

(2) 조건에 따라 새로운 계산 열 추가

-- 급여 수준에 따라 보너스를 계산
SELECT name, salary,
       CASE 
           WHEN salary >= 5000000 THEN salary * 0.2
           WHEN salary >= 3000000 AND salary< 5000000 THEN salary * 0.1
           ELSE salary * 0.05
       END AS bonus
FROM employees;

 

 

 


오늘은 SQL 강의 2주차까지 완강하고 3주차를 시작하게 되었다. 생각보다 강의가 길지 않아서 금방 다음으로 넘어가는 것 같다. 

뭔가 이제서야 쿼리문 만드는 게 조금은 익숙해진 것 같다. 처음엔 SELECT, FROM이 매 번 헷갈렸는데 이제는 그정도로는 헷갈리지 않는다. 

 

그리고 오늘 데이터마케팅과 관련된 라이브세션이 있었는데, 유익한 편이었다. 

앞으로 데이터 분석과 마케팅의 경계가 모호해 질 것이라는 이야기가 와닿았다. 결국 모든 의사결정을 하는 데 있어서 객관적인 지표가 필요하다는 이야기. 향후 나는 어떤 방향의 마케팅을 그려야 할 지 잘 고민해보아야 겠다.