본문 바로가기
개발일지

[내일배움단] 엑셀보다 쉬운 SQL - 4주차 숙제, SQL 문법 총정리

by 능이버섯 2022. 1. 27.
반응형

쿼리문 : 데이터베이스에 명령을 내린다

Select 쿼리문 : 데이터베이스에서 내가 원하는 데이터를 선택해서 가져오겠다

select 필드 from 테이블 형식으로 불러올 수 있다

테이블 : 엑셀 시트명, 필드 : 시트 안에 구분되어 있는 데이터 구분값

 

 

SQL에서 가장 중요한 건 쿼리가 실행되는 순서

 

select u.name, count(u.name) as u_name from orders o

inner join users u

on o.user_id = u.user_id

where o.course = "abc"

group by u.name;

order by count(u.name) desc;

 

예를 들어 위 쿼리가 있을 경우 실행되는 순서는 from -> join -> where -> group by -> select -> order by

orders 테이블을 앞으로 o 라고 부르겠다. (orders o)

o 테이블을 users 테이블(u라고 부르겠음)이랑 묶을 건데 (from), (inner join)

o 테이블의 user_id 필드랑 u 테이블의 user_id 필드는 같다 (on o.ㅌㅌㅌ = u.ㅌㅌㅌ)

o 테이블의 course 필드값이 "abc"인 데이터를 가져와서 (where)

걔네를 u 테이블의 name이라는 그룹으로 묶어서 (group by)

u 테이블의 name으로 묶은 데이터 갯수가 몇 개인지 보여주되 (select)

내림차순으로 나타내줘 (order by ~~ desc)

근데 걔를 u_name이라고 표기할 거임 as u_name

 

 

 

show tables; 전체 테이블 보기

select * from ㅇㅇㅇ : ㅇㅇㅇ 테이블에 있는 모든 데이터를 불러와주라. *은 모든 것을 뜻한다.

select ABC from ㅇㅇㅇ : ㅇㅇㅇ 테이블에 있는 ABC 필드를 불러와주라.

 

where절 : select 쿼리문으로 가져올 때 데이터에 조건 거는 것

select * from ㅇㅇㅇ

where ABC = "ㅁㅁㅁ";

오더스 테이블에서 ABC 필드에 "ㅁㅁㅁ"인 데이터만 가져와.. ; 는 그냥 붙이는 거다 이유 알 필요 없다 걍 붙인다.

문자열로 인식 시키려면 "" 꼭 사용해야 한다. 따옴표 없이 작성하면 필드명으로 인식한다.

 

여러 조건을 걸고 싶은 경우 and를 사용한다.

where ABC = "ㅁㅁㅁ" and DEF = "ㅅㅅㅅ";

ABC의 ㅁㅁㅁ이면서 DEF의 ㅅㅅㅅ를 만족하는 데이터를 불러와.

 

숫자와 관련된 경우

where ㅇㅇㅇ > 숫자; 형식으로 작성. 크다 작다 크거나 같다 등으로 활용 가능

 

문법

같지 않음 where 필드 != "데이터"

범위 조건 between 데이터 and 데이터;

포함 조건 where 필드 in (데이터, 데이터);

 

문자열 규칙 like 사용법

where 필드 like 'a%' : 필드값이 a로 시작하는 모든 데이터

where 필드 like '%a' : 필드값이 a로 끝나는 모든 데이터

where 필드 like '%a%' : 필드값이 a를 포함하는 모든 데이터

where 필드 like 'a%b' : 필드값이 a로 시작하고 b로 끝나는 모든 데이터

 

데이터 관련 명령어

limit : 일부 데이터만 가져오기, 너무 많은 데이터를 한 번에 불러오면 버벅거리니까 ㅇㅇ

 

select * from ㅇㅇㅇ

where ABC = "ㅁㅁㅁ";

limit 5; 

 

ㅇㅇㅇ 테이블에서 ABC 필드값이 ㅁㅁㅁ인 거를 5개만 가져와

 

distinct : 중복 항목 제외하고 가져오기

select distinct(결제수단) from ㅇㅇㅇ : ㅇㅇㅇ 테이블의 결제수단 필드에 결제수단이 몇 개 있는지 가져와

 

count : 숫자 세기, (*)는 전체, (유저) 이런 식으로 필드 지정 가능함

select count(유저) from ㅇㅇㅇ : ㅇㅇㅇ 테이블의 유저 필드에 몇 명 있는지 가져와

 

동시에 쓰기 -> select count(distinct(ABC)) from ㅇㅇㅇ : ㅇㅇㅇ 테이블의 ABC 필드에 중복된 항목을 제외하고 총 몇 갠지 세어줘

 

group by ㅇㅇㅇ; ㅇㅇㅇ로 데이터를 묶어줘

어떤 데이터를 추출할 때 같은 범주에 있는 데이터를 한 그룹으로 묶어서 처리하면 훨씬 효율적이니까.

 

order by ㅇㅇㅇ;  ㅇㅇㅇ로 정렬해줘 - 기본적으로 오름차순임, 내림차순을 원하는 경우 order by ㅇㅇㅇ desc

 

min(최솟값), max(최댓값), avg(평균), sum(합계)

데이터가 예쁘게 보이길 원하면 round(avg(평균),2) 이런 식으로 소숫점 얼마까지 보여줄 건지 설정 가능

 

 

별칭 Alias (as) 쿼리가 너무 길어지면 헷갈리니까 이름을 정해줄 수 있다.

select abcedrfdscfasfadhjlfasdhlkfahs as abc from users u

users 테이블을 u라고 부를 것이고, abcedrfdscfasfadhjlfasdhlkfahs 필드를 abc라고 부를 것이다.

 

 

join 공통된 정보(key값) 가져와서 한 테이블처럼 볼 수 있도록 이어붙이는 것

select * from 테이블 a

inner join 테이블 b

on a.필드 = b.필드;

테이블 a 필드랑 b 필드는 같은 값이라는 뜻, 이너조인은 교집합이라 순서가 별로 상관없음 아무렇게나 써도 된다.

 

 

select * from 테이블 a

left join 테이블 b

on a.필드 = b.필드;

원하는 필드 옆에 붙이는 거라 어디에 어떤 필드를 붙일 것인지 순서가 중요하다.

테이블 a 필드랑 b 필드는 같은 값이어도 비어있는 필드가 있을 수 있고 그런 것은 NULL로 표시되며 count에서 세지 않는다

where 필드 is NULL / where 필드 is not NULL : 데이터가 비어있거나 비어있지 않은 것을 구할 수 있음

 

union all : 결과물 합쳐서 한 번에 보기

 

서브쿼리 : 쿼리문 안에 들어있는 하위 쿼리문

자주 쓰이는 서브쿼리 유형 : where, select, from

select * from users u

where u.user_id in (select o.user_id from orders o

            where o.payment_method = 'kakaopay');

from으로 user 데이터 가져와서 / (select ~~) 서브쿼리문이 실행되는데, orders 테이블의 카카오페이로 결제한 유저 아이디를 가져와서 / 서브쿼리 조건으로 필터링된 유저 테이블의 유저 아이디 출력

 

(a/b) 이런 식으로 쓰면 비율이 자동계산되어 나온다

 

 

with절

래디오구구 래디오절절 쓰면 헷갈리니께 앞으로 얘를 이렇게 부르겠다. 정리해주는 역할.

 

SUBSTRING(문자열,출력을 하고 싶은 첫 글자 위치, 몇 개 출력하고 싶은지)

 

case : 특정 조건을 주고 싶을 때

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

 

case 이하의 조건 전제하에 pu 테이블의 포인트 유저 아이디, pu 테이블의 포인트를 불러오기 할 거다 from

pu 테이블 포인트가 10000보다 크면 1만 이상이라는 텍스트와 함께 출력 then '1만 이상'

5000보다 크면 5천 이상이라고 출력 then '5천 이상' 나머지는 5천 미만 else '5천 미만' 이라고 할 거임 조건은 여기까지가 끝임 END

이 조건을 lv라고 부르겠다 as lv

위의 조건을 편의 상 테이블1이라고 부르겠다 with table1 as ( ~~ )

테이블1의 데이터를 lv로 그룹화 하고 그 중 레벨 필드랑 갯수를 가져오는데 걔를 cnt라고 부르자 (group by) (select ~~ ), (as cnt)

 

 

반응형

댓글