--질문 이름이 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 emp_id AS 사원번호, emp_name AS"사원^^이름"FROM temp;
DISTINCT
중복된 결과를 하나씩만 나오게 한다.
다른 필드와 같이 나오면 중복이 없으므로 모두 나온다.
함부로 쓰면 곤란한 상황이 생길 수 있다.
SELECTDISTINCT 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 NOTIN (20,30);
여러 개 선택
BETWEEN ~ AND
이상, 이하
enp_id>=19970001 AND enp_id<=19979999;로 대체 가능
-- temp 테이블에서 사번이 1997년대인 사원의 사번과 성명을 검색SELECT emp_id, emp_name
FROM temp
WHERE emp_id BETWEEN19970001AND19979999;
--질문 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<7654OR empno>7782;
SELECT*FROM emp
WHERE empno NOTBETWEEN7654AND7782;
ORDER BY
오름차순, 내림차순 정렬
-- 질문 sal(월급)에 의해 내림차순으로 정렬SELECT empno, sal, ename
FROM emp
ORDERBY sal DESC;
-- 질문 직급(lev=1)의 오름차순으로 먼저 정렬하고 사원번호(emp_id=2)의 내림차순으로 정렬SELECT lev, emp_id, emp_name
FROM temp
ORDERBY1, 2DESC;
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
WHERENOT salary <50000000;
GROUP BY
그룹별로.
그룹 바이를 쓰고 나면 개개인의 정보는 얻기 힘들다. 그룹 정보만 얻기 편하다.
--질문 emp 테이블의 부서번호를 확인하는데 부서별로 확인하고 싶다.SELECT deptno FROM emp GROUPBY deptno;
--질문 emp 테이블의 job별로 급여의 합계를 구하시오SELECT job, SUM(sal) AS 직무별급여총합
FROM emp
GROUPBY job;
--질문 tdept 테이블의 자료 중에서 area별로 최소 boss_id를 골라내고, 이 결과를 boss_id별로 정렬SELECT area, MIN(boss_id)
FROM tdept
GROUPBY area
ORDERBY2ASC;
-- 2는 SELECT에서 고른 것 중 2번째 열을 뜻함 (즉, MIN(boss_id)
GROUPING
-- 질문 : 부서별 직무별로 그룹을 지어 그룹별로 평균 급여를 보는 뷰와,-- 직무별, 매니저별로 그룹을 지어 또 그 그룹별 평균을 낸 뷰를 합친 것-- GROUP BY 이용SELECT deptno, job, null, AVG(sal)
FROM emp
GROUPBY deptno, job
UNIONALLSELECTnull, job, mgr, AVG(sal)
FROM emp
GROUPBY job, mgr;
--GROUPING SETS 이용SELECT deptno, job, mgr, AVG(sal)
FROM emp
GROUPBYGROUPING SETS((deptno, job), (job,mgr));
SUM
총합
--질문 emp 테이블의 부서별 급여의 총합을 보고 싶다.SELECTSUM(sal) as "부서별 급여 총합", deptno
FROM emp
GROUPBY deptno;
AVG
평균
--질문 emp 테이블의 job별로 급여의 평균을 구하시오SELECT job, AVG(sal) AS 급여평균
FROM emp
GROUPBY job;
--질문 emp 테이블의 job별로 최고 급여를 높은 순부터 구하시오SELECT job,MAX(sal)
FROM emp
GROUPBY job
ORDERBYMAX(sal) DESC;
HAVING
검색할 테이블에서 검색하고자 하는 row를 조건절을 사용해서 제한할 때
having 절은 group by된 결과를 제한하고자 할 때 사용
--질문 직급별로 연봉 평균을 구한 상태에서 평균 연봉이 5천만원 이상인 경우의 직급과 평균 연봉을 읽어오는 것SELECT lev, AVG(salary)
FROM temp
GROUPBY lev
HAVINGAVG(salary) >=50000000;
--질문 temp의 자료를 사용해서 직급 별로 사번이 제일 늦은 사람을 구하고 그 결과 내에서 사번이 1997로 시작하는 결과 보기SELECT lev, MAX(emp_id)
FROM temp
GROUPBY lev
HAVINGMAX(emp_id) LIKE'1997%';
UNION SELECT
두 개 이상의 sql문의 결과를 연결시켜주는 연산자.
합집합. (겹치는 게 있으면 중복 없이 하나만 나온다)
짝끼리 타입이 일치하지 않으면 오류가 난다.
짝이 맞지 않으면 오류가 난다.
-- UNION SELECTSELECT empno, ename
FROM emp
UNIONSELECT deptno, dname
FROM dept;
-- UNION ALL SELECTSELECT empno, ename
FROM emp
UNIONALLSELECT 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
INTERSECTSELECT deptno
FROM dept;
--질문) temp 테이블에서 hobby가 없는 사람의 이름을 읽어오고 싶다.SELECT emp_name
FROM temp
WHERE hobby isnull;
--질문) temp 테이블에서 hobby가 있는 사람들의 이름과 취미를 읽어오고 싶다.SELECT emp_name, hobby
FROM temp
WHERE hobby ISNOTNULL;
--질문) 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*12AS 연봉
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
GROUPBY lev;