본문 바로가기
코드잇/SQL

[SQL] 공부 시작이야~~~~

by 봉그리봉봉 2024. 7. 7.

 

🥕1일차 : 2024-07-05 ✅

 

조건을 나타내는 다양한 방법  

조건1 :  30세 이상부터 39세 이하까지 포함 ➡️ BETWEEN A AND B : A에서 B까지 

SELECT * FROM copang_main.member WHERE age BETWEEN 30 AND 39;

 

조건2 : 30대만 제외하고 확인하기  ➡️ + NOT

SELECT * FROM copang_main.member WHERE age NOT BETWEEN 30 AND 39;


조건 3 : 2019년 1월 1일 이후로 가입한 회원들만 ➡️ 부등호 '>' 크다 

DATE 값끼리 부등호를 사용해서 조건 만들기 

SELECT * FROM copang_main.member WHERE sign_up_day > '2019-01-01';

 

조건 4 : 2018년도에 가입한 회원들  ➡️ BETWEEN A AND B : A에서 B까지 

DATE 값끼리도 비트윈 가능 ! 

SELECT * FROM copang_main.member WHERE age BETWEEN '2018-01-01' AND '2018-12-12';

문자열 패턴 매칭 조건 

조건1 : 주소가 서울인 회원들만 조회하고 싶다. ➡️ BETWEEN A AND B : A에서 B까지 

 

문자열 비교를 할 때 대소문자 구분을 확실하게 하고 싶다면 문자열 패턴 표현식 앞에 BINARY라고 써주면 됩니다. 


 

✅ SQL 에서 데이터 정렬

1. ROW(행)들을

2. 특정 정렬을 기준으로

3. 순서대로 출력

 * 정렬할 때 null은 가장 작은 값으로 취급됨. 

 

1) 오름차순 정렬 - ORDER BY 특정 컬럼 ASC

2) 내림차순 정렬 - ORDER BY 특정 컬럼 DESC

 

WHERE는 ORDERBY 앞에 존재해야함 

 

⚠️주의 )

숫자의 경우 TEXT와 INT의 정렬이 다름 !

TEXT 는 한글자씩 123보다 17이 더 크게 취급됨.

-> 일시적으로 변환해서 정렬하기 위해서 CAST()사용

 

정수형 : ORDER BY CAST(data As signed) ASC;

소수형 : ORDER BY CAST(data As Decimal) ASC;

 

📅날짜의 정렬

 

큰값 : 가장 최신 날짜

작은 값 : 옛날 날짜

내림차순 정렬 : 가장 최신 날짜부터 옛날로 -

오름차순 정렬 : 옛날 날짜부터 가장 최근 날짜로 

 

🫙 LIMIT ; 추려서 보기 

 

⬇️10개만 추려서 보여주세요. 

ORDER BY sign_up_date DESC
LIMIT 10;


⬇️ 8번쨰 부터 2개 보여주세요 

ORDER BY sign_up_date DESC
LIMIT 8, 2;

 

* 단 ROW도 인덱스와 같이 0번째부터 시작임

8번째는 실제로는 9번째 로우를 말하는 것 

 

순서 : 

FROM - WHERE - ORDER BY - LIMIT

 

 

 

 

 

 

 


❤️‍🔥데이터 분석 단계로 나아가기

01. 데이터의 특성 구하기

 

1. 집계함수 

 

개수(COUNT)

SELECT COUNT(*) FROM TABLE; #NULL신경 안쓰고 전체 로우 수
SELECT COUNT(email) FROM TABLE;#NULL이 존재하는 로우는 제외


최댓값(MAX)

SELECT MAX(height)


최솟값(MIN)

SELECT MIN(height)


평균값(AVG)

SELECT AVG(weight)
# 단 null이 존재하는 건 계산에 포함하지 않음 -> 제외시킴

 

표준편차(STD)

전체 합(SUM)

 

2. 산술연산을 해주는 산술 함수 (Mathematical Function)

ABS() = 절대값 구하기 

SQRT() = 제곱근 구하기 

CEIL() = 올림 하기179.5 = 180

FLOOR() = 내림하기 179.5 = 179

ROUND() = 반올림 함수

 

✅ 산술 함수와 집계 함수의 차이점?

1. 집계 함수는 특정 컬럼의 여러 ROW의 값들을 동시에 고려해서 실행되는 함수

ex) MAX = 가장 큰 값을 찾기 위해서는 여러 행들을 고려해야함 .

 

2. 산술 함수는 특정 컬럼의 각 ROW의 값마다 실행되는 함수 

ex ) 반올림 함수를 실행하면 각 행 값들에 실행될 뿐.

 

 


🫨 NULL 다루기 

NULL은 어떤 값이 아니기 때문에 애초에 등호(=)를 사용해서 어떤 값과 비교할 수 있는 대상이 아니다 !!

➡️ 반드시 IS NULL, IS NOT NULL을 써야한다

 

✅ 여러 행에서 NULL이 하나라도 있으면 출력하기 

: IS NULL과 OR로 연결 

SELECT * FROM member
WHERE height IS null
    OR weight IS null
    OR address IS NULL;

 

 

 

✅ NULL 값을 다른 값으로 바꿔주기

: COALESCE(컬럼명, '####'대체할 문자열) : 코알레스

null이 아니면 height 전하고 null이면 두번째 인자 전하기

SELECT 
    coalesce(height, '####'),
    coalesce(weight, '@@@@'),
    coalesce(address, '----')
FROM member;

 


05. 이상한 값들 처리하기 

SELECT COUNT(*),
       ROUND(AVG(star))
FROM review 
WHERE comment IS NOT null;

 

 

컬럼끼리 산술계산 

select
        email,
        height AS 키,
        weight AS 몸무게,
        weight / ((height/100) * (height / 100)) AS BMI
FROM member; 

# AS 없이 스페이스 하나만 띄워도 가능하다/

AS(alias : 별명, 별칭)를 붙여서 컬럼 명도 만들 수 있음/ 

 

 

✅ CONCAT : 컨켓 ( CONCATENATE)

연결하다. 괄호 안에 있는 것들을 이어서 하나의 컬럼을 만들어줌 .

여러 컬럼의 값을 하나의 컬럼으로 표현하는 게 가능해짐.

select
        email,
        CONCAT(height, 'cm', ', ',weight, 'kg') AS '키와 몸무게',
        weight / ((height/100) * (height / 100)) AS BMI
FROM member;

 

-

 기존 컬럼의 값을 각각의 경우에 맞는 다른 값으로 변화하여 보여주는 컬럼을 추가하기 위해 CASE문을 사용

select
    email,
    CONCAT(height, 'cm', ', ',weight, 'kg') AS '키와 몸무게',
    weight / ((height/100) * (height / 100)) AS BMI,
    (case
         WHEN weight IS NULL OR height IS NULL THEN '비만 여부 알 수 없음'
         WHEN weight / ((height/100) * (height / 100)) >= 25 THEN '과체중 혹은 비만'
         WHEN weight / ((height/100) * (height / 100)) >= 18.5 
             AND weight / ((height/100) * (height / 100)) < 25
             THEN '정상'
        ELSE '저체중'
    END) AS obesity_check
    
FROM member;

❌case 이어질 때 쉼표 깜빡 

FROM 맨 마지막에 들어가는 거 확인

CASE 절 밖에 AS 

 


13. 고유값만 보기

 

DISTINCT : 어떤 고유한 값들이 존재하는지 한눈에 확인하기 -> 특정 컬럼에 어떤 값들이 존재하는 지 살피는 데 유용 

 

✅ 앞자리 두개만 가지고 지역명 뽑기 : SUBSTRING: 문자열 추출 

SELECT distinct(SUBSTRING(address,1,2)) AS 지역명 From member;

 

14. 문자열 관련 함수들 

✔️LENGTH() 함수 : 문자열의 길이를 구해줌 

SELECT *, LENGTH(address) FROM member;

 

✔️ UPPER(), LOWER()  :

는 문자열을 모두 대문자로 바꿔서 보여주는 함수이고, LOWER()는 문자열을 모두 소문자로 바꿔서 보여주는 함수

 

✔️ LPAD(), RPAD()  : 문자열의 왼쪽, 오른쪽을 특정 문자열로 채워주는 함수

- LPAD는 LEFT(왼쪽) + PADDING(채우기)

- RPAD는 RIGHT(오른쪽) + PADDING(채우기)

SELECT email, LPAD(age, 10, '0') FROM member;
#age컬럼의 값을 왼쪽에 문자 0울 붙여서 총 10자리로 만들자. 
# 정수형이라도 문자열 함수 안에 인자로 넣어주면 그 값이 자동으로 문자열로 형변환

 

✔️TRIM(), LTRIM(), RTRIM() :  문자열에 존재하는 공백을 제거

- LTRIM() : 왼쪽 공백 삭제

 - RTRIM() : 오른쪽 공백 삭제

- TRIM() : 왼쪽, 오른쪽 양쪽 다 공백 삭제

 


15. 그루핑 : 로우들을 여러개의 그룹으로 나눈다. 

⭐GROUP BY : 이 존재하면 테이블 전체가 아니라 각 그룹에 대하여 각각 작동된다. 

✔️ COUNT(*) :  조회되는 로우의 개수를 구해주는 표현식 

그루핑 상태에서는 전체가 아니라 각 그룹에 대해 각각 작동

✔️그룹핑의 기준은 여러 개(여러 컬럼)도 가능하다 ➡️ 쉼표, 로 잇기

- 이렇게 여러 그룹이 존재할 때 특정 보고 싶은 그룹만 선별해서 보기 위해서 HAVING 사용

 

HAVING : ~을 가지고 있는

HAVING region = '서울' # 여러 그룹 중에서 region값이 서울인 것만 조회, 출력해라

GROUP BY 절 뒤에 쓴 컬럼 이름들만, SELECT 절 뒤에도 쓸 수 있다.
대신 SELECT 절 뒤에서 집계 함수에 그 외의 컬럼 이름을 인자로 넣는 것은 허용된다.

 

GROUP BY로 그루핑을 하고 난 후, 생성된 그룹들 중에서 특정 그룹들만 선별하려면 HAVING 절을 사용해야 합니다. 간혹, 이 HAVING 절과 WHERE 절을 혼동하시는 분들이 있는데요.

WHERE 절은 SELECT 문에서 맨 처음에 row들을 필터링 할 때 쓰이고, 그 후로 그루핑까지 거친 후에야 HAVING 절에서 그 그룹들을 필터링하는 겁니다.

 

 

SELECT  문 실행순서 FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY - LIMIT

 

FROM: 데이터를 가져올 테이블을 지정합니다. 여러 테이블을 조인하는 경우, 조인이 먼저 수행됩니다. 

WHERE: 조건에 맞는 행을 필터링합니다. 조건에 맞지 않

는 행은 제외됩니다.

 

GROUP BY: 특정 컬럼을 기준으로 행을 그룹화합니다. 주로 집계 함수와 함께 사용됩니다.

HAVING: GROUP BY로 그룹화된 결과에 대해 조건을 필터링합니다. WHERE 절과 유사하지만, HAVING은 집계 함수의 결과에 조건을 적용할 수 있습니다.

SELECT: 최종적으로 출력할 컬럼을 지정합니다. 이 단계에서는 집계 함수와 계산된 컬럼을 정의할 수 있습니다.

ORDER BY: 결과를 특정 컬럼을 기준으로 정렬합니다.

LIMIT: 반환할 행의 수를 제한합니다.

 

 

SELECT department, COUNT(*) as employee_count
FROM employees
WHERE salary > 50000
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY employee_count DESC
LIMIT 10;

 

  • FROM: employees 테이블에서 데이터를 가져옵니다.
  • WHERE: salary > 50000 조건을 만족하는 행을 필터링합니다.
  • GROUP BY: department 컬럼을 기준으로 행을 그룹화합니다.
  • HAVING: 그룹화된 결과 중 COUNT(*) > 5 조건을 만족하는 그룹만 선택합니다.
  • SELECT: department와 각 그룹의 COUNT(*)를 employee_count라는 별칭으로 선택합니다.
  • ORDER BY: employee_count를 기준으로 내림차순 정렬합니다.
  • LIMIT: 결과에서 상위 10개의 행만 반환합니다

FROM : 데이터를 가져오고

WHERE : 그 전체 데이터에서 조건을 만족하는 행을 필터링 하고 

GROUP BY 특정 컬럼을 기준으로 그룹화를 진행

HAVING 그 그룹화된 결과 내에서 특정 조건만 만족하는 그룹을 선택

SELECT 그 그룹화 안에서 COUNT(*) 로우들 조회

ORDER BY : 계산한 조회법을 기준으로 정렬

LIMIT 진짜 반환