SQL dual 테이블과 연산자와 where절

2024. 9. 12. 10:28SQL

dual테이블

dual테이블은 쿼리 결과를 쉽게 확인해볼 수 있는 임시 테이블이다.

--dual테이블 사용하기--
select * from dual;
--daul테이블에서는 true라면 x가 출력된다--

select 100+88+90 from dual;
select 273/3 from dual;

--dual테이블을 사용하지 않는 경우
select * from dept;
--dept테이블의 행은 4개--
select 2*2 from dept;
--연산을 할때 dept테이블을 사용했으므로 행의 개수인 4개만 출력--


dual테이블을 다른 연산자없이 사용하게되면 위의 스크립트 창처럼 x라는 값을 반환하는데 이는 그냥 x라는 단하나의 값을 저장하고있을뿐 사실상 의미는없다.
쿼리문 실행결과가 하나의 행으로 출력하기 위해 하나의 값을 구성하고있을 뿐이다...!
 

연산자

수식은 연산자와 피연산자로 이루어져있다. 예를 들어 2+3이라는 수식에서 2와 3은 피연산자(연산의 대상)에 해당되며, +는 연산자(무엇을 연산할 것인지 나타내는 부분)에 해당된다.
수식(식)은 연산자와 피연산자로 이루어져 있다.
 


연산자 종류

  • 산술 연산자
  • 관계 연산자
  • 논리 연산자 / 논리부정 연산자
  • BETWEEN AND 연산자
  • IN 연산자
  • LIKE 연산자와 와일드 카드
  • IS NULL, IS NOT NULL

 

산술연산자

오라클에서의 산술연산은 수학에서의 산술연산자와 매우 동일하다. 산술연산자는 수학연산을 사용하기 위해서 사용하며, 주의할점은 오라클에서는 나머지를 파이썬이나 r과는 다르게 나머지를 연산해주는 연산자가 따로 존재하지않는다는 점이다.

--산술 연산자--
select 2 + 1 from dual;
select 2 - 1 from dual;
select 3 * 3 from dual;
select 10 / 2 from dual;
select 10 % 2 from dual;--에러!--
--오라클에서는 나머지 연산자가 없고 mod()함수를 이용한다--
select mod(10,2) from dual; --출력!--

오라클에서 나머지 값을 구하고자 할때는 mod라는 함수를 이용해야한다.

dual테이블에서 결과 확인

 

관계연산자

--관계연산자--
select * from dual where 2 > 1; --2가 1보다 크다는것은 참이기때문에 true출력--
select * from dual where 2 < 1; --2가 1보다 크기때문에 조건이 거짓이므로 x가 출력되지 않음--
select * from dual where 2 >=1;
select * from dual where 2 <=1;

select * from dual where 2 <>1; --<>같지 않다--
select * from dual where 2 !=1; --!=같지 않다--
select * from dual where 2^=1; --^=같지 않다--

관계연산자는 두 값을 비교하기 위해 사용하는 연산자이다. 관계 연산자는 좌변과 우변의 값을 비교해서 크기 관계를 평가하며, 그 결과를 참(true)과 거짓(false)으로 나타낸다. 관계연산자의 경우 true 이면 x가 출력되고 false라면 x가 출력되지 않는다.

참인경우
거짓인 경우

 
논리연산자 / 논리부정연산자

--논리연산자-
--and or not--
--and : 전부다 참일때 참 출력--
select * from dual where 2 > 1 and 2 >1; --2가 1보다 크면서 2가 1보다 클때 둘다 참--
select * from dual where 2 > 1and 10 <=5; --2가 1보다 크면서 10이 5 이하일때 후자 거짓--

--or : 둘중 하나가 참일때 참 출력 / 둘다 거짓일때 거짓 출력--
select * from dual where 90!=90 or 2>1; --90은 90과 같지 않거나 2가 1보다 클때 후자 참--
select * from dual where 0=10 or 80^=80; --0은 10과 같거나 80은 80이 아닐때 둘다 거짓--
select empno, ename, sal from emp where sal <2000 or sal >3000;

--not : 참이면 거짓, 거짓이면 참으로 출력된다--
select * from dual where not 1 = 1;
select * from dual where not 2 < 1;

논리연산자와는 두 개 이상의 관계 연산자를 묶을때 사용하는 연산자이다. 

 

논리연산자 / 논리부정연산자의 종류 및 뜻

and : 두가지 조건이 모두 참일 경우 참 출력
or : 두가지 조건중 한 가지만 참이면 참 출력 / 두 조건 모두 거짓일때 거짓 출력
not : 조건이 참이면 거짓으로, 거짓이면 참으로 출력 (논리부정 연산자)
 
 
BETWEEN AND 연산자

--Between and 연산자--
--해당 값 사이의 값을 출력할 수 있다--
select * from emp where sal >= 2000; --2000보다 큰 직원정보--
select * from emp where sal <=3000; --3000보다 작은 직원정보--
select * from emp where sal >=3000; --3000보다 큰 직원정보--
select * from emp where sal >=2000 and sal <=3000; --2000이상 3000이하--

select * from emp where sal between 2000 and 3000;
--between and 연산자를 사용하면 깔끔하게 해당 값 사이의 값들을 출력할 수 있다--
select * from emp where sal not between 2000 and 3000;
--between 앞에 not을 이용하면 사이에 해당하지 않는 값들만 출력이 된다--

select * from emp where sal between 2000 and 3000;

 

select * from emp where sal not between 2000 and 3000;

BETWEEN AND 연산자의 형식은 컬럼명 BETWEEN A AND B      <-- A(최솟값), B(최댓값)의 형식으로 작성하며 NOT을 붙여 사용하는 컬럼명 NOT BETWEEN A AND B  <-- A(최솟값), B(최댓값) 경우에는 특정 값 사이에 속하지 않는 값들을 출력한다. 
 
 
IN 연산자

--in 연산자--
--in, not in--
--사원테이블에서 comm이 300,500,1400인 사원 출력--
select * from emp where comm = 300 or comm =500 or comm=1400;
select * from emp where comm in (300,500,1400);

--사원테이블에서 comm이 300,500,1400이 아닌 사원 출력
select * from emp where comm != 300;
select * from emp where comm !=500;
select * from emp where comm !=1400;
select * from emp where comm != 300 and comm !=500 and comm != 1400;
select * from emp where comm not in(300,500,1400);

--사원테이블에서 JOB이 'MANAGER', 'SALESMAN', 'CLERK'의 사원의 모든 컬럼을 출력한다.--
select * from emp where job in ('MANAGER', 'SALESMAN', 'CLERK');

select * from emp where comm in (300,500,1400);

IN연산자의 경우 컬럼명 IN (A, B, C), 컬럼명 NOT IN (A, B, C)의 두가지로 사용할 수 있다. IN연산자의 경우 where절에 나열해야하는 조건들을 하나의 구문으로 깔끔하게 작성할 수 있는 장점이 있다.
* not in 연산자의경우 서브쿼리 사용시 null과 만나면 아무것도 출력되지 않는다* 
 
 
like 연산자와 와일드 카드

--like 연산자와 와일드 카드--
select * from emp where ename like 'S%'; --S로 시작하는 직원출력--
select * from emp where ename like 'F%';--F로 시작하는 직원 출력--
select * from emp where ename like 'K%'; --K로 시작하는 직원 출력--
select * from emp where ename not like 'S%'; --S로 시작하지 않는 직원 출력--

select * from emp where ename like '%CO%';
select * from emp where ename like '__OT_'; --_는 정확한 한 글자를 의미한다--

-- 사원테이블에서 사원명(ENAME)이 첫 글자가 어떤 문자로 시작해도 상관없고--
-- 두 번째 문자가 L이고 나머지 문자들이 %(0개 이상인) 모든 사원의 모든 컬럼을 출력한다.--
select * from emp where ename like '_L%';

select * from emp where ename like '_L%';

LIKE 연산자는 검색하는 값을 정확히 모를 경우에 사용하며, 와일드 카드의 패턴에는 다음과 같이 두 가지 와일드 카드가 사용된다.
%: 문자가 없거나 하나 이상의 문자에 어떤 값이 와도 상관없다.
_: 하나의 문자에 해당하며 어떤 문자가 와도 상관없다.

이런 와일드 카드와 like연산자를 사용하게 되면 보고싶은 전부다 적지 않아도, 그에 해당하는 값을 빠르게 출력할 수 있다.


 
IS NULL,  IS NOT NULL

--is null, is not null--

select comm from emp; --널이 포함되어있는 열--
--null값은 =연산자로 출력이 불가하다--
select * from emp where comm = null; --공집합 출력--
select * from emp where comm is null;
select * from emp where comm is not null;

select * from emp where mgr is null;
select * from emp where mgr is not null;

select * from emp where comm is null;

 

select * from emp where comm is not null;

 
IS NULL, IS NOT NULL은 NULL을 위한 연산자이다.
NULL은 값이 없음을 나타내기 때문에 NULL은 연산을 하거나 비교하는 것이 불가능하다.

-- 사용법이 틀린 경우
-- NULL 값을 연산자 = 로 판단할 수 없기 때문에 EMP 테이블에서 커미션(COMM)의 NULL인 사원을 찾지 못한다.
SELECT * FROM EMP WHERE COMM = '';   -- MySQL, MariaDB (O), Oracle (X)
SELECT * FROM EMP WHERE COMM = NULL; -- MySQL, MariaDB (O), Oracle (X)
SELECT * FROM EMP WHERE COMM = null; -- MySQL, MariaDB (O),Oracle (X)

 



 
where절

--where절 사용하기 
--where절은 데이터를 조회할때 조건을 지정해서 원하는 데이터를 출력하는데 사용--
select * from emp;

--emp테이블에서 부서번호가 30인 사원만 출력한다--
select * from emp where deptno=30;

--emp테이블에서 부서번호가 10인 사원만 출력한다--
select * from emp where deptno=10;

--사원테이블에서 사원명이 JAMES만 출력한다
select * from emp where ename='JAMES';
select * from emp where ename="JAMES";
--오라클에서 홑따옴표는 문자열 값을 나타내는데 사용되므로 정상 실행된다--
--쌍따옴표는 식별자(테이블명, 열명)등에 주로 사용된다.--
--그러므로 열이나 테이블명이 아니라 값인 JAMES에는 홑따옴표를 붙여사용한다--


--사원테이블에서 사원명이 SAL이 5000인 직원만 출력한다
select * from emp where sal=5000;
select * from emp where sal='5000';
--묵시적 형변환 때문에 숫자식 문자형은 정상 출력됨!--

select * from emp where deptno=30;

where절은 from절 뒤에 위치하며 조건을 검색할때 사용된다. 또한 ' '홑따옴표를(작은따옴표)를 사용하게 되면 작은 따옴표 안에 있는 글자는 대소문자 비교를 하게 된다. where절은 쿼리문에서 select 하기전에 출력될 결과물의 조건 및 제한을 걸어주는 것과 같으므로 여러 명령어 및 연산자와 함께 사용되는 경우가 많다.

--논리연산자와 where--
select * from emp where deptno=30 and job='SALESMAN';
select * from emp where deptno=10 or deptno=20;

--[활용]--
--산술연산자를 이용해서 SAL컬럼에 12를 곱한값이 36000과 동일하면 출력하기--
select * from emp where sal*12=36000;
--관계연산자를 이용해서 SAL컬럼이 3000 이상인 직원 출력하기--
select * from emp where sal >=3000;

대체로 논리연산자와 사용되는 경우가 많으며, 이외에도 in 이나 서브쿼리에서는 연관쿼리로 사용된다.
 



아스키코드활용

--아스키코드표와 where--
select * from emp where ename > 'F'; --아스키 코드표를 참고해서 F보다 큰 숫자를 가지는 문자들 출력--
select * from emp where ename <='FORZ';

 

select * from emp where ename &lt;='FORZ';

[아스키 코드 참고 표]

 

ASCII - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 1972 프린터 사용 설명서에 개시된 아스키 코드 차트표 미국정보교환표준부호(영어: American Standard Code for Information Interchange), 또는 줄여서 ASCII( , 아스키)는 영문

ko.wikipedia.org

모든 문자는 각 문자에해당하는 숫자값을 가지고 있다. 이를 아스키코드라고 부르는데 이 아스키 코드를 활용해서 해당 문자값보다 더 크거나 작은 문자값들을 추출할 수 있다.
 


학습일기

복습하면서 dual 테이블이 실무에서 생각보다 자주 사용된다는 강사님의 말이 기억이 났다. 수업때는 단순 연산결과를 반환했지만 내가 작성하고자 하는 쿼리문이 제대로 잘 작동하는지 테스트용으로도 많이 사용한다고 하셨다. 그리고 where절이 구문 전체를 출력하는 결과값에 조건을 걸어주는 역할을 하는만큼, 이 where절에 조건을 거는게 사실상 쿼리문에서 가장 기본이자 중요한 부분이라고 하신것도 다시 상기할 수 있었다. 강사님의 말씀처럼 단순해 보이더라도 where절과 같이 쿼리문의 중심이 되는 where절 사용법에 대해 연습이 필요할것 같다.