9장. SELECT명령문 : WHERE 절 개요, 2. 관계연산자를 사용하는 조건 개요, 2. 관계연산자를 사용하는 조건 3. AND, OR, NOT을 사용한 다중 조건 4. BETWEEN 연산자, 5. IN 연산자 6. LIKE 연산자, 7. NULL 연산자 8. 부속질의어에서 IN 연산자 9. 부속질의어에서 관계 연산자 10. ALL과 ANY 연산자 11. EXISTS 연산자, 12. 부정조건 2019-04-13 쉽게 배우는 MySQL 5.x
9.1 개요 SQL은 FROM 절의 중간 결과에 나타난 각 행을 WHERE 조건이 참이면 WHERE 절의 중간 결과 테이블로 이동 WHERE 절에서 사용할 수 있는 조건과 연산자 ∙관계 연산자 ∙AND, OR, NOT과 결합된 조건 ∙BETWEEN 연산자 ∙IN 연산자 ∙LIKE 연산자 ∙NULL 연산자 ∙부속 질의어 함께 사용되는 IN 연산자 ∙부속 질의어 함께 사용되는 관계 연산자 ∙ANY와 ALL 연산자 ∙EXISTS 연산자 2019-04-13 쉽게 배우는 MySQL 5.x
9.2 관계 연산자를 사용하는 조건 관계 연산자의 좌변과 우변에 있는 값을 비교하여 조건의 결과는 참, 거짓 관계 연산자 9.2 관계 연산자를 사용하는 조건 관계 연산자의 좌변과 우변에 있는 값을 비교하여 조건의 결과는 참, 거짓 관계 연산자 의 미 = 같다. < 작다. > 크다. <= 작거나 같다. >= 크거나 같다. <> 같지 않다. (NOT = 사용) 다른 SQL 제품에서 관계 연산자 중 <> 연산자는 !=, ^=, # 등으로 사용됨 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-1] 성별이 여자인 학생의 학번과 이름, 주민등록번호를 출력하라. mysql> select stu_no, stu_name, id_num -> from student -> where substring(id_num, 8,1) = 2; +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20041002 | 김유미 | 830207-2629715 | | 20041007 | 정인정 | 830315-2351225 | | 20061014 | 고혜진 | 870307-2638759 | | 20071300 | 유하나 | 880921-2573717 | | 20071307 | 김문영 | 880418-2121623 | | 20071405 | 최차영 | 881003-2581516 | 6 rows in set (0.00 sec) substring( ) 함수는 주민등록번호(id_num) 문자열의 8번째 자리 1자리를 추출 조건이 SUBSTRING(ID_NUM, 8, 1) = 2이기 때문에 여자인 행만 출력 2019-04-13 쉽게 배우는 MySQL 5.x
[예제9-2] 야간인 학생들의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where juya='야'; +----------+----------+ | stu_no | stu_name | | 20001001 | 김유신 | | 20041033 | 연개소문 | | 20061048 | 김영호 | | 20071010 | 홍길동 | | 20071022 | 이순신 | | 20071307 | 김문영 | [예제 9-3] 학번이 20071405인 학생의 학번과 이름을 출력하라. -> where stu_no = '20071405'; | 20071405 | 최차영 | 2019-04-13 쉽게 배우는 MySQL 5.x
[예제9-4]휴대폰을 가지고 있는 학생의 학번과 이름, 휴대폰 번호를 출력하라. mysql> select stu_no, stu_name, phone_no -> from student -> where phone_no = phone_no; +----------+----------+---------------+ | stu_no | stu_name | phone_no | | 20001001 | 김유신 | 011-617-1290 | | 20001015 | 박도준 | 011-611-9884 | | 20041002 | 김유미 | 010-617-1290 | | 20041007 | 정인정 | 016-605-7837 | | 20041033 | 연개소문 | 018-641-9304 | | 20061011 | 박정인 | 017-3142-1294 | | 20061048 | 김영호 | 017-614-7575 | | 20071010 | 홍길동 | 010-6425-9245 | | 20071022 | 이순신 | 010-7141-1860 | | 20071300 | 유하나 | 019-651-0707 | | 20071307 | 김문영 | 019-4624-0460 | 11 rows in set (0.00 sec) -PHONE_NO = PHONE_NO 휴대폰번호가 동일하기 때문에 PHONE_NO 열이 채워져 있는 모든 행이 출력 -만약 PHONE_NO 열이 채워져 있지 않다면 조건은 알 수 없는 값으로 평가 -NULL 값이 나타나면 조건의 값은 알 수 없는 것으로 평가되어 출력 안함 2019-04-13 쉽게 배우는 MySQL 5.x
-관계 연산에서 수식은 비교할 수 있는 데이터를 가지고 있어야 한다. -조건의 값 24는 자동적으로 문자수치 데이터로 변환되기 때문에 비교가 허용 WHERE STU_NAME = 24 -DATE 열은 날짜(DATE) 자료형을 가지고 있지만 수치 24는 수치 값이므로 비교가 허용되지 않는다. WHERE DATE = 24 어떤 영수치 값이 다른 문자 수치 값에 비하여 영문자의 ASCII 코드 값 보다 더 적다면 다른 값 보다 적다고 할 수 있다. 조건 값 'Jim' < 'Pete' TRUE 'Truck' >= 'Trek' 'Jim' = 'JIM' FALSE '1985/12/08' < '1985/12/09' '1980/05/02' > '1979/12/31' 2019-04-13 쉽게 배우는 MySQL 5.x
9.3 AND, OR, NOT을 사용한 다중 조건 [예제9-5]1985년 이후에 출생한 여학생의 학번, 이름, 주민등록번호를 출력하라. mysql> select stu_no, stu_name, id_num mysql> select stu_no, stu_name, id_num -> from student -> from student -> where substring(id_num, 8,1) = 2 -> where substring(id_num, 8,1) = 2 -> and substring(id_num,1,2) > 85; -> and birth_year > '1985'; +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20061014 | 고혜진 | 870307-2638759 | | 20071300 | 유하나 | 880921-2573717 | | 20071307 | 김문영 | 880418-2121623 | | 20071405 | 최차영 | 881003-2581516 | -여학생인 조건 : 주민등록번호 8번째 1자리가 2인 학생 where = substring(id_num, 8,1) = 2 -1985년 이후에 태어난 학생의 조건 : ① 좌측은 주민등록번호 1번째 자리에서 2자리가 85보다 큰 학생 출력 : substring(id_num, 1,2) > 85 ② 우측의 where 조건절은 출생년도(birth_year)가 1985년 보다 큰 모든 행을 출력 : birth_year > ‘1985’ 2019-04-13 쉽게 배우는 MySQL 5.x
[예제9-6]휴대폰 번호가 016, 018, 019로 시작하는 휴대폰을 소지한 학생의 학번과 이름, 휴대폰번호를 나타내어라. mysql> select stu_no, stu_name, phone_no -> from student -> where substring(phone_no, 1,3) = '016' -> or substring(phone_no, 1,3) = '018' -> or substring(phone_no, 1,3) = '019'; +----------+----------+---------------+ | stu_no | stu_name | phone_no | | 20041007 | 정인정 | 016-605-7837 | | 20041033 | 연개소문 | 018-641-9304 | | 20071300 | 유하나 | 019-651-0707 | | 20071307 | 김문영 | 019-4624-0460 | 조건의 substring(phone_no, 1,3) 은 휴대폰 번호에서 1째 자리에서 3자리만 추출하여 ‘016’, ‘018’, ‘019’중에서 동일한 것만 비교해야 되므로 or 연산자를 사용하였다. 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-7] 성별이 남자가 아닌 학생의 학번, 이름을 나타내어라. [예제 9-7] 성별이 남자가 아닌 학생의 학번, 이름을 나타내어라. mysql> select stu_no, stu_name -> from student -> where substring(id_num, 8, 1) <> 1; +----------+----------+ | stu_no | stu_name | | 20041002 | 김유미 | | 20041007 | 정인정 | | 20061014 | 고혜진 | | 20071300 | 유하나 | | 20071307 | 김문영 | | 20071405 | 최차영 | 위의 예제를 다음과 같이 작성하여도 동일한 결과를 출력한다. SELECT STU_NO, STU_NAME FROM STUDENT WHERE NOT SUBSTRING(ID_NUM, 8, 1) = 1; 2019-04-13 쉽게 배우는 MySQL 5.x
위의 결과처럼 1988년에 태어난 남자(20071010, 홍길동) 학생은 출력되지 않는다. [예제 9-8] 성별이 남자이거나 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 and substring(id_num,1,2) = 88); +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20001001 | 김유신 | 811007-1632013 | | 20001015 | 박도준 | 780116-1580715 | | 20001021 | 이상길 | 750819-1227014 | | 20041033 | 연개소문 | 810615-1633111 | | 20061011 | 박정인 | 830403-1635213 | | 20061048 | 김영호 | 860811-1548758 | | 20071001 | 장수인 | 890209-1616822 | | 20071022 | 이순신 | 890222-1218818 | | 20071300 | 유하나 | 880921-2573717 | | 20071307 | 김문영 | 880418-2121623 | | 20071405 | 최차영 | 881003-2581516 | 11 rows in set (0.02 sec) 위의 결과처럼 1988년에 태어난 남자(20071010, 홍길동) 학생은 출력되지 않는다. 2019-04-13 쉽게 배우는 MySQL 5.x
9.4 BETWEEN 연산자 [예제 9-9] 81년부터 87년 사이에 출생한 각 학생의 학번과 이름, 출생년도를 출력하라. [예제 9-9] 81년부터 87년 사이에 출생한 각 학생의 학번과 이름, 출생년도를 출력하라. mysql> select stu_no, stu_name, birth_year -> from student -> where birth_year >= 1981 -> and birth_year <= 1987; +----------+----------+------------+ | stu_no | stu_name | birth_year | | 20001001 | 김유신 | 1981 | | 20041002 | 김유미 | 1983 | | 20041007 | 정인정 | 1983 | | 20041033 | 연개소문 | 1981 | | 20061011 | 박정인 | 1983 | | 20061014 | 고혜진 | 1987 | | 20061048 | 김영호 | 1986 | BETWEEN 연산자를 사용하여 다음과 같이 작성하면 동일한 결과 출력 -> where birth_year between 1981 and 1987; 2019-04-13 쉽게 배우는 MySQL 5.x
위의 결과는 출생년도 오름차순으로 정렬된 점이다. [예제 9-10] 출생연도가 1981년부터 1987년 사이에 태어난 학생의 학번과 이름, 출생년도를 출력하라. 단, 출생년도 오름차순으로 출력하라. mysql> select stu_no, stu_name, birth_year -> from student -> where birth_year between 1981 and 1987 -> order by birth_year; +----------+----------+------------+ | stu_no | stu_name | birth_year | | 20001001 | 김유신 | 1981 | | 20041033 | 연개소문 | 1981 | | 20041002 | 김유미 | 1983 | | 20041007 | 정인정 | 1983 | | 20061011 | 박정인 | 1983 | | 20061048 | 김영호 | 1986 | | 20061014 | 고혜진 | 1987 | 7 rows in set (0.00 sec) 위의 결과는 출생년도 오름차순으로 정렬된 점이다. 2019-04-13 쉽게 배우는 MySQL 5.x
9.5 IN 연산자 [예제 9-11] 우편번호가 150-051, 540-170, 550-260에 해당되는 각 학생의 학번, 이름, 현주소의 우편번호를 출력하라. mysql> select stu_no, stu_name, post_no -> from student -> where post_no = '150-051' -> or post_no = '540-170' -> or post_no = '550-260'; +----------+----------+---------+ | stu_no | stu_name | post_no | | 20061011 | 박정인 | 150-051 | | 20071022 | 이순신 | 540-170 | | 20071300 | 유하나 | 550-260 | | 20071307 | 김문영 | 540-170 | IN 연산자를 사용하여 다음과 같이 작성하면 동일한 결과 출력 -> where post_no in('150-051', '540-170', '550-260'); 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-12] 81, 83, 87년에 출생한 각 학생의 학번과 주민등록번호를 출력하라. mysql> select stu_no, id_num -> from student -> where substring(id_num, 1, 2) in (81, 83, 87); +----------+----------------+ | stu_no | id_num | | 20001001 | 811007-1632013 | | 20041002 | 830207-2629715 | | 20041007 | 830315-2351225 | | 20041033 | 810615-1633111 | | 20061011 | 830403-1635213 | | 20061014 | 870307-2638759 | IN 연산자 다음에 사용되는 수식에 적용되는 규칙 -수식의 자료형을 비교할 수 있어야 한다. -통계 함수는 수식으로 사용할 수 없다. 2019-04-13 쉽게 배우는 MySQL 5.x
9.6 LIKE 연산자 LIKE 연산자는 특별한 패턴이나 마스크를 가지는 영수치 값을 선택할 때 사용 [예제 9-13] 영문이름이 문자 P 로 시작하는 학생의 학번과 이름, 영문이름을 나타내어라. mysql> select stu_no, stu_name, stu_ename -> from student -> where stu_ename like 'P%'; +----------+--------------+ | stu_no | stu_ename | | 20001015 | Park Do-Jun | | 20061011 | Park Jung-In | 2 rows in set (0.00 sec) LIKE 연산자 다음에 사용되는 퍼센트 기호(%)는 특별한 의미를 가지고 있는데, 이를 패턴(pattern) 또는 마스크(mask)라 한다. -퍼센트 기호(%) : 0 또는 임의의 모든 문자를 의미(dos명령어 *과 동일) -밑줄(_) : 0 또는 임의의 문자 1개를 의미(dos명령어 ?과 동일) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제9-14]영문이름의 끝에 문자g를 가지고 있는 학생의 학번과 이름을 나타내어라. mysql> select stu_no, stu_ename -> from student -> where stu_ename like '%g'; +----------+-----------------+ | stu_no | stu_ename | | 20041007 | Jeung Yin-Jeung | | 20071010 | Hong Gil-Dong | | 20071307 | Kim Moon-Young | | 20071405 | Choi Cha-Young | [예제 9-15]영문이름의 끝에서 두 번째 문자가 u인 학생의 학번과 이름을 나타내어라. -> where stu_ename like '%u_'; +----------+-------------+ | stu_no | stu_ename | | 20001015 | Park Do-Jun | 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-16] 영문이름이 문자 K 로 시작하지 않는 학생의 학번과 이름을 나타내어라. mysql> select stu_no, stu_ename -> from student -> where not (stu_ename like 'K%'); +----------+------------------+ | stu_no | stu_ename | | 20001015 | Park Do-Jun | | 20001021 | Lee Sang-Gil | | 20041007 | Jeung Yin-Jeung | | 20041033 | Yean Gae-So-Moon | | 20061011 | Park Jung-In | | 20071001 | Jang Soo-In | | 20071010 | Hong Gil-Dong | | 20071022 | Lee Sun-Shin | | 20071300 | Yoo Ha-Na | | 20071405 | Choi Cha-Young | 10 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
9.7 NULL 연산자 NULL 연산자는 특정한 열이 값을 가지고 있지 않는 행을 선택할 때 사용 [예제9-17]휴대폰을 가지고 있는 학생의 학번과 이름, 휴대폰 번호를 나타내어라. mysql> select stu_no, stu_name, phone_no -> from student -> where phone_no is not null; +----------+----------+---------------+ | stu_no | stu_name | phone_no | | 20001001 | 김유신 | 011-617-1290 | | 20001015 | 박도준 | 011-611-9884 | | 20041002 | 김유미 | 010-617-1290 | | 20041007 | 정인정 | 016-605-7837 | | 20041033 | 연개소문 | 018-641-9304 | | 20061011 | 박정인 | 017-3142-1294 | | 20061048 | 김영호 | 017-614-7575 | | 20071010 | 홍길동 | 010-6425-9245 | | 20071022 | 이순신 | 010-7141-1860 | | 20071300 | 유하나 | 019-651-0707 | | 20071307 | 김문영 | 019-4624-0460 | 11 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제9-18] 휴대폰을 가지고 있지 않은 학생의 학번과 이름, 휴대폰 번호가 NULL인 경우에는 “휴대폰없음”을 나타내어라. mysql> select stu_no, stu_name, ifnull(phone_no, '휴대폰없음') -> from student -> where phone_no is null; +----------+----------+--------------------------------+ | stu_no | stu_name | ifnull(phone_no, '휴대폰없음') | | 20001021 | 이상길 | 휴대폰없음 | | 20061014 | 고혜진 | 휴대폰없음 | | 20071001 | 장수인 | 휴대폰없음 | | 20071405 | 최차영 | 휴대폰없음 | 4 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-19] 학생의 휴대폰번호(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; +----------+----------+---------------+ | stu_no | stu_name | phone_no | | 20001001 | 김유신 | 011-617-1290 | | 20001015 | 박도준 | 011-611-9884 | | 20001021 | 이상길 | NULL | | 20041002 | 김유미 | 010-617-1290 | | 20041007 | 정인정 | 016-605-7837 | | 20041033 | 연개소문 | 018-641-9304 | | 20061014 | 고혜진 | NULL | | 20071001 | 장수인 | NULL | | 20071010 | 홍길동 | 010-6425-9245 | | 20071022 | 이순신 | 010-7141-1860 | | 20071300 | 유하나 | 019-651-0707 | | 20071307 | 김문영 | 019-4624-0460 | | 20071405 | 최차영 | NULL | 13 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
9.8 부속질의어에서 IN 연산자 등록을 한 각 학생의 학번, 이름을 출력하라. 단, 중복된 값을 사용할 필요는 없으므로 distinct를 사용한다. mysql> select distinct stu_no -> from fee; +----------+ | stu_no | | 20001015 | | 20061011 | | 20071001 | | 20071010 | | 20071022 | | 20071300 | | 20071307 | | 20071405 | 8 rows in set (0.05 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-20] 등록을 한 각 학생의 학번, 이름을 출력하라. (in연산자를 이용) mysql> select stu_no, stu_name -> from student -> where stu_no IN (20001015, 20061011, 20071001, 20071010, 20071022, 20071300, 20071307, 20071405); +----------+----------+ | stu_no | stu_name | | 20001015 | 박도준 | | 20061011 | 박정인 | | 20071001 | 장수인 | | 20071010 | 홍길동 | | 20071022 | 이순신 | | 20071300 | 유하나 | | 20071307 | 김문영 | | 20071405 | 최차영 | 8 rows in set (0.13 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-21] 부속질의어를 이용하여 등록을 한 각 학생의 학번, 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where stu_no in -> (select stu_no -> from fee); +----------+----------+ | stu_no | stu_name | | 20001015 | 박도준 | | 20061011 | 박정인 | | 20071001 | 장수인 | | 20071010 | 홍길동 | | 20071022 | 이순신 | | 20071300 | 유하나 | | 20071307 | 김문영 | | 20071405 | 최차영 | 8 rows in set (0.13 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-22] 적어도 한 번의 장학금을 받았던 학생의 학번과 이름을 출력하라 [예제 9-22] 적어도 한 번의 장학금을 받았던 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where stu_no in -> (select stu_no -> from fee -> where jang_total > 0); +----------+----------+ | stu_no | stu_name | | 20001015 | 박도준 | | 20061011 | 박정인 | | 20071001 | 장수인 | | 20071010 | 홍길동 | | 20071022 | 이순신 | | 20071300 | 유하나 | | 20071307 | 김문영 | | 20071405 | 최차영 | 8 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-23] “20061011”인 학생이 가입한 동아리를 제외한 다른 동아리에 적어도 한 번 가입을 한 학생의 학번과 이름, 주민등록번호를 출력하라. mysql> select stu_no, stu_name, id_num -> from student -> where stu_no in -> (select stu_no -> from circle -> where cir_name not in -> (select cir_name -> where stu_no = '20061011')); +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20001015 | 박도준 | 780116-1580715 | | 20001021 | 이상길 | 750819-1227014 | | 20041007 | 정인정 | 830315-2351225 | | 20071001 | 장수인 | 890209-1616822 | 4 rows in set (0.05 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-24] 휴대폰을 가지고 있는 학생을 출력하라.(단, 휴대폰이 있어도 야간인 학생은 제외한다.) mysql> select stu_no, stu_name, phone_no -> from student -> where phone_no not in -> (select phone_no -> where juya = '야'); +----------+----------+---------------+ | stu_no | stu_name | phone_no | | 20001015 | 박도준 | 011-611-9884 | | 20041002 | 김유미 | 010-617-1290 | | 20041007 | 정인정 | 016-605-7837 | | 20061011 | 박정인 | 017-3142-1294 | | 20071300 | 유하나 | 019-651-0707 | 5 rows in set (0.00 sec) 학번 “20001015” 박도준 학생은 주간 학생이므로 출력, “20041033”번 연개소문은 야간이므로 제외되었다. 휴대폰이 없는 “20061014” 고혜진 학생도 제외되었고, 휴대폰을 가지고 있고 주간인 학생만 최종 결과에 포함 2019-04-13 쉽게 배우는 MySQL 5.x
9.9 부속질의어에서 관계 연산자 [예제 9-25] 수강신청을 한 학생의 학번과 이름을 출력하라. 9.9 부속질의어에서 관계 연산자 [예제 9-25] 수강신청을 한 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where stu_no in -> (select stu_no -> from attend -> where att_div = 'Y'); +----------+----------+ | stu_no | stu_name | | 20061011 | 박정인 | | 20071300 | 유하나 | 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-26]김유미(1983년생) 보다 나이가 더 많은 각 학생의 학번과 이름, 주 민등록번호를 출력하라. mysql> select stu_no, stu_name, id_num -> from student -> where substring(id_num,1,2) < -> (select substring(id_num, 1,2) -> where stu_name = '김유미'); +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20001001 | 김유신 | 811007-1632013 | | 20001015 | 박도준 | 780116-1580715 | | 20001021 | 이상길 | 750819-1227014 | | 20041033 | 연개소문 | 810615-1633111 | 4 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
9.10 ALL과 ANY 연산자 [예제 9-27] 가장 나이가 많은 학생의 학번, 이름 , 출생년도를 출력하라. (단, 가장 나이가 많은 학생은 다른 학생의 출생년도보다 출생년도가 더 적거나 같은 출생년도를 가진 학생이다.) mysql> select stu_no, stu_name, birth_year -> from student -> where birth_year <= all -> (select birth_year -> from student); +----------+----------+------------+ | stu_no | stu_name | birth_year | | 20001021 | 이상길 | 1975 | 1 row in set (0.02 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-28] 가장 나이가 많은 학생을 제외한 나머지 모든 학생의 학번, 이름, 주민등록번호를 출력하라 . mysql> select stu_no, stu_name, id_num -> from student -> where birth_year > any -> (select birth_year -> from student); +----------+----------+----------------+ | stu_no | stu_name | id_num | | 20001001 | 김유신 | 811007-1632013 | | 20001015 | 박도준 | 780116-1580715 | | 20041002 | 김유미 | 830207-2629715 | | 20041007 | 정인정 | 830315-2351225 | | 20041033 | 연개소문 | 810615-1633111 | | 20061011 | 박정인 | 830403-1635213 | | 20061014 | 고혜진 | 870307-2638759 | | 20061048 | 김영호 | 860811-1548758 | | 20071001 | 장수인 | 890209-1616822 | | 20071010 | 홍길동 | 880402-1850838 | | 20071022 | 이순신 | 890222-1218818 | | 20071300 | 유하나 | 880921-2573717 | | 20071307 | 김문영 | 880418-2121623 | | 20071405 | 최차영 | 881003-2581516 | 14 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-29] 학번 20001015인 학생이 등록한 등록금의 납부총액보다 더 많은 등록금을 낸 학생의 학번을 출력하라 [예제 9-29] 학번 20001015인 학생이 등록한 등록금의 납부총액보다 더 많은 등록금을 낸 학생의 학번을 출력하라.이때 20001015번은 결과에서 제외한다. mysql> select distinct stu_no -> from fee -> where stu_no <> '20001015' -> and fee_pay > any -> (select fee_pay -> where stu_no = '20001015'); +----------+ | stu_no | | 20061011 | | 20071001 | | 20071010 | | 20071022 | | 20071300 | | 20071307 | | 20071405 | 7 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
9.11 EXISTS 연산자 [예제 9-30] 등록을 한 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where stu_no in -> (select stu_no -> from fee); +----------+----------+ | stu_name | stu_no | | 박도준 | 20001015 | | 박정인 | 20061011 | | 장수인 | 20071001 | | 홍길동 | 20071010 | | 이순신 | 20071022 | | 유하나 | 20071300 | | 김문영 | 20071307 | | 최차영 | 20071405 | EXISTS 연산자를 사용하여 다음과 같이 작성하면 동일한 결과 출력 mysql> select stu_no, stu_name -> from student -> where exists -> (select * from fee -> where stu_no = student.stu_no); 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-31] 등록하지 않은 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from student -> where not exists -> (select * -> from fee -> where stu_no = student.stu_no); +----------+----------+ | stu_no | stu_name | | 20001001 | 김유신 | | 20001021 | 이상길 | | 20041002 | 김유미 | | 20041007 | 정인정 | | 20041033 | 연개소문 | | 20061014 | 고혜진 | | 20061048 | 김영호 | EXISTS 연산자를 사용하여 다음과 같이 작성하면 동일한 결과 출력 -> (select 'Nothing' 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-32] 학적 테이블에서 학번, 이름, 휴대폰번호, 우편번호를 출력하라. mysql> select stu_no, stu_name, phone_no, post_no from student; +----------+----------+---------------+---------+ | stu_no | stu_name | phone_no | post_no | | 20001001 | 김유신 | 011-617-1290 | 556-820 | | 20001015 | 박도준 | 011-611-9884 | 540-130 | | 20001021 | 이상길 | NULL | 451-800 | | 20041002 | 김유미 | 010-617-1290 | 545-800 | | 20041007 | 정인정 | 016-605-7837 | 540-850 | | 20041033 | 연개소문 | 018-641-9304 | 550-130 | | 20061011 | 박정인 | 017-3142-1294 | 150-051 | | 20061014 | 고혜진 | NULL | 500-170 | | 20061048 | 김영호 | 017-614-7575 | 506-040 | | 20071001 | 장수인 | NULL | 545-080 | | 20071010 | 홍길동 | 010-6425-9245 | 550-160 | | 20071022 | 이순신 | 010-7141-1860 | 540-170 | | 20071300 | 유하나 | 019-651-0707 | 550-260 | | 20071307 | 김문영 | 019-4624-0460 | 540-170 | | 20071405 | 최차영 | NULL | 540-310 | 15 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-33] 각각의 도시에 거주하는 모든 학생에 대하여 휴대폰을 가지고 있는 학생의 학번과 이름 우편번호, 휴대폰 번호를 나타내어라.(단, 휴대폰이 있는 학생과 휴대폰이 없는 학생의 우편번호 앞 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); +----------+----------+---------+---------------+ | stu_no | stu_name | post_no | phone_no | | 20001001 | 김유신 | 556-820 | 011-617-1290 | | 20041033 | 연개소문 | 550-130 | 018-641-9304 | | 20061011 | 박정인 | 150-051 | 017-3142-1294 | | 20061048 | 김영호 | 506-040 | 017-614-7575 | | 20071010 | 홍길동 | 550-160 | 010-6425-9245 | | 20071300 | 유하나 | 550-260 | 019-651-0707 | 6 rows in set (0.00 sec) 위의 실행결과는 휴대폰이 없는 학생과 휴대폰이 있어도 휴대폰이 없는 학생의 우편번호 앞 3자리가 같으면 제외되었다. 휴대폰 없는 최차영 학생의 우편번호(540-310)과 장수인 학생의 우편번호(545-080) 중 앞 3자리가 똑같아 김문영, 김유미 학생은 휴대폰이 있지만 제외되었다. 2019-04-13 쉽게 배우는 MySQL 5.x
9.11 부정 조건 -SQL에서 자주 발생하는 오류는 부정 조건을 가지고 있는 오류 9.11 부정 조건 -SQL에서 자주 발생하는 오류는 부정 조건을 가지고 있는 오류 -부정 조건은 긍정 조건 앞에 NOT을 위치시킴으로써 만듬 [예제 9-34] “Java길라잡이” 동아리에 가입한 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name -> from circle -> where cir_name = 'Java길라잡이'; +----------+----------+ | stu_no | stu_name | | 20071001 | 장수인 | | 20041007 | 정인정 | | 20001015 | 박도준 | 3 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-35] “Java길라잡이” 동아리에 가입하지 않은 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name, cir_name -> from circle -> where cir_name <> 'Java길라잡이'; +----------+----------+-------------+ | stu_no | stu_name | cir_name | | 20061011 | 고혜진 | 컴맹탈출 | | 20071300 | 유하나 | 컴맹탈출 | | 20071307 | 김문영 | 컴맹탈출 | | 20001021 | 이상길 | PHP길라잡이 | 4 rows in set (0.00 sec) NOT = 연산자를 사용하여 다음과 같이 작성하면 동일한 결과 출력 -> where not cir_name = 'Java길라잡이'; 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-36] 등록테이블에서 장학코드가 ‘11’ 학생의 학번과 장학코드, 장학금 총액을 출력하라. mysql> select stu_no, jang_code, jang_total -> from fee -> where jang_code = 11; +----------+-----------+------------+ | stu_no | jang_code | jang_total | | 20001015 | 11 | 2000000 | | 20061011 | 11 | 2000000 | | 20071300 | 11 | 2000000 | 3 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-37] 등록테이블에서 장학코드가 ‘11’이 아닌 학생의 학번과 장학코드, 장학금총액을 출력하라. mysql> select stu_no, jang_code, jang_total -> from fee -> where jang_code <> 11; +----------+-----------+------------+ | stu_no | jang_code | jang_total | | 20001015 | 2 | 1000000 | | 20001015 | 10 | 2500000 | | 20061011 | 1 | 500000 | | 20061011 | 10 | 2500000 | | 20061011 | 21 | 800000 | | 20071001 | 1 | 500000 | | 20071010 | 1 | 500000 | | 20071022 | 1 | 500000 | | 20071300 | 1 | 500000 | | 20071307 | 1 | 500000 | | 20071405 | 1 | 500000 | | 20071405 | 10 | 2500000 | 17 rows in set (0.00 sec) 장학코드가 11이거나, NULL인 경우가 제외 되어 원하는 결과 값이 아니다. 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-38] 등록테이블에서 장학코드가 ‘11’이 아닌 학생의 학번과 장학코드, 장학금총액을 출력하라.(NOT IN 이용) mysql> select stu_no, jang_code, jang_total -> from fee -> where jang_code not in -> (select jang_code -> where jang_code in (11)); +----------+-----------+------------+ | stu_no | jang_code | jang_total | | 20001015 | 2 | 1000000 | | 20001015 | 10 | 2500000 | | 20061011 | 1 | 500000 | | 20061011 | 10 | 2500000 | | 20061011 | 21 | 800000 | | 20071001 | 1 | 500000 | | 20071010 | 1 | 500000 | | 20071022 | 1 | 500000 | | 20071300 | 1 | 500000 | | 20071307 | 1 | 500000 | | 20071405 | 1 | 500000 | | 20071405 | 10 | 2500000 | 장학코드가 11이거나, NULL인 경우가 제외 되어 원하는 결과 값이 아니다. 2019-04-13 쉽게 배우는 MySQL 5.x
[예제 9-39] 등록테이블에서 장학코드가 ‘11’이 아닌 학생의 학번과 장학코드, 장학금총액을 출력하라 [예제 9-39] 등록테이블에서 장학코드가 ‘11’이 아닌 학생의 학번과 장학코드, 장학금총액을 출력하라.(단, NOT IN 이용하고 장학코드가 NULL인 학생도 포함하여 출력하라.) mysql> select stu_no, jang_code, jang_total -> from fee -> where jang_code not in -> (select jang_code -> where jang_code in(11)) -> or jang_code is null; +----------+-----------+------------+ | stu_no | jang_code | jang_total | | 20001015 | 2 | 1000000 | | 20001015 | 10 | 2500000 | | 20061011 | 1 | 500000 | | 20061011 | 10 | 2500000 | | 20061011 | 21 | 800000 | | 20071001 | 1 | 500000 | | 20071001 | NULL | NULL | | 20071010 | 1 | 500000 | | 20071010 | NULL | NULL | | 20071022 | 1 | 500000 | | 20071022 | NULL | NULL | | 20071300 | 1 | 500000 | | 20071307 | 1 | 500000 | | 20071307 | NULL | NULL | | 20071405 | 1 | 500000 | | 20071405 | 10 | 2500000 | 21 rows in set (0.00 sec) 2019-04-13 쉽게 배우는 MySQL 5.x