관리 메뉴

me made it !

20230216 [SQL] LEFT JOIN , SEQUENCE 본문

TIL/SQL

20230216 [SQL] LEFT JOIN , SEQUENCE

yeoney 2023. 2. 16. 12:43
반응형

-- 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

https://doh-an.tistory.com/30

출처

 

[DB] SQL - JOIN문, JOIN 종류 (Inner Join,Natural Join,Outer Join,Cross Join)

1. Join이란? 두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법 두 개의 테이블을 마치 하나의 테이블인 것처럼 보여준다. 2. 기본 구조 1) 일반 SELECT 테이블.컬럼, 테이블.컬

doh-an.tistory.com


 

 



예) 게시글을 쓴 사람들 중에 최고 나이 많은 사람의 나이와 가장 나이 어린 사람의 나이를 출력하시오

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;

rollback: 되돌리기

commit: 번복안된다..

 

 

 

 

테이블 만듦(무시)

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test1',
              '1111',
              '홍길동',
              'test@naver.com',
              'female',
              '전주',
              '20230101',
              '123.456.789.100'
       );
INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test2',
              '1111',
              '홍길서',
              'test@naver.com',
              'male',
              '서울',
              '20110101',
              '123.456.789.200'
       );
INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test3',
              '1111',
              '홍길동',
              'test3@naver.com',
              'male',
              '광주',
              '20200122',
              '123.456.789.300'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test4',
              '1111',
              '홍길훈',
              'test4@naver.com',
              'male',
              '부산',
              '20020101',
              '123.456.789.400'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test5',
              '1111',
              '홍길치',
              'test5@naver.com',
              'female',
              '대구',
              '19980101',
              '123.456.789.500'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test6',
              '1111',
              '홍길림',
              'test6@naver.com',
              'female',
              '서울',
              '20110101',
              '123.456.789.600'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test7',
              '1111',
              '홍길우',
              'test7@naver.com',
              'male',
              '서울',
              '19970101',
              '123.456.789.700'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test8',
              '1111',
              '홍길찬',
              'test8@naver.com',
              'female',
              '전주',
              '19740101',
              '123.456.789.800'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test9',
              '1111',
              '홍길수',
              'test9@naver.com',
              'female',
              '서울',
              '19840101',
              '123.456.789.900'
       );

INSERT
INTO   member1230
       (
              midx,
              memberId,
              memberPwd,
              memberName,
              memberEmail,
              memberGender,
              memberAddr,
              memberBirth,
              ip
       )
       VALUES
       (
              midx_seq.NEXTVAL,
              'test10',
              '1111',
              '홍길리',
              'test10@naver.com',
              'male',
              '서울',
              '19770101',
              '123.456.789.230'
       );
SELECT *FROM MEMBER1230;

-- 게시글 모두를 지우고 시퀀스 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;

 

 

 

 

 

https://school.programmers.co.kr/learn/challenges?order=recent 

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

반응형