본문 바로가기

SQL

1. Select ~ From

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