반응형
-- 사용 테이블 정보
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 = '김민철');
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도 동일하게 작동합니다
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);
ID | NAME | AGE |
1 | 홍길동 | 20 |
2 | 홍길순 | 23 |
3 | 김철수 | 22 |
6 | 김민철 | 24 |
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);
ID | NAME | AGE |
1 | 홍길동 | 20 |
2 | 홍길순 | 23 |
3 | 김철수 | 22 |
ALL의 경우나온 결과를 모두(AND) 만족시켜야합니다 예를 들면 위의 쿼리를 실행 시킬 때 24보다 나이가 적은 사람 이면서(AND) 27보다 나이가 적은 사람을 조회하라는 의미입니다.
반응형