코딩 공부/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 | 조명훈 |
+--------+--------------+-------+--------+