SQL - SELECT 문
데이터 베이스에 여러 데이터들이 저장되어 있다면, 사용하고자 하는 데이터를 불러올 수 있는 명령어가 필요하다.
여러 명령어중 데이터를 조회하는 기능을 담당하는 것이 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;
- 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 |
댓글