코딩/SQL

SQL - Day1

americanoallday 2025. 1. 14. 15:30

SQL : Structured Query Language 

 

데이터베이스 데이터 저장형식

  • 테이블 (행(row)과 열(column)로 구성)

데이터 조회하기

select * from 테이블 : *(모든 컬럼 선택)
select 컬럼1, 컬럼2 from 테이블



컬럼명 바꿔서 데이터 추출하기

  • 방법1 : 컬럼1 as 별명1
  • 방법2 : 컬럼2 별명2
  • 주의사항 : 한글 및 특수문자로 치환 시 큰 따옴표 안에 기입

조건문 추출 : where
*
WHERE 절은 행(row) 단위로 조건을 필터링합니다. 하지만 집계 함수(예: MAX(), SUM(), COUNT() 등)는 전체 데이터의 그룹화 또는 집계된 결과를 기반으로 계산됩니다.

즉, 집계 함수는 그룹화 이후의 데이터를 처리하기 때문에 WHERE 절이 아닌 HAVING 절이나 서브쿼리를 통해서 사용해야 합니다.

select * from 테이블 where 필터링 조건
  • 필터링 조건이 문자일 경우 작은 따옴표 안에 기입
  • 비교연산자 : =, <>, >, >=, <, <=

 

행 단위의 값을 기반으로 조건을 지정할 수 있습니다. 즉, 테이블의 각 개별 행의 값을 사용해야 합니다. 아래는 WHERE 절에서 사용할 수 있는 것들입니다:

  1. 단일 값 비교:
     컬럼 값과 특정 값을 비교.
     예: WHERE age > 30
  2. 논리 연산자:
    AND, OR, NOT 등을 사용한 조건.
    예: WHERE age > 30 AND region = '한국'
  3. 패턴 매칭:
    LIKE 연산자를 사용한 문자열 비교.
    예: WHERE name LIKE '김%'
  4. NULL 값 확인:
    IS NULL, IS NOT NULL 등을 사용.
    예: WHERE join_date IS NOT NULL
  5. 범위 조건:
    BETWEEN, IN 등을 사용.
    예: WHERE rating BETWEEN 1300 AND 1500
  6. 함수와 표현식:
    개별 행에 대해 계산되는 함수.
    예: WHERE YEAR(join_date) = 2023

 

범위 조건 :

  • BETWEEN : A 와 B 사이
    • 기본 문법 : between a and b
    • 예시 : 나이가 10 과 20 사이
    • where age between 10 and 20
  • IN : ‘포함’ 하는 조건 주기
    • 기본 문법 : in (A, B, C)
    • 예시1 : 나이가 15, 21, 31 세인 경우
    • age in (15, 21, 31)
    • 예시2 : 음식 종류가 한식, 일식인 경우
    • cuisine_type in ('Korean', 'Japanese')

패턴 조건 : 

  • LIKE : 완전히 똑같지는 않지만, 비슷한 값을 조건으로 주기
    • 특정한 문자로 시작하는 경우
      • 기본 문법 : like ‘시작문자**%**’
      • 예시 : ‘김’ 으로 시작하는 이름
      • name like '김%'
    • 특정한 문자를 포함하는 경우
      • 기본 문법 : like%포함문자%
      • 예시 : 식당 이름에 ‘Next’ 를 포함하는 경우
      • restaurant_name like '%Next%'
    • 특정한 문자로 끝나는 경우
      • 기본 문법 : like ‘**%**끝나는문자’
      • 예시 : ‘임’ 으로 끝나는 이름
      • name like '%임'


논리연산 : 여러조건 적용 시

  • AND, OR, NOT
select * from 테이블명 where column1='Korean' and column2>=30000



숫자연산 : +, -. *, /

select a, b, a+b as c from 테이블명

 


집계 함수

합계 함수 : sum

평균 함수 : avg

select sum(column1) total_column1, avg(column2) total_column2 from 테이블명



갯수 함수 : count

select count(1) from 테이블 명 : 테이블에 전체의 갯수를 집계 (1 또는 *)
select count(1) total_count, count(distinct player_id) total_player_id from 테이블명
  • distinct : 중복된 값을 제거하고 고유한 값만 고려하도록 하는 키워드


최솟값 : MIN(컬럼)

최댓값 : MAX(컬럼)

select min(price) min_price, max(price) max_price from 테이블명

GROUP BY : 컬럼 속성별 집계 진행 시

select column1, sum(column2), from 테이블명 group by column1
select column1, avg(column2)
from 테이블명
group by column1

#위와 동일한 쿼리문
select column1, avg(column2)
from 테이블명
group by 1

ORDER BY : 정렬

오름차순 정렬

select column1, sum(column2) from 테이블명 group by column1 order by sum(column2)

 

내림차순 정렬

select column1, sum(column2) from 테이블명 group by column1 order by sum(column2) desc


columm1 오름차순 정렬 후 column2 오름차순 정렬 진행

select * from 테이블명 order by column1, column2

 


replace 함수 : 문자 치환

replace(바꿀 컬럼, 현재 값, 바꿀 값)



substring (substr) 함수 : 특정 문자 추출

substr(조회 할 컬럼, 시작 위치, 글자 수)

 글자 수 생략 가능(생략할 경우 문자 수 끝까지 추출)

select column1, substr(column1, 1, 2) "column1_substr" from 테이블명 where column1 like '%ABCD%'

 

 

concat 함수 : 문자 결합

concat(붙이고 싶은 값1, 붙이고 싶은 값2, 붙이고 싶은 값3, .....)
select name, address, concat('[', substring(address, 1, 2),']',name)
from 테이블명
where address like '%서울%'

 


if 함수 : 컬럼별 조건 주고 싶을 때

if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
select addr "원래 주소", 
	if(addr like '%평택군%', replace(addr, '문곡리', '문가리'), addr) "바뀐 주소" 
from 테이블명 
where addr like '%문곡리%'
select substring(if(email like '%gmail%', replace(email, 'gmail', '@gmail'), email), 10) "이메일 도메인", 
	count(customer_id) "고객 수", 
	avg(age) "평균 연령" 
from 테이블명 
group by 1

having 절

그룹화된 데이터의 조건을 필터링할 때 사용하는 절

보통 **GROUP BY**와 함께 사용되며, **집계 함수(aggregate functions)**를 기반으로 한 조건을 적용하는 데 사용됩니다. WHERE 절과 비슷하지만, WHERE 절은 행(row) 단위의 조건을 필터링하는 반면, HAVING 절은 그룹(group) 단위의 조건을 필터링합니다.

  1. 집계 함수 사용 가능:
    SUM(), COUNT(), AVG(), MAX(), MIN() 등 집계 함수의 결과를 기준으로 조건을 필터링할 수 있습니다.
  2. GROUP BY와 함께 사용:
    • 데이터를 그룹화한 후 각 그룹의 집계 결과를 필터링합니다.
  3. WHERE와의 차이점:
    • WHERE: 그룹화 전에 데이터를 필터링(행 단위).
    • HAVING: 그룹화 후에 필터링(그룹 단위).
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블명
GROUP BY 컬럼1
HAVING 조건;

 

예제 1) 고객별 총 주문 금액이 1000 이상인 고객 조회

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) >= 1000;

 

예제 2) 각 고객의 주문 건수가 2건 이상인 경우

SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) >= 2;