mysql 서브쿼리

27
데이터베이스 베이직 서브쿼리, 뷰 NHN NEXT 정호영 나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.

Upload: hoyoung-jung

Post on 13-Jul-2015

397 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: mysql 서브쿼리

데이터베이스베이직

서브쿼리, 뷰

NHN NEXT 정호영

나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.

Page 2: mysql 서브쿼리

오늘의실습자료

Page 3: mysql 서브쿼리

셀프조인

테이블이자기자신과조인하는걸말합니다.

예) 사용자와추천인의이름을보여주세요.

Page 4: mysql 서브쿼리

셀프조인

사용자와추천인의이름을보여주세요.

SELECT u.name, R.name FROM user U LEFT JOIN user R ON U.CHOO = R.ID;

Page 5: mysql 서브쿼리

서브쿼리(SUB QUERY)

쿼리안에다른쿼리가들어가는형태

중첩쿼리(nested query) 라고도합니다.

Page 6: mysql 서브쿼리

서브쿼리예제 1

‘맥북’을 팔고 있는유저의정보를출력하세요.

바깥쪽쿼리 : OUTER QUERY

안쪽쿼리 : INNER QUERY, SUB QUERY

SELECT * FROM user uWHERE u.id =

( SELECT seller FROM trade tWHERE item_name = '맥북'

);

Page 7: mysql 서브쿼리

서브쿼리의특징

SELECT, INSERT, UPDATE, DELETE 모두에사용가능

단,안쪽쿼리는무조건 SELECT 쿼리입니다.

Page 8: mysql 서브쿼리

서브쿼리의특징

모든단일값(스칼라)이올수있는자리에사용가능

하나의레코드가올수있는자리도대치가능

테이블(여러레코드)이올수있는자리도대치가능

Page 9: mysql 서브쿼리

스칼라값대체쿼리

GTA5를 팔고있는유저 1명의정보를출력하세요.

SELECT * FROM user uWHERE u.id =

( SELECT seller FROM trade tWHERE item_name = ‘GTA5‘ limit1

);

Page 10: mysql 서브쿼리

스칼라값대체쿼리

2번마켓에서가장많은상품을팔고있는사람의정보를

출력하세요.

Page 11: mysql 서브쿼리

스칼라값대체할때주의사항

서브쿼리의결과값으로두개의값이오면에러발생

Page 12: mysql 서브쿼리

IN 과 NOT IN

IN과 NOT IN은 스칼라집합에대해사용가능

예)

아이폰을팔고있는유저의정보를모두출력하시오

SELECT * FROM userWHERE iD = (

SELECT seller FROM tradeWHERE item_name like '아이폰%'

);

Page 13: mysql 서브쿼리

IN 과 NOT IN

IN과 NOT IN은 스칼라집합에대해사용가능

예)

아이폰을팔고있는유저의정보를모두출력하시오

SELECT * FROM userWHERE id IN (

SELECT seller FROM tradeWHERE item_name like '아이폰%'

);

Page 14: mysql 서브쿼리

IN 과 NOT IN

2번마켓에파는물건이없는유저의정보를검색하세요.

Page 15: mysql 서브쿼리

ANY

컬럼이름비교연산자 ANY (쿼리)

결과값에하나라도만족하면 TRUE

적어도하나의상품을구매가능한유저의

정보를출력하세요.

Page 16: mysql 서브쿼리

ANY

컬럼이름비교연산자 ANY (쿼리)

결과값에하나라도만족하면 TRUE

적어도하나의상품을구매가능한유저의

정보를출력하세요.

SELECT * FROM userWHERE money >= any (

SELECT price FROM trade);

Page 17: mysql 서브쿼리

ALL

컬럼이름비교연산자 ALL (쿼리)

서브쿼리의모든결과를만족시키는경우에만참

마켓의어떤물건이라도구매가능한유저의정보를출력하라.

Page 18: mysql 서브쿼리

상관쿼리

상관쿼리 :

바깥쿼리테이블의속성이안쪽쿼리에나오는경우

SELECT * FROM T1WHERE COL1 =

(SELECT COL3 FROM T2WHERE t1.COL2 = T2.COL4);

Page 19: mysql 서브쿼리

비상관쿼리의동작방식

안쪽쿼리실행 ->스칼라값추출 -> 바깥쿼리실행 ->최종결과

안쪽 테이블

바깥쪽 테이블

안쪽 쿼리수행 결과값

최종 결과

Page 20: mysql 서브쿼리

상관쿼리의동작방식

바깥쪽쿼리실행 -> 레코드하나의각각의값이안쪽쿼리를만족

바깥쪽 테이블

최종 결과

안쪽 테이블

Page 21: mysql 서브쿼리

상관쿼리

유저자신의판매물품가격의총합이그유저의재산보다

많은유저의정보를출력하시오.

Page 22: mysql 서브쿼리

EXISTS와 NOT EXISTS

EXISTS(서브쿼리) :쿼리가하나이상나오면참

NOT EXISTS(서브쿼리) : 결과가하나라도있으면거짓

주로상관쿼리에사용됩니다.

앞에컬럼이름이나오지않습니다.

Page 23: mysql 서브쿼리

EXISTS와 NOT EXISTS

2번마켓에판매물품이없는유저를검색하시오.

Page 24: mysql 서브쿼리

FROM절의서브쿼리

FROM절에도쿼리가올수있습니다.

반드시테이블에별명을붙여줘야합니다.

SELECT m.name, m.item_nameFROM(SELECT * FROM user u LEFT JOIN TRADE t ON u.id = t.seller) AS m;

Page 25: mysql 서브쿼리

VIEW

SELECT 쿼리를이용해서만든가상테이블

용량을차지하지않음

생성: CREATE VIEW 명령사용

CREATE VIEW 뷰이름 as (SELECT…);

사용 : 일반적인테이블과동일

SELECT * FROM뷰이름 ...;

삭제 : DROP VIEW 명령사용

DROP VIEW my_view;

Page 26: mysql 서브쿼리

학습정리

서브쿼리에대해배웠습니다.

서브쿼리를사용하면의미가명확해집니다.

중첩상관쿼리는성능이좋지않을수있습니다.

데이터베이스에따라최적화에의해성능이달라집니다.

Page 27: mysql 서브쿼리

THANK YOU!!!