위로 아래

와일드 카드 %, _

와일드 카드

% : 문자가 없거나 하나 이상의 문자가 오든 상관 없고 자릿수 제한 없음

_ : 하나의 문자가 어떤 값이 오든 상관 없고, 문자의 자릿수 나타냄

 

LIKE와 함께 쓴다!

--질문 이름이 S로 시작하고 마지막 글자가 T인 사람의 모든 정보를 출력하라(이름은 전체 5자리)
SELECT *
FROM emp
WHERE ename LIKE 'S___T';

--질문 이름이 S로 시작하는 사원의 사원번호, 이름, 입사일, 부서번호를 출력
SELECT empno, ename, hiredate, deptno
FROM emp
WHERE ename LIKE 'S%';

-- 질문 이름 중 S자가 들어가 있는 사람만 모든 정보를 출력
SELECT *
FROM emp
WHERE ename LIKE '%S%';

 

 

문자열 이어 붙이기

SELECT ename, 'is a', job FROM emp;

SELECT ename, '의 직업은', job,'입니다.' FROM emp;

SELECT ename ||'의 직업은'||job||'입니다.' FROM emp;

 

 

 

DESC

테이블 col(열) 정보

DESC emp;

 

 

 

AS

  1. name AS 이름 (이름 치환)
  2. 생략 가능 name 이름
  3. 공백 사용 불가! name 뛰어쓰기불가해요
  4. 큰 따옴표 씌우면 특수문자 사용 가능 name "뛰어쓰기 가능 해요"
SELECT emp_id AS 사원번호, emp_name AS "사원^^이름"
FROM temp;

 

 

DISTINCT

중복된 결과를 하나씩만 나오게 한다.

다른 필드와 같이 나오면 중복이 없으므로 모두 나온다.

함부로 쓰면 곤란한 상황이 생길 수 있다.

SELECT DISTINCT deptno FROM emp;

 

 

 

LIKE

-- ename 속성에 D가 들어간 사람들
SELECT empno,ename FROM emp WHERE ename LIKE '%D%';

-- ename 속성이 5글자인 사람들
SELECT empno,ename FROM emp WHERE ename LIKE '_____';

% : *처럼 모든 것을 지칭

_ : 글자 하나를 표현

 

 

 

IN

-- 질문 temp 테이블에서 이름이 홍길동인 사람과 김길동의 사원번호와 이름을 출력하는 문장

SELECT emp_id AS 사원번호, emp_name AS 이름
FROM temp
WHERE emp_name IN ('홍길동','김길동');


--질문 부서번호가 20, 30번을 제외한 모든 사람의 이름, 사원번호, 부서번호를 출력
SELECT ename, empno AS 사원번호, deptno
FROM emp
WHERE deptno NOT IN (20,30);

여러 개 선택

 

 

BETWEEN ~ AND

이상, 이하

enp_id>=19970001 AND enp_id<=19979999;로 대체 가능

-- temp 테이블에서 사번이 1997년대인 사원의 사번과 성명을 검색
SELECT emp_id, emp_name
FROM temp
WHERE emp_id BETWEEN 19970001 AND 19979999;


--질문 between 연산자를 이용하여 성명(emp_name)이 'ㄱ'으로 시작하는 사람의 emp_id와 emp_name을 조회하면
SELECT emp_id, emp_name
FROM temp
WHERE emp_name BETWEEN '가' AND '나';


--질문 사원번호가 7654와 7782 사이 이외의 사원의 모든 정보를 출력
SELECT *
FROM emp
WHERE empno<7654 OR empno>7782;

SELECT *
FROM emp
WHERE empno NOT BETWEEN 7654 AND 7782;

 

 

ORDER BY

오름차순, 내림차순 정렬

-- 질문 sal(월급)에 의해 내림차순으로 정렬
SELECT empno, sal, ename
FROM emp
ORDER BY sal DESC;


-- 질문 직급(lev=1)의 오름차순으로 먼저 정렬하고 사원번호(emp_id=2)의 내림차순으로 정렬
SELECT lev, emp_id, emp_name
FROM temp 
ORDER BY 1, 2 DESC;

ASC : 오름차순 (생략 시 자동 선택)

DESC : 내림차순

 

 

ANY

어떤 것. 일일이 하나씩 비교한다.

-- 질문 temp 테이블에서 이름이 홍길동이거나 김길동인 사람들의 사원번호와 이름을 출력하는 문장
SELECT emp_name, emp_id
FROM temp
WHERE emp_name = ANY('홍길동', '김길동');
--emp_name = '홍길동' or emp_name = '김길동'


-- 직급(lve)이 사원인 사람의 연봉보다, 연봉이 큰 사람의 이름, 사원번호, 직급, 연봉을 출력
DESC temp;
SELECT emp_name, emp_id, lev, salary
FROM temp
WHERE salary > ANY(SELECT salary FROM temp WHERE lev='사원');
--직급이 사원인 사람들의 연봉을 쭉 불러놓고,
--모든 사원을 직급이 사원인 사람 한 명씩 전부 비교해서 불러온다.

 

 

ALL

조건을 먼저 다 따져서 하나를 뽑은 후에 비교한다. (ANY보다 빠르다)

SELECT emp_name, emp_id
FROM temp
WHERE emp_name > ALL('김길동','배뱅이');
-- emp_name > '김길동' or emp_name > '배뱅이'
-- 결과로는 김길동보다 크고, 배뱅이보다 큰 데이터들의 합이 나온다

-- 직급(lve)이 사원인 사람의 연봉보다, 연봉이 큰 사람의 이름, 사원번호, 직급, 연봉을 출력
SELECT emp_name, emp_id, lev, salary
FROM temp
WHERE salary > ALL(SELECT salary FROM temp WHERE lev='사원');
-- 직급이 사원인 사람들의 연봉을 모두 확인해서 가장 연봉이 큰 사람을 골라서,
-- 그 사람보다 연봉이 큰 사람들 목록을 불러온다.

 

 

NOT

-- 연봉이 50,000,000원보다 크지 않은 사람들 불러오기
SELECT emp_id, emp_name, salary
FROM temp
WHERE NOT salary < 50000000;

 

 

GROUP BY

그룹별로.

그룹 바이를 쓰고 나면 개개인의 정보는 얻기 힘들다. 그룹 정보만 얻기 편하다.

--질문 emp 테이블의 부서번호를 확인하는데 부서별로 확인하고 싶다.
SELECT deptno FROM emp GROUP BY deptno;


--질문 emp 테이블의 job별로 급여의 합계를 구하시오
SELECT job, SUM(sal) AS 직무별급여총합
FROM emp
GROUP BY job;


--질문 tdept 테이블의 자료 중에서 area별로 최소 boss_id를 골라내고, 이 결과를 boss_id별로 정렬
SELECT area, MIN(boss_id)
FROM tdept
GROUP BY area
ORDER BY 2 ASC;
-- 2는 SELECT에서 고른 것 중 2번째 열을 뜻함 (즉, MIN(boss_id)

 

 

GROUPING

-- 질문 : 부서별 직무별로 그룹을 지어 그룹별로 평균 급여를 보는 뷰와,
-- 직무별, 매니저별로 그룹을 지어 또 그 그룹별 평균을 낸 뷰를 합친 것

-- GROUP BY 이용
SELECT deptno, job, null, AVG(sal)
FROM emp
GROUP BY deptno, job
UNION ALL
SELECT null, job, mgr, AVG(sal)
FROM emp
GROUP BY job, mgr;

--GROUPING SETS 이용
SELECT deptno, job, mgr, AVG(sal)
FROM emp
GROUP BY GROUPING SETS((deptno, job), (job,mgr));

 

 

SUM

총합

--질문 emp 테이블의 부서별 급여의 총합을 보고 싶다.
SELECT SUM(sal) as "부서별 급여 총합", deptno
FROM emp
GROUP BY deptno;

 

 

AVG

평균

--질문 emp 테이블의 job별로 급여의 평균을 구하시오
SELECT job, AVG(sal) AS 급여평균
FROM emp
GROUP BY job;

 

 

ROUND

반올림

-- 기본형
ROUND(실수,2)   -- 실수를 소수점 2째자리까지.


--질문 emp 테이블의 job별로 급여의 평균을 소수점 2째자리까지 구하시오
SELECT job, ROUND(AVG(sal),2)
FROM emp
GROUP BY job;

 

 

 

MAX

--질문 emp 테이블의 job별로 최고 급여를 높은 순부터 구하시오
SELECT job,MAX(sal)
FROM emp
GROUP BY job
ORDER BY MAX(sal) DESC;

 

 

 

HAVING

검색할 테이블에서 검색하고자 하는 row를 조건절을 사용해서 제한할 때

having 절은 group by된 결과를 제한하고자 할 때 사용

--질문 직급별로 연봉 평균을 구한 상태에서 평균 연봉이 5천만원 이상인 경우의 직급과 평균 연봉을 읽어오는 것
SELECT lev, AVG(salary)
FROM temp 
GROUP BY lev
HAVING AVG(salary) >=50000000;

--질문 temp의 자료를 사용해서 직급 별로 사번이 제일 늦은 사람을 구하고 그 결과 내에서 사번이 1997로 시작하는 결과 보기
SELECT lev, MAX(emp_id)
FROM temp
GROUP BY lev
HAVING MAX(emp_id) LIKE '1997%';

 

 

 

UNION SELECT

  1. 두 개 이상의 sql문의 결과를 연결시켜주는 연산자.
  2. 합집합. (겹치는 게 있으면 중복 없이 하나만 나온다)
  3. 짝끼리 타입이 일치하지 않으면 오류가 난다.
  4. 짝이 맞지 않으면 오류가 난다.
-- UNION SELECT
SELECT empno, ename
FROM emp
UNION SELECT deptno, dname
FROM dept;


-- UNION ALL SELECT
SELECT empno, ename
FROM emp
UNION ALL SELECT deptno, dname
FROM dept;

 

 

MINUS SELECT

차집합.

두 번째 sql문의 결과에는 없고, 첫 번째 sql문의 결과에만 존재히는 것 

SELECT deptno
FROM dept
MINUS SELECT deptno
FROM emp;

 

 

INTERSECT SELECT

교집합.

첫 번째 SQL 문과 두 번째 SQL문의 결과에 중복된 행만 출력

SELECT deptno
FROM emp
INTERSECT SELECT deptno
FROM dept;

 

 

 


종합 예시

더보기
--질문) temp 테이블에서 hobby가 없는 사람의 이름을 읽어오고 싶다.
SELECT emp_name
FROM temp
WHERE hobby is null;

--질문) temp 테이블에서 hobby가 있는 사람들의 이름과 취미를 읽어오고 싶다.
SELECT emp_name, hobby
FROM temp
WHERE hobby IS NOT NULL;

--질문) tmep 테이블에서 hobby가 null인 사람 모두 hobby를 '없음'이라고 치환하여 가져오고 나머지는 그대로 값을 읽어오고 싶다.
SELECT emp_name, nvl(hobby,'없음') AS hobby
FROM temp;

--질문) temp의 자료 중에서 hobby의 값이 null인 사원을 "등산"으로 치환했을 때 취미가 등산인 사람들의 이름과 취미를 읽어오고 싶다.
SELECT emp_name,nvl(hobby,'등산')
FROM temp
WHERE nvl(hobby,'등산')='등산';

--별칭주기 as 별칭
SELECT ename, comm*12 AS 연봉
FROM emp;

SELECT emp_id AS 사원번호, emp_name AS "사원^^이름"
FROM temp;

--질문)temp 테이블의 emp_id, emp_name을 각각 사번, 성명으로 표시하고 출력되도록
SELECT emp_id AS 사번, emp_name AS 성명
FROM temp;

--질문) 부서번호가 10인 사원들의 정보만 출력
SELECT ename FROM emp WHERE deptno=10;

--질문 emp 테이블에서 급여가 2000이상 되는 사람을 출력
DESC emp;
SELECT ename,sal FROM emp WHERE sal>=2000;

--질문 이름이 S로 시작하는 사원의 사원번호, 이름, 입사일, 부서번호를 출력
SELECT empno, ename, hiredate, deptno
FROM emp
WHERE SUBSTR (ename, 1, 1) ='S';

--질문 temp에서 직급별로 최소 연봉을 가진 직원의 사번과 연봉 읽어오기
SELECT lev, SUBSTR(MIN(LPAD(TO_CHAR(salary), 10, '0')||emp_id),11), MIN(salary)
FROM temp
GROUP BY lev;