코딩 공부/DataBase

[DataBase] 08_테이블 조인

chocbi 2020. 5. 11. 15:15

여러 테이블에서 데이터 조회하기

#01. 조인의 이해

1) Join

  • 두 개 이상으 ㅣ테이블을 결합하여 필요한 데이터를 조회하는 기능.
    • ex) 김도훈 교수의 이름과 소속 학과 이름을 출력하려 할 때, professor 테이블과 department 테이블을 두번 조회 해야 하지만, 조인을 이용하면 한번에 조회가 가능하다.
mysql> select p.name, d.deptno, d.dname
    -> from professor p, department d
    -> where p.deptno=d.deptno;
+--------+--------+----------------+
| name   | deptno | dname          |
+--------+--------+----------------+
| 김도훈 |    101 | 컴퓨터공학과   |
| 성연희 |    101 | 컴퓨터공학과   |
| 이만식 |    101 | 컴퓨터공학과   |
| 전은지 |    101 | 컴퓨터공학과   |
| 염일웅 |    102 | 멀티미디어학과 |
| 권혁일 |    102 | 멀티미디어학과 |
| 이재우 |    201 | 전자공학과     |
| 남은혁 |    202 | 기계공학과     |
+--------+--------+----------------+

2) Join의 종류

  • 카티션 곱(cartesian product, cross join), EQUI JOIN, INNER JOIN, OUTER JOIN 등이 있다.

3) Join의 기본 문법

SELECT { 컬럼이름 [ as 별칭]...}
FROM <테이블1이름>, <테이블2이름>, ..., <테이블n이름>
[where 검색조건]
[group by 컬럼이름]
[order by 컬럼이름 [정렬옵션]]
  • 조회하고자 하는 테이블의 이름을 콤마(,)로 구분한다.
  • 조인이 이루어지는 테이블에 각각 동일한 이름의 컬럼이 존재할 경우, SELECT절에서 “테이블이름.컬럼이름”의 형식으로 명시되어야 한다.

4) 교수 테이블과 학과 테이블 조인하기

  • 단순히 테이블 이름을 콤마로 구분하여 나열할 경우, 32건이 조회된다.
  • 이는 두개의 테이블에서 연결 가능한 모든 경우의 수를 조합하기 때문에 발생하는 현상으로 이러한 경우를 카디션 곱이라 한다. 항상 카디션 곱이 발생하지 않도록 주의해야 한다.

#02. EQUI JOIN

1) 카디션 곱의 원인

  • WHERE 절에서 조인 조건을 명시하지 않거나 잘못 설정하여 양쪽 테이블을 연결하는 조건이 하나도 없는 경우 발생한다.
  • 카디션 곱을 해결하기 위해서는 JOIN의 조건이 되는 적절한 WHERE절을 명시하면 된다.

2) EQUI JOIN이란?

  • SQL 문에서 가장 많이 사용되는 조인으로, 조인 대상 테이블에서 공통 칼럼에 대하여 ‘=’ 비교를 명시해, 같은 값을 갖는 행을 연결하여 결과를 생성하는 조인 방법이다.
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column;

예제

  • 교수의 이름과 소속 학과 번호, 학과 이름을 조회하시오.
    • 테이블이름.컬럼이름의 형식을 사용해야한다.
mysql> select professor.name, professor.deptno, department.dname
    -> from professor , department 
    -> where professor.deptno=department.deptno;
+--------+--------+----------------+
| name   | deptno | dname          |
+--------+--------+----------------+
| 김도훈 |    101 | 컴퓨터공학과   |
| 성연희 |    101 | 컴퓨터공학과   |
| 이만식 |    101 | 컴퓨터공학과   |
| 전은지 |    101 | 컴퓨터공학과   |
| 염일웅 |    102 | 멀티미디어학과 |
| 권혁일 |    102 | 멀티미디어학과 |
| 이재우 |    201 | 전자공학과     |
| 남은혁 |    202 | 기계공학과     |
+--------+--------+----------------+

3) 테이블 이름에 대한 별칭 사용하기

  • FROM 절에 명시되는 테이블 이름에 공백으로 구분하여 별칭을 적용하면 SELECT 절이나 WHERE 절에서 풀네임을 명시하지 않아도 된다. 대부분 컬럼의 제일 앞문자를 사용한다.

예제

  • 101번 학과에 소속된 교수들의 이름, 학과번호, 학과 이름을 조회하시오.
mysql> select p.name, d.deptno, d.dname
    -> from professor p, department d
    -> where p.deptno=d.deptno AND p.deptno=101;
+--------+--------+--------------+
| name   | deptno | dname        |
+--------+--------+--------------+
| 김도훈 |    101 | 컴퓨터공학과 |
| 성연희 |    101 | 컴퓨터공학과 |
| 이만식 |    101 | 컴퓨터공학과 |
| 전은지 |    101 | 컴퓨터공학과 |
+--------+--------+--------------+

#03. INNER JOIN

1) EQUI JOIN를 다른 형태로 표현한 JOIN 처리

  • EQUI JOIN과 INNER JOIN 은 두 테이블에서 JOIN 조건에 만족하는 교집합을 조회한다는 점이다.
  • EQUI JOIN 구문
SELECT table1.columnm table2.column
FROM table1, table2
WHERE table1.column = table2.column;
  • INNER JOIN 구문
    • EQUI JOIN에서 테이블 이름을 구분하는 콤마(,)를 INNER JOIN이라는 키워드로 변경하고, WHERE은 ON으로 변경한다.
SELECT table1.columnm, table2.column
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

예제1

  • 교수이름, 소속 학과 번호, 학과 이름을 INNER JOIN으로 조회하기
mysql> select p.name, p.deptno, d.dname
    -> from professor p
    -> inner join department d
    -> on p.deptno = d.deptno;
+--------+--------+----------------+
| name   | deptno | dname          |
+--------+--------+----------------+
| 김도훈 |    101 | 컴퓨터공학과   |
| 성연희 |    101 | 컴퓨터공학과   |
| 이만식 |    101 | 컴퓨터공학과   |
| 전은지 |    101 | 컴퓨터공학과   |
| 염일웅 |    102 | 멀티미디어학과 |
| 권혁일 |    102 | 멀티미디어학과 |
| 이재우 |    201 | 전자공학과     |
| 남은혁 |    202 | 기계공학과     |
+--------+--------+----------------+

예제2

  • 101번 학과에 소속된 교수들의 이름, 학과번호, 학과 이름을 INNER JOIN으로 조회하시오.
mysql> select p.name, p.deptno, d.dname
    -> from professor p
    -> inner join department d
    -> on p.deptno = d.deptno
    -> where p.deptno = '101';
+--------+--------+--------------+
| name   | deptno | dname        |
+--------+--------+--------------+
| 김도훈 |    101 | 컴퓨터공학과 |
| 성연희 |    101 | 컴퓨터공학과 |
| 이만식 |    101 | 컴퓨터공학과 |
| 전은지 |    101 | 컴퓨터공학과 |
+--------+--------+--------------+

#04.OUTER JOIN

1) OUTER JOIN의 이해

  • INNER JOIN이 JOIN 조건에 부합하는 행들만 JOIN이 발생하는 것이라면, OUTER JOIN은 조건에 부합하지 않는 행들까지도 포함시켜 결합하는 것을 의미한다.

2) OUTER JOIN의 종류

종류 설명
LEFT OUTER JOIN 조인절에서 명시한 테이블 중, 왼쪽의 테이블에 대하여 조건에 부합하지 않는 데이터까지 조회한다.
RIGTH OUTER JOIN 조인절에서 명시한 테이블 중, 오른쪽의 테이블에 대하여 조건에 부합하지 않는 데이터까지 조회한다.
FULL OUTER JOIN 조인에서 사용하는 모든 테이블에서 조건에 부합하지 않는 데이터까지 조회한다. 시스템의 성능에 큰 영향을 주기 때문에 실무에서는 잘 사용하지않는다.

예제1

  • 학생의 이름과 담당교수의 이름을 조회하시오. 단, 담당교수가 배정되지 않은 학생의 경우 이름만 조회하시오.
mysql> select s.name, p.name
    -> from student s
    -> left outer join professor p
    -> on s.profno = p.profno;
+--------+--------+
| name   | name   |
+--------+--------+
| 전인하 | 성연희 |
| 박미경 | NULL   |
| 김영균 | 이만식 |
| 지은경 | 전은지 |
| 임유진 | 전은지 |
| 서재진 | NULL   |
| 이광훈 | 성연희 |
| 류민정 | 전은지 |
| 김진영 | 권혁일 |
| 오유석 | 권혁일 |
| 하나리 | NULL   |
| 윤진욱 | 권혁일 |
| 이동훈 | NULL   |
| 박동진 | NULL   |
| 김진경 | 이재우 |
| 조명훈 | NULL   |
+--------+--------+

예제2

  • 학생의 이름과 담당교수의 이름을 조회하시오. 단, 담당하는 학생이 없는 교수는 교수의 이름만 조회하시오.
mysql> select s.name, p.name
    -> from student s
    -> right outer join professor p
    -> on s.profno=p.profno;
+--------+--------+
| name   | name   |
+--------+--------+
| NULL   | 김도훈 |
| 김진경 | 이재우 |
| 전인하 | 성연희 |
| 이광훈 | 성연희 |
| NULL   | 염일웅 |
| 김진영 | 권혁일 |
| 오유석 | 권혁일 |
| 윤진욱 | 권혁일 |
| 김영균 | 이만식 |
| 지은경 | 전은지 |
| 임유진 | 전은지 |
| 류민정 | 전은지 |
| NULL   | 남은혁 |
+--------+--------+

#05. 두 개 이상의 테이블에 대한 조인

  • 학생의 이름과 학년, 소속학과의 이름과 담당교수의 이름을 모두 조회하시오.
    • 두 개 이상의 테이블을 조인하는 경우 기준이 되는 하나의 테이블을 정하고, 기분테이블에서 다른 테이블을 조인하도록 작성한다.
mysql> select s.name, grade, d.dname, CONCAT(p.name, ' ', p.position)
    -> from student s, department d, professor p
    -> where s.deptno=d.deptno and s.profno=p.profno;
+--------+-------+----------------+---------------------------------+
| name   | grade | dname          | CONCAT(p.name, ' ', p.position) |
+--------+-------+----------------+---------------------------------+
| 전인하 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 김영균 |     3 | 컴퓨터공학과   | 이만식 부교수                   |
| 지은경 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 임유진 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 이광훈 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 류민정 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 김진영 |     2 | 멀티미디어학과 | 권혁일 교수                     |
| 오유석 |     4 | 멀티미디어학과 | 권혁일 교수                     |
| 윤진욱 |     3 | 멀티미디어학과 | 권혁일 교수                     |
| 김진경 |     2 | 전자공학과     | 이재우 조교수                   |
+--------+-------+----------------+---------------------------------+
  • 앞 예제와 같은 결과를 갖는 SQL문을 Inner Join으로 구성하시오.
    • INNER JOIN ~ ON의 구문이 한 단위로 구성된다.
mysql> select s.name, grade, d.dname, CONCAT(p.name, ' ', p.position)
    -> from student s
    -> inner join department d on s.deptno = d.deptno
    -> inner join professor p on s.profno = p.profno;
+--------+-------+----------------+---------------------------------+
| name   | grade | dname          | CONCAT(p.name, ' ', p.position) |
+--------+-------+----------------+---------------------------------+
| 전인하 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 김영균 |     3 | 컴퓨터공학과   | 이만식 부교수                   |
| 지은경 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 임유진 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 이광훈 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 류민정 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 김진영 |     2 | 멀티미디어학과 | 권혁일 교수                     |
| 오유석 |     4 | 멀티미디어학과 | 권혁일 교수                     |
| 윤진욱 |     3 | 멀티미디어학과 | 권혁일 교수                     |
| 김진경 |     2 | 전자공학과     | 이재우 조교수                   |
+--------+-------+----------------+---------------------------------+
  • 학생의 이름, 학년, 소속학과 이름, 담당교수 이름+직급을 조회하시오. 단, 담당교수가 없는 학생의 경우 NULL로 표시하세요.
    • Outer Join 구문 역시 다중 테이블 조인에서 사용할 수 있다.
mysql> select s.name, grade, d.dname, CONCAT(p.name, ' ', p.position)
    -> from student s
    -> inner join department d on s.deptno=d.deptno
    -> left outer join professor p on s.profno=p.profno;
+--------+-------+----------------+---------------------------------+
| name   | grade | dname          | CONCAT(p.name, ' ', p.position) |
+--------+-------+----------------+---------------------------------+
| 전인하 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 박미경 |     1 | 컴퓨터공학과   | NULL                            |
| 김영균 |     3 | 컴퓨터공학과   | 이만식 부교수                   |
| 지은경 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 임유진 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 서재진 |     1 | 컴퓨터공학과   | NULL                            |
| 이광훈 |     4 | 컴퓨터공학과   | 성연희 조교수                   |
| 류민정 |     2 | 컴퓨터공학과   | 전은지 전임강사                 |
| 김진영 |     2 | 멀티미디어학과 | 권혁일 교수                     |
| 오유석 |     4 | 멀티미디어학과 | 권혁일 교수                     |
| 하나리 |     1 | 멀티미디어학과 | NULL                            |
| 윤진욱 |     3 | 멀티미디어학과 | 권혁일 교수                     |
| 이동훈 |     1 | 전자공학과     | NULL                            |
| 박동진 |     1 | 전자공학과     | NULL                            |
| 김진경 |     2 | 전자공학과     | 이재우 조교수                   |
| 조명훈 |     1 | 전자공학과     | NULL                            |
+--------+-------+----------------+---------------------------------+

#06.SUB Query

1) SQL안의 SQL

  • 하나의 SQL명령문의 처리 결과를 다른 SQL 명령문에 전달하기 위해 두 개 이상의 SQL문을 하나의 SQL문으로 연결한 형태.
  • 검색조건을 다른 결과 집합에서 찾기 위해서 사용한다.
  • 서브쿼리를 포함한 SQL문을 ‘메인쿼리’라고 한다.
  • 서브쿼리는 SELECT 문의 시작과 끝에 ()를 묶어서 메인쿼리와 구분한다.
SELECT * | 컬럼 ... FROM 테이블 WHERE 컬럼 연산자(SELECT...)

2) 종류

서브쿼리 설명
단일 행 서브 쿼리 단 하나의 검색 결과만을 반환하는 형태로 서브쿼리를 검색결과로 사용하기 위해 비교연산자가 사용된다.
다중 행 서브쿼리 하나 이상의 검색결과를 반환하는 형태로서 서브쿼리를 검색결과로 사용하기 위해 IN 연산자가사용 된다.

3) 단일행 서브쿼리

  • ‘전은지’ 교수와 같은 직급의 교수에 대한 이름, 직급을 조회
mysql> select name, position from professor
    -> where position=
    -> (select position from professor where name='전은지');
+--------+----------+
| name   | position |
+--------+----------+
| 염일웅 | 전임강사 |
| 전은지 | 전임강사 |
+--------+----------+
  • 집계함수와 함께 사용하기
    • 1학년 학생 중에서 키가 전체 학생의 평균키를 초과하는 학생의 이름, 학과번호, 학년, 키를 조회
mysql> select name, deptno, grade, height
    -> from student
    -> where grade='1' and height > (select avg(height) from student);
+--------+--------+-------+--------+
| name   | deptno | grade | height |
+--------+--------+-------+--------+
| 서재진 |    101 |     1 |    186 |
| 이동훈 |    201 |     1 |    172 |
| 박동진 |    201 |     1 |    182 |
| 조명훈 |    201 |     1 |    184 |
+--------+--------+-------+--------+
  • JOIN과 함께 사용하기
    • ‘이광훈’학생과 같은 학과에 재학중인 학생의 이름과, 소속학과 이름을 조회하시오.
mysql> select s.name, d.dname
    -> from student s
    -> inner join department d on s.deptno=d.deptno
    -> where s.deptno=(select deptno from student where name='이광훈');
+--------+--------------+
| name   | dname        |
+--------+--------------+
| 전인하 | 컴퓨터공학과 |
| 박미경 | 컴퓨터공학과 |
| 김영균 | 컴퓨터공학과 |
| 지은경 | 컴퓨터공학과 |
| 임유진 | 컴퓨터공학과 |
| 서재진 | 컴퓨터공학과 |
| 이광훈 | 컴퓨터공학과 |
| 류민정 | 컴퓨터공학과 |
+--------+--------------+

4) 다중행 서브쿼리

  • 서브쿼리의 결과가 여러건인 경우
    • 급여를 300만원 초과로 받는 교수에게 지도받는 학생들의 학번, 학년, 이름을 조회하시오.
mysql> select studno, grade, name
    -> from student
    -> where profno IN (select profno from professor where sal > 300);
+--------+-------+--------+
| studno | grade | name   |
+--------+-------+--------+
|  20103 |     2 | 김진경 |
|  10101 |     4 | 전인하 |
|  10107 |     4 | 이광훈 |
|  10201 |     2 | 김진영 |
|  10202 |     4 | 오유석 |
|  10204 |     3 | 윤진욱 |
|  10103 |     3 | 김영균 |
+--------+-------+--------+

연습문제1

  • EQUI JOIN을 사용하여 학생 테이블과 부서 테이블의 학번, 이름, 학과번호, 소속학과 이름, 학과 위치를 출력하시오.
mysql> select s.studno, s.name, d.deptno, d.dname, d.loc
    -> from student s, department d
    -> where s.deptno=d.deptno;
+--------+--------+--------+----------------+-------+
| studno | name   | deptno | dname          | loc   |
+--------+--------+--------+----------------+-------+
|  10101 | 전인하 |    101 | 컴퓨터공학과   | 1호관 |
|  10102 | 박미경 |    101 | 컴퓨터공학과   | 1호관 |
|  10103 | 김영균 |    101 | 컴퓨터공학과   | 1호관 |
|  10104 | 지은경 |    101 | 컴퓨터공학과   | 1호관 |
|  10105 | 임유진 |    101 | 컴퓨터공학과   | 1호관 |
|  10106 | 서재진 |    101 | 컴퓨터공학과   | 1호관 |
|  10107 | 이광훈 |    101 | 컴퓨터공학과   | 1호관 |
|  10108 | 류민정 |    101 | 컴퓨터공학과   | 1호관 |
|  10201 | 김진영 |    102 | 멀티미디어학과 | 2호관 |
|  10202 | 오유석 |    102 | 멀티미디어학과 | 2호관 |
|  10203 | 하나리 |    102 | 멀티미디어학과 | 2호관 |
|  10204 | 윤진욱 |    102 | 멀티미디어학과 | 2호관 |
|  20101 | 이동훈 |    201 | 전자공학과     | 3호관 |
|  20102 | 박동진 |    201 | 전자공학과     | 3호관 |
|  20103 | 김진경 |    201 | 전자공학과     | 3호관 |
|  20104 | 조명훈 |    201 | 전자공학과     | 3호관 |
+--------+--------+--------+----------------+-------+

연습문제2

  • 102번 학과에 다니는 학생들에 대한 학번, 이름, 학과번호, 소속 학과 이름, 학년을 EQUI JOIN으로 출력하시오.
mysql> select s.studno, s.name, d.deptno, d.dname, s.grade
    -> from student s, department d
    -> where s.deptno=d.deptno AND s.deptno=102;
+--------+--------+--------+----------------+-------+
| studno | name   | deptno | dname          | grade |
+--------+--------+--------+----------------+-------+
|  10201 | 김진영 |    102 | 멀티미디어학과 |     2 |
|  10202 | 오유석 |    102 | 멀티미디어학과 |     4 |
|  10203 | 하나리 |    102 | 멀티미디어학과 |     1 |
|  10204 | 윤진욱 |    102 | 멀티미디어학과 |     3 |
+--------+--------+--------+----------------+-------+

연습문제3

  • 학생이름, 학년, 담당교수이름, 담당교수의 직급을 EQUI JOIN으로 조회하시오.
mysql> select s.name, p.name, p.position
    -> from student s, professor p
    -> where s.profno = p.profno;
+--------+--------+----------+
| name   | name   | position |
+--------+--------+----------+
| 김진경 | 이재우 | 조교수   |
| 전인하 | 성연희 | 조교수   |
| 이광훈 | 성연희 | 조교수   |
| 김진영 | 권혁일 | 교수     |
| 오유석 | 권혁일 | 교수     |
| 윤진욱 | 권혁일 | 교수     |
| 김영균 | 이만식 | 부교수   |
| 지은경 | 전은지 | 전임강사 |
| 임유진 | 전은지 | 전임강사 |
| 류민정 | 전은지 | 전임강사 |
+--------+--------+----------+

연습문제4

  • 학생이름, 학년, 담당교수이름, 담당교수의 직급을 INNER JOIN을 사용하여 조회하시오.
mysql> select s.name, s.grade, p.name, p.position
    -> from student s
    -> inner join professor p
    -> on s.profno=p.profno;
+--------+-------+--------+----------+
| name   | grade | name   | position |
+--------+-------+--------+----------+
| 김진경 |     2 | 이재우 | 조교수   |
| 전인하 |     4 | 성연희 | 조교수   |
| 이광훈 |     4 | 성연희 | 조교수   |
| 김진영 |     2 | 권혁일 | 교수     |
| 오유석 |     4 | 권혁일 | 교수     |
| 윤진욱 |     3 | 권혁일 | 교수     |
| 김영균 |     3 | 이만식 | 부교수   |
| 지은경 |     2 | 전은지 | 전임강사 |
| 임유진 |     2 | 전은지 | 전임강사 |
| 류민정 |     2 | 전은지 | 전임강사 |
+--------+-------+--------+----------+

연습문제5

  • 아이디가 ‘jun123’인 학생과 같은 학년인 학생의 학번, 이름, 학년을 조회 하시오
mysql> select studno, name, grade
    -> from student
    -> where grade=(select grade from student where userid='jun123');
+--------+--------+-------+
| studno | name   | grade |
+--------+--------+-------+
|  10101 | 전인하 |     4 |
|  10107 | 이광훈 |     4 |
|  10202 | 오유석 |     4 |
+--------+--------+-------+

연습문제6

  • 101번 학과 학생들의 평균 몸무게보다 몸무게가 적은 학생의 이름, 학과번호, 몸무게를 조회하시오.
mysql> select name, deptno, weight
    -> from student
    -> where weight < (select avg(weight) from student where deptno='101');
+--------+--------+--------+
| name   | deptno | weight |
+--------+--------+--------+
| 박미경 |    101 |     52 |
| 지은경 |    101 |     42 |
| 임유진 |    101 |     54 |
| 김진영 |    102 |     48 |
| 이동훈 |    201 |     64 |
| 김진경 |    201 |     51 |
| 조명훈 |    201 |     62 |
+--------+--------+--------+

연습문제7

  • ‘이광훈 학생’과 같은 학과의 학생들에 대한 평균 몸무게보다 몸무게가 적게 나가는 학생들의 이름, 몸무게, 소속학과 이름, 담당교수 이름을 조회하시오.(담당교수가 없는 학생은 출력되지 않습니다.)
mysql> select s.name 학생이름, s.weight 몸무게, d.dname 학과이름, p.name 교수이름
    -> from student s
    -> inner join department d on s.deptno=d.deptno
    -> left outer join professor p on s.profno = p.profno
    -> where weight < (select avg(weight) from student where name='이광훈');
+----------+--------+----------------+----------+
| 학생이름 | 몸무게 | 학과이름       | 교수이름 |
+----------+--------+----------------+----------+
| 전인하   |     72 | 컴퓨터공학과   | 성연희   |
| 박미경   |     52 | 컴퓨터공학과   | NULL     |
| 김영균   |     88 | 컴퓨터공학과   | 이만식   |
| 지은경   |     42 | 컴퓨터공학과   | 전은지   |
| 임유진   |     54 | 컴퓨터공학과   | 전은지   |
| 서재진   |     72 | 컴퓨터공학과   | NULL     |
| 류민정   |     72 | 컴퓨터공학과   | 전은지   |
| 김진영   |     48 | 멀티미디어학과 | 권혁일   |
| 하나리   |     68 | 멀티미디어학과 | NULL     |
| 윤진욱   |     70 | 멀티미디어학과 | 권혁일   |
| 이동훈   |     64 | 전자공학과     | NULL     |
| 박동진   |     70 | 전자공학과     | NULL     |
| 김진경   |     51 | 전자공학과     | 이재우   |
| 조명훈   |     62 | 전자공학과     | NULL     |
+----------+--------+----------------+----------+

연습문제8

  • 20101번 학생과 같은 학년이고, 20101번 학생의 키보다 큰키를 같는 학생의 이름, 학년, 키를 조회하시오.
mysql> select name, grade, height
    -> from student
    -> where grade=(select grade from student where studno='20101') AND
    -> height>(select height from student where studno='20101');
+--------+-------+--------+
| name   | grade | height |
+--------+-------+--------+
| 서재진 |     1 |    186 |
| 박동진 |     1 |    182 |
| 조명훈 |     1 |    184 |
+--------+-------+--------+

연습문제9

  • 학과 이름에 ‘공학’ 이라는 단어를 포함하고 있는 학과에 재학중인 학생의 학번, 학과이름, 학년, 학생이름을 조회하시오.
mysql> select studno, d.dname, grade, name
    -> from student s
    -> inner join department d
    -> on d.deptno = s.deptno
    -> where d.dname like '%공학%';
+--------+--------------+-------+--------+
| studno | dname        | grade | name   |
+--------+--------------+-------+--------+
|  10101 | 컴퓨터공학과 |     4 | 전인하 |
|  10102 | 컴퓨터공학과 |     1 | 박미경 |
|  10103 | 컴퓨터공학과 |     3 | 김영균 |
|  10104 | 컴퓨터공학과 |     2 | 지은경 |
|  10105 | 컴퓨터공학과 |     2 | 임유진 |
|  10106 | 컴퓨터공학과 |     1 | 서재진 |
|  10107 | 컴퓨터공학과 |     4 | 이광훈 |
|  10108 | 컴퓨터공학과 |     2 | 류민정 |
|  20101 | 전자공학과   |     1 | 이동훈 |
|  20102 | 전자공학과   |     1 | 박동진 |
|  20103 | 전자공학과   |     2 | 김진경 |
|  20104 | 전자공학과   |     1 | 조명훈 |
+--------+--------------+-------+--------+