본문 바로가기

SQL - SELECT 문

인포꿀팁 발행일 : 2020-09-01

데이터 베이스에 여러 데이터들이 저장되어 있다면, 사용하고자 하는 데이터를 불러올 수 있는 명령어가 필요하다.

여러 명령어중 데이터를 조회하는 기능을 담당하는 것이 SELECT 문이다.

SELECT문이란?

  • 테이블이나 뷰에 있는 데이터를 조회하여 0개 이상의 행을 반환한다.
  • SELECT문은 반드시 SELECT와 FROM의 두개의 키워드로 구성된다.
  • SELECT절 다음에 컬럼명 대신 * 을 기입하면 테이블의 모든 컬럼 정보를 출력할 수 있다.
  • FROM절 다음에는 조회할 테이블의 이름을 기술한다.
기본적인 SELECT문의 형식 :
SELECT 컬럼명 AS 별칭 FROM 테이블명

** AS : 컬럼 별칭을 붙일시 AS는 생략이 가능하며 공백, 특수문자, 대소문자 구분이 있는 경우엔 ""쌍따옴표 안에 기술해야한다.

 

 

SELECT문에서 중요한 것은 해당 쿼리문이 구현되는 순서를 알아야 한다는 점이다.  그 이유는 작성되는 순서와 구현되는 순서가 다르기 때문에 잘못 작성한 경우 심각한 오류를 초래할 수 있기 때문이다.

 

먼저 작성 순서는 아래와 같다.

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

 

다음은 구문의 실행 순서이다.

FROM
WHERE
GROUP BY
HAVING
SELECT << 순서가 밀려난 걸 볼 수  있다.
ORDER BY

*******

작성 순서와 실행 순서가 다르기 때문에 구문을 작성할 때  주의를 해야한다. 

특히 별칭을 부여할 시 부여한 별칭이 거의 마지막에 부여되기 때문에 그 별칭을 상위 순서의 절에서 불러올 수 없다는 점을 기억해야한다.

 

쿼리문 예제풀기전 컬럼 정보

■ EMP 테이블 : 임플로이(EMPLOYEE, 사원) 정보를 가진 테이블
 ※ 컬럼 정보
     empNo : 사원번호
     name : 이름
     rrn : 주민번호
     hireDate : 입사일
     city : 출신도
     tel : 전화번호
     dept : 부서명
     pos : 직위
     sal : 급여
     bonus : 보너스

 

조건식과 표현식

1) 비교 연산자

=, >, <, <=, >=, <>, !=, ^=

EX1) emp 테이블에서 city가 서울인 자료 중 name, city 컬럼 출력

SELECT name, city 

FROM emp 

WHERE city = '서울';

EX2) emp 테이블에서  city가 서울이 아닌 자료 중 name, city 컬럼 출력
SELECT name, city

FROM emp

WHERE city != '서울';

 

EX3) emp 테이블에서 sal+bonus 가 2500000원 이상인 자료 중 name, sal, bonus 컬럼 출력

SELECT name, sal, bonus

FROM emp

WHERE sal+bonus>=2500000;

 

2) 논리 연산자

AND, OR, NOT

EX1) emp 테이블에서 city가 서울이고 sal가 2000000원 이상인 자료 중 empNo, name, city, sal 컬럼 출력
SELECT empNo, name, city, sal

FROM emp

WHERE city='서울' AND sal>=2000000;

EX2) emp 테이블에서 city가 서울, 경기, 인천인 자료 중 empNo, name, city, sal 컬럼 출력
SELECT empNo, name, city, sal

FROM emp

WHERE city = '서울' OR city = '경기' OR city = '인천';

EX3) emp 테이블에서 sal가 2000000~3000000을 제외한 자료 중 empNo, name, sal 컬럼 출력

SELECT empNo, name, sal

FROM emp

WHERE NOT (sal>2000000 AND sal<3000000);

 

3) 그룹 비교 연산자

ANY(SOME)= OR과 유사한 개념, ALL = AND개념과 유사  

EX1) emp 테이블에서 city가 '서울', '경기', '인천' 인 자료 중 empNo, name, city 컬럼 출력
SELECT empNo, name, city

FROM emp

WHERE city = ANY('서울', '경기', '인천');

EX2) emp 테이블에서 sal가 2000000원 이상인 자료 중 empNo, name, sal 컬럼 출력
SELECT empNo, name, city 

FROM emp 

WHERE sal >= ANY(2000000, 2500000, 300000);


EX3) emp 테이블에서 sal가 3000000원 이상인 자료 중 empNo, name, sal 컬럼 출력
SELECT empNo, name, city, sal

FROM emp

WHERE sal >= ALL(3000000);

 

4) SQL 연산자

- BETWEEN 조건식

** BETWEEN은 일반 비교 연산자와 다르게 함수로 되어 있어서 데이터가 많아질 경우 부하(overhead)가 걸리기가 쉽다.

BETWEEN 도메인 값 AND 도메인값

EX1) emp 테이블에서 sal가 2000000~3000000 사이 인 자료 중 name, sal 컬럼 출력
SELECT name, sal
FROM emp
WHERE sal BETWEEN 2000000 AND 3000000;

 

-- 다른방법 : 성능은 아래 방식이 더 효율적
SELECT name, sal
FROM emp
WHERE sal>=2000000 AND sal<=3000000;


EX2) emp 테이블에서 sal가 2000000~3000000을 제외한 자료 중 name, sal 컬럼 출력
SELECT name, sal
FROM emp
WHERE sal NOT BETWEEN 2000000 AND 3000000;

 

-- 다른방법 : 성능은 아래 방식이 더 효율적
SELECT name, sal
FROM emp
WHERE sal<2000000 AND sal>3000000;

- IN 조건식

(컬럼명) IN (도메인 값)

EX1) emp 테이블에서 city가 '서울', '인천', '경기' 인  자료 중 name, city 컬럼 출력
SELECT name, city
FROM emp
WHERE city  IN('서울','인천','경기');

EX2) emp 테이블에서 city가 '서울', '인천', '경기' 를 제외한  자료 중 name, city 컬럼 출력
SELECT name, city
FROM emp
WHERE city NOT IN('서울','인천','경기');

EX3) emp 테이블에서 city와 pos가 '서울  이면서 '부장'이거나 '경기' 이면서 '과장' 인 자료 중 name, city, pos 컬럼 출력

SELECT name,city,pos
FROM emp
WHERE (city='서울' AND pos ='부장')OR(city='경기' AND pos='과장');

 

-- 좀더 간단히 나타낸 쿼리문 : 두가지 컬럼을 명시하여 적는다.

SELECT name,city,pos
FROM emp
WHERE (city, pos) IN(('서울','부장'),('경기','과장'));


EX4) emp 테이블에서 city와 pos가 '서울' 이면서 '부장' 인 자료 중 name, city, pos 컬럼 출력(subquery)
 
SELECT name,city,pos
FROM emp
WHERE (city, pos) IN(('서울','부장'));

 

--서브쿼리문을 활용할 수도 있다.
SELECT name, city, pos FROM emp
WHERE (city, pos) IN (SELECT '서울','부장' FROM dual);

- LIKE 조건식

컬럼 LIKE 형식 ---EX(김%)

EX1) emp 테이블에서 name이 '김'씨인  자료 중 empNo, name 컬럼 출력
SELECT empNo, name 

FROM emp
WHERE name LIKE '김%';

EX2) emp 테이블에서 LIKE 예           

--1월달인 사람 출력
SELECT empNo, name, rrn 

FROM emp
WHERE rrn LIKE '__01%';

 

** _ 언더바를 사용하면 해당 개수만큼의 값은 무시하고 넘어감.

_ 언더바와 %의 차이점

_ 는 해당 개수만큼의 자리수의 값이 온다.

% 개수상관없이 값이 온다.

 


-- 성씨가 'ㄱ' 인 모든 이름 출력(나씨는 출력 안됨)
SELECT empNo, name

FROM emp
WHERE name>='가' AND name<'나';

 

- WITH : 반복적으로 사용되는 쿼리를 블럭화 할 경우 사용

WITH 테이블 별칭 AS(
쿼리문
)
SELECT 컬럼명 FROM 테이블 별칭;

EX1) 
WITH emp_pay AS(
         SELECT name, sal, bonus, sal+bonus pay 
         FROM emp
)
SELECT name,sal,bonus,pay
FROM emp_pay
WHERE pay>=3000000;
         
         

EX2)

WITH tb AS (
         SELECT '김김김' name, '우리_나라' content  FROM dual
         UNION ALL
         SELECT '나나나' name, '자바%스프링' content  FROM dual
         UNION ALL
         SELECT '다다다' name, '우리나라' content  FROM dual
         UNION ALL
         SELECT '라라라' name, '안드로이드%모바일' content  FROM dual

SELECT * FROM  tb
WHERE INSTR(content, '%')>=1;

 

***ESCAPE를 활용하여 '_' , '%' 이 들어간 값을 검색할 수 있다.

--WHERE content LIKE '%#%%' ESCAPE '#';

 

 

5) NULL

  • 행의 열에 값이 없으면 열은 null이거나 null을 포함한다고 말한다.
  • NOT NULL 또는 PRIMARY KEY 무결성 제약 조건에 의해 제한되지 않는 모든 데이터 유형의 열에는 널이 나타날 수 있다.
  • 오라클에서는 ''는 NULL과 같다.(자바에서 '''은 NULL이 아님)
  • NULL은 '='가 아닌 IS로 비교함
    • SELECT name, tel FROM emp WHERE tel IS NULL;
          
  • NULL과의 연산은 NULL이 나온다.
    • SELECT 10 + NULL FROM dual; => null

'DB > Oracle' 카테고리의 다른 글

SQL - 단일행 함수(문자함수)  (0) 2020.09.01
SQL - 단일행 함수 (숫자함수)  (0) 2020.09.01
관계형 데이터베이스  (0) 2020.08.29
데이터베이스 언어  (0) 2020.08.29
데이터베이스와 데이터베이스 관리 시스템  (0) 2020.08.29

댓글