앞에서 간단히 데이터 처리를 위한 조건을 추가해 보았습니다. 도시가 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 절 모두 사용 가능 합니다.