이틀 간 SQL을 공부했다.

SQL 공부

by 김은송

기본구조


SELECT 결과집합에 포함하려는 컬럼에 대한 식 리스트

FROM 테이블명

WHERE 데이터(행)에 대한 조건

GROUP BY 그룹을 나누는 기준 식(들) deptno 가 같은 경우 그룹핑

HAVING (group by의 조건) 그룹에 대한 조건

ORDER BY 정렬하고자 하는 기준에 대한 식(들)


서브쿼리

(셀렉트 안에 셀렉트)

메인쿼리 (서브쿼리 - (서브쿼리 ..))

서브 -> 메인 순으로 작동


ex)

스미스랑 같은 부서에서 근무하는 직원의 리스트

-> 스미스 근무 부서 넘버 (Deptno) 알아야 함


SELECT deptno from emp where ename='SMITH';

select * from emp where deptno =20;

이렇게 하면 되긴 하는데 한줄로 끝내자


= > select ename from emp where deptno = (select deptno from emp where ename='SMITH');


select ename

from emp

where deptno = (select deptno

from emp

where ename = 'SMITH')

이렇게 내려쓰기도 함

회사마다 다 다름


ex)

급여 평균보다 많이 받는 사원 정보 출력

select * from emp where sal > (select avg(Sal) from emp);


여기까진 안어려움


서브쿼리 수행 결과 값이 하나

다중행 비교 연산자( IN, ANY, ALL 등) 사용


group by, having절

having절은 where과 비슷한 개념으로 조건 제한하는 거지만, 집계 함수에 대해서 조건을 제한하는 것.


mysql > select year(hiredate), count(*) from emp group by year(hiderate) having count(*)>=2;


스크린샷 2025-05-09 141916.png

count(ename)

count(job) job컬럼값 가지고 카운팅 (null은 안 셈)


count(distinct job) => 중복된 것은 하나로


with roll up

: 그 그룹 뿐만 아니라 전체 집계도 같이 내준다.

(소합계와 총합계)


함수는...교..안에 엄청 많아서 쓰면서 외워야 할 듯


join

두 개 이상의 테이블을 가로로 묶어서 하나의 결과 집합으로 만들어 내는 것

inner join, outer join, cross join, self join

데이터베이스의 테이블은 중복과 공간 낭비를 피하고, 데이터의 무결성을 위해서 여러 개의 테이블로 분리하여 저장 분리된 테이블들은 서로 관계 (relation)을 가짐


db의 테이블은

중복과 공간 낭비를 피하고 데이터의 무결성을 위해서 여러 개의 테이블로 분리하여 저장

분리된 테이블들은 서로 관계를 가짐

1대 다 관계가 보편적


ex)

mysql> select *

from emp

join dept on emp.deptno = dept.deptno

스크린샷 2025-05-09 163727.png ㅇㅎ
스크린샷 2025-05-09 171234.png

"""

이러면 deptno가 null이면 빠짐.

부서정보를 매칭할 수가 없으니가

부서명도 몇개 빠짐

(매칭 안되면 뺀다 마인드)

"""

= inner join (기본)



"""

그래도 뺼 수는 없음.

포함시킨다.

"""

= outer join



근데 deptno컬럼이 두개임.

'''

등가비교일때 (컬럼명이 같을 때만) = 등가 join

select * from emp

join dept on dept using(deptno);

'''

이렇게 안하면

select할 때 emp.deptno인지 dept.deptno 인지 테이블 명을 정확히 명시해줘야 함.

안그럼

errrrrror....나


cross join = > 데이터 내용이 중요한게아니라 테스트 때문에 데이터를 증폭시켜야 할 때 쓰는 거 (나는 잘 안쓰는 거)

self join => 자기 자신하고 join emp-emp

여러개의 테이블로 분리해서 저장한다.


아니 그냥 쉽게 말해서 테이블 - 테이블 엮는 거 인 것 같음


emp테이블에서는 부서이름dname을 뽑을 수 없으니까 join시켜서 뽑을 수 있음.

location도 얼마든지..


근데 join은 수명이 select일때임

join을 할 일이 많으면 귀찮으니까 view로 만들기도(like 가짜 테이블)


스크린샷 2025-05-09 171321.png


left - 기준에서 null이어도 출력

right - join된 거에서 매칭 안되어도 출력

full - 둘다 = my sql에서 지원 안해요오를레히히 그래서 left right union 하면 되긴 해 하면 하긴 해

오라클은 지원 함.



on/using은 join에 대한 조건



select ename, emp.deptno, dname

from emp

join dept

on emp.deptno = dept.deptno;




mission

직원들이 근무하는 부서명과 지역(도시) 정보를 출력한다.

= 3개의 테이블을 조인해야 함.


select ename, dname, city

from emp

join dept

using(deptno)

join locations

using(loc_code);


select ename, dname, city

frim emp e

join dept d

on e. deptno = d.deptno

join locations i

on d.loc_code = i.loc_code;


직원들이 근무하는 지역(도시) 정보를 출력한다.

= 직원 이름이랑 도시 이름,, 근데 조인할 근거가 없음 (직접 관계가 없음)

-> 그래도 그래도 3개 조인해야 함

스크린샷 2025-05-09 174323.png enriry relation diagram


코드 쓰기 전에

테이블 파악을 잘 하고, 추출해야 하는 데이터가 무엇인지를 아는 게 가장 중요함.



이제 select문은 다 읽을 줄 알고,, 간단한 건 쓸 줄 알아요! 우헤헤

좀 복잡한 건 gpt랑 같이 하면 충분히 할 수 있더라구요

이것도 배우고 보니 그냥 도구인 것 같습니다.

어떻게 이 데이터에 질문을 던질 것인가, 머가 필요한 데이터인지 아는 것이 더 중요하다는 생각이 듭니다.



비등가조인은 월욜에 해야징


keyword
작가의 이전글Firebase에서 바이브코딩