FROM 절의 중간 결과 테이블에 나타난 각 행을 살펴보고 특별한 행에 대하여 조건이 참이면 WHERE 절의 중간 결과 테이블로 이동시킨다.
관계연산자를 사용하는 조건
조건의 가장 간단한 형식은 두 수식간의 관계 연산이다. 이러한 조건은 수식, 조건 연산자, 수식으로 구성
= 같다.
< 작다.
> 크다.
<= 작거나 같다
>= 크거나 같다.
<> 같지 않다. (NOT = 사용)
예제) 성별이 여자인 학생의 학번과 이름, 주민등록번호를 출력하라.
mysql > select stu_no, stu_name, id_num
> from student
> where substring(id_num,8,1)=2;
substing() 함수는 주문등록번호(id_num) 문자열의 8번째 자리 1자리를 추출한다. 예제에서 조건이 substring(id_num,8,1)=2이기 때문에 여자인 행만 출력한다.
AND, OR, NOT을 사용한 다중 조건
예제) 1985년 이후 출생한 성별이 여자인 학생의 학번과 이름, 주민등록번호를 출력하라.
mysql > select stu_no, stu_name, id_num
> from student
> where substring(id_num,8,1)=2;
> and substring(id_num,1,2) > 85;
substing() 함수는 주문등록번호(id_num) 문자열의 8번째 자리 1자리를 추출한다. 예제에서 조건이 substring(id_num,8,1)=2이기 때문에 여자인 행만 출력한다.
예제) 휴대폰 번호가 016,019,010로 시작하는 휴대폰을 소지한 학생의 학번과 이름, 휴대폰번호를 나타내라.
mysql > select stu_no, stu_name, phone_no
>from student
>where substring(phone_no,1,3) ='106'
>or substring(phone_no,1,3)='019'
>or substring(phone_no,1,3)='010'
이 예제에서 만약 OR 대신에 AND 연산자를 사용하게 되면 SELECT 명령문은 결과로 공백 테이블을 반환한다.
예제) 성별이 남자이거나 1988년에 출생한 학생의 학번, 이름, 주민등록번호를 나타내어라. 그러나 1988년도 출생한 남학생은 제외한다.
mysql > select stu_no, stu_name, id_num
> from student
> where (substring(id_num,8,1)= 1 or substring(id_num,1,2)=88)
>and not (substring(id_num,8,1)=1 or substring(id_num,1,2)=88);
BETWEEN 연산자
SQL은 주어진 값의 범위에 어떤 값이 포함 되어 잇는지를 결정도록하는 BETWEEN이라는 특별한 연산자를 제공한다.
E1 BETWEEN E2 AND E3
예제) 81년부터 87년 사이에 출생한 각 학생의 학번과 이름, 출생년도를 출력하라
mysql> select stu_no,stu_name, birth_year
> from student
> where birth_year >= 1981
> and birth_year <= 1987
(E1 >= E2) AND (E1 <= E3)
위의 조건식에서 3개의 수식 중 하나라도 NULL 값과 동일한 값을 가진다면 전체 조건을 할 수 없게 된다.
예제)
mysql> select stu_no, stu_name, birth_year
> from student
> where birth_year between 1981 and 1987
> order by birth_year;
IN 연산자
열에 있는 값이 매우 큰 값의 집합에 존재하는지 결정하기 위한 긴 조건식을 사용한다면 조건식을 사용하는 것이 아주 귀찮을 때가 있다. 다음에서는 복잡한 조건을 간단하게 처리 할 수 있는 IN 연산자의 예제를 보여주고 잇다.
• 서브쿼리가 리턴하는 행중에서 어느 하나라도 만족하는 경우에 결과를 리턴한다.
예제) 우편번호가 135-794,150-051,550-260에 해당되는 각 학생의 학번, 이름, 현주속의 우편번호를 출력하라.
mysql> select stu_no, stu_name, post_no
> from student
> where post_no =' 135-794'
> or post_no =' 150-051'
> or post_no =' 550-260';
예제) 우편번호가 135-794,150-051,550-260에 해당되는 각 학생의 학번, 이름, 현주속의 우편번호를 출력하라.
mysql> select stu_no, stu_name, post_no
> from student
> where post_no in(' 135-794', ' 150-051',' 550-260'); # POST 값이 3개의 우편번호를 가지고 있는 집합에 포함되면 각 행은 조건을 만족하게 된다.
예제) 81,83,87년에 출생한 각 학생의 학번과 주민등록번호를 출력하라.
mysql> select stu_no, id_num
> from student
> where stubstirng(id_num,1,2) in (81,83,87);
- 수식의 자료형을 비교할 수 있어야한다.
- 통계 함수는 수식으로 사용할 수 없다.
E1, E2, E3, E4가 수식이라고 할 때 조건식은
E1 IN (E2,E3,E4)
은 다음의 수식과 동일한다.
(E1=E2) OR (E1=E3) OR (E1=E4)
E1 NOT IN (E2,E3,E4)
은 다음의 수식과 동일한다.
(E1 <> E2) AND (E1 <> E3) AND (E1<>E4)
LIKE 연산자
LIKE 연산자는 특별한 패턴이나 마스크를 가지는 영수치 값을 선택할 때 사용된다.
예제) 영문이름이 문자 P로 시작하는 학생의 학번과 이름, 영문이름을 나타내어라
mysql> select stu_no, stu_name, stu_ename
> from student
> where stu_ename like 'P%';
LIKE 연산자 다음에 문자 수치 리터럴 'P%'
리터럴은 LIKE 연산자 다음에 사용되는 퍼센트는 특별한 의미 = 패턴 또는 마스크
마스크에서 특별한 기호로 사용되는 퍼센트 기호는 0 또는 그 이상의 임의의 모든 문자를 의미
예제) 영문이름의 끝에 문자 g를 갖고 있는 학생의 학번과 이름을 나타내라.
mysql> select stu_no, stu_ename
> from student
> where stu_ename like '%g';
예제) 영문이름의 끝에서 두 번째 문자의 u인 학생의 학번과 이름을 나타내라.
mysql> select stu_no, stu_ename
> from student
> where stu_ename like '%u_';
예제) 영문이름이 문자 K로 시작되지 않는 학생의 학번과 이름을 나타내라.
mysql> select stu_no, stu_ename
> from student
> where not (stu_name like 'K%');
NULL 연산자
NULL연산자는 특정한 열이 값을 가지고 있지 않는 행을 선택할 때 사용한다.
예제) 휴대폰을 가지고 있는 학생의 학번과 이름, 휴대폰 번호를 나타내라.
mysql> select stu_no, stu_name, phone_no
> from student
> where phone_no is not null;
예제) 휴대폰을 가지고 있는 학생의 학번과 이름, 휴대폰 번호가 NULL 인 경우에 "휴대폰 없음" 나타내라.
mysql> select stu_no, stu_name, ifnull(phone_no, '휴대폰없음')
> from student
> where phone_no is not null;
예제) 학생의 휴대폰번호(phone_no)가 017이 아닌 모든 학생의 학번과 이름, 휴대폰 번호를 출력하라.
mysql> select stu_no, stu_name, phone_no
> from student
> where substring(phone_no,1,3) <> '017'
or phone_no is null;
부속 질의어에서 IN 연산자
• 서브쿼리가 리턴하는 행중에서 어느 하나라도 만족하는 경우에 결과를 리턴한다.
예제) 등록을 한 각 학생의 학번, 이름을 출력
mysql> select distinct stu_no
> from fee;
첫번째 작업, 학생이 등록을 했는지 작업을 해야하고,
그 다음에 이러한 학생의 학번, 이름을 찾아야 한다.
distinct는 중복된 값을 사용할 필요가 없으므로
예제) 부속질의어를 이용하여 등록을 한 각 학생의 학번, 이름을 출력하라.
mysql> select stu_no, stu_name
> from student
> where stu_no in
> (select stu_no
> from fee);
예제) 적어도 한 번의 장학금을 받았던 학생의 학번과 이름을 출력하라.
mysql > select stu_no, stu_name
> from student
> where stu_no in
> (select stu_no
> from fee
> where jang_total >0);
예제) "20061011"인 학생이 가입한 동아리를 제외한 다른 동아리에 적어도 한번 가입을 한 학생의 학번과 이름을 출력하라.
mysql > select stu_no, stu_name
> from student
> where stu_no in
> (select stu_no
> from circle
> where cir_name not in
> (select cir_name
> from circle
> where stu_no = '20061011'));
예제) 휴대폰을 가지고 잇는 학생을 출력하라.(야간 학생 제외)
mysql > select stu_no, stu_name,phone_no
> from student
> where phone_no not in
> (select phoe_no
> from student
> where juya ='야');
부속질의어에서 관계 연산자
예제) 수강신청을 한 학생의 학번과 이름을 출력하라.
mysql> select stu_no, stu_name
> from student
> where stu_no in
> (select stu_no
> from attend
> where att_div ='Y');
예제) 김유미(1983년생) 보다 나이가 더 많은 각 학생의 학번과 이름, 주민등록번호를 출력하라.
mysql> select stu_no, stu_name, id_num
> from student
> where substring(id_num,1,2) <
> (select substirng(id_num, 1,2)
> from student
> where stu_name =' 김유미');
ALL과 ANY 연산자
ANY, SOME | 서브쿼리에 의해 리턴되는 각각의 값과 조건을 비교하여 하나 이상을 만족하면 참이다. |
---|---|
ALL | 값을 서브쿼리에 의해 리턴되는 모든 값과 조건값을 비교하여 모든 값을 만족해야만 참이다. |
• ANY,ALL 연산자는 IN 연산자와 달리 어떤 특정한 값이 아닌 범위로 비교연산을 처리한다.
• ANY 연산자는 서브쿼리에서 리턴되는 어떠한 값이라도 만족을 하면 조건이 성립된다.
• ALL 연산자는 서브쿼리에서 리턴되는 모든 값을 만족하면 조건이 성립된다.
부속 질의어를 사용하는 3번째 방법은 ALL과 ANY 연산자를 사용하는 것이다. 이러한 연산자는 부속 질의어에서 IN 연산자를 사용하는 것과 유사하다. ANY 연산자와 SOME 연산자는 동의어
예제) 가장 나이가 많은 학생의 학번, 이름, 출생년도를 출력하라(단, 가장 나이가 많은 학생은 다른 학생의 출생년도보다 출생년도가 더 적거나 같은 출생년도를 가진 학생이다.)
mysql> select stu_no, stu_name, birth_year
> from student
> where birth_year <= all
> (select birth_year
> from student);
(birth_year =birth_year) AND
(birth_year <= y1) AND
(birth_year <= y2) AND ...AND
(birth_year <= yn) AND
TRUE
ANY연산자는 ALL연산자의 반대가 되는 연산자이다.
예제) 가장 나이가 많은 학생을 제외한 나머지 모든 학생의 학번, 이름, 출생년도를 출력하라
mysql> select stu_no, stu_name, id_num
> from student
> where birth_year > any
> (select birth_year
> from student);
(birth_year =birth_year) AND
(birth_year > y1) OR
(birth_year > y2) OR
(birth_year > yn) OR false);
예제) 학번 20001015인 학생이 등록한 등록금의 납부 총액보다 더 많은 등록금을 낸 학생의 학번을 출력하라. 이때 20001015번은 결과에서 제외한다.
mysql> select distinct stu_no
> from fee
> where stu_no <> '20001015'
> and fee_pay > any
> (select fee_pay
> from fee
> where stu_no='20001015');
EXISTS 연산자
EXISTS | 메인 쿼리의 비교 조건이 서브쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참이다. |
---|
• NOT EXISTS는 서브쿼리에서 검색된 결과가 하나도 존재하지 않으면 메인쿼리 조건절은 참이다.
예제)
등록을 한 학생의 학번과 이름을 출력하라.
mysql> select stu_no, stu_name
> from student
> where stu_no in
> (select stu_no
> from fee);
mysql> select stu_no, stu_name
> from student
> where exists
> (select * from fee
> where stu_no = student.stu_no);
조건에서 열 명세 student.stu_no은 주 질의어의 명령문에서 사용했던 테이블을 참조하게 된다. 이와 같은 이유는 상호 관련된 부속 질의어를 호출하기 때문이다. 즉, 지정된 열 명세를 사용함으로써 부속질의어와 주 질의어 간에 관계를 확립한다.
STUDETNT 테이블에 있는 모든 학생에 대하여 부속 질의어의 결과로서 행을 반환하는지 반환하지 않는지 결정한다. 다시 말하면, WHERE EXISTS의 결과가 있는지 조사한다는 것. 만약 FEE 테이블이 학생과 관련된 동일한 학번인 행이 적어도 하나 이상 있다면 그 행은 조건을 만족.
예제) 등록하지 않은 학생의 학번과 이름을 출력하라.
mysql> select stu_no, stu_name
> from student
> where not exists
> (select *
> from fee
> where stu_no = student.stu_no);
예제) 각각의 도시에 거주하는 모든 학생에 대하여 휴대폰을 가지고 있는 학생의 학번과 이름 우편번호, 휴대폰 번호를 나타내라.(단, 휴대폰이 있는 학생과 휴대폰이 없는 학생의 우편 번호 앞 3자리가 동일한 학생은 제외시킨다.)
mysql> select stu_no, stu_name, post_no, phone_no
> from student s1
> where not phone_no in
> (select phone_no
> from student s2
> where substring(s1.post_no,1,3) = substring(s2.post_no,1,3)
> and phone_no is null);
부정 조건
SQL에서 자주 발생하는 오류의 대한 설명.
열에서 특별한 값을 가지고 있지 않는 행을 찾는 조건을 부정 조건이라 한다.
부정 조건은 긍정 조건 앞에 NOT을 위치시킴으로써 만들 수 있다.
예제) "Java길라잡이" 동아리에 가입한 학생의 학번과 이름을 출력하라.
mysql > select stu_no, stu_name
> from circle
> where cir_name ='java길라잡이';
예제) "Java길라잡이" 동아리에 가입하지 않은 학생의 학번과 이름을 출력하라.
mysql > select stu_no, stu_name, cir_name
> from circle
> where cir_name <>'java길라잡이';
mysql > select stu_no, stu_name, cir_name
> from circle
> where not cir_name <>'java길라잡이';
NULL 값을 포함한 데이터가 존재한다면 부정조건을 처리 할 때 문제가 발생한다.
예제) 등록테이블에서 장학코드 '11' 학생의 학번과 장학코드, 장학금 총액을 출력하라.
mysql > select stu_no, jang_code, jang_total
> from fee
> where jang_code =11 ;
예제) 등록테이블에서 장학코드 '11'이 아닌 학생의 학번과 장학코드, 장학금 총액을 출력하라.
mysql > select stu_no, jang_code, jang_total
> from fee
> where jang_code <> 11 ;
예제) 등록테이블에서 장학코드 '11'이 아닌 학생의 학번과 장학코드, 장학금 총액을 출력하라. (NOT IN 이용)
mysql > select stu_no, jang_code, jang_total
> from fee
> where jang_code not in
> (select jang_code
> from fee
> where jang_code in (11));
예제) 등록테이블에서 장학코드 '11'이 아닌 학생의 학번과 장학코드, 장학금 총액을 출력하라. (NOT IN 이용하고 장학코드가 NULL 인 학생도 포함하여 출력)
mysql > select stu_no, jang_code, jang_total
> from fee
> where jang_code not in
> (select jang_code
> from fee
> where jang_code in (11))
> or jang_code is null;
'DB > MySQL' 카테고리의 다른 글
Mysql 접속하기 (0) | 2012.03.06 |
---|---|
PHP와 mysql을 이용해서 게시판 만들기 (1) | 2012.03.05 |
FROM 절 (0) | 2012.03.05 |
7장 SELECT 명령문의 절 (0) | 2012.03.05 |
테이블 생성 및 삭제하기 (0) | 2012.03.02 |
댓글