SlideShare a Scribd company logo
데이터베이스 베이직
서브쿼리, 뷰
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 u
WHERE u.id =
( SELECT seller FROM trade t
WHERE item_name = '맥북'
);
서브 쿼리의 특징
SELECT, INSERT, UPDATE, DELETE 모두에 사용 가능
단, 안쪽 쿼리는 무조건 SELECT 쿼리입니다.
서브 쿼리의 특징
모든 단일 값(스칼라)이 올 수 있는 자리에 사용 가능
하나의 레코드가 올 수 있는 자리도 대치 가능
테이블(여러 레코드)이 올 수 있는 자리도 대치 가능
스칼라 값 대체 쿼리
GTA5를 팔고 있는 유저 1명의 정보를 출력하세요.
SELECT * FROM user u
WHERE u.id =
( SELECT seller FROM trade t
WHERE item_name = ‘GTA5‘ limit1
);
스칼라 값 대체 쿼리
2번 마켓에서 가장 많은 상품을 팔고 있는 사람의 정보를
출력하세요.
스칼라 값 대체할 때 주의사항
서브 쿼리의 결과값으로 두 개의 값이 오면 에러 발생
IN 과 NOT IN
IN과 NOT IN은 스칼라 집합에 대해 사용 가능
예)
아이폰을 팔고 있는 유저의 정보를 모두 출력하시오
SELECT * FROM user
WHERE iD = (
SELECT seller FROM trade
WHERE item_name like '아이폰%'
);
IN 과 NOT IN
IN과 NOT IN은 스칼라 집합에 대해 사용 가능
예)
아이폰을 팔고 있는 유저의 정보를 모두 출력하시오
SELECT * FROM user
WHERE id IN (
SELECT seller FROM trade
WHERE item_name like '아이폰%'
);
IN 과 NOT IN
2번 마켓에 파는 물건이 없는 유저의 정보를 검색하세요.
ANY
컬럼이름 비교연산자 ANY (쿼리)
결과값에 하나라도 만족하면 TRUE
적어도 하나의 상품을 구매가능한 유저의
정보를 출력하세요.
ANY
컬럼이름 비교연산자 ANY (쿼리)
결과값에 하나라도 만족하면 TRUE
적어도 하나의 상품을 구매가능한 유저의
정보를 출력하세요.
SELECT * FROM user
WHERE money >= any (
SELECT price FROM trade
);
ALL
컬럼이름 비교연산자 ALL (쿼리)
서브 쿼리의 모든 결과를 만족시키는 경우에만 참
마켓의 어떤 물건이라도 구매 가능한 유저의 정보를 출력하라.
상관 쿼리
상관 쿼리 :
바깥 쿼리 테이블의 속성이 안쪽 쿼리에 나오는 경우
SELECT * FROM T1
WHERE COL1 =
(SELECT COL3 FROM T2
WHERE t1.COL2 = T2.COL4);
비상관 쿼리의 동작 방식
안쪽 쿼리 실행 -> 스칼라 값 추출 -> 바깥쿼리 실행 ->최종 결과
안쪽 테이블
바깥쪽 테이블
안쪽 쿼리
수행 결과값
최종 결과
상관 쿼리의 동작 방식
바깥쪽 쿼리 실행 -> 레코드 하나의 각각의 값이 안쪽 쿼리를 만족
바깥쪽 테이블
최종 결과
안쪽 테이블
상관 쿼리
유저 자신의 판매 물품 가격의 총합이 그 유저의 재산보다
많은 유저의 정보를 출력하시오.
EXISTS와 NOT EXISTS
EXISTS(서브쿼리) : 쿼리가 하나 이상 나오면 참
NOT EXISTS(서브쿼리) : 결과가 하나라도 있으면 거짓
주로 상관 쿼리에 사용됩니다.
앞에 컬럼 이름이 나오지 않습니다.
EXISTS와 NOT EXISTS
2번 마켓에 판매 물품이 없는 유저를 검색하시오.
FROM 절의 서브쿼리
FROM 절에도 쿼리가 올 수 있습니다.
반드시 테이블에 별명을 붙여줘야 합니다.
SELECT m.name, m.item_name
FROM
(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!!!

More Related Content

More from Hoyoung Jung

mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedure
Hoyoung Jung
 
암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초
Hoyoung Jung
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHEN
Hoyoung Jung
 
트랜잭션
트랜잭션 트랜잭션
트랜잭션
Hoyoung Jung
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
Hoyoung Jung
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍
Hoyoung Jung
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
Hoyoung Jung
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링
Hoyoung Jung
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
Hoyoung Jung
 
MySQL Select (1)
MySQL Select (1)MySQL Select (1)
MySQL Select (1)
Hoyoung Jung
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
Hoyoung Jung
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye Basic
Hoyoung Jung
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
Hoyoung Jung
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
Hoyoung Jung
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개
Hoyoung Jung
 
Crontab 간단 사용법
Crontab 간단 사용법Crontab 간단 사용법
Crontab 간단 사용법
Hoyoung Jung
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
Hoyoung Jung
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
Hoyoung Jung
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기
Hoyoung Jung
 

More from Hoyoung Jung (20)

mysql stored procedure
mysql stored proceduremysql stored procedure
mysql stored procedure
 
암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초암달의 법칙과 쿼리튜닝 기초
암달의 법칙과 쿼리튜닝 기초
 
GROUP BY, CASE WHEN
GROUP BY, CASE WHENGROUP BY, CASE WHEN
GROUP BY, CASE WHEN
 
트랜잭션
트랜잭션 트랜잭션
트랜잭션
 
데이터베이스 정규화
데이터베이스 정규화데이터베이스 정규화
데이터베이스 정규화
 
tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍tomcat jdbc mysql 프로그래밍
tomcat jdbc mysql 프로그래밍
 
MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
 
데이터베이스 모델링
데이터베이스 모델링데이터베이스 모델링
데이터베이스 모델링
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
 
MySQL Select (1)
MySQL Select (1)MySQL Select (1)
MySQL Select (1)
 
4. 함수포인터
4. 함수포인터4. 함수포인터
4. 함수포인터
 
2. MySQL DataTye Basic
2. MySQL DataTye Basic2. MySQL DataTye Basic
2. MySQL DataTye Basic
 
MySQL Create Table
MySQL Create TableMySQL Create Table
MySQL Create Table
 
Mymysql basic sql
Mymysql basic sqlMymysql basic sql
Mymysql basic sql
 
데이터베이스 베이직 소개
데이터베이스 베이직 소개데이터베이스 베이직 소개
데이터베이스 베이직 소개
 
Crontab 간단 사용법
Crontab 간단 사용법Crontab 간단 사용법
Crontab 간단 사용법
 
3.포인터
3.포인터3.포인터
3.포인터
 
포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1포인터의기초 (2) - 포인터 사용하기1
포인터의기초 (2) - 포인터 사용하기1
 
포인터의 기초(1)
포인터의 기초(1)포인터의 기초(1)
포인터의 기초(1)
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기
 

mysql 서브쿼리

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