mysql 서브쿼리
TRANSCRIPT
데이터베이스베이직
서브쿼리, 뷰
NHN NEXT 정호영
나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.
오늘의실습자료
셀프조인
테이블이자기자신과조인하는걸말합니다.
예) 사용자와추천인의이름을보여주세요.
셀프조인
사용자와추천인의이름을보여주세요.
SELECT u.name, R.name FROM user U LEFT JOIN user R ON U.CHOO = R.ID;
서브쿼리(SUB QUERY)
쿼리안에다른쿼리가들어가는형태
중첩쿼리(nested query) 라고도합니다.
서브쿼리예제 1
‘맥북’을 팔고 있는유저의정보를출력하세요.
바깥쪽쿼리 : OUTER QUERY
안쪽쿼리 : INNER QUERY, SUB QUERY
SELECT * FROM user uWHERE u.id =
( SELECT seller FROM trade tWHERE item_name = '맥북'
);
서브쿼리의특징
SELECT, INSERT, UPDATE, DELETE 모두에사용가능
단,안쪽쿼리는무조건 SELECT 쿼리입니다.
서브쿼리의특징
모든단일값(스칼라)이올수있는자리에사용가능
하나의레코드가올수있는자리도대치가능
테이블(여러레코드)이올수있는자리도대치가능
스칼라값대체쿼리
GTA5를 팔고있는유저 1명의정보를출력하세요.
SELECT * FROM user uWHERE u.id =
( SELECT seller FROM trade tWHERE item_name = ‘GTA5‘ limit1
);
스칼라값대체쿼리
2번마켓에서가장많은상품을팔고있는사람의정보를
출력하세요.
스칼라값대체할때주의사항
서브쿼리의결과값으로두개의값이오면에러발생
IN 과 NOT IN
IN과 NOT IN은 스칼라집합에대해사용가능
예)
아이폰을팔고있는유저의정보를모두출력하시오
SELECT * FROM userWHERE iD = (
SELECT seller FROM tradeWHERE item_name like '아이폰%'
);
IN 과 NOT IN
IN과 NOT IN은 스칼라집합에대해사용가능
예)
아이폰을팔고있는유저의정보를모두출력하시오
SELECT * FROM userWHERE id IN (
SELECT seller FROM tradeWHERE item_name like '아이폰%'
);
IN 과 NOT IN
2번마켓에파는물건이없는유저의정보를검색하세요.
ANY
컬럼이름비교연산자 ANY (쿼리)
결과값에하나라도만족하면 TRUE
적어도하나의상품을구매가능한유저의
정보를출력하세요.
ANY
컬럼이름비교연산자 ANY (쿼리)
결과값에하나라도만족하면 TRUE
적어도하나의상품을구매가능한유저의
정보를출력하세요.
SELECT * FROM userWHERE money >= any (
SELECT price FROM trade);
ALL
컬럼이름비교연산자 ALL (쿼리)
서브쿼리의모든결과를만족시키는경우에만참
마켓의어떤물건이라도구매가능한유저의정보를출력하라.
상관쿼리
상관쿼리 :
바깥쿼리테이블의속성이안쪽쿼리에나오는경우
SELECT * FROM T1WHERE COL1 =
(SELECT COL3 FROM T2WHERE t1.COL2 = T2.COL4);
비상관쿼리의동작방식
안쪽쿼리실행 ->스칼라값추출 -> 바깥쿼리실행 ->최종결과
안쪽 테이블
바깥쪽 테이블
안쪽 쿼리수행 결과값
최종 결과
상관쿼리의동작방식
바깥쪽쿼리실행 -> 레코드하나의각각의값이안쪽쿼리를만족
바깥쪽 테이블
최종 결과
안쪽 테이블
상관쿼리
유저자신의판매물품가격의총합이그유저의재산보다
많은유저의정보를출력하시오.
EXISTS와 NOT EXISTS
EXISTS(서브쿼리) :쿼리가하나이상나오면참
NOT EXISTS(서브쿼리) : 결과가하나라도있으면거짓
주로상관쿼리에사용됩니다.
앞에컬럼이름이나오지않습니다.
EXISTS와 NOT EXISTS
2번마켓에판매물품이없는유저를검색하시오.
FROM절의서브쿼리
FROM절에도쿼리가올수있습니다.
반드시테이블에별명을붙여줘야합니다.
SELECT m.name, m.item_nameFROM(SELECT * FROM user u LEFT JOIN TRADE t ON u.id = t.seller) AS m;
VIEW
SELECT 쿼리를이용해서만든가상테이블
용량을차지하지않음
생성: CREATE VIEW 명령사용
CREATE VIEW 뷰이름 as (SELECT…);
사용 : 일반적인테이블과동일
SELECT * FROM뷰이름 ...;
삭제 : DROP VIEW 명령사용
DROP VIEW my_view;
학습정리
서브쿼리에대해배웠습니다.
서브쿼리를사용하면의미가명확해집니다.
중첩상관쿼리는성능이좋지않을수있습니다.
데이터베이스에따라최적화에의해성능이달라집니다.
THANK YOU!!!