반응형

 

-- 사용 테이블 정보
CREATE TABLE student(
	ID   VARCHAR(8) PRIMARY KEY NOT NULL,
	NAME VARCHAR(20),
	AGE  INT
);

DELETE FROM student WHERE 1=1;


INSERT INTO student VALUES('1','홍길동',20);
INSERT INTO student VALUES('2','홍길순', 23);
INSERT INTO student VALUES('3','김철수',22);
INSERT INTO student VALUES('4','김민수',27);
INSERT INTO student VALUES('5','김진수',27);
INSERT INTO student VALUES('6','김민철',24);

 

 

📝서브쿼리 (Sub Query)

저번에 작성중이던거에 데이터를 진라면을 추가했습니다.

 

서브쿼리란 무엇이냐면 쿼리안에 쿼리문이 또 들어있는 형태입니다.

 

  • SELECT id, name, age FROM STUDENT WHERE age >(SELECT age FROM STUDENT WHERE name = '김민철');

 

이와같이 두개의 SELECT 쿼리문이 들어가 있죠 '김민철' 나이보다 나이가 더 많은 사람을 조회하기 위해 저렇게 서브쿼리를 썼습니다.

 

SELECT  id ,name ,age 
  FROM student 
 WHERE age > (SELECT age FROM student WHERE name = '김민철');

 

Document
ID NAME AGE
4 김민수 27
5 김진수 27

 

-- (1) 나이가 평균보다 많은 회원
SELECT m.*
  FROM MEMBER m
 WHERE m.age > (select avg(m2.age) from Member m2)
 
-- (2) 한 건이라도 주문한 고객
SELECT m.*
  FROM Member m
 WHERE (SELECT count(o) FROM Order o WHERE m.member = o.mebmer) > 0

(1)번 쿼리의 경우 서브쿼리 내용과 밖의 쿼리 내용이 관계가 없기 때문에 성능상에 이점이 있다

(2)번 쿼리의 경우 밖에 내용을 가져와 서브쿼리랑 비교하기 때문에 필터 성능상 이점이 없다

 

 

📝ANY, SOME

서브쿼리의 경우 ( ) 안에 결과 겂이 2개 이상인 경우 에러가 발생하게 됩니다.

SELECT  id ,name, age 
  FROM student 
 WHERE age < (SELECT age FROM student WHERE age >= 24); -- 2개 이상의 결과로 에러 발생

 

그걸 해결하기 위해 ANY, SOME, ALL이라는 것을 사용하게 됩니다.

 

ANY의 경우나온 결과를 OR로 만족 시키는 결과만 반환하도록 합니다.

예를 들어 위에 괄호에 있는 쿼리를 실행시켰을 때 하기의 결과가 나오게 되는데 

WHERE age < ( SELECT age FROM student WHERE age >= 24); 에서 24보다 나이가 적은 사람 또는(OR) 27보다 나이가 적은 사람이라는 조건으로 찾게 됩니다. SOME도 동일하게 작동합니다

 

Document
AGE
24
27
27

 

SELECT  id, name, age 
  FROM student 
 WHERE age < ANY (SELECT age FROM student WHERE age >= 24);


SELECT  id, name, age 
  FROM student 
 WHERE age < SOME (SELECT age FROM student WHERE age >= 24);

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22
6 김민철 24

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22
6 김민철 24

 

 

📝ALL

SELECT  id, name, age 
  FROM student 
 WHERE age < ALL (SELECT age FROM student WHERE age >= 24);

 

Document
ID NAME AGE
1 홍길동 20
2 홍길순 23
3 김철수 22

 

ALL의 경우나온 결과를 모두(AND) 만족시켜야합니다 예를 들면 위의 쿼리를 실행 시킬 때 24보다 나이가 적은 사람 이면서(AND) 27보다 나이가 적은 사람을 조회하라는 의미입니다.

반응형