데이터 제한과 정렬

특정 행의 검색

모든 자료를 가져오는 것이 아니라 사용자가 원하는 자료만 조회하고자 한다면 WHERE 절을 사용한다.
WHERE 절은 조건절을 포함하여 FROM절 다음에 기술한다.

SELECT 컬럼명
FROM 테이블명
WHERE 조건
--EMP테이블에서 담당업무가 MANAGER인 사원의 정보를 사원번호,이름,업무,급여,부서번호로 출력하세요.
SELECT empno, ename, job, sal, deptno
FROM emp
WHERE lower(job)='manager';

  • 문자는 ' '를 사용한다.
  • 문자 값은 대소문자를 구분한다.
--EMP테이블에서 1982년 1월1일 이후에 입사한 사원의 사원번호,성명,업무,급여,입사일자를 출력하세요.
SELECT empno, ename, job, sal, hiredate
FROM emp
WHERE hiredate >= '82/01/01' ORDER BY hiredate ASC;

  • 날짜 값은 ' '를 사용한다.
  • 날짜 값은 날짜 형식을 구분한다. (여기서는 YY/MM/DD)

 

SQL 연산자

WHERE 조건절에서 자료를 검색할 때 조건을 달기 위해 사용하는 구문

  1. = : 같은가? WHERE name = '홍길동'
  2. < : 작은가? WHERE age < 30
  3. <= : 작거나 같은가?
  4. > : 큰가?
  5. >= : 크거나 같은가?
  6. <> : 같지 않은가? WHERE name <> '홍길동'
  7. != : 같지 않은가? WHERE name != '홍길동'
  8. LIKE : 값의 일부를 이용하여 데이터의 정보와 일치하는지를 묻는 연산자
    WHERE name LIKE '홍%' → 이름 중 '홍'으로 시작하는 데이터가 있는지 검색
    WHERE name LIKE '%길%' → 이름 중 '길' 자를 포함한 데이터가 있는지 검색
    WHERE name LIKE '%동' → 이름 중 '동'으로 끝나는 데이터가 있는지 검색
  9. BETWEEN a AND b : a와 b 사이에 있는가? (a, b 포함)
    작은 값을 앞에 기술하고, 큰 값을 뒤에 기술해야 함
  10. IN (list) : list 값 중 어느 하나와 일치하는가?
  11. NOT BETWEEN a AND b: a와 b 사이에 있지 않다. (a, b 미포함)
  12. NOT IN (list) : list 값과 일치하지 않는다.

[실습]

-- [1] emp테이블에서 급여가 1300에서 1500사이의 사원의 이름, 업무, 급여, 부서번호를 출력하세요
SELECT ename, job, sal, deptno
FROM emp
WHERE sal BETWEEN 1300 AND 1500 ORDER BY sal;
--WHERE sal >= 1300 AND sal <= 1500;

 

-- [2] emp테이블에서 사원번호가 7902,7788,7566인 사원의
--사원번호, 이름, 업무, 급여, 입사일자를 출력하세요.
SELECT empno, ename, job, sal, hiredate
FROM emp
WHERE empno IN (7902, 7788, 7566);
--WHERE empno=7902 OR empno=7788 OR empno=7566;

 

--[3] 10번 부서가 아닌 사원의 이름, 업무, 부서번호를 출력하세요
SELECT ename, job, deptno
FROM emp
WHERE deptno <> 10 ORDER BY 3; --3번째 컬럼(deptno) 오름차순 정렬

 

--[4] emp테이블에서 업무가 SALESMAN 이거나 PRESIDENT인
--사원의 사원번호, 이름, 업무, 급여를 출력하세요.
SELECT empno, ename, job, sal
FROM emp
WHERE job IN('SALESMAN', 'PRESIDENT')
ORDER BY 3 DESC;

 

-- [5] 커미션(COMM)이 300이거나 500이거나 1400인 사원정보를 출력하세요
SELECT * FROM emp WHERE comm IN(300, 500, 1400);

 

-- [6] 커미션이 300,500,1400이 아닌 사원의 정보를 출력하세요
SELECT * FROM emp WHERE comm NOT IN(300, 500, 1400);

 

--emp에서 이름이 S로 시작하는 사원 정보를 보여주세요.
SELECT * FROM emp WHERE ename LIKE 'S%';
--emp에서 이름이 S로 끝나는 사원 정보를 보여주세요.
SELECT * FROM emp WHERE ename LIKE '%S';
--emp에서 이름에 S자가 들어 있는 사원 정보를 보여주세요.
SELECT * FROM emp WHERE ename LIKE '%S%';
--이름 두 번째 글자에 'O'자가 들어간 사원 정보를 보여주세요.
SELECT * FROM emp WHERE ename LIKE '_O%';
-- 고객 테이블 가운데 성이 김씨인 사람의 정보를 보여주세요.
SELECT * FROM member WHERE name LIKE '김%';
-- 고객 테이블 가운데 주소에 '강북'이 포함된 정보를 보여주세요.
SELECT * FROM member WHERE addr LIKE '%강북%';
-- 카테고리 테이블 가운데 category_code가 0000로 끝는 상품정보를 보여주세요.
SELECT * FROM category WHERE category_code LIKE '%0000';
-- EMP테이블에서 입사일자가 82년도에 입사한 사원의 사번,이름,업무, 입사일자를 출력하세요.
SELECT empno, ename, job, hiredate
FROM emp
WHERE hiredate LIKE '1982%';
  • %: 문자가 없거나 하나 이상의 문자와 대치된다.(0개 이상의 문자)
  • _: 하나의 문자와 대치된다.(1개의 문자)

 

날짜 포맷 변경
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YY';
ALTER SESSION SET NLS_DATE_FORMAT='YY/MM/DD';
SELECT ename, hiredate FROM emp;

 

 

IS NULL 연산자

NULL값의 여부를 체크하고자 할 때 IS NULL과 IS NOT NULL 구문을 이용하여 NULL을 비교한다.

  • NULL일 경우: WHERE 컬럼이름 IS NULL
  • NOT NULL일 경우: WHERE 컬럼이름 IS NOT NULL
SELECT * FROM emp WHERE comm IS NULL;

 

SELECT * FROM emp WHERE comm IS NOT NULL ORDER BY comm;

 

 

논리 연산자

  1. AND: 양쪽 조건이 TRUE이면 TRUE를 반환
  2. OR: 양쪽 조건 중 하나라도 TRUE이면 TRUE를 반환
  3. NOT: 이후의 조건이 FALSE이면 TRUE를 반환

[실습]

-- EMP테이블에서 급여가 1000이상 1500이하가 아닌 사원의 정보를 출력하세요.
SELECT * FROM emp
WHERE sal NOT BETWEEN 1000 AND 1500;
--WHERE NOT (sal >= 1000 AND sal <= 1500);

-- EMP테이블에서 이름에 'S'자가 들어가지 않은 사람의 이름을 모두 출력하세요.
SELECT ename FROM emp WHERE ename NOT LIKE '%S%';

-- 사원테이블에서 업무가 PRESIDENT이고 급여가 1500이상이거나
-- 업무가 SALESMAN인 사원의 사번, 이름, 업무, 급여를 출력하세요.
SELECT empno, ename, job, sal FROM emp
WHERE (job='PRESIDENT' AND sal >= 1500) OR (job='SALESMAN');

-- 고객 테이블에서 이름이 홍길동이면서 직업이 학생인 정보를 모두 보여주세요.
SELECT * FROM member
WHERE name='홍길동' AND job='학생';

-- 고객 테이블에서 이름이 홍길동이거나 직업이 학생인 정보를 모두 보여주세요.
SELECT * FROM member
WHERE name='홍길동' OR job='학생';

-- 상품 테이블에서 제조사가 삼성 또는 대우이면서 판매가가 100만원 미만의 상품 목록을 보여주세요.
SELECT * FROM products
WHERE (company='삼성' OR company='대우') AND (output_price<1000000);
연산자간 우선 순위  

모든 비교 연산자 > NOT > AND > OR(오른쪽으로 갈수록 우선순위가 낮다.)

 

 

ORDER BY 절

  • 자료를 정렬하여 나타낼 때 필요한 구문
  • ASC: 오름차순 (default) / DESC: 내림차순
  • ORDER BY절을 사용할 때는 SELECT 구문의 가장 마지막에 위치(SELECT ~ FROM ~ WHERE ~ ORDER BY)
  • NULL값은 오름차순에서 제일 나중에, 내림차순에선 제일 먼저 옴
-- EMP에서 최근에 입사한 순으로 사번, 이름, 업무, 입사일자를 보여주세요
SELECT empno, ename, job, hiredate
FROM emp
ORDER BY hiredate DESC;

-- 사원 테이블에서 부서번호로 정렬한 후 부서번호가 같을 경우 급여가 많은 순으로 정렬하여
-- 사번, 이름, 업무, 부서번호, 급여를 출력하세요.
SELECT empno, ename, job, deptno, sal
FROM emp
ORDER BY deptno, sal DESC;

-- 사원 테이블에서 첫번째 정렬은 부서번호로, 두번째 정렬은 업무로,
-- 세번째 정렬은 급여가 많은 순으로 정렬하여
-- 사번, 이름, 입사일자, 부서번호, 업무, 급여를 출력하세요.
SELECT empno, ename, hiredate, deptno, job, sal
FROM emp
ORDER BY deptno, job, sal DESC;

--상품 테이블에서 배송비의 내림차순으로 정렬하되,
--같은 배송비가 있는 경우에는 마일리지의 내림차순으로 정렬하여 보여주세요.
SELECT *
FROM products
ORDER BY trans_cost DESC, mileage DESC;

+ Recent posts