select 명령문은 많은 절로 구성되어 있다.
각 select 명령문은 select 와 from 이라는 절을 가지기 때문에 적어도 2개의 절을 가지고 있다.
그리고 wehre , grop by , order by 같은 절은 선택적으로 사용된다.
절의 순서는 고정되어 있다. 예를 들면 grop by 절은 where 또는 from절 앞에 올 수 없다.
그리고 order by 절이 사용된다면 이 절은 항상 나중에 사용된다.
having절은 grop by 절이 사용되어야 만이 사용할 수 있다.
- select 명령문 모든 절을 포함한 수행과정
sql이 select 명령문을 수행할 때되는 단계를 설명하고 있다.
등록 테이블 fee 에서 장학금을 지급 받은 학생의 학번과 장학금 내역을 출력하라
select stu_no, jang_total
from fee
where jang_total > 0 ;"
이 예제에서는 from 절을 먼저 수행하면 등록 테이블에 있는 전체 행의 복사본을 만들어 내고, 3번의 where 절에서 조건에 맞는 행을 선택 후 열의 값을 찾아 내어 출력한다.
등록 테이블에서 장학금을 1,000,000 이상 지급 받은 학생 중에서 2회 이상 지급받은 학생의 학번과, 지급받은 횟수를 학번 내림차순으로 출력하라.
"select stu_no, count(jang_total)
from fee
where jang_total > 1000000
group by stu_no
having count(*) > 1
order by stu_no desc;
"
각절이 수행되는 순서는 from 절 where 절 group by 절 having 절 select 절 order by 절 순으로 처리가 진행된다.
각 절이 수행되면 0 또는 그 이상의 행과 1 또는 그 이상의 열로 구성된 하나의 결과 테이블(임시 테이블)이 생성된다.
첫 번째 절을 제외한 모든 절은 0 또는 그 이상의 행과 1 또는 그 이상의 열로 구성된 테이블을 가진다는 것이다.
첫 번째 절은 데이터베이스로 부터 데이터를 찾아내고, from 절은 데이터 베이스로 부터 하나 이상의 테이블을 입력으로 취한다.
1 from 절
from 절에서 fee 테이블만 사용되었다.
sql은 이 테이블에서만 작업을 수행한다는 것이다.
이 절의 중간 결과 테이블은 fee 테이블에서 학번, 등록년도, 학기, 장학코드, 장학금액에 대한 정확한 자료는 다음과 같다
2.where 절
조건으로 jang_total > 1000000 이라는 where 절이 사용된다면 jang_total 열에 있는 값이 1000000원 이상이 되는 모든 행은 조건을 만족하게 된다.
3group by 절
group by 절은 그룹별로 검색을 할 때 사용된다. group by 절을 사용할 때는 그룹함수를 같이 사용해야 한다.
대표적인 그룹 함수는 count, avg, max min sum이 있다.
위 결과에서 학번으로 그룹을 만들면
select stu_no, count(*) from fee where jang_total > 1000000 group by stu_no;
이 예제에서는 동일한 학번을 가진 행을 하나의 그룹으로 묶고 동일한 행의 개수를 count(*) 열에 출력하는 예제다.
즉, fee 테이블에는 장학금은 1,000,000원 이상 받은 학생중 stu_no로 그룹을 만들어 각 학생별로 1,000,000 이상 장학금을 받은 횟수를 출력하는 예제 이다.
이와 같이 group by 절을 사용하여 하나의 테이블을 그룹으로 분류하여 데이터를 처리할 수 있다.
4.having 절
having 절과 where절을 서로 비교할 수 있는데, 그 차이점은 where 절은 from 절에서 생성된 중간 테이블에서 동작하고, having 절은 group by 절에서 생성된 중간 테이블에서 동작한다.
사실 수행된 과정은 동일하다.
having 절을 포함 시켰을 때 sql은 조건을 참조하여 행을 선택한다.
이러한 경우 조건은 다음과 같다
count(*) > 1
5 select 절
select 절은 최종 결과 테이블에 표현될 열을 지정하기 위해서 사용된다.
다시말하면 select 절은 열을 선택하는 것이다.
2장에서 설명한 학사 관리 예제의 fee 테이블은 stu_no, fee_year, fee_term, fee_enter 등 11개의 열로 구성된다.
따라서 select 절을 이용하여 fee 테이블 중에서 stu_no와 fee_year 만 선택하여 출력할 수 있다.
select stu_no, fee_year from fee
select 절은 다른 절을 이용해 만들어진 중간 결과 테이블에서 사용자가 보고 싶은 절을 선택하여 출력할 수 있다.
아래 예제는 fee 테이블에서 장학금을 1,000,000원 이상 받은 학생의 stu_no, fee_year, fee_term을 출력하는 예제다
select stu_no, fee_yaer, fee_term from fee where jang_total > 1000000;
6 order by 절
이 절은 마지막으로 수행되는 절로 중간 결과 테이블의 내용에 영향을 주지 않는다.
마지막까지 선택된 행을 정렬한다.
따라서 stu_no 열에 있는 데이터는 order by 절에 의해서 정렬된다.
select 절에서 나온 결과 값은 입력된 데이터 순으로 출력되었으므로 정렬을 원하면 order by 절을 사용한다.
결과 값은 학번 내림차순이므로 결과 값이 달라질 것이다.
'데이터 베이스 > mysql 문제' 카테고리의 다른 글
8 where 절 (0) | 2017.11.14 |
---|---|
7 from 절에서 테이블 명세 (0) | 2017.11.13 |
5 mysql 함수 & 문제 (0) | 2017.11.10 |
4 mysql 테이블 생성 (0) | 2017.11.09 |
3 mysql 데이터 타입 및 필수 기능 (0) | 2017.11.09 |
댓글