1. 접속 클라이언트 Orange 이용
[ orange 단축키 ]
ctrl + - : 주석처리 (범위 잡고 한방에 가능)
ctrl + shift + - : 주석해제
ctrl + enter : 명령어 실행(한 쿼리)
F5 : 모든 명령어 실행
ctrl + shift + U : 대문자 변환
ctrl + U : 소문자 변환
ctrl + shift + f : 자동 줄맞춤(범위 잡고 실행)
ctrl + n : 새접속
ctrl + s : 저장
ctrl + o : 파일 오픈(불러오기)
ctrl + t : 새 탭 열기
2. Select 문
[데이터 조회 언어 : select 문 ]
- 테이블명 컬럼명 소유자 정보를 사전에 알고 있어야 함
from 절과 함께 사용
- 조회할 데이터가 저장된 테이블명 전달
2-1
select *
from emp;
select *
from dept;
select ename
from emp;
사전에 미리 정보를 조회해 볼 필요가 있음
이러한 식으로 테이블 안에 들어 있는 정보를 조회 할 수 있다.
2-2 문법의 흐름
select -- 컬럼 선택 (5)
from -- oracle 은 from 절 생략 불가(sql-server 는 생략 가능) (1)
[where] -- 행 선택 (2)
[group by] -- 그룹연산 (3)
[having] -- 그룹연산 결과 필터링 (4)
[order by] -- 정렬 (6)
;
( ) 괄호 안의 순서는 순서를 적어놓은것.
수행순서 : from -> (where -> group by -> having) -> select -> (order by)
즉, select 절에서 정의된 별칭의 재사용은 order by 절에서만 가능하다.
하지만 최근 나온 오라클 23c 버전부터는 from 절 생략이 가능하다고 한다.
select 24*365; -->> sql-server 에서 수행 가능(oracle에서는 에러 발생) 23c 버전부터는 가능해짐
select 24*365 from dual; -- oracle 에서는 dummy table(dual)을 사용한 조회 가능
select sysdate from dual; -- 현재 날짜와 시간 출력
2-3 select 절
: 조회할 컬럼 선택, 연산, 데이터 변환
(1) 방법
select * from tab; -- 접속한 계정의 소유 테이블 목록 확인
(2) 전체 컬럼 조회(* 이용)
select * -- 출력할 대상 정의(컬럼선택, 연산, 함수출력)
from emp; -- 저장된 데이터 출처(테이블)
cf) * (에스테리스크) : *는 에스테리스크라고 불리어지는 표시로써 테이블 내의 모든(all) 컬럼의 데이터를 선정할 때 사용
(3) 원칙적으로 select 절에 *와 컬럼명은 동시 사용 불가
오류 발생 하지만
select e.*, e.ename --> * 앞에 테이블명이나 테이블 별칭 사용시에는 컬럼명과 동시 출력 가능.
from emp e;
이러한 경우 다음과 같이 가능하다.
(4) 특정 컬럼 선택
select empno, ename, sal
from emp;
select deptno, comm, sal, hiredate
from emp;
다음과 같은 식으로 특정한 컬럼을 선택 할 수 있고 입력한 순서대로 출력된다.
(5) 연산
select ename, sal, sal*1.1
from emp;
다음과 같이 sal*1.1 처럼 연산이 된 결과를 가지고 새로운 컬럼을 생성 할 수 있다.
(6) 함수를 사용한 데이터 변형
select lower(ename), sal, deptno
from emp;
기본적으로 행 안에 출력된 결과물들은 대문자로 출력이 되는데 소문자로 출력하고 싶으면
위의 방식대로 출력하면 된다.
3. where 절
- (조건을 통해) 조회할 행을 선택
3-1. 방법
: 대상 연산자 상수 / ex) sal >= 3000
select *
from emp
where sal >= 3000;
이런 식으로 입력 했을 때 조회된 데이터에서 sal가 3000 이상인 데이터만 조회된다.
즉, 필터링 역할을 한다고 보면 됨.
-- 예제) 10번 부서원의 이름, 급여, 부서번호 출력
select ename, sal, deptno
from emp
where deptno = 10;
3-2 조건의 형태
- 단순 비교 : =, >, >=, <, <= , !=, <> (같지않다.)
- 기타(포함) 연산자 : between A and B (A 이상 B 이하), in
- 패턴 연산자 : like
- 부정 연산자 : not
- 널 연산자 : is null, is not null
-예제) 10번 부서원을 제외한 직원의 이름, 급여, 부서번호 출력
select ename, sal, deptno
from emp
where deptno !=10;
이런 식으로 결과가 출력된다.
3-3. between A and B 연산자
- 범위 연산자(A이상 B 이하)
- A,B 는 문자, 숫자, 날짜 상수 전달 가능
- A는 B보다 작은값이어야 함
예제) 급여가 2000이상 3000이하인 직원 출력
select *
from emp
where sal between 2000 and 3000; -- 2000, 3000 포함
select *
from emp
where sal >= 2000
and sal <= 3000;
위의 두가지 경우는 원하는 결과가 정상적으로 출력된다.
하지만
select *
from emp
where sal between 3000 and 2000;
과 같이 A에 더 큰 상수를 전달하면 공집합 출력 -> 오류가 나는것은 아니다.
3-4. IN 연산자
- 범주형 데이터의 여러 카테고리 선택
- 일치하는 여러 대상을 한번에 조회
--예제) 이름이 BLAKE, SCOTT, SMITH 인 직원 모두 조회
select *
from emp
where ename = 'BLAKE'
or ename = 'SCOTT'
or ename = 'SMITH';
select *
from emp
where ename in ('BLAKE', 'SCOTT', 'SMITH');
두 결과 모두 같은 결과가 출력된다.
주의) 이름이 소문자가 아닌 대문자로 이루어져 있으므로 where 절에서 작성 시 소문자로 쓰지 말아야 한다.
참고) not 연산자는 수학으로 따지면 부정의 의미를 갖고 있고 집합의 개념에서는 여집합을 의미하므로
주로 between 이나 in 과 함께 쓰인다.
-- 예제) 급여가 2000 미만 3000초과인 직원 출력
select *
from emp
where sal not between 2000 and 3000 ;
결과는 이것은 2000 미만 3000 초과를 의미.
--예제) 이름이 BLAKE, SCOTT, SMITH 가 아닌 직원 모두 조회
select *
from emp
where ename not in ('BLAKE', 'SCOTT', 'SMITH');
다음 결과 또한 이름에 'BLAKE', 'SCOTT', 'SMITH' 가 포함되지 않은 이름을 조회함
3-5. like 연산자
- 패턴 연산자(문자열의 일부를 이용한 비교 조건)
- %, _ 를 사용하여 패턴 전달
%과 _의 차이점
1) where ename like 'S%' : S로 시작하는(자리수 상관없음)
2) where ename like 'S_' : S로 시작하는(자리수 상관있음 -> 두 글자)
예제) 이름이 T로 끝나는 직원의 이름, 급여 출력
select ename, sal
from emp
where ename like '%T';
if 이름에 T를 포함하는으로 만드려면 where ename like '%T%' 으로 작성하면 됨.
예제) 이름의 두 번째 글자가 A인 직원의 이름, 급여 출력
select ename, sal
from emp
where ename like '_A%' ;
4. null 연산자
- null : 정해지지 않은 미지의 값 (공백과 null은 다르다.) ex) 1칸 공백은 사이즈가 1 but null 은 사이즈가 없다.
- null을 포함한 산술연산(+,-,X,/) 의 결과는 항상 null 리턴
예제) 직업이 CLERK인 직원의 이름, 총급여(SAL + COMM) 출력
select ename, sal, comm, sal + comm
from emp
where job = 'CLERK' ;
다음 결과에서 볼 수 있듯이 null은 산술 연산자를 이용한 연산이 불가능하다.
comm이 현재 null 이기 때문에 sal+comm의 값이 연산이 되지 않은 형태로 나타나게됨.
이는 null을 0 또는 다른 값으로 변환하기 위한 다른 함수가 필요. (추후에 기술)
예제) comm이 null 인 직원의 이름, 급여, comm 출력
select ename, sal, comm
from emp
where comm = null ; -- 공집합 출력
select *
from emp
where comm != null; -- 공집합 출력
: 마찬가지이다.
select *
from emp
where comm is null; -- comm이 null 인 대상 출력
: comm이 null 인 대상 출력되는 것을 확인 할 수 있다.
select *
from emp
where comm is not null;
: comm이 null이 아닌 대상이 출력된다.
그러므로 해당 예제의 답은
select ename, sal, comm
from emp
where comm is null ;
5. desc
- oracle 에서 테이블의 layout 을 볼 수 있는 명령어
- 컬럼명, 컬럼순서, null 허용 여부, 데이터 타입 확인 가능
desc emp;
다음과 같이 출력됨을 알 수 있다.
6. 컬럼 별칭
6-1.
- select 문에서 출력되는 컬럼명의 임시 이름(원본 이름 변경 X)
- select절에서 정의
- 사용법 : select 컬럼명 as 컬럼별칭(as 생략 가능)
- 컬럼별칭의 재사용은 order by절에서만 가능
ex)
select ename as 사원명, hiredate 입사날짜, comm 보너스
from emp;
:임시적으로 이 쿼리에서만 바꿔서 쓰겠다.
만약 입사 날짜 띄어쓰면 입사까지만 별칭으로 받고 날짜는 정의되지 않는다.
그래서 하나의 별칭으로 지정하려면 쌍따옴표 이용한다.
6-2. 컬럼별칭 정의 시 쌍따옴표가 필요한 경우
1) 별칭에 공백을 포함하는 경우
select ename as 사원명, hiredate "입사 날짜", comm 보너스 -- 정상 수행
from emp;
2) 별칭에 특수기호를 포함하는 경우(oracle의 경우 #은 예회)
select ename as "사원명!" -- 정상 수행
from emp;
select empno as 사원# -- 정상 수행
from emp;
3) 별칭의 대소문자를 구분하고 싶은 경우(기본적으로 oracle은 컬럼별칭이 모두 대문자로 출력)
select ename, sal as "salary" -- 정상 수행
from emp;
select ename as 사원명, hiredate 입사날짜, comm 보너스
from emp
where 사원명 = 'SMITH';
다음의 경우
: 에러 발생
왜? where에서 select의 별칭을 사용할 수 없다.
select ename as 사원명, hiredate 입사날짜, comm 보너스
from emp
order by ename; -- order by 가 없으면 입력된 순서대로 출력되지만 order by ename로 인해 사전식 배열로 출력.
select ename as 사원명, hiredate 입사날짜, comm 보너스
from emp
order by 사원명; -- 정상 수행
다음과 같이 입력해야 정상적으로 수행이 되는것을 확인 할 수 있다.
Quiz
test_data.sql 전체실행(F5) 후 아래 문제 쿼리 작성
1. EMP 테이블에서 담당업무가 Manager인 사원의 정보를
사원번호, 성명, 업무, 급여, 부서번호(deptno)를 출력하라.
select empno, ename, job, sal, deptno
from emp
where job = 'MANAGER' ;
2. emp 테이블에서 job이 Manager, Clerk, Analyst가 아닌 사원의
사원번호, 성명, 업무, 급여, 부서번호를 출력하여라.
sol)
select empno, ename, job, sal, deptno
from emp
where job not in ('manager', 'clerk', 'analyst') ;
3. emp 테이블에서 15% 인상된 급여가 3500 이상인 직원의
기존급여, 인상된 급여를 이름과 함께 출력
sol)
select ename as 이름, sal as 기존급여, sal*1.15 as 인상된급여
from emp
where sal*1.15 >= 3500 ;
4. emp2 테이블에서 정규직과 인턴직을 제외한 직급 중
부서번호가 1008번이거나 취미가 오락인 직원의 이름, 고용형태, 부서번호, 취미 출력
sol)
select name, emp_type, deptno, hobby
from emp2
where (deptno = 1008 or hobby = '오락') and (emp_type not in ('정규직', '인턴직')) ;
5. student 테이블에서 "ㅅ" 성인 학생의 이름, 학번, 제1전공번호(deptno1) 출력
sol)
select name, studno, deptno1
from student
where name between '사' and '수';
'SQL' 카테고리의 다른 글
6. 문자열 함수(2) (2) | 2024.10.16 |
---|---|
5. 문자열 함수(1) (0) | 2024.10.15 |
4. 연결연산자(||), 논리연산자 (4) | 2024.10.15 |
3. Order by 절, 중복행 제거 (0) | 2024.10.15 |
2. 계정 접속과 권한 (1) | 2024.10.15 |