데이터베이스(Database)
SQL(Standard Query Language)
SELECT문 : 데이터베이스로부터 저장되어 있는 데이터를 검색하는데 사용
전체 테이블 명세
SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno FROM emp;
SELECT * FROM emp; -- *은 모든 컬럼을 의미함
특정 열 선택
SELECT ename,job,sal FROM emp;
주석
SELECT * /*주석*/ FROM emp; --주석
SELECT SYSDATE FROM dual;
SELECT 7 + 10 FROM dual;
SELECT ASCII('A') FROM dual;
SELECT ASCII(0) FROM dual;
산술식 : 산술연산자(+,-,*,/)를 사용하여 숫자 및 날짜 데이터로 표현식을 작성
SELECT ename,sal,sal + 300 FROM emp;
연산자 우선순위
SELECT ename,sal,(sal + 300) * 12 FROM emp;
NULL 값의 정의 : NULL은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값(NULL은 0이나 공백과는 다름)
SELECT empno,ename,job,comm FROM emp;
산술식의 null값 : null값을 포함하는 산술식은 null로 계산
SELECT ename, comm + 100 FROM emp;
알리아스에 큰따옴표를 사용하는 경우
SELECT sal*12 Asal FROM emp; --바로뒤에 한칸 띄고 별칭 입력(별칭 : Asal)
SELECT sal*12 AS Asal FROM emp; --AS 사용
SELECT sal*12 "Annual Salary" FROM emp;
--공백이 있으면 에러가 생김, 큰따옴표를 사용하면 입력값 그대로 사용
select ename || ' has $' || sal FROM emp;
SELECT deptno FROM emp;
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT(deptno) FROM emp; --DISTINCT와 테이블명 앞에 공백삭제
DESCRIBE emp;
DESC emp;
10번 부서에서 일하는 사원의 정보 읽기
SELECT * FROM emp WHERE deptno=10;
'SMITH' 정보 읽기
SELECT * FROM emp WHERE ename='SMITH'; --입력된 데이터는 대소문자 구분O
날짜 정보 읽기
SELECT * FROM emp WHERE hiredate > '81/12/03';
[주의] where절에서는 알리아스(ALIAS)를 사용할 수 없음
SELECT ename,sal,sal*12 ansal FROM emp WHERE sal*12 > 15000;
같다, 같지않다
SELECT * FROM emp WHERE hiredate = '81/12/03'; --같다
SELECT * FROM emp WHERE hiredate != '81/12/03'; --같지않다
SELECT * FROM emp WHERE hiredate <> '81/12/03'; --같지않다
SELECT * FROM emp WHERE hiredate ^= '81/12/03'; --같지않다
이상 ~ 이하
SELECT * FROM emp WHERE sal>=1000 AND sal<=1500;
BETWEEN ~ AND ~ : 두 값 사이(지정한 값 포함)
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 1500;
SELECT * FROM emp WHERE sal NOT BETWEEN 1000 AND 1500; --부정형
SELECT * FROM emp WHERE sal IN (1300,2450,3000);
SELECT * FROM emp WHERE sal NOT IN (1300,2450,3000); --부정
SELECT ename,mgr,deptno FROM emp WHERE ename IN ('ALLEN', 'FORD');
사원명에 S가 포함된 사원 정보 읽기
SELECT * FROM emp WHERE ename LIKE '%S%';
사원명이 S로 시작하는 사원 정보 읽기
SELECT * FROM emp WHERE ename LIKE 'S%';
SELECT * FROM emp WHERE ename NOT LIKE 'S%'; --부정
입사일이 22로 끝나는 날 입사한 사원 정보 읽기
SELECT * FROM emp WHERE hiredate LIKE '%22';
사원이름이 FOR 다음에 한글자로 구성된 이름을 갖는 사원 정보 읽기
SELECT * FROM emp WHERE ename LIKE 'FOR_';
SELECT * FROM emp WHERE comm = NULL; -- comm = null은 불가
SELECT * FROM emp WHERE comm IS NULL; --이렇게 입력해야함
SELECT * FROM emp WHERE comm IS NOT NULL; -- comm != null은 불가
1.emp테이블에서 사원번호(empno),사원이름(ename),월급(sal)을 출력하시오
SELECT empno,ename,sal FROM emp;
2.emp테이블에서 사원이름과 월급을 출력하는데 컬럼명은 "이 름", "월 급"으로 바꿔서 출력하시오.
SELECT ename "이 름", sal "월 급" FROM emp;
3.emp테이블에서 사원번호,사원이름,월급,연봉을 구하고 각각 컬럼명은 "사원번호","사원이름","월급","연봉"으로 출력하시오.
SELECT empno 사원번호,ename 사원이름,sal 월급,sal*12 연봉 FROM emp;
4.emp테이블에서 사원번호가 7698인 사원의 이름,업무(job),급여를 출력하시오
SELECT ename,job,sal FROM emp WHERE empno=7698;
5.emp테이블에서 사원이름이 SMITH인 사원의 이름과 월급,부서번호(deptno)를 구하시오.
SELECT ename,sal,deptno FROM emp WHERE ename='SMITH';
6.월급이 2500이상 3500미만인 사원의 이름,입사일,월급을 구하시오.
SELECT ename,hiredate,sal FROM emp WHERE sal>=2500 AND sal<3500;
7.급여가 2000에서 3000사이에 포함되지 않는 사원의 이름,업무,급여를 출력하시오.
SELECT ename,job,sal FROM emp WHERE sal NOT BETWEEN 2000 AND 3000;
SELECT ename,job,sal FROM emp WHERE not (sal>=2000 AND sal<=3000);
8.81년05월01일과 81년12월03일 사이에 입사한 사원의 이름,급여,입사일을 출력하시오.
SELECT ename,sal,hiredate FROM emp WHERE hiredate BETWEEN '81/05/01' AND '81/12/03';
SELECT ename,sal,hiredate FROM emp WHERE hiredate BETWEEN '81-05-01' AND '81-12-03';
SELECT ename,sal,hiredate FROM emp WHERE hiredate>='81/05/01' AND hiredate<='81/12/03';
9.사원번호가 7566,7782,7934인 사원을 제외한 사람들의 사원번호,이름,월급을 출력하시오.
SELECT empno,ename,sal FROM emp WHERE empno NOT IN(7566,7782,7934);
10.급여가 2000와 5000사이고 부서번호가 10 또는 30인 사원의 이름과 급여,부서번호를 출력하시오.
SELECT ename,sal,deptno FROM emp WHERE (sal BETWEEN 2000 AND 5000) AND deptno IN(10,30);
SELECT ename,sal,deptno FROM emp WHERE (sal BETWEEN 2000 AND 5000) AND (deptno = 10 OR deptno = 30);
ASC : 오름차순으로 행을 정렬(기본 순서)
DESC : 내림차순으로 행을 정렬
SELECT * FROM emp WHERE deptno = 10 ORDER BY sal; --오름차순 정렬
SELECT * FROM emp WHERE deptno = 10 ORDER BY sal ASC; --오름차순 정렬(생략O)
SELECT * FROM emp WHERE deptno = 10 ORDER BY sal DESC; --내림차순 정렬
SELECT * FROM emp ORDER BY sal DESC,ename DESC;
--중복이 있는 경우 2차정렬을 통해 다시 정렬할 수 있음
SELECT * FROM emp ORDER BY job,sal DESC,ename; --중복값은 2차,3차정렬 가능
열 ALIAS를 기준으로 정렬
SELECT empno,ename,sal,sal*12 annsal FROM emp ORDER BY annsal;
열의 숫자 위치를 사용하여 정렬
-- 1 2 3 4 : index3번째인 deptno를 기준으로 정렬
SELECT ename,job,deptno,hiredate FROM emp ORDER BY 3;
테이블에 생성된 순서대로 열 숫자 위치 부여 - 직관적이지 않아서 좋지 않음
SELECT * FROM emp ORDER BY 2;
NULLS FIRST, NULLS LAST 키워드
--안쓰면 NULL이 맨 아래로 가는데 위로 가도록 싶으면 사용
SELECT * FROM emp ORDER BY comm NULLS FIRST;
SELECT * FROM emp ORDER BY comm DESC NULLS LAST;
SELECT * FROM emp ORDER BY comm DESC NULLS LAST, ename; --2차정렬
1.사원번호,사원이름,입사일을 출력하는데 입사일이 빠른 사람순으로 정렬하시오.
SELECT empno,ename,hiredate FROM emp ORDER BY hiredate;
2.사원이름,급여,연봉을 구하고 연봉이 많은 순으로 정렬하시오.
SELECT ename,sal,sal*12 FROM emp ORDER BY sal*12 DESC;
SELECT ename,sal,sal*12 annsal FROM emp ORDER BY annsal DESC; --자바에서는 ALIAS 권장
3.10번 부서 또는 20번 부서에서 근무하고 있는 사원의 이름과 부서번호를 출력하는데 이름을 영문자순으로 표시하시오.
SELECT ename,deptno FROM emp WHERE deptno IN(10,20) ORDER BY ename;
1.emp테이블의 업무(job)를 중복되지 않게 표시하시오.
SELECT DISTINCT job FROM emp;
2.업무가 SALESMAN 또는 MANAGER 이면서 급여가 $1,600,%2975,$2850이 아닌 모든 사원의 이름,업무 및 급여를 표시하시오.
SELECT ename,job,sal FROM emp WHERE job IN ('SALESMAN','MANAGER') AND sal NOT IN(1600,2975,2850);
3.업무명에 MAN 이 포함되어 있고, 급여를 $1,000~$3,000사이로 받는 사원의 이름,급여,업무를 출력하시오.
SELECT ename,sal,job FROM emp WHERE job LIKE '%MAN%' AND sal BETWEEN 1000 AND 3000;
4.이름이 S로 끝나는 사원들 중에서 30번 부서에 근무하는 사원의 이름,급여,부서번호를 출력하시오.
SELECT ename,sal,empno FROM emp WHERE ename LIKE '%S' AND deptno=30;
5.커미션 계약을 맺은 모든 사원의 이름,급여,커미션을 출력하는데 커미션을 기준으로 내림차순 정렬하시오.
SELECT ename,sal,comm FROM emp WHERE comm IS NOT NULL ORDER BY comm DESC ;
추가