본문 바로가기

sql

2. SELECT 문의 산술, 비교, 논리 연산자

728x90
반응형

sql 이란?

-structure Query language 약자로

데이터 베이스에 구조적 질의 언어

-데이터를 검색하고 조작할 있는 언어

 

SQL 종류?

  1. Query database 데이터를 검색하는 언어

: select 문의 6가지절

 

  1. DML database 데이터를 조작 삭제하는 언어

: insert, update, delete, merge

data manipulation language

*manipulation 교묘한 처리, 솜씨있는 취급

 

  1. DDL database 테이블과 같은 object 관리하는 언어

: create, alter, drop, truncate, rename

data definition language

 

  1. DCL database 사용자들의 권한을 관리하는 언어

: grant, revoke

data control language

 

  1. TCL database data 저장할 아니면 저장하지 않고 취소할지를 결정하는 언어

: commit, rollback, savepoint

Tool command language

 

 

Query

 

**도스창을 이용한 sqlplus 안좋다 보안상 취약. sqlgate 쓰는게 좋다.

 

 

문제8. 사원 테이블 전체를 검색하시오.

select * from emp;

 

*sqlgate 컨트롤+엔터

 

 

SELECT 문의 산술, 비교, 논리 연산자

(1-10)

 

오라클의 연산자

 

1. 산술 연산자: * / + -  (곱하기 나누기 )

2. 비교 연산자: > , <, >=, <=, =,     <>, !=, ^= ( 세가지가 '같지않거나')

3. 논리 연산자: and, or, not

 

 

 

 

문제10. 이름, 월급, 커미션, 월급+커미션 출력하시오!

 

*4주차 공부중인 내가 문제를 잠깐 고민했던

월급+커미션이 과연 그룹일까 였던 건데,

자체내 합계는 그룹과 상관없다.

select ename, sal, comm, sal+comm from emp;

 

* , 커미션 없는 사람들의 월급조차 안나온다.

비어있는 부분을 null 지정해줘야

>>고치면

select ename, sal comm, nvl(comm,0)  from emp;

 

comm 없는 사람들 sal 보고 싶으면

select ename, sal, comm, nvl(comm, 0), sal+nvl(comm, 0)

from emp;

 

설명: comm 에서 비어있는 부분을 null 이라고 한다.

 

*null 값이란?

1. 데이터가 없는 상태

2. 없는

ex) 3000+ null( 없는 ) = 없는

*0 공백과는 다르다.

 

 

 

nvl  함수

null 대신에 지정된 다른 값을 출력하는 함수

 

: select ename, sal, comm, nvl(comm,0)

    from emp;

comm 없는 사람은 0 으로 출력해라 라는

 

 

연결 연산자 ||

 

문제11. 이름과 월급을 출력하는데 연결연산자를 사용해서 연결해서 출력하시오

select ename|| sal

from emp;

 

 

문제12. 이름과 월급을 출력하는데 아래와 같이 문자열로 출력되게 하시오!

                  scott 월급은 3000 입니다.

: select ename || ' 월급은 ' || sal || '입니다'

     from emp;

 

 

 

sql gate 에서 한글 괴상하게 나오면

연결해제-유니코드 체크

 

문제13. 아래와 같이 결과를 출력하시오

       scott "월급" 3000 입니다.

 

select ename || ' ''월급'' || sal || '입니다' from emp;

*월급 앞뒤로 "( 따옴표) 한번 또는 ''(작은따옴표) 두번

 

q 안쓰고 가능

 

 

 

문제14. dept 테이블의 구조를 확인하시오

desc dept

*describe 약자

 

 

 

컬럼명 지정

select ename as 이름, sal as 월급 from emp;

              *퀄럼별칭

as 생략 가능하다. 공백문자나 특수문자를 컬럼 별칭으로 사용하려면 양쪽에 더블 쿼테이션 마크를 사용해야한다.

대소문자를 구분하고자 때도 더블 쿼테이션 마크를 사용해야 한다

 

 

 

 

문제15. 이름과 월급과 직업을 아래와 같이 출력하시오

employee name    salary     job

---------------------    --------     -----

SCOTT                     3000      ANALYST

     :                              :                :

     :                              :                :

 

select ename as "employee name",  sal as "salary",  job as "job" from emp;

*employee name 같이 띄어쓰기가 들어가는데 하나의 덩어리로 인식시켜야 하므로 쿼테이션 써줌.

*job 이라고 설정 안해주면 대문자로 나옴.[원하는 문자가 아님]

*as 뒤에 한글쓰는건 구별되니까 쿼테이션 안쓰는데

같은 영어로 구분을 위해 쿼테이션 붙여야함.

 

 

 

*1장에서 배운 내용 정리

1. 기본 select

2. distinct (중복제거 키워드)

3. 산술 연산자

4. 컬럼 별칭 사용법

5. describe (테이블 구조 확인)

6. 연결 연산자 (||)

7. null 값이 무엇인지

 

 

 

 

2. where 절과 order by 사용법

select  ename, sal --컬럼명

from emp               --테이블명

where sal = 3000; --검색조건

 

내가 보고자 하는 데이터만 설정하기 위해

where 사용        

: where sal = 3000;

월급이 3000 사람만 갖고와봐 라는 명령어

 

select ename, sal from emp;

where sal=3000;

 

 

 

 

문제16. 커미션이 300 사원의 이름과 커미션과 직업을

출력하시오

select ename, comm, job from emp;

where comm=300;

 

 

문제17. 이름이 scott 사원의 이름과 월급을 출력하시오

select ename, sal from emp

where ename='SCOTT';

에러뜸

같은 영어문자라서.

대문자 써야함.

숫자, 한글과는 다르게 문자와 날짜 양쪽에 싱글 쿼테이션 마크를 사용해야 한다.

그리고 데이터가 대문자로 저장 되어있으면 대문자로 검색해야 한다.

select ename, sal from emp

where ename='SCOTT';

 

 

 

 

문제18. 직업이 SALESMAN 사원들의 이름과 직업을 출력하시오

select ename, job from emp

where job='SALESMAN';

 

 

문제19. 부서번호가 10번인 사원들의 이름과 월급과 직업과 부서번호를 출력하시오

select ename, sal, job, deptno

from emp

where deptno=10;

 

 

 

문제20. 1981 11 17일에 입사한 사원의 이름과 입사일을 출력하시오

select ename, hiredate

from emp

where hiredate='1981 11 17';

*날짜니까 싱글쿼테이션 써야함

 

SQL gate 에서 위의 sql 에러가 난다.

이유는 날짜 형식이 SQL*PLUS(cmd작업) 달라서 이다.

*현재 세션의 날짜 형식을 확인하는 방법

미국식의 dd-mm-yy(--) 으로 셋팅되어있어서.

 

select * from nls_session parameters;

*nls=national language support

 

select * from emp

where hiredated='17-NOV-81';

 

sql gate 안되는데???????????

국내 개발자가 만든건데 문제가 많다고 한다

 

 

 

문제21. (점심시간 문제)

월급이 1500 이상인 사원들의 이름과 월급을 출력하시오

select ename, sal from emp

where sal>=1500;

 

*작업시 sqlgate 안들으면

/*~~~~~~*/

슬래쉬와 * 이용해서 무효화

 

 

 

 

문제22. 나이가 27살인 학생들의 이름과 나이와 전공을 출력하시오

select age, major varchor2 from emp2 where age = '27';

 

 

문제23. sk 텔레콤을 사용하는 학생들의 이름과 나이와 텔레콤을 출력하시오

select ename, age, telecom from emp2

where telecom='sk';

 

**만약 학생 sk 대문자로 작성했다면

where telecom='sk' or telecom='SK';

 

 

문제24. 30 이상인 학생들의 이름과 나이를 출력하시오

select ename, age from emp2

where age >='30';

 

 

문제25. 컴퓨터 공학과인 학생들의 이름과 전공을 출력하시오

select ename, major from emp2 where major = '컴퓨터공학과';

 

 

문제26. 통계학과인 학생들의 이름과 전공을 출력하시오

select ename, major from emp2 where major='통계학과';

*응용통계학과 학생도 포함 시키고 싶다면

 

 

 

 

기타 비교 연산자(between, like, in, is null)

(94페이지)

1. between...and

2. like

3. in

4. is null

 

 

between...and 연산자

 

문제27. 월급이 1000 에서 3000 사이인 사원들의 이름과 월급을 출력하시오

select ename, sal from emp where sal between 1000 and 3000;

**주의: 낮은값 먼저 써야

 

 

 

문제28. 나이가 25 에서 30 사이가 아닌 학생들의 이름과 나이를 출력하시오

select ename, age from emp2 where age not between 25 and 30;

또는

where age < 25 and age >30;

*where age>30 and age<25 안나옴. 작은값부터 써야

 

문제29. 전공에 통계가 포함되어져 있는 학생들의 이름과 전공을 출력하시오

select ename, major from emp2 where major like '%통계%';

 

 

※설명: like ~처럼, ~ 같은

like '%통계%' >>>>>>>>>>>통계 앞뒤 자리에 뭐가 와도 관계없다, 갯수가 몇개가 와도 관계없다(wild card)

 

 

*****만약에 in 써서 찾으려면

select ename, major from emp2

where major in ('통계학과');

**'통계' 까지만 쓰면 부분이라 컴터가 못읽음

그래서 like 이용해서 부분검색으로도 잡아내는 것임.

 

 

문제30. 서울에서 사는 학생들의 이름과 주소를 출력하시오

select ename, address from emp2 where address like '%서울%';

 

 

문제31. 이름에 글자가 S 시작하는 사원들의 이름을 출력하시오

select ename from emp where ename like 'S%';

 

 

문제32. 이름의 끝글자가 진으로 끝나는 학생들의 이름을 출력하시오

select ename from emp2 where ename like '%';

설명: % 특수문자 % 아닌 wild card 인식하려면

연산자를 반드시 = 아닌 like 사용해야한다.

 

 

 

문제33. 이름의 두번째 글자가 '' 자인 학생들의 이름을 출력하시오

select ename from emp2 where ename like '__';

**%% 하면 '' 위치 상관없이 들어간 학생들이 출력된다.

 

 

※설명: 98페이지

  %: 자리에 뭐가 와도 관계없고 철자의 갯수도 관계없다

  _: 자리에  뭐가 와도 관계없는데 철자의 갯수는

     한개여야 한다.

 

 

문제34. 이름의 세번째 철자가 L 사원들의 이름을 출력하시오

select ename from emp where ename like '__L%';

 

insert into emp(empno, ename, sal)

values(2121, 'A%B', 3400);

commit;

 

 

문제35. 이름의 두번째 철자가 % 사원의 이름을 출력하시오

select ename from emp where ename like '_%%';

*근데 다나옴;;;;

특수문자 인식시키고

wild card 인식시키고 싶으면

 

select ename from emp

where ename like '_m%%'  escape 'm';

*m 임의 문자. k 딴걸로 해도 상관없음.

설명:

m 바로 다음에 나오는 % wild card 아니라 특수문자 % 인식해라 라는 .

 

 

insert into emp(empno, ename, sal)

values(1343, 'A%%B', 4000);

commit;

 

 

문제36. 이름의 두번째 철자도 %이고 세번째 철자도 % 사원들의 이름을 출력하시오

select ename from emp

where ename like '_m%m%%' escape 'm';

 

 

문제37. 통계관련 학과가 아닌 학생들의 이름과 전공을 출력하시오

select ename, major from emp2

where major not like '%통계%';


*
만약 not like '통계' 라고만 쓰면 25 과가 나온다.

 

 

문제38. 네이버 메일 사용하는 학생들의 이름과 이메일을 출력하시오

select ename, email from emp2

where email like '%naver%' or email like '%NAVER%';

 

 

 

문제39. 사원번호가 7788 번인 사원의 사원번호와 이름을 출력하시오

select ename, empno from emp

where empno = '7788';

 

 

 

문제40. 사원번호가 7788, 7902, 7369 번인 사원의 사원번호와 이름을 출력하시오

(= 이용해서 쿼리짜시오)

select ename, empno from emp

where empno = 7788 or empno = 7902 or empon = 7369;

또는

select ename, empno from emp

where empno in (7788, 7902, 7369);

**

만약

where empno=7788, 7902, 7369 라고 쓰면 3가지를 동시에 만족시키는 값이여야 하기때문에 안됨.

 = 단일연산자 입니다.

 

 

문제41. 직업이 SALESMAN 이거나 ANALYST 사원들의 이름과 직업을 출력하시오

select ename, job from emp

where job in ('SALESMAN', 'ANALYST');

*영어문자라서 작은따옴표 .

 

 

문제42. 부서번호가 10, 20번이 아닌 사원들의 이름과 부서번호를 출력하시오

select ename, deptno from emp

where deptno not in (10, 20);

 

 

is null 연산자

 

문제43. 커미션이 null 사원들의 이름과 커미션을 출력하시오

select ename, comm from emp

where comm is null;

 

*where comm = null; 이라고 쓰면 안되는 이유는

null 없는 값이라 비교가 안된다. (= 비교연산자)

그래서 비교연산자가 아닌

is null 이라고 한다.

 

 

문제44. 커미션이 null 아닌 사원들의 이름과 커미션을 출력하시오

select ename, comm from emp

where comm is not null;

 

 

연산자 3가지

1. 산술연산자

2. 비교 연산자

3. 논리 연산자: and, or, not

 

논리연산자

 

문제45. 직업이 SALESMAN 이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오

select ename, sal, job from emp

where job = 'SALESMAN' and sal>=1000;

 

 

 

*****************and or 차이가 내용을 다르게 한다

 

select ename, sal, job from emp

where job = 'SALESMAN' or sal>=1000;

 

 

 

설명: true and true = true

               ture and false = false

              true and null = null

            *null true/false 냐를 모르니까.

 

            true or false = true

 

            true or null  =  true

                *null true/false 하나니까.

 

        false or null = null

          *null true/false 하나니까 null

 

       false and null = false

          *null true false (and 니까!)

           null false false

 

 

언제 or 쓸지 and 쓸지 정해야 한다. 중요하다.

 

 

and, or 연산자의 우선순위

 

문제46. 직업이 SALESMAN 이거나 CLERK 이고 월급이 1000 이상인 사원들의 이름과 월급과 직업을 출력하시오

select ename, sal, job from emp

where job ='SALESMAN' or job ='CLERK' and sal>=1000;

 

*or, and 이런거 어떤게 먼저 수행되는지 알아야 한다.

 

 

*만약 and 보다 or 먼저 하고 싶으면 괄호로 묶어주면 된다.

select ename, sal, job from emp

where (job ='SALESMAN' or job ='CLERK') and sal>=1000;

 

 

 

문제47. 통신사가 kt 이거나 lg 이고 나이가 25 이상인 학생들의 이름과 나이와 통신사를 출력하시오

select ename, age, telecom from emp2

where telecom = 'kt' or telecom='lg' and age>=25;

 

괄호를 묶으면

select ename, age, telecom from emp2

where (telecom = 'kt' or telecom='lg') and age>=25;

값이 달라진다.

 

문제48.(마지막 문제)

아래와 같이 결과를 출력하시오

엄한솔 학생은 27살이고 전공이 프랑스어학과이며 sk 통신사를 사용하고 있습니다.

.........이런식으로...........

우리반 전부 출력하시오

 

select ename ||' 학생은 '||age||' 이고 전공이 '||major||'이며'||telecom||'통신사를 사용하고 있습니다.' from emp2;

 

 

 

order by (109페이지)

 데이터를 정렬하는

ex) select ename, sal from emp

order by sal asc;

※설명: 이름과 월급을 출력하는데 월급이 낮은 값부터 출력하시오

(오름차순)

 

 

※옵션: asc->>낮은값부터 출력

         dsc->>높은값부터 출력(내림차순)

 

월급 높은값부터 출력하려면

select ename, sal from emp

order by sal desc;

 

 

문제49. 우리반 테이블에서 이름과 나이를 출력하는데

나이가 높은학생부터 출력하시오

select ename, age from emp2

order by age desc;

 

 

문제50. 직업이 SALESMAN 사원들의 이름과 직업과 입사일을 출력하는데 최근에 입사한 사원부터 출력하시오

select ename, job, hiredate

from emp

where job ='SALESMAN'

order by hiredate desc;

※설명: SQL 작성 규칙(페이지 64)

 

 

 

대소문자를 구분하지는 않으나 현업에서 대부분 소문자를 쓴다.

줄에 연속 입력해도 상관없으나, 바꿈 해줌으로서 에러잡기

편하게 습관들이는게 좋다.

가독성을 높이기 위해 들여쓰기를 사용하라

 ex) select ename, sal

        from emp

        where job='SALESMAN'

        order by sal desc;

 

문제 51. 통계학과인 학생들의 이름과 나이와 전공을 출력하는데

나이가 높은 학생부터 출력하시오

select ename, age, major

from emp2

where major like '%통계%'

order by age desc;

 

 

 

※오라클 내부적 실행순서

from>> where>> select>> order

 

증명을 위한 비교 실험

select ename, age, major

from emp2

where major like '%통계%'

order by age desc;

 

select ename, age as 나이, major

from emp2

where major like '%통계%'

order by age desc;

 

*문제없이 된다. select 영향을 미치는 order by 뿐이니까.

 

select ename, age as 나이, major as 전공

from emp2

where 전공 like '%통계%'

order by age desc;

 

*select 에서 설정한 값이 where 에서 먹히는 이유가

select 나중에 실행되기 때문이다.

그렇게 순서 증명 ㅇㅋ

 

 

문제52.  직업, 이름, 월급을 출력하는데 직업은 abcd 순으로 정렬해서

출력하고 직업이 abcd 순서 정렬되어 있는 것을 기준으로

월급은 높은순으로 출력하시오

select job, ename, sal

   from emp

   order by job asc, sal desc;

**알파벳도 오름, 내림차순 가능하다

 

컬럼column 활용

select job, ename, sal

   from emp

   order by 1 asc, 3 desc;

컬럼(column)이란 관계형 데이터베이스 테이블에서 특정한 단순 자료형의 일련의 데이터값과 테이블에서의 각 열을 말한다

 

 

문제53. 월급이 1000에서 3000 사이인 사원들의

이름과 월급을 출력하는데

월급이 높은 사원부터 출력하시오

select ename, sal from emp

where sal between 1000 and 3000

order by sal desc;

 

 

 

■치환변수 &

같은 SQL 인데 값만 다르게 해서 반복 수행해야하는 작업을

작업을 쉽게 있는 키워드

 

 

)

select ename, sal, job

from emp

where empno= &empno;

 

**sqlplus 에서는 먹히고

sqlgate 에서는 먹힘

(안중요 하다고 하심.)

 

 

■서울시 물가 데이터 테이블 생성 데이터 입력

 

select * from price;

 

건인지 세고 싶으면

select count (*) from price;

 

 

문제54. 남대문 시장에서 파는 물건과 가격을 출력하는데

가격이 높은것 부터 출력하시오

 

select a_name, a_price, a_unit

from price

where m_name='남대문시장'

order by a_price desc;

 

 

문제55. m_name(판매처) 중복제거해서 출력하시오

select distinct  m_name from price;

 

 

 

문제56. 신세계 백화점에서 파는 물건이름과 가격과

단위(a_unit) 출력하는데 가격이 높은것 부터 출력하시오

select a_name, a_price, a_unit

from price

where m_name = '신세계백화점'

order by a_price desc;

728x90
반응형

'sql' 카테고리의 다른 글

5. NVL, DECODE, CASE  (0) 2019.03.30
4. 날짜함수  (0) 2019.03.30
3. 단일행 함수  (0) 2019.03.30
1. SQL 설치 및 테이블, 컬럼 소개  (0) 2019.03.30
오라클 설치  (0) 2018.12.28