2022. 10. 8. 05:57ㆍProgram/PHP
127_PHP MySQL 서브쿼리 사용하기
[요약]
- 쿼리문 안의 쿼리문의 서브쿼리 사용에 대해 알아보자.
schoolRecord 테이블에서 영어 점수가 가장 높은 사람의 레코드를 출력하려면 어떻게 해야할까?
아마도 조건문에 english = max(english)를 입력할 수 있을 것이다.
하니만 이러한 쿼리문은 에러가 발생한다. max(english)의 값을 알기 위해서는 전체의 영어 점수를 파악해야 하고, 그 중 가장 높을 값을 구해야 하기 때문이다. 그리고 집계함수는 필드를 입력하는 부분에서 사용할 수 있다.
SELECT * FROM schoolRecord WHERE english = max(english);
위와 같은 쿼리문은 에러가 발생한다. 이런 경우 서브쿼리를 사용해야 한다.
서브쿼리는 쿼리문 안에서 또 다른 쿼리문을 사용하는 것을 의미한다.
서브쿼리를 사용하여 가장 높은 영어 점수를 구한 후 그 점수를 조건문에 대입한다.
다음은 서브쿼리를 이용하여 영어 점수가 가장 높은 레코드를 출력하는 쿼리문이다.
SELECT * FROM schoolRecord WHERE english = (SELECT max(english) FROM schoolRecord);
다음은 위의 서브쿼리를 활용하여 영어 점수가 가장 높은 학생의 학생번호와 클래스(반), 영어 점수를 출력하는 예제이다.
[예제: 130-1_subQuery.php ]
<?php
include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';
$sql = "SELECT * FROM schoolRecord WHERE english = ";
$sql .= "(SELECT max(english) FROM schoolRecord)";
$result = $dbConnect->query($sql);
$dataCount = $result->num_rows;
for ($i = 0; $i < $dataCount; $i++) {
$memberInfo = $result->fetch_array(MYSQLI_ASSOC);
echo "학생번호 : " . $memberInfo['myMemberID'];
echo '<br>';
echo "클래스 : " . $memberInfo['class'];
echo '<br>';
echo "영어 : " . $memberInfo['english'];
echo '<hr>';
}
?>
실행결과
조건문에 사용하는 서브쿼리에 대해 알아보았다.
이번에는 SELECT문에 사용하는 쿼리문에 대해 알아보겠다.
학생들의 모든 점수를 출력하고 옆에 필드를 더 만들어 모든 학생들의 영어 점수 평균을 출력하는 것을 쿼리문으로 만들어 보자.
우선 영어 점수 평균을 구하는 서브쿼리문을 만든다.
필드명은 englishAVG로 하겠다.
(SELECT avg(english) FROM schoolRecord) as englishAVG
위의 쿼리문은 레코드와 함께 출력하므로 필드명을 적는 곳에 기입한다.
SELECT *, (SELECT avg(english) FROM schoolRecord) as englishAVG FROM schoolRecord;
(SELECT avg(english) FORM schoolRecord)는 모든 학생의 영어 점수 평균값을 구하며,
이 값을 표시할 임시 필드명을 앨리어스(as)를 사용하여 englishAVG로 지정했다.
다음은 위의 쿼리문을 활용한 예제이다.
[예제: 130-2_subQuery.php ]
<?php
include $_SERVER['DOCUMENT_ROOT'] . '/php/108-2_connectDB.php';
$sql = "SELECT *, (SELECT avg(english) FROM schoolRecord) as englishAVG FROM schoolRecord;";
$result = $dbConnect->query($sql);
$dataCount = $result->num_rows;
for ($i = 0; $i < $dataCount; $i++) {
$memberInfo = $result->fetch_array(MYSQLI_ASSOC);
echo "학생번호 : " . $memberInfo['myMemberID'];
echo '<br>';
echo "클래스 : " . $memberInfo['class'];
echo '<br>';
echo "영어 : " . $memberInfo['english'];
echo '<br>';
echo "영어 평균 점수 : " . $memberInfo['englishAVG'];
echo '<hr>';
}
?>
실행결과
초보자를 위한 PHP 200제
김태영 지음 | 정보문화사
'Program > PHP' 카테고리의 다른 글
[PHP] MySQL 서로 다른 필드의 값을 합쳐서 출력하기 CONCAT (0) | 2022.10.09 |
---|---|
[PHP] MySQL 특정 필드에 중복값 넣지 않기 UNIQUE (0) | 2022.10.09 |
[PHP] MySQL 2개 이상의 테이블 묶어 사용하기 UNION (0) | 2022.10.08 |
[PHP] MySQL 그룹별 집계 GROUP BY (0) | 2022.10.08 |
[PHP] MySQL 집계함수 sum, avg, max, min (0) | 2022.10.07 |