[SQL] 기본 문법 정리

CHLEE·2022년 8월 2일
0

TIL

목록 보기
3/9
post-custom-banner

Select 쿼리문

데이터베이스에서 '데이터를 선택해서 가져오겠다'는 의미입니다.
1) 어떤 테이블에서 2) 어떤 필드의 데이터를 기져올지 로 구성됩니다.

select * from (table) -> 특정 table의 데이터 가져오기
select (field) from (table) -> 특정 table의 특정 field의 데이터 가져오기


Where 절

Where 절은, Select 쿼리문으로 가져올 데이터의 조건을 걸어주는 것을 의미합니다.

select * from orders
where payment_method = "kakaopay";

"orders 테이블에서 payment_method가 kakaopay인 것만 가져오기"
(kakaopay는 필드명이나 테이블 명이 아닌 문자열로 인식시키기 위해 ""을 써줘야 됩니다.)

자주 같이 쓰는 문법

  • '같지 않음' 조건은 !=
  • '범위' 조건은 between ~ and ~
  • '포함' 조건은 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

Group by는 범주의 통계를 내줍니다.

select name, count(*) from users
group by name;
  1. from users: users 테이블에서 데이터를 불러옵니다.
  2. group by name: name이라는 필드에서 동일한 값을 갖는 데이터를 하나로 합쳐줍니다.
  3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.

👉 위 쿼리가 실행되는 순서 : from → group by → select

select 범주가 담긴 필드명,from 테이블명
group by 범주가 담긴 필드명;

⭐ 위치에 원하는 값들을 구하기 위해서 count, min, max, avg, sum을 넣어서 구할 수 있습니다.


Order by

Order by는 정렬을 하기 위해 사용되고 모든 SQL 쿼리에 적용될 수 있는 기능입니다.
기본적으로 오름차순으로 정렬이 되고 뒤에 desc를 붙이면 내림차순으로 정렬됩니다.

select name, count(*) from users
group by name
order by count(*);
  1. from users: users 테이블 데이터 전체를 가져옵니다.
  2. group by name: users 테이블 데이터에서 같은 name을 갖는 데이터를 합쳐줍니다.
  3. select name, count(*): name에 따라 합쳐진 데이터가 각각 몇 개가 합쳐진 것인지 세어줍니다.
  4. order by count(*): 합쳐진 데이터의 개수에 따라 오름차순으로 정렬해줍니다.

👉 위 쿼리가 실행되는 순서 : from → group by → select → order by


💡Alias
쿼리가 점점 길어지면서 종종 헷갈리는 일이 생길 수 있습니다. 그래서 SQL은 Alisas라는 별칭 기능을 지원해 테이블명 뒤에 as를 붙여서 별칭을 추가하여 혼동을 최소화하고 원하는 이름으로 결과를 출력할 수 있습니다.


Join

두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미합니다. 무언가 연결된 정보가 있을 때, 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓습니다. 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부릅니다.
Left join

  • Left Join -> 어디에 뭐를 붙일건지, 순서가 중요


  • Inner Join -> 교집합
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
  1. from enrolleds: enrolleds 테이블 데이터 전체를 가져옵니다.
  2. inner join courses on e.course_id = c.course_id: courses를 enrolleds 테이블에 붙이는데, enrolleds 테이블의 course_id와 동일한 course_id를 갖는 courses의 테이블을 붙입니다.
  3. select * : 붙여진 모든 데이터를 출력합니다.

👉 위 쿼리가 실행되는 순서: from → join → select
항상 from에 들어간 테이블을 기준으로, 다른 테이블이 붙는다고 생각하고 Join의 실행순서는 항상 from과 붙어다닌다고 생각하면 편합니다!


Subquery

결과물을 합치기 위해서 Union을 쓸 수 있지만 내부 정렬이 먹지 않습니다. 그래서 이럴 때 Subquery를 사용하면 됩니다.

Subqurey란 쿼리 안의 쿼리라는 의미입니다. Subquery를 사용하지 않아도 원하는 데이터를 얻어낼 수 있겠지만, 더 편하고 간단하게 원하는 데이터를 얻기 위해 사용되는 기능입니다. Subquery는 where, select, from 절에서 유용하게 사용되고 with구문을 이용해서 더 간단하게 쿼리문을 작성할 수 있습니다.

  • where 필드명 in (subquery)
    • (1) from 실행: users 데이터를 가져와줌
      (2) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
      (3) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
      (4) 조건에 맞는 결과 출력
  • select 필드명, 필드명, (subquery) from ..
    • (1) 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서
      (2) select 안의 subquery가 매 데이터 한줄마다 실행되는데
      (3) 그 데이터 한 줄의 user_id를 갖는 데이터의 평균 좋아요 값을 subquery에서 계산해서
      (4) 함께 출력
  • From은 내가 만든 Select와 이미 있는 테이블을 Join하고 싶을 때 사용 (가장 많이 사용)
    • (1) 먼저 서브쿼리의 select가 실행되고,
      (2) 이것을 테이블처럼 여기고 밖의 select가 실행

유용한 문법들

  • 문자열 쪼개기
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users

👉 @를 기준으로 텍스트를 쪼개고, 그 중 첫 번째 조각을 가져오라는 뜻!

select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users

👉 @를 기준으로 텍스트를 쪼개고, 그 중 마지막 조각을 가져오라는 뜻!

  • 문자열 일부만 출력하기
select order_no, created_at, substring(created_at,1,10) as date from orders

👉 orders 테이블에서 created_at을 날짜까지만 출력하게 하라는 뜻!

  • Case : 경우에 따라 원하는 값을 새 필드에 출력해보기
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

👉 10000점보다 높은 포인트를 가지고 있으면 '잘 하고 있어요!', 평균보다 낮으면 '조금 더 달려주세요!' 라고 표시하라는 뜻!


출처 : [스파르타코딩클럽] 엑셀보다 쉬운 SQL 강의자료

profile
🤗
post-custom-banner

0개의 댓글