SQL - Day1
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 절에서 사용할 수 있는 것들입니다:
- 단일 값 비교:
• 컬럼 값과 특정 값을 비교.
• 예: WHERE age > 30 - 논리 연산자:
• AND, OR, NOT 등을 사용한 조건.
• 예: WHERE age > 30 AND region = '한국' - 패턴 매칭:
• LIKE 연산자를 사용한 문자열 비교.
• 예: WHERE name LIKE '김%' - NULL 값 확인:
• IS NULL, IS NOT NULL 등을 사용.
• 예: WHERE join_date IS NOT NULL - 범위 조건:
• BETWEEN, IN 등을 사용.
• 예: WHERE rating BETWEEN 1300 AND 1500 - 함수와 표현식:
• 개별 행에 대해 계산되는 함수.
• 예: 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) 단위의 조건을 필터링합니다.
- 집계 함수 사용 가능:
• SUM(), COUNT(), AVG(), MAX(), MIN() 등 집계 함수의 결과를 기준으로 조건을 필터링할 수 있습니다. - GROUP BY와 함께 사용:
• 데이터를 그룹화한 후 각 그룹의 집계 결과를 필터링합니다. - 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;