쿼리(Query)문 - 데이터베이스에 명령을 내리는 것
Select 쿼리문 - 데이터베이스에서 '데이터를 선택해서 가져오겠다'는 의미.
Select 쿼리문은 1) 어떤 테이블에서 2) 어떤 필드의 데이터를 가져올지 로 구성된다.
Where 절의 개념 - Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것
and 연산자 - 조건을 추가
비교 연산자
연산자 앞뒤에 있는 데이터 값을 비교하는 데 사용한다. 문자열은 알파벳 순서로 문자열의 대소를 비교한다.
ex) >, >=, <, <=
+등가 비교 연산자 : 연산자 양쪽 항목이 같은 값인지 검사하는 연산자
ex) = , !=, <>, ^= : =를 제외한 3개는 모두 같은 의미 (≠)
범위 조건 - between
포함 조건 - in
패턴 (문자열 규칙) 조건 - like
where email like 'a%': email 필드값이 a로 시작하는 모든 데이터
where email like '%a' email 필드값이 a로 끝나는 모든 데이터
where email like '%co%' email 필드값에 co를 포함하는 모든 데이터
where email like 'a%o' email 필드값이 a로 시작하고 o로 끝나는 모든 데 이터
일부 데이터만 가져오기: Limit
중복 데이터는 제외하고 가져오기: Distinct
몇 개인지 숫자 세보기: Count
Group by
동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것
- 동일한 범주의 개수 구하기 - count
- 동일한 범주에서의 최솟값 구하기 - min
- 동일한 범주에서의 최댓값 구하기 - max
- 동일한 범주의 평균 구하기 - avg
- 동일한 범주의 합계 구하기 - sum
Order by
데이터를 내림차순(desc) 혹은 오름차순으로 정렬
Alias
별칭 기능, 혼동을 최소화하고 원하는 이름으로 결과를 출력하기 위해 사용된다.
Join
두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것
- Join의 종류 : Left Join, Inner Join
- Left Join : 합집합, 왼쪽의 모든 행을 조회한다. 따라서 왼쪽 테이블의 key값이 NULL이라면 오른쪽 테이블은 해당 행이 존재하지 않으므로 해당 행의 필드값들은 NULL로 채워진다.
- Inner Join : 교집합, 겹치치 않는 행이 존재할 경우 그 행은 결과에서 제외된다.
Union
여러개의 쿼리문을 사용하여 하나의 데이터로 출력해야 되는 경우 사용
- Union -결과를 합칠 떄 중복되는 행은 하나만 표시
- Union all - 중복제거를 하지 않고 모두 합쳐서 표시
Subquery
: 하나의 SQL 쿼리 안에 또다른 SQL 쿼리가 있는 것
- 자주 쓰이는 Subquery 유형
- Where 절에 들어가는 Subquery
- Subquery의 결과를 조건에 활용하는 방식으로 유용하게 사용. -
ex) where 필드명 in (subquery)
- Subquery의 결과를 조건에 활용하는 방식으로 유용하게 사용. -
- Select 절에 들어가는 Subquery
- 기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 붙이는 것에 사용
ex) select 필드명, 필드명, (subquery) from ..
- 기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 붙이는 것에 사용
- From 절에 들어가는 Subquery (가장 많이 사용)
- 내가 만든 Select와 이미 있는 테이블을 Join하고 싶을 때 사용
- Where 절에 들어가는 Subquery
With 절
- 이름을 가진 SubQuery를 정의한 후 사용하는 구문.
- Query의 전체적인 가독성을 높이고, 재사용할 수 있는 장점이 있음.
- with [별명] as (subquery)
실전에서 유용한 SQL 문법 (문자열, Case)
- 문자열 데이터 다뤄보기
- SUBSTRING_INDEX - 문자열 쪼개기
- ex) 이메일에서 아이디만 가져와보기
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
@를 기준으로 텍스트를 쪼개고, 그 중 첫 번째 조각을 가져오라는 뜻 - ex) 이메일에서 이메일 도메인만 가져와보기
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
@를 기준으로 텍스트를 쪼개고, 그 중 마지막 조각을 가져오라는 뜻
- ex) 이메일에서 아이디만 가져와보기
- SUBSTRING - 문자열 일부만 출력하기
- ex) orders 테이블에서 날짜까지 출력하게 해보기
select order_no, created_at, substring(created_at,1,10) as date from orders
SUBSTRING(문자열, 출력을 하고싶은 첫 글자의 위치, 몇개의 글자를 출력하고 싶은지) - ex) 일별로 몇 개씩 주문이 일어났는지 살펴보기
select substring(created_at,1,10) as date, count(*) as cnt_date from orders
group by date
- ex) orders 테이블에서 날짜까지 출력하게 해보기
- SUBSTRING_INDEX - 문자열 쪼개기
- CASE: 경우에 따라 원하는 값을 새 필드에 출력해보기
- ex) 포인트 보유액에 따라 다르게 표시해주기
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu; - ex) 심화과정
1. 우선 몇 가지로 구분을 나누고,
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '1만 이상'
when pu.point > 5000 then '5천 이상'
else '5천 미만'
END as lv
from point_users pu
2. 서브쿼리를 이용해서 group by로 통계
select level, count(*) as cnt from (
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '1만 이상'
when pu.point > 5000 then '5천 이상'
else '5천 미만'
END as lv
from point_users pu
) a
group by lv
3.with 절로 정리하기
with table1 as (
select pu.point_user_id, pu.point,
case
when pu.point > 10000 then '1만 이상'
when pu.point > 5000 then '5천 이상'
else '5천 미만'
END as lv
from point_users pu
)
select level, count(*) as cnt from table1
group by lv
- ex) 포인트 보유액에 따라 다르게 표시해주기