wanttosleep1111 2023. 1. 23. 12:55

SQL WHERE

 

※ 연습 데이터

makeData.sql
0.01MB

 

WHERE : 테이블에서 내가 원하는 튜플만 조건에 따라 뽑아옴

비교 조건 =, !=, >, <, >=, <= 등
논리 조건 AND, OR, NOT
산술 조건 +, -, *, /
결합 조건 ||
NULL 조건 IS NULL, IS NOT NULL
SQL 연산자 IN, LIKE, BETWEEN

 


 

1. 비교 조건

 

① 성별이 '남'인 직원들의 정보를 모두 출력

SELECT *
  FROM 직원
 WHERE 성별 = '남';

 

② 연봉이 8000이상인 직원들의 직원ID, 이름, 나이, 입사일시 출력

SELECT 직원ID
     , 이름
     , 나이
     , 입사일시
  FROM 직원
 WHERE 연봉 >= 8000 ;

 

③ 연봉이 9000보다 큰 직원들의 직원ID, 이름, 나이, 입사일시 출력

SELECT 직원ID
     , 이름
     , 나이
     , 입사일시
  FROM 직원
 WHERE 연봉 > 9000 ;

 

④ 이름이 '이현정'인 직원의 정보를 모두 출력

SELECT *
  FROM 직원
  WHERE 이름 = '이현정';

 

⑤ 패스워드 길이가 6이하인 대상을 모두 출력

SELECT *
  FROM 직원
  WHERE length(패스워드) <= 6;

 


 

2. 논리 조건

 

① 연봉이 5000 이상이면서 연봉이 7000 이하인 직원들의 정보를 모두 출력

SELECT *
  FROM 직원
 WHERE 연봉 >= 5000
   AND 연봉 <= 7000 ;

 

② 연봉이 5000 이상이면서 연봉이 7000 이하인 직원이면서 부서ID 가 ‘D005’인 대상을 모두 출력

SELECT *
  FROM 직원
 WHERE 연봉 >= 5000
   AND 연봉 <= 7000
   AND 부서ID = 'D005' ;

 

③ 직원 테이블에서 부서가 D001 이거나 D002인 직원을 모두 출력

SELECT *
  FROM 직원
 WHERE 부서ID = 'D001'
    OR 부서ID = 'D002' ;

 

④ 이름이 “이현정“ 이 아닌 직원의 정보를 모두 출력

SELECT *
  FROM 직원
 WHERE NOT 이름 = '이현정';
SELECT *
  FROM 직원
 WHERE 이름 != '이현정';

 

※ 논리 조건 AND와 OR가 함께 사용되면 AND가 우선 실행된다.(OR를 실행하고 싶으면 괄호를 사용)

SELECT *
  FROM 직원
 WHERE 부서ID = 'D001'
    OR 부서ID = 'D002'
   AND 이름 = '김철수' ;

 

SELECT *
  FROM 직원
 WHERE (부서ID = 'D001'
    OR 부서ID = 'D002')
   AND 이름 = '김철수' ;

 


 

3. NULL 조건

 

① 나이 값이 정해지지 않은(NULL) 직원을 추출

SELECT *
  FROM 직원
 WHERE 나이 IS NULL ;

 

② 부서ID가 ‘D003’ 이면서 나이 값이 정해지지 않은(NULL) 직원을 추출

SELECT *
  FROM 직원
 WHERE 나이 IS NULL
   AND 부서ID = 'D003' ;

 


 

4. IN / BETWEEN / LIKE 조건 (SQL 연산자)

  • IN : 뒤에 나열된 파라미터를 OR 조건으로 출력, NULL은 무시
  • NOT IN : 뒤에 나열된 파라미터를 제외한 대상을 출력
  • BETWEEN : 범위 연산
  • LIKE : _, %를 이용하여 특정값을 찾는 매칭 연산 가능

 

① 직원 테이블에서 직원ID가 ‘A0001’ , ‘A0003’ , ‘A0005’ , ‘A0010’ 인 대상을 출력

SELECT *
  FROM 직원
 WHERE 직원ID IN ('A0001', 'A0003', 'A0005', 'A0010');

 

② 직원 테이블에서 직원ID가 ‘A0001’ , ‘A0003’ , ‘A0005’ , ‘A0010’ 이 아닌 대상을 출력

SELECT *
  FROM 직원
 WHERE 직원ID NOT IN ('A0001', 'A0003', 'A0005', 'A0010');

 

③ 직원들 중에 나이가 30세 이상 40세 이하인 직원들을 모두 출력

SELECT *
  FROM 직원
 WHERE 나이 BETWEEN 30 AND 40;

 

④ 직원들 중 이름이 ‘강’ 으로 시작하는 모든 대상을 출력

SELECT *
  FROM 직원
 WHERE 이름 LIKE '강%';

 

⑤ 직원들 중 이름 가운데에 ‘홍’ 이 포함된 모든 대상을 출력

SELECT *
  FROM 직원
 WHERE 이름 LIKE '%홍%';

 

⑥ 직원들 중 패스워드가 ‘123’ 으로 끝나는 모든 대상을 출력

SELECT *
  FROM 직원
 WHERE 패스워드 LIKE '%123';

 

⑦ 직원들 중 이름의 세번째 글자가 ‘수’ 인 세글자인 모든 대상을 출력

SELECT *
  FROM 직원
 WHERE 이름 LIKE '__수';

 

⑧ 직원들 중 주민등록번호의 7번째 자리가 1인 대상을 모두 출력

SELECT *
  FROM 직원
 WHERE 주민등록번호 LIKE '_______1%';

 

⑨ 직원들 중 2015년에 입사한 대상을 출력

SELECT *
  FROM 직원
 WHERE 입사일시 >= TO_DATE('20150101')
   AND 입사일시 < TO_DATE('20160101');
SELECT *
  FROM 직원
 WHERE TO_CHAR(입사일시, 'YYYY') = '2015';

 


▶ 실습

 

① 직원 테이블에서 이름에 '철' 이 포함되는 직원의 직원ID, 이름, 나이 를 출력

SELECT 직원ID
     , 이름
     , 나이
  FROM 직원
 WHERE 이름 LIKE '%철%';

 

② 직원 테이블에서 나이가 아직 정해지지 않은 회원들의 모든 정보를 출력

SELECT *
  FROM 직원
 WHERE 나이 IS NULL ;

 

③ 직원 중에 2015년도에 입사를 했거나, 입사일시가 정해지지 않은 직원의 모든 정보를 출력

SELECT *
  FROM 직원
 WHERE 입사일시 IS NULL
    OR TO_CHAR(입사일시, 'YYYY') = 2015;

 

④ 직원 중에 연봉이 7000 ~ 9000 사이인 직원들의 다음 정보를 출력

출력할 컬럼 : 직원ID, 패스워드, 이름, 주민등록번호 앞 6자리를 추출해 AS 생년월일로 표현

SELECT 직원ID
     , 패스워드
     , 이름
     , SUBSTR(주민등록번호, 1, 6) AS 생년월일
     FROM 직원
 WHERE 연봉 BETWEEN 7000 AND 9000 ;

 

⑤ 직원 중에 성별이 '남' 이면서 나이가 20대인 직원의 모든 정보를 출력

SELECT *
  FROM 직원
 WHERE 성별 = '남'
   AND 나이 BETWEEN 20 AND 29;

 

⑥ 2017년부터 지금까지 입사한 모든 직원을 출력

SELECT *
  FROM 직원
 WHERE TO_CHAR(입사일시, 'YYYY') >= 2017;

 

⑦ 직원 중에 직원ID 가 'A0001' , 'A0002' , 'A0003' 이 아닌 직원들을 모두 출력

SELECT *
  FROM 직원
 WHERE 직원ID NOT IN ('A0001', 'A0002', 'A0003') ;

 

⑧ 직원주소 테이블에서 주소가 '동구' 로 시작하는 모든 데이터를 출력

SELECT *
  FROM 직원주소
 WHERE 주소 LIKE '동구%' ;

 

⑨ 직원 패스워드 길이가 8글자 이하인 대상은 패스워드를 다시 설정해야 합니다. 
패스워드 길이가 8글자 이하인 대상을 모두 추출해주세요.

SELECT *
  FROM 직원
 WHERE LENGTH(패스워드) <= 8 ;