첨부된 이미지는 모두 SW캠프 수업 자료입니다.
INNER JOIN / OUTER JOIN으로 구분
SELECT 열_이름들
FROM 첫번째_테이블
INNER JOIN 두번째_테이블 ON 첫번째_테이블.공통_열 = 두번째_테이블.공통_열;
SELECT * FROM tableA AS a INNER JOIN tableB AS b ON a.ID = b.a_id;출력 결과 : tableA의 모든 컬럼 + tableB의 모든 컬럼 중 ON 조건을 만족하는 row만 출력.

SELECT * FROM tableA a LEFT JOIN tableB b ON a.id = b.a_id출력 결과 : tableA의 모든 컬럼 + tableB의 모든 컬럼 중
A 테이블 데이터 row는 모두 출력, B 테이블 데이터는 ON 조건에 맞는 데이터만 출력
ON 조건에 맞지 않는 B 데이터는 null로 출력
ORDER BY 시에 B 데이터를 기준으로 하게 되면 null 이 최상단에 위치됨에 주의.

join 은 옆으로 붙인다면 union 은 아래로 !UNION ALL-- union : 중복을 제회한 두 테이블의 select 를 결합.
-- 컬럼의 개수와 타입이 같아야함에 유의
-- union all : 중복 포함
select 컬럼1, 컬럼2 from table1 union select 컬럼1, 컬럼2 from table2;
-- author 테이블의 name, email / post 테이블의 title, contents 를 union
select name, email from author union select title, contents from post;
1) SELECT 절: select 절 안에 서브쿼리 → select 문 안에 또 다른 select 문.
2) FROM 절: from 절 안에 서브쿼리 → from 안에 또 다른 select 문
3) WHERE 절: where 절 안에 서브쿼리 : where 문 안에 또 다른 select 문
-- 서브 쿼리
-- select 절 안에 서브쿼리 : select 문 안에 또 다른 select 문.
-- author email과 해당 author가 쓴 글의 개수를 출력
select email, (select count(*) from post p where p.author_id = a.id) as count from author a;
-- from 절 안에 서브쿼리 : from 안에 또 다른 select 문
select a.name from (select * from author) as a;
-- where 절 안에 서브쿼리 : where 문 안에 또 다른 select 문
select a.* from author a inner join post p on a.id = p.author_id;
-- 위 쿼리를 where 절로 변환
select * from author where id in (select author_id from post);
SELECT 컬럼명 FROM 테이블명 GROUP BY 컬럼명SELECT DATE_FORMAT(datetime, '%H') as HOUR, COUNT(*) FROM animal_outs
WHERE DATE_FORMAT(datetime, '%H:%i')
BETWEEN '09:00' AND '19:59' GROUP BY HOUR ORDER BY HOUR;
-- 앞에서 HOUR 로 정의 > GROUP BY 에서 HOUR 로 사용
사용 목적
집계함수
-- 집계 함수
SELECT COUNT (*) FROM author; -- (= SELECT COUNT(ID) FROM AUTHOR;) >> 행의 갯수를 세는 거라 ID 갯수와 동일함.
SELECT SUM(price) FROM post;
SELECT AVG(price) FROM post; -- 반올림하면 ROUND(AVG(PRICE), 소수점자리) >> SELECT ROUND(AVG(price),0) FROM post;
HAVING
쿼리의 진행 순서
SELECT > JOIN > ON > WHERE > GROUP > HAVING > ORDER > LIMIT
다중열 GROUP BY
-- 다중열 group by
SELECT author_id, title, count(title) FROM post GROUP BY author_id, title;
-- author_id 로 묶었던 그룹을 title로 한 번 더 묶어줌 >> 앞에서 title도 뽑아내기 OK
색인과 목차처럼 데이터 검색 속도를 향상시키는데 사용.
일반적으로 인덱스는 B-tree의 자료구조를 가지고, 이는 이진 트리를 확장한 형태로, 한 노드가 두 개 이상의 자식을 가질 수 있는 자료구조.
- 이진트리는 최대 2개의 자식 노드를 가지는 구조. 모두 2개의 자식노드만을 가진 이진트리를 완전이진트리라 부른다.

▶ id = 897 번째의 데이터를 조회한다면 root에서 8번, 그 다음 branch에서 9번, 그 다음 leaf에서 7번, 24번만에 검색 완료!
만약 인덱스가 없다면? 897번 동안 하나 하나 확인하게 됨.
인덱스 생성 : PK, FK, UNIQUE 제약 조건 추가 시 해당 컬럼에 대해 index 자동 생성됨.
단일 컬럼 index : CREATE INDEX index_name ON 테이블명(컬럼명);
복합(다중 컬럼) 인덱스 생성 : CREATE INDEX index_name ON 테이블명(컬럼1, 컬럼2);
-- 인덱스 없이 조회 -> 0.178s
SELECT * FROM author WHERE email = 'test99999@naver.com';
-- 인덱스 생성
CREATE index email_index on author(email);
-- 후 다시 조회하면 -> 0.002s 시간이 감소함!
오늘은 정말 정말 방대한 양의 개념을 배우고 실습하였다 !
중간 점검으로 강사님께서 응용이 어렵다는 나에게
응용은 연습하면 된다 ! 수업이 이해가 됐다면 당장은 그걸로 OK !
이런 말씀을 해주셨다.. 수업 중 여기 저기서 여러 방안들을 던지고,
가끔 나오는 질문들을 보면 (내 기준에서는) 엄청난 수준들이라 나만 뒤쳐진 것 같고, 여러가지 걱정들이 쌓여갔었는데 강사님이 말 한 마디로 큰 힘을 실어주셨다 !🍀 (과대해석이어도 원영적 사고로 받아들이기)
-- 실습 : 두 건 이상의 글을 쓴 사람의 id와 횟수 구하기.
-- 나이는 25세 이상인 사람만 통계에 사용, 가장 나이 많은 사람 한 명의 통계만 출력하시오.
SELECT a.id, COUNT(a.id) as count FROM post p INNER JOIN author a
ON a.id = p.author_id WHERE a.age >= 25 GROUP BY a.id HAVING count >=2 ORDER BY max(a.age) DESC LIMIT 1;
-- 한 그룹에는 다 같은 나이가 잡힐 거니까 max를 쓸 필요가 없다 >> a.age 를 DESC 로 정렬하면 당연히 max 가 최상단일테니까..
특히나 오늘은 여기서 다들 MAX 가 빠져도 되는데 왜 써야하는가? 에 대한 작은 토론이 열렸었는데, 나 혼자만.. 왜 MAX 가 빠져도 똑같다는거지..? 하고 이해가 안 가는데 진짜 도저히! 질문하기 너무너무 창피한 수준의 의문이어서 세미 개발자 / 개발자 연습생 친구에게 물어보니 보자마자 "DESC 이니까 당연히 큰 값이 맨 위지" 라고 답변해줬다..
나도 한 번에 캐치할 수 있는 사람이 되고 싶다..
얼만큼 노력하면 되니..? 어디까지 왔니 개발자 아영아...... 기다릴게....