select

JIHYUN·2023년 8월 14일
0

sql

목록 보기
2/9
-- inline comment

SQL 문장은 세미콜론(;)으로 끝남.
ctrl+Enter: 현재 커서가 있는 위치의 SQL 한 문장을 실행.
F5: 스크립트(확장자가 sql인 파일) 전체를 실행.

DQL

DQL(Data Query Language): 테이블의 내용을 검색.
select 컬럼 이름, ... from 테이블 이름;
dual: 오라클 데이터베이스에서 select 문장의 문법을 맞추기 위해서 사용하는 가상의 테이블 이름.

select sysdate from dual;

EMP 테이블의 모든 내용을 검색:

select * from emp; -- '*' 모든

SQL 명령어(키워드), 테이블 이름, 컬럼 이름은 대소문자를 구분하지 않음.

SELECT * FROM EMP;
SELECT * FROM emp;
select * from EMP;

테이블에 저장된 데이터는 대/소문자를 구분함!

Alt+F10: 새 워크시트(sql 스크립트 파일) 만들기.

select 컬럼 이름, ... from 테이블 이름;

emp: 사원 테이블, dept: 부서 테이블

사원 테이블에서 사번(empno), 사원이름(ename)을 검색.

select empno, ename from emp; 

부서 테이블에서 모든 컬럼을 검색.

select * from dept; -- 테이블에서 컬럼들이 만들어진 순서대로 결과가 출력됨.
select loc, deptno, dname from dept; -- 순서 변경 가넝한

컬럼 이름에 별명(alias) 주기

as "별명"에서는 큰 따옴표("")를 사용함!

SELECT deptno AS "부서 번호", dname AS "부서 이름"
FROM dept; 

별명은 원하는 컬럼에만 사용할 수도 있음.

SELECT deptno, dname AS "부서 이름"
FROM dept;

연결 연산자

연결 연산자 (||): 2개 이상의 컬럼을 합쳐서 하나의 컬럼으로 출력.
'부서 번호-부서 이름' 형식의 문자열을 '문자 정보'라는 컬럼으로 출력.
SQL에서 문자열은 작은따옴표('')를 사용함!
큰따옴표("")는 as 별명 구문에서만 사용함!

select deptno || '-' || dname as "부서 정보"
from dept;

부서 테이블의 내용을 검색해서 '... 부서는 ... 도시에 있습니다.' 형식으로 출력.

select dname || '부서는 ' || loc || '에 있습니다.' as "부서 위치"
from dept;

정렬해서 출력하기:

select 컬럼 이름, ... from 테이블 이름 order by 컬럼 [asc/desc];

asc: 오름차순 정렬(ascending order) : 정렬의 기본값, 보통 생략
desc: 내림차순 정렬(descending order) : 생략 불가

부서 테이블의 모든 내용을 검색, 부서번호 내림차순으로 출력.

select * from dept order by deptno desc;

부서 테이블의 모든 내용을 검색, 부서 이름 오름차순으로 출력.

select * from dept order by dname;

부서 테이블의 모든 내용을 검색, 부서 위치 내림차순으로 출력.

select * from dept order by loc desc;

직원 테이블에서 부서 번호, 사번, 이름을 검색,
정렬 조건: (1) 부서 번호, (2) 사번 오름차순\

SELECT deptno, empno, ename from emp order by deptno, empno;

직원 테이블에서 부서번호, 직무, 이름을 검색,
정렬 조건: (1) 부서번호, (2) 직무 오름차순

SELECT deptno, job, ename 
FROM emp 
ORDER BY deptno, job;

중복되지 않는 결과만 출력하기.

SELECT DISTINCT 컬럼이름,... FROM 테이블;

직원 테이블에서 직무를 검색

SELECT DISTINCT job FROM emp;

직원 테이블에서 중복되지 않는 부서번호, 직무를 검색

SELECT DISTINCT deptno, job FROM emp ORDER BY deptno, job;

distinct는 select 문장에서 오직 한 번만, 검색하려는 컬럼 이름 앞에서 사용됨.
(예) select distinct col1, col2, col3 from tbl;
order by는 컬럼별로 정렬 기준(오름차순/내림차순)을 다르게 할 수 있음.
(예) select col1, col2 from tbl order by col1 asc, col2 desc;

SELECT DISTINCT deptno,job FROM emp ORDER BY deptno, job DESC;

테이블에서 데이터를 검색:
(1) projection: 테이블에서 원하는 컬럼들을 선택.
(2) selection: 테이블에서 조건을 만족하는 레코드(행, row)들을 검색.

select column_name,... from table_name where 조건식 order by column_name,...;

조건식에서 사용되는 연산자들:
(1) 비교 연산자: =, !=, >, >=, <, <=, is null, is not null,
(2) 논리 연산자: and, or, not

직원테이블에서 10번 부서에서 근무하는 직원들의 부서번호, 사번, 이름을 출력.

SELECT deptno, empno, ename FROM emp WHERE deptno = 10;

직원테이블에서 수당(comm)이 null이 아닌 직원들의 사번, 부서번호, 이름, 수당을 출력.

SELECT empno, deptno, ename, comm FROM emp WHERE comm IS NOT NULL; 

직원테이블에서 급여(sal)가 2000 이상인 직원들의 이름, 직무, 급여를 출력.

SELECT ename, job, sal FROM emp WHERE sal >= 2000;

직원테이블에서 급여가 2000 이상 3000 이하인 직원들의 이름, 직무, 급여를 출력.
급여의 내림차순으로 정렬

SELECT ename, job, sal FROM emp WHERE sal BETWEEN 2000 AND 3000 ORDER BY sal DESC; 

직원 테이블에서 10번 또는 20번 부서에서 근무하는 직원들의 부서번호, 이름, 급여를 검색.
-- 출력 순서는 (1) 부서 번호, (2) 이름 오름차순 정렬.

SELECT dedeptno, ename, sal FROM emp WHERE deptno = 10 OR deptno = 20 ORDER BY deptno, ename; 

직원 테이블에서 직무가 'CLERK'인 직원들의 직무, 이름, 급여를 출력.
이름 오름차순 순서로 출력

SELECT job, ename, sal FROM emp WHERE job = 'CLERK' ORDER BY ename;

직원 테이블에서 직무가 CLERK 또는 MANAGER인 직원들의 직무, 이름, 급여를 검색.
출력 순서 (1) 직무 (2) 급여 오름차순 정렬.

SELECT job, ename, sal FROM emp WHERE job = 'CLERK' or job = 'MANAGER' ORDER BY job, sal;

직원 테이블에서 20번 부서에서 근무하는 CLERK의 모든 정보를 검색

SELECT * FROM emp WHERE deptno = 20;

직원 테이블에서 CLERK, ANALYST, MANAGER가 아닌 직원들의 사번, 이름, 직무, 급여를 검색
사번 오름차순 정렬.

SELECT empno, ename,job, sal FROM emp WHERE job NOT IN ('CLERK', 'ANALYST', 'MANAGER');

직원테이블에서 10번 부서에서 근무하는 직원들의 부서번호, 사번, 이름을 출력.

SELECT deptno, empno, ename FROM emp WHERE deptno = 10;

직원테이블에서 수당(comm)이 null이 아닌 직원들의 사번, 부서번호, 이름, 수당을 출력.

SELECT empno, deptno, ename, comm FROM emp WHERE comm IS NOT NULL; 

직원테이블에서 급여(sal)가 2000 이상인 직원들의 이름, 직무, 급여를 출력.

SELECT ename, job, sal FROM emp WHERE sal >= 2000;

직원테이블에서 급여가 2000 이상 3000 이하인 직원들의 이름, 직무, 급여를 출력.
급여의 내림차순으로 정렬

SELECT ename, job, sal FROM emp WHERE sal BETWEEN 2000 AND 3000 ORDER BY sal DESC; 

직원 테이블에서 10번 또는 20번 부서에서 근무하는 직원들의 부서번호, 이름, 급여를 검색.
출력 순서는 (1) 부서 번호, (2) 이름 오름차순 정렬.

SELECT dedeptno, ename, sal FROM emp WHERE deptno IN (10, 20) ORDER BY deptno, ename; 

직원 테이블에서 직무가 'CLERK'인 직원들의 직무, 이름, 급여를 출력.
이름 오름차순 순서로 출력

SELECT job, ename, sal FROM emp WHERE job = 'CLERK' ORDER BY ename;

직원 테이블에서 직무가 CLERK 또는 MANAGER인 직원들의 직무, 이름, 급여를 검색.
출력 순서 (1) 직무 (2) 급여 오름차순 정렬.

SELECT job, ename, sal FROM emp WHERE job IN ('CLERK', 'MANAGER') ORDER BY job, sal;

직원 테이블에서 20번 부서에서 근무하는 CLERK의 모든 정보를 검색

SELECT * FROM emp WHERE deptno = 20 AND job = 'CLERK';

직원 테이블에서 CLERK, ANALYST, MANAGER가 아닌 직원들의 사번, 이름, 직무, 급여를 검색
사번 오름차순 정렬.

SELECT empno, ename,job, sal FROM emp WHERE job NOT IN ('CLERK', 'ANALYST', 'MANAGER') ORDER BY empno;

숫자 타입뿐만 아니라 문자열, 날짜 타입들도 대소비교(>, <, >=, <=, ...)가 가능.
(예) 'a' < 'b', 2023/04/10 < 2023/04/11

직원 테이블에서 '1987/01/01' 이후에 입사한 직원들의 모든 레코드 검색,
입사일 오름차순 정렬.

SELECT * FROM emp WHERE hiredate >= '1987/01/01' ORDER BY hiredate;

Oracle이 hiredate 컬럼의 값(Date)을 문자열로 변환해서 '1987/01/01'과 비교.

SELECT * FROM emp WHERE hiredate >= TO_DATE('1987/01/01');

위 방법보다 더 안전한 방법.

특정 문자열로 시작하거나, 특정 문자열이 포함된 값을 찾는 문장. -> LIKE 검색

LIKE 검색:

 (1) %: 글자수 제한 없음. 
 (2) underscore(_): underscore 자리에 어떤 글자가 와도 상관없음.

'A'로 시작하는 이름을 갖는 직원들의 이름을 오름차순으로 출력.

SELECT ename FROM emp WHERE ename LIKE 'A%' ORDER BY ename;

직무 첫문자는 어떤 문자이든 상관 없고, 나머지 문자열은 'LERK'로 끝나는 직무.

SELECT job FROM emp WHERE job LIKE '_LERK';

30번 부서에서 근무하는 직무가 'SALES'로 시작하는 직원들의 사번, 이름, 급여, 부서번호, 직무를 검색.
사번 오름차순 정렬

SELECT empno, ename, sal, deptno, job FROM emp WHERE deptno = 30 AN
D job LIKE 'SALES%' ORDER BY empno;
profile
🍋

0개의 댓글