티스토리 뷰

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

SQL SUBQUERY 부속질의어

SQL SUBQUERY 부속질의어

SQL SUBQUERY 부속질의어



부속 질의어(subquery) 는 select 명령문의  조건에 있는 SELECT 명령문이다



부속 질의어를 다르게 말하면 부속 선택문 또는 내부선택문이라 할 수 있다. 부속 질의어에 대한 SELECT 명령문은 일반 SELECT 명령문과 약간이 차이가 있다


  1. 만약 부속 질의어가 EXISTS 연산자를 사용하지 않으면 SELECT 절에는 오직 하나의 수식만 사용되어야 한다.

  2. SELECT 절에는 DISTINCT는 사용할 수 없다

  3. ORDER BY 절은 사용할 수 없다.


  학생 테이블


mysql> select * from student;

+----+------+-----------+-------+--------+

| no | sno  | name      | jumsu | course |

+----+------+-----------+-------+--------+

|  1 |  100 | 홍길동    |   100 | 수학   |

|  2 |  101 | 김철수    |    90 | 국어   |

|  3 |  102 | 김순이    |    30 | 영어   |

|  4 |  103 | 김말동    |    45 | 국어   |

|  5 |  104 | 정민철    |    80 | 역사   |

|  6 |  105 | 이만수    |    70 | 과학   |

|  7 |  106 | 안철수    |    90 | 영어   |

|  8 |  107 | 김재동    |   100 | 역사   |

|  9 |  108 | 이미자    |    95 | 수학   |

| 10 |  109 | 김기철    |   100 |        |

+----+------+-----------+-------+--------+

10 rows in set (0.00 sec)



   서클 테이블을 출력한 모습이다.


mysql> select * from circle;

+----+------+-----------+-----------+

| no | sno  | name      | president |

+----+------+-----------+-----------+

|  1 |  100 | 홍길동    |         0 |

|  2 |  101 | 김철수    |         2 |

|  3 |  102 | 김순이    |         2 |

|  4 |  103 | 김말동    |         2 |

|  5 |  104 | 정민철    |         1 |

|  6 |  105 | 이만수    |         0 |

|  7 |  106 | 안철수    |         2 |

|  8 |  107 | 김재동    |         2 |

|  9 |  108 | 이미자    |         2 |

| 10 |  109 | 김기철    |         2 |

| 11 |  110 | 김만수    |         2 |

| 12 |  200 | 김만수    |         2 |

| 13 |  201 | 김옥경    |         2 |

| 14 |  202 | 김수경    |         2 |

| 15 |  203 | 김말동    |         2 |

| 16 |  204 | 민영탁    |         2 |

| 17 |  205 | 이경철    |         2 |

| 18 |  206 | 김영진    |         2 |

| 19 |  207 | 탁재훈    |         2 |

| 20 |  208 | 안병훈    |         2 |

| 21 |  209 | 진우형    |         2 |

+----+------+-----------+-----------+

21 rows in set (0.00 sec)



1 IN 과 EXISTS 그리고 JOIN


서클에 가입한 적이 있는 학생에 대한 검색 subquery 값이다


IN 사용


mysql> select sno, name from student where sno in(select sno from circle);

+------+-----------+

| sno  | name      |

+------+-----------+

|  100 | 홍길동    |

|  101 | 김철수    |

|  102 | 김순이    |

|  103 | 김말동    |

|  104 | 정민철    |

|  105 | 이만수    |

|  106 | 안철수    |

|  107 | 김재동    |

|  108 | 이미자    |

|  109 | 김기철    |

+------+-----------+

10 rows in set (0.00 sec)



EXIST 사용 (서브쿼리의 값을 구한후 비교하는 IN함수에 비해 계산량이 적음)


mysql> select sno, name from student where exists (select * from circle where student.sno=circle.sno);

+------+-----------+

| sno  | name      |

+------+-----------+

|  100 | 홍길동    |

|  101 | 김철수    |

|  102 | 김순이    |

|  103 | 김말동    |

|  104 | 정민철    |

|  105 | 이만수    |

|  106 | 안철수    |

|  107 | 김재동    |

|  108 | 이미자    |

|  109 | 김기철    |

+------+-----------+

10 rows in set (0.00 sec)


JOIN 사용


mysql> select a.sno, a.name from student a join circle b on a.sno=b.sno;

+------+-----------+

| sno  | name      |

+------+-----------+

|  100 | 홍길동    |

|  101 | 김철수    |

|  102 | 김순이    |

|  103 | 김말동    |

|  104 | 정민철    |

|  105 | 이만수    |

|  106 | 안철수    |

|  107 | 김재동    |

|  108 | 이미자    |

|  109 | 김기철    |

+------+-----------+

10 rows in set (0.00 sec)


2 상호 관련 부속질이어



학생중 서클 등급이 0인(회장) 학생을 구하라


mysql> select sno, name from student where sno in(select sno from circle where president=0);

+------+-----------+

| sno  | name      |

+------+-----------+

|  100 | 홍길동    |

|  105 | 이만수    |

+------+-----------+

2 rows in set (0.00 sec)


이글이 도움이 되셨다면 아래에 로그인이 필요없는 공감 버튼을 클릭해주세요 ^^


'DEVELOPE > MYSQL&MARIADB' 카테고리의 다른 글

SQL INDEX 설명, 사용법  (0) 2017.10.19
SQL JOIN 조인 메뉴얼  (0) 2017.10.18
SQL UNION / UNION ALL  (0) 2017.10.18
SQL 명령어 ORDER BY 정렬  (0) 2017.10.17
SQL GROUP BY / HAVING  (0) 2017.10.17
댓글