앞에서 간단히 데이터 처리를 위한 조건을 추가해 보았습니다. 도시가 seoul인 회원을 찾 기 위해서 = 연산 기호를 사용했습니다. WHERE은 컬럼과 값을 다양한 연산자를 통하여 조건을 설정할 수 있습니다.

MySQL에서는 아홉 가지의 다양한 연산자를 지원합니다.

12.2.1 Equal

컬럼의 동일한 값을 비교할 때는 = 기호를 사용합니다. = 기호는 컬럼의 데이터 값이 우 측에 지정한 값과 정확히 일치했을 경우에 조건이 성립됩니다. = 기호는 데이터 처리 조 건으로 가장 많이 이용하는 기호입니다.

| 예제 쿼리 |

쿼리~ where Id = 7; 

Id 값이 정확히 7인 데이터를 검색하여 결과를 출력합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id =7;
+----+-------+
| Id | code  |
+----+-------+
|  7 | O_007 |
+----+-------+
1 row in set (0.00 sec)

PHP 코드를 통하여 검색 조건 처리를 실험해 보도록 합니다.

| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.

public function selectRowss($queryString)
{
            if ($result = mysqli_query($this->dbcon, $queryString)) {
                $this->msgEcho("쿼리성공] ".$queryString);
                $rowss = "";
                $row_cnt = mysqli_num_rows($result);
                for ($i=0; $i<$row_cnt; $i++) {
                    $rowss[$i] = mysqli_fetch_object($result);
                }

                $result->free();
                return $rowss;
            } else {
                    $this->msgEcho("Error] ".$queryString);
            }  
}

예제 파일 | where-01.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$queryString = "SELECT FirstName, LastName FROM members where Id='3'";
	if($rowss = $db->selectRowss($queryString)){
		echo "tables fields = ". count($rowss) . "<br>";
 
		for($i=0;$i<count($rowss);$i++){
			echo $i."=";            
			print_r($rowss[$i]);
			echo "<br>";
		}
	}

?>

화면 출력

mysql connected!
쿼리성공] SELECT FirstName, LastName FROM members where Id='3'
tables fields = 1
0=stdClass Object ( [FirstName] => kim [LastName] => james ) 

12.2.2 NOT Equal

같다를 의미하는 = 기호의 반대입니다. 컬럼의 값이 일치하지 않을 때 비교하는 연산자 는 <> 를 사용합니다.

| 예제 쿼리 |

쿼리~ where Id <> '7'; 

쿼리에서 Id 값이 7이 아닌 모든 내용을 찾아서 결과를 출력합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id <> 7;
+----+-------+
| Id | code  |
+----+-------+
|  1 | O_001 |
|  2 | O_002 |
|  3 | O_003 |
|  4 | O_004 |
|  5 | O_005 |
|  6 | O_006 |
|  8 | O_008 |
|  9 | O_009 |
| 10 | O_010 |
+----+-------+
9 rows in set (0.00 sec)

출력 결과를 확인해 보면 Id가 7인 경우만 빼고 모두 출력되었습니다. PHP 코드를 통하여 결과를 실험해 보도록 합니다.

예제 파일 | where-02.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$queryString = "SELECT FirstName, LastName FROM members where Id<>'3'";
	if ($rowss = $db->selectRowss($queryString)) {
    		echo "tables fields = ". count($rowss) . "<br>";
 
		for ($i=0;$i<count($rowss);$i++) {
			echo $i."=";            
			print_r($rowss[$i]);
			echo "<br>";
		}
	}

?>
 

화면 출력

mysql connected!
쿼리성공] SELECT FirstName, LastName FROM members where Id<>'3'
tables fields = 5
0=stdClass Object ( [FirstName] => lee [LastName] => hojin )
1=stdClass Object ( [FirstName] => [LastName] => jiny )
2=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
3=stdClass Object ( [FirstName] => jiny [LastName] => 1234 )
4=stdClass Object ( [FirstName] => jiny [LastName] => 123400 ) 

12.2.3 크기 비교

where 조건 설정 시 크기를 비교하는 부등호 기호를 함께 사용할 수 있습니다.

>는 왼쪽의 값이 오른쪽 값보다 큰 값인지를 비교하는 연산자입니다.
>=는 왼쪽의 값이 오른쪽 값보다 큰 값, 또는 같은 값인지를 비교하는 연산자입니다.

| 예제 쿼리 |

쿼리~ where Id > 7; 
쿼리~ where Id >= 7; 

Id 값이 7보다 큰 값만 출력해 봅니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id >7;
+----+-------+
| Id | code  |
+----+-------+
|  8 | O_008 |
|  9 | O_009 |
| 10 | O_010 |
+----+-------+
3 rows in set (0.00 sec)

7보다 큰 값이기 때문에 7은 출력되지 않습니다. 7을 포함하려고 하면 >= 등호 기호도 함께 작성합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id >=7;
+----+-------+
| Id | code  |
+----+-------+
|  7 | O_007 |
|  8 | O_008 |
|  9 | O_009 |
| 10 | O_010 |
+----+-------+
4 rows in set (0.00 sec)

<는 왼쪽의 값이 오른쪽보다 큰 값인지를 비교하는 연산자입니다.
<=는 왼쪽의 값이 오른쪽 다 큰 값, 또는 작은 값인지를 비교하는 연산자입니다.

쿼리~ where Id < 5; 
쿼리~ where Id <= 5; 

Id 값이 5보다 작은 값만 출력합니다.

mysql> select * from orders WHERE Id <5;
+----+-------+
| Id | code  |
+----+-------+
|  1 | O_001 |
|  2 | O_002 |
|  3 | O_003 |
|  4 | O_004 |
+----+-------+
4 rows in set (0.00 sec)

5보다 작은 값이기 때문에 5를 출력하지는 않았습니다. 5를 포함하려면 <=처럼 등호 기 호를 함께 사용합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id <=5;
+----+-------+
| Id | code  |
+----+-------+
|  1 | O_001 |
|  2 | O_002 |
|  3 | O_003 |
|  4 | O_004 |
|  5 | O_005 |
+----+-------+
5 rows in set (0.00 sec)

PHP 코드를 통하여 크기 비교를 실습해 보도록 합니다.

예제 파일 | where-03.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$queryString = "SELECT Id, FirstName, LastName FROM members where Id>=3";
	if ($rowss = $db->selectRowss($queryString)) {
		echo "tables fields = ". count($rowss) . "<br>";
 
		for ($i=0;$i<count($rowss);$i++) {
			echo $i."=";            
			print_r($rowss[$i]);
			echo "<br>";
		}
	}

?>

화면 출력

mysql connected!
쿼리성공] SELECT Id, FirstName, LastName FROM members where Id>=3
tables fields = 4
0=stdClass Object ( [Id] => 3 [FirstName] => kim [LastName] => james )
1=stdClass Object ( [Id] => 5 [FirstName] => jiny [LastName] => 1234 )
2=stdClass Object ( [Id] => 6 [FirstName] => jiny [LastName] => 1234 )
3=stdClass Object ( [Id] => 7 [FirstName] => jiny [LastName] => 123400 ) 

12.2.4 BETWEEN ~ AND ~

연산 기호를 사용한 조건은 어떠한 방향성을 설정하여 검색하는 방법입니다. 이와 달리 BETWEEN 연산자는 입력된 값의 사이의 범위를 지정할 수 있는 조건입니다. 범위로 사 용할 수 있는 값은 숫자, 텍스트 또는 날짜 데이터 타입입니다.

BETWEEN 연산자는 범위를 설정하기 때문에 시작 값과 끝 값이 필요합니다.

| 쿼리 문법 |

쿼리~ WHERE 컬럼명 BETWEEN 시작  AND  ; 

BETWEEN 연산자는 WHERE 컬럼 >= 값1 and 컬럼 <= 값2로 바꾸어 사용할 수 있습 니다. 같은 의미입니다. 즉, >=와 <= 사이를 말합니다.

| 예제 쿼리 |

select * from orders where Id between 3 and 8; 

Id가 3과 8 사이의 값을 출력합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id between 3 and 8;
+----+-------+
| Id | code  |
+----+-------+
|  3 | O_003 |
|  4 | O_004 |
|  5 | O_005 |
|  6 | O_006 |
|  7 | O_007 |
|  8 | O_008 |
+----+-------+
6 rows in set (0.00 sec)

3부터 8까지를 출력합니다. BETWEEN은 =를 포함하기 때문에 3과 8도 출력됩니다.

BETWEEN 조건은 해당 범위의 사이의 값의 항목들을 출력합니다. 이와 반대로 해당 범 위의 여집합을 선택하여 출력할 수도 있습니다. NOT BETWEEN 은 범위가 아닌 밖을 지정하여 출력합니다.

| 예제 쿼리 |

select * from orders where Id not between 3 and 8; 

Id의 범위가 3보다 크고 8보다 작은 영역이 아닌 그 외의 집합을 찾아 출력합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id not between 3 and 8;
+----+-------+
| Id | code  |
+----+-------+
|  1 | O_001 |
|  2 | O_002 |
|  9 | O_009 |
| 10 | O_010 |
+----+-------+
4 rows in set (0.00 sec)

해당 범위만 제외되고 전체가 출력됩니다.
PHP 코드를 통하여 BETWEEN 조건을 실험해 봅니다.

예제 파일 | where-04.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$queryString = "select * from orders WHERE Id between 3 and 8";
	if ($rowss = $db->selectRowss($queryString)) {
		echo "tables fields = ". count($rowss) . "<br>";
 
		for ($i=0;$i<count($rowss);$i++) {
			echo $i."=";            
			print_r($rowss[$i]);
			echo "<br>";
		}
	}

?>

화면 출력

mysql connected!
쿼리성공] select * from orders WHERE Id between 3 and 8
tables fields = 6
0=stdClass Object ( [Id] => 3 [code] => O_003 [email] => eric@jinyphp.com ) 
1=stdClass Object ( [Id] => 4 [code] => O_004 [email] => ) 
2=stdClass Object ( [Id] => 5 [code] => O_005 [email] => ) 
3=stdClass Object ( [Id] => 6 [code] => O_006 [email] => ) 
4=stdClass Object ( [Id] => 7 [code] => O_007 [email] => ) 
5=stdClass Object ( [Id] => 8 [code] => O_008 [email] => ) 

BETWEEN의 연산 범위로 텍스트 값을 사용할 수도 있습니다.

SELECT * FROM members WHERE username BETWEEN '장승빈' AND '이호진' 
SELECT * FROM members WHERE username NOT BETWEEN '장승빈' AND '이호진' 

BETWEEN의 연산 범위로 날짜 값을 사용할 수도 있습니다.

| 예제 쿼리 |

SELECT * FROM Orders WHERE regDate BETWEEN #07/04/1996# AND #07/09/1996#; 

12.2.5 IN

방향과 범위는 해당 조건에 맞는 그룹의 모두를 의미합니다. 그룹의 모두가 아니라 특정 한 조건을 가지는 몇몇 다수를 선택하고자 할 때는 사용을 할 수 없습니다. 또는 = 기호로 모두 나열하는 것은 불편할 것입니다.

IN 연산자는 다수의 선택 값을 지정하여 결과를 출력할 수 있습니다.

| 쿼리 문법 |

~~~ WHERE 컬럼명 IN (1, 2, .); 

IN 연산자는 컬럼명=값 1 or 컬럼명=값2 or 컬럼명=값3 or ….처럼 or 연산자로 묶여 있 는 것과 같습니다.

| 예제 쿼리 |

select * from orders where Id in (1,3,9); 

Id 값이 1과 3과 9인 경우만 검색하여 출력합니다.

| 콘솔 실습 화면 |

mysql> select * from orders WHERE Id in (1,3,9); +----+-------+ | Id | code | +----+-------+ | 1 | O_001 | | 3 | O_003 | | 9 | O_009 | +----+-------+ 3 rows in set (0.00 sec)

선택하고자 하는 값은 IN 연산자 소괄호 안에 직접 입력하면 됩니다. 값이 여러 개일 경 우 콤마 (,)를 통하여 구분합니다. 또한 () 안에 또 다른 SELECT 조회문을 입력하여 결과 를 매칭할 수도 있습니다.

| 쿼리 문법 |

쿼리~ WHERE 컬럼명 IN (SELECT 쿼리문); 

먼저 IN 안에 있는 SELELCT 조건이 먼저 수행됩니다. 해당 조건에 맞는 값들이 IN 연산 자 안에 값이 선택 값으로 들어갑니다. 두 번째로 메인 SELECT가 실행되면서 IN 연산자 와 일치된 목록만 출력됩니다.

| 예제 쿼리 |

SELECT * FROM members WHERE email IN (SELECT email FROM orders where regdate >= '2017-05-26' ); 

위의 쿼리를 실행하게 되면 오늘 주문 내역이 있는 회원 정보만 출력합니다.

PHP 코드를 통하여 IN 연산자를 실험해 보겠습니다.

예제 파일 | where-05.php

<?php

	include "dbinfo.php";
	include "mysql.class.php";
 
	// ++ Mysqli DB 연결.
	$db = new JinyMysql();

	$queryString = "select * from orders WHERE Id in (1,3,9)";
	if ($rowss = $db->selectRowss($queryString)) {
		echo "tables fields = ". count($rowss) . "<br>";
 
		for($i=0;$i<count($rowss);$i++){
			echo $i."=";            
			print_r($rowss[$i]);
 			echo "<br>";
		}
	}

?> 

화면 출력

mysql connected!
쿼리성공] select * from orders WHERE Id in (1,3,9)
tables fields = 3
0=stdClass Object ( [Id] => 1 [code] => O_001 [email] => hojin@jinyphp.com )
1=stdClass Object ( [Id] => 3 [code] => O_003 [email] => eric@jinyphp.com )
2=stdClass Object ( [Id] => 9 [code] => O_009 [email] => ) 

12.2.6 ANY와 ALL 연산자

앞에서 여러 개의 데이터를 매칭하여 처리를 하는 IN 연산자를 학습했습니다. IN 연산자 는 입력된 조건 값에 대해서 같은 (=) 값을 가지는 것만 처리합니다. ANY 연산자는 IN 연 산자와 유사하지만 >, >=, <, <=와 같이 양도 비교 처리를 할 수 있습니다.

| 쿼리 문법 |

쿼리~ WHERE 컬럼명 >= ANY(SELECT 쿼리문); 

위의 쿼리 문법의 예를 보면 ANY 안에 있는 SELECT 쿼리문의 결과보다 크거나 같은 데 이터 조건을 출력합니다.

| 예제 쿼리 |

select * from members where emoney > any (select prices from products); 

예제는 현재 판매하고 있는 상품의 가격을 ANY의 인자로 전달합니다. 그리고 회원이 적 립금과 비교합니다. ANY 안에 있는 값 중에 하나라도 만족하면 됩니다. 즉 제품의 모든 가격과 회원 수의 적립금을 N:N으로 검사하게 됩니다. 즉, 위의 쿼리 결과는 가장 금액이 작은 상품, 최소한 상품 1개 이상을 살수 있는 적립금을 가진 회원을 출력합니다.

반면에 ALL 쿼리는 서브 쿼리의 조건 모두가 일치하는지 확인합니다.

| 쿼리 문법 |

쿼리~ WHERE 컬럼명 >= ALL(SELECT 쿼리문); 

ALL 안에 있는 SELECT의 모든 조건을 만족하는 결과를 처리합니다.

| 예제 쿼리 |

select * from members where emoney > all (select prices from products)

앞의 ANY는 최저 가격의 상품보다 이상의 금액을 가지는 회원 목록이었다면, ALL은 모 든 상품의 가격을 다 만족해야 합니다. 즉, 최고 가격의 상품 이상의 회원 적립금을 갖는 회원을 출력합니다.

위의 쿼리를 달리 작성한다면,

| 예제 쿼리 |

select * from members where emoney > (select max(prices) from products) 

와 같을 수 있습니다. ANY와 ALL 연산자는 WHERE 절과 HAVING 절 모두 사용 가능 합니다.