-- left outer join(왼쪽에 있는 테이블의 모든 것과 오른쪽에 있는 공통된 데이터)
-- 형식 select *from 테이블 A left outer join 테이블 B on A.공통컬럼=B.공통컬럼
-- 각 지역별로 글 쓴 사람의 인원수를 출력하시오
SELECT A.MEMBERADDR,COUNT(DISTINCT B.midx)
FROM MEMBER1230 A LEFT OUTER JOIN BOARD1230 B ON A.MIDX = B.MIDX
GROUP BY A.MEMBERADDR;
왼쪽을 기준으로 컬럼 값이 없으면 NULL처리를 한다.
SELECT *
FROM MEMBER1230 A LEFT OUTER JOIN BOARD1230 B ON A.MIDX = B.MIDX; --(표준쿼리)
SELECT *FROM MEMBER1230 a,BOARD1230 b
WHERE a.MIDX = b.MIDX(+) AND 조건식; --(+) : 왼쪽에 있는 쿼리와 오른쪽 쿼리를 더한다.
예) 성별로 글 쓴 사람의 인원수를 출력하시오(남성 몇명, 여성 몇명)
SELECT a.MEMBERGENDER,COUNT(b.writer)
FROM MEMBER1230 a LEFT OUTER JOIN board1230 b ON a.MIDX=b.MIDX
GROUP BY a.MEMBERGENDER;
--근데 이거말고
-- left join 보다 inner join을 사용하는게 좋다
SELECT a.MEMBERGENDER,COUNT(DISTINCT a.MIDX)
FROM MEMBER1230 a JOIN board1230 b ON a.MIDX=b.MIDX
GROUP BY a.MEMBERGENDER;
+++)))left join 보다 inner join을 사용하는게 좋다?
>왜>
INNER JOIN
기준 테이블과 조인 테이블 모두에 조인 컬럼 데이터가 존재해야 조회됨 (ON절)
예시 SELECT Sales.*, Countries.Country FROM Sales JOIN Countries ON Sales.CountryID = Countries.ID
LEFT JOIN
Left Join = Left Outer Join
왼쪽 테이블을 기준으로 일치하는 행만 결합되고, 일치하지 않는 부분은 null 값으로 채워짐.
예시 SELECT * FROM instructor LEFT OUTER JOIN teaches ON instructor.id = teaches.id
예) 게시글을 쓴 사람들 중에 최고 나이 많은 사람의 나이와 가장 나이 어린 사람의 나이를 출력하시오
SELECT MAX(2023-SUBSTR(a.memberBirth,1,4)),MIN(2023-SUBSTR(a.memberBirth,1,4))
FROM MEMBER1230 a JOIN board1230 b ON a.MIDX=b.MIDX ;
예) 회원번호 3,5번인 사람이 쓴 글의 내용중에 안녕이라는 글자가 포함된 글을 번호로 출력하시오
SELECT bidx FROM board1230 WHERE MIDX IN(3,5) AND CONTENT LIKE '%안녕%';
-- 시퀀스 (sequence) 순서를 갖춘 장면(자동 번호표) -- 자동번호표를 만들어 내는 객체
-- 형식 create sequence 시퀀스이름
-- increment by 1(증가)
-- start with 1;
CREATE SEQUENCE midx_seq
INCREMENT BY 1
START WITH 1;
-- 1부터 하나씩 증가
SELECT MIDX_SEQ.NEXTVAL FROM dual;
-- 현재 값
SELECT midx_seq.CURRVAL FROM dual;
-- 시퀀스 삭제
DROP SEQUENCE midx_seq;
DELETE FROM MEMBER1230;
DELETE FROM BOARD1230;
ROLLBACK;
COMMIT;
SELECT *FROM MEMBER1230;
SELECT *FROM BOARD1230;
-- 게시글 모두를 지우고 시퀀스 bidx_seq를 생성해서 게시글 샘플데이터에 적용하시오
CREATE SEQUENCE bidx_seq
INCREMENT BY 1
START WITH 1;
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'첫번째글입니다.','첫번째내용입니다.','김민수','111.222.333.444',1);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'두번째글입니다.','두번째내용입니다.','행인','222.222.333.444',2);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'세번째글입니다.','세번째내용입니다.','아이언맨','222.222.333.555',1);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'네번째글입니다.','네번째내용입니다.','토르',null,3);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'다섯번째글입니다.','다섯번째내용입니다.','스파이더맨',null,4);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'여섯번째글입니다.','여섯번째내용입니다.','슈퍼맨',null,3);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'일곱번째글입니다.','일곱번째내용입니다.','원더우먼',null,5);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'여덟번째글입니다.','여덟번째내용입니다.','배트맨',null,6);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'아홉번째글입니다.','아홉번째내용입니다.','이순신',null,1);
INSERT INTO board1230(bidx,subject,content,writer,ip,midx)
VALUES(bidx_seq.NEXTVAL,'열번째글입니다.','열번째내용입니다.','김순자',null,9);
SELECT *FROM BOARD1230;