Oracle DBA SQL 230622

sskit·2023년 7월 11일
0

OracleSQL

목록 보기
1/19
post-thumbnail
  • 오라클 설치 순서
  1. otn.oracle.com 으로 접속해서 18c express edition 을 다운로드
    받습니다.
  2. 다운로드 받은 폴더가 한글이 있으면 안됩니다.
    (무조건 영문으로 하세요 ~)
    18c   ---> cloud  (  구글 드라이브, 네이버 드라이브를 연상 )
    
    메모 프로그램 :    원노드, 노션등에 수업내용을 정리하시면 됩니다.
    
    수업내용을 잘 노트해서 현업에서 노트 보면서 일하시면 됩니다.
    
    문제 ---> 답 --->  설명
    
    오라클을 좀더 편안하게 사용할 수 있게하는 툴(소프트웨어)
    
    SQL수업 : sqldeveloper(무료),   SQLgate(유료),  orange(유료), toad (유료)

▣ 오라클 database 에 접속하는 방법

  1. 도스창(명령 프롬프트)을 엽니다.
    시작 버튼 옆에 검색에 cmd 라고 하고 엔터를 치세요
  2. 도스창에서 sqlplus "/ as sysdba" 하고 엔터 치세요.

▣ 001 테이블에서 특정 열(COLUMN) 선택하기

emp 테이블 소개 :

사원 14명에 대한 정보가 들어있는 테이블입니다.

컬럼 : empno : 사원번호
ename : 사원이름
sal : 월급
job : 직업
hiredate : 입사일
mgr : 관리자의 사원번호
comm : 커미션
deptno : 부서번호

예제1. 사원 테이블에서 사원번호, 이름, 월급을 출력하시오 !

select empno, ename, sal
from emp ;

문제1. 사원 테이블에서 이름과 직업과 부서번호를 출력하시오 !

답:

select ename, job, deptno
from emp;

문제2. 사원 테이블에서 이름과 입사일, 월급, 커미션을 출력하시오

답: select ename, hiredate, sal, comm

     from   emp;

설명: SQL 이 앞으로 길어질거기 때문에 아래로 작성하세요.
그리고 가독성을 위해서 들여쓰기를 사용하세요 !

▣ 002 테이블에서 모든 열(COLUMN) 출력하기

예제2. emp 테이블에서 모든 컬럼과 데이터를 출력하시오!

set lines 300
set pages 400

select *
from emp;

설명: * 를 사용하지 않고 모든 컬럼을 다 검색하려면 다음과 같이
해야합니다.

select empno, ename, sal, job, deptno, hiredate, comm, deptno
from emp;

문제3. dept 테이블의 모든 컬럼과 데이터를 조회하시오 !

답:
select *
from dept;

문제4. 부서 테이블에서 부서번호와 부서명을 출력하시오 !

답: select deptno, dname
from dept;

▣ 003 컬럼 별칭을 사용하여 출력되는 컬럼명 변경하기

select empno as 사원번호, ename as 사원이름, sal as "Salary"
from emp;

설명: 컬럼별칭을 이용해서 출력되는 컬럼명을 다른 이름으로
변경할수 있습니다. 컬럼명 옆에 as 쓰시고 컬럼별칭을
작성하면 되는데 만약 공백문자나 특수문자 그리고
대소문자를 구분해서 사용하고 싶다면 양쪽에 더블 쿼테이션
마크를 사용하면 됩니다.

※ 오라클 전체를 통틀어서 더블 쿼테이션 마크를 사용할 일은
이것밖에 없습니다.

문제4. 사원이름, 직업, 부서번호를 출력하는데 출력되는 컬럼명이
전부 한글로 이름, 직업, 부서번호로 출력되게하시오 !

답 :

select ename as 사원이름, job as 직업, deptno as 부서번호
from emp;

오라클에 접속해서 편하게 데이터를 검색할때 사용하는 툴이
있습니다. 그 툴을 설치하겠습니다.

sqldeveloper 라는 툴을 설치하겠습니다.

otn.oracle.com <-- sqldeveloper 툴을 다운로드 받겠습니다.

무료 tool : sqldeveloper

유료 tool : sqlgate, orange , toad (30일 평가판은 사용가능)

문제5. 사원이름, 월급, 커미션을 출력하시오 !

select ename, sal, comm
from emp;

문제6. ename 과 sal 을 출력하는데 컬럼명이 소문자로 ename, sal
이라고 출력되게하시오 !

답: select ename as "ename" , sal as "sal"
from emp;

설명: 출력되는 컬럼명의 대소문자를 구분하고 싶다면
더블쿼테이션 마크를 사용해야 합니다.

▣ 004 연결 연산자 사용하기(||)

 연결 연산자를 사용하면 컬럼과 컬럼을 서로 연결해서
 출력할 수 있습니다.  연결 연산자는 엔터키위에 수직바(|)를
두번 연달아 쓴거 입니다.

예제4. 이름과 월급을 서로 연결해서 출력하시오 !

select ename || sal
from emp;

문제7. 이름과 월급을 출력하는데 다음과 같이 문자열로 출력하시오

예: KING 의 월급은 5000 입니다.

답: select ename || ' 의 월급은 ' || sal || ' 입니다 '
from emp;

설명: 싱글 쿼테이션 마크를 둘러줘야하는 이유는 싱글 쿼테이션
마크 안에 있는것이 '문자'
다 라는것을 오라클에게 알려주는
것 입니다.

문제8. 다음과 같이 결과를 출력되게 SQL을 작성하시오 !

KING의 직업은 PRESIDENT 입니다.
답: select ename || ' 의 직업은 ' || job || '입니다.'
from emp;

▣ 현업에서 가장 많이 사용하는 데이터 베이스

  1. Oracle

  2. MySQL ( Maria db )
    유료 무료

  3. 기타

    MySQL 을 설치 하겠습니다.

    나머지 시간은 자유롭게 자습 하시면 됩니다. ~~

dba 양성자반 수업 :

  1. SQL : Oracle
    mySQL

  2. 파이썬

  3. 하둡과 스파크

  4. DB 관리

  5. DB 백업

  6. DB 튜닝

sqldeveloper 를 켜주시면 되는데

▣ MySQL 을 켜는 방법

시작 버튼을 누르고 Mysql workbench 를 클릭하세요 !

문제9. (복습문제) 사원 테이블에서 이름과 월급과 부서번호를
출력하는데 출력되는 컬럼명을 한글로 이름, 월급, 부서번호가
되게하시오 !
답:

Oracle> select ename as 이름, sal as 월급 , deptno as 부서번호
from emp;

MySQL> select ename as 이름, sal as 월급 , deptno as 부서번호
from emp;

설명: 이 SQL 수행하는 어떤 프로세서가 있는데 이 프로세서
이 SQL 을 수행할 때 FROM 절을 먼저 수행합니다.

"SQL 튜닝" 을 할때 이 실행순서를 알면 큰 도움이 됩니다.

데이터를 빠르게 검색하게하는 기술

▣ 005 중복된 데이터를 제거해서 출력하기(DISTINCT)

예제. 사원 테이블에서 직업을 출력하시오 !

select job
from emp ;

예제. 위의 결과를 다시 출력하는데 중복을 제거해서 출력하시오 !

select distinct job
from emp;

문제10. 사원 테이블에서 부서번호를 출력하는데 중복을 제거해서
출력하시오!

select distinct deptno
from emp ;

▣ 006 데이터를 정렬해서 출력하기(ORDER BY)

예제. 이름과 월급을 출력하는데 월급이 낮은 사원부터 높은 사원순으로
출력하시오 !

select ename, sal
from emp

order by 정렬할 컬럼명 정렬방법;

select ename, sal
from emp
order by sal asc;

※ 정렬방법 :

  1. asc : 오름차순으로 정렬
  2. desc : 내림차순으로 정렬

문제11. 이름과 월급과 입사일을 출력하는데 최근에 입사한 사원부터
출력하시오 !

select ename, sal, hiredate
from emp
order by hiredate desc;

코딩 순서 : select ---> from ---> order by
실행 순서 : from ---> select ---> order by

문제12. 위의 결과를 다시 출력하는데 출력되는 컬럼명이 한글로
이름, 월급, 입사일로 출력되게 하시오 !

select ename as 이름, sal as 월급, hiredate as 입사일
from emp
order by 입사일 desc;

※ 실행순서 때문에 order by 절에 컬럼별칭을 사용하는게 가능합니다.

※ ORDER BY 절에 컬럼명, 컬럼별칭, 또는 컬럼 순서에 대한 숫자를
쓸 수 있습니다.

select ename, sal, hiredate
from emp
order by 3 desc;

문제13. 이름과 부서번호와 월급을 출력하는데 부서번호를 ascending
하게 출력하시오 ! ( order by 절에 컬럼순서인 숫자를 넣어서
수행하세요 )

답: select ename, deptno, sal
from emp
order by 2 asc ;

※ order by 절에 정렬할 컬럼을 여러개 쓸 수 있습니다.

문제14. 이름과 부서번호와 월급을 출력하는데 부서번호를 ascending
하게 출력하고 부서번호를 ascending 하게 정렬된것을 기준으로
월급을 descending 하게 출력하시오!

select ename, deptno, sal
from emp
order by deptno asc , sal desc ;

문제15. 이름, 직업과 입사일을 출력하는데 직업별로 가장 먼저 입사한
사원들을 보기 위해서 직업을 ascending 하게 정렬해서 출력
하고 그리고 이렇게 두고서 입사일을 먼저 입사한 사원부터
출력되게 하시오!

select ename, job, hiredate
from emp
order by 2 asc, 3 asc ;

▩ 우리반 테이블(emp17) 생성

drop table emp17;

create table emp17
( empno number(10) ,
ename varchar2(20),
gender varchar2(10),
birth date ,
age number(10),
telecom varchar(10),
email varchar2(30),
major varchar2(30),
address varchar2(100) );

insert into emp17
values( 1, '홍길동', '남', to_date('1997/12/11', 'RRRR/MM/DD'),
32, 'sk', 'abcdefg@gmail.com', '피아노학과', '서울시 강남구' ) ;

문제16. 우리반 테이블에서 이름과 나이와 전공을 출력하는데
나이가 높은 학생부터 출력하시오 !

select ename, age, major
from emp17
order by age desc;

문제17. 우리반에서 나이만 출력하는데 중복을 제거해서 출력하시오

select distinct age
from emp17;

문제18. 위의 결과를 다시 출력하는데 나이가 낮은 학생부터
높은 학생순으로 출력하시오 !

select distinct age
from emp17
order by 1 asc ;

문제19. 우리반 테이블에서 모든 컬럼과 데이터를 출력하는데
나이가 높은 학생부터 출력하시오 !

select *
from emp17
order by age desc ;

문제20. 우리반 테이블에서 모든 컬럼과 데이터를 출력하는데
사원번호 순으로 출력하시오 !

select *
from emp17
order by empno asc ;

설명: order by 절에서 정렬방법인 asc 와 desc 를 생략하면
기본값이 asc 입니다.

문제21. 우리반 테이블에서 통신사를 출력하는데 중복을 제거해서
출력하시오 !

select distinct telecom
from emp17;

문제22. (점심시간 문제) 우리반 테이블에서 주소와 이름과 나이를
출력하는데 주소를 ascending 하게 출력하고 이걸 기준으로
두고 이름을 ascending 하게 출력하시오 !

select address, ename, age

from emp17

order by address asc, ename asc;

▣ 007 WHERE절 배우기 1(숫자 데이터 검색)

where 절을 사용해서 특정 조건에 맞는 데이터만 검색할 수 있습니다.

문법: select 컬럼명
from 테이블명
where 검색조건 ;

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

select empno, ename
from emp
where empno = 7788;

※ 숫자는 그냥 위와같이 작성하면 되는데 문자와 날짜를 검색할때는
양쪽에 다음과 같이 싱글쿼테이션 마크를 둘러줘야합니다.

select ename, sal
from emp
where ename='SCOTT' ;

※ 오라클과 MYSQL 차이점 ?

WHERE 절에서 문자를 검색할때 오라클은 대소문자를 구분하지만
mySQL은 대소문자를 구분하지 않습니다. (기본값 셋팅이 이렇습니다.)

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

select ename, sal, job
from emp
where job='SALESMAN';

문제24. 입사일이 81년 11월 17일에 입사한 사원들의 이름과 입사일을
출력하시오!

select ename, hiredate
from emp
where hiredate = '81/11/17';

※ 한국식 날짜 형식이 년도/월/일 입니다.
미국식 날짜 형식은 일/월/년도 입니다.

문제25. 부서번호가 20번인 사원들의 이름과 월급과 부서번호를
출력하시오 !

select ename, sal, deptno
from emp
where deptno = 20;

▣ 008 WHERE절 배우기 2(문자와 날짜 검색)

문자와 날짜를 where 절에서 검색조건을 주고 검색하려면
양쪽에 싱글 쿼테이션 마크를 둘러줘야 합니다.

문제26. 전공이 피아노학과인 학생의 이름과 나이와 전공을 출력하시오

select ename, age, major
from emp17
where major='피아노학과';

문제27. 통신사가 kt 인 학생들의 이름과 나이와 통신사를 출력하시오!

select ename, age, telecom
from emp17
where telecom = 'kt';

※ mySQL은 DBA 가 문자 검색할 때 대소문자를 구분해서 검색하겠금
DB 레벨로 변경할 수 있습니다.

문제28. (복습문제) 직업이 SALESMAN 인 사원들의 이름과 월급과 직업을
출력하는데 월급이 높은 사원부터 출력하시오 !

SELECT ename, sal, job 문법 : select 보고싶은 컬럼명
FROM emp from 테이블명
WHERE job = 'SALESMAN' where 검색조건
ORDER BY sal desc ; order by 정렬할 컬럼명 ;

문제29. (복습문제) 성별이 남자인 학생들의 이름과 나이와 주소를
출력하는데 나이가 높은 학생부터 출력하시오 !

select ename, age, address
from emp17
where gender ='남'
order by age desc;

009 산술 연산자 배우기(*, /, +, -)

※ 연산자의 종류 3가지

  1. 산술 연산자 : * / + -
  2. 비교 연산자 : >, <, >=, <=, =, !=, ^=, <>
  3. 논리 연산자 : and, or, not

예제. 이름과 연봉(sal*12) 을 출력하세요 ! 컬럼명을 한글로 이름, 연봉
이라고 출력되게 하시오 !

select ename as 이름, sal *12 as 연봉
from emp;

예제. 이름과 연봉( sal * 12 + 300 ) 을 출력하세요. 컬럼명을 한글로
이름, 연봉이라고 출력되게 하시오 !

select ename, sal * 12 + 300 as 연봉
from emp;

문제30. 위의 결과를 다시 출력하는데 곱하기가 아니라 더하기 부터
실행되게 하시오 !

select ename, sal * ( 12 + 300 ) as 연봉
from emp;

※ 산술 연산자 작성시 괄호 처리를 신중하게 잘 해야합니다.

문제31. 이름과 연봉(sal*12) 을 출력하는데 연봉이 26000 이상인 사원들만
출력하시오 !

select ename, sal*12 as 연봉
from emp
where 연봉 >= 26000;

※ 실행 순서때문에 where 절에 컬럼별칭을 사용할 수 없습니다.

select ename, sal 12 as 연봉
from emp
where sal
12 >= 26000;

문제32. 연봉이 26000 이상인 사원들의 이름과 연봉을 출력하는데
연봉이 높은 사원부터 출력되게 하시오

select ename as 이름 , sal 12 as 연봉
from emp
where sal
12 >= 26000
order by 2 desc;

▣ 010 비교 연산자 배우기 1(〉, 〈, 〉=,〈=, =, !=,〈〉, ^=)

예제. 월급이 3000 이상인 사원들의 이름과 월급을 출력하시오 !

select ename, sal
from emp
where sal >= 3000;

코딩 순서: select ---> from ---> where
실행 순서: from ---> where ---> select

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

select ename, age
from emp17
where age >= 30;

문제34. 사원 테이블에 직업이 SALESMAN 이 아닌 사원들의 이름과
직업과 월급을 출력하시오 !

select ename, job, sal
from emp
where job != 'SALESMAN' ;

문제35. (복습 문제) 부서번호가 10번이 아닌 사원들의 이름과 월급과
부서번호를 출력하는데 월급이 높은 사원부터 출력하시오 !

select ename, sal, deptno
from emp
where deptno != 10
order by sal desc;

▣ 011 비교 연산자 배우기 2(BETWEEN AND)

※ 기타 비교 연산자 4가지

  1. between .. and
  2. like
  3. is null
  4. in

예제: 월급이 1000 에서 3000 사이인 사원들의 이름과 월급을
출력하시오 !

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

※ 1000 과 3000도 포함하면서 검색되는 것 입니다.
아래의 SQL과 같습니다.

select ename, sal
from emp
where sal >= 1000 and sal <= 3000;

SQL의 실행계획 보는 명령어 :

실행계획은 왜 봐야하는가 ?  SQL 이 검색이 느리면 왜 느린지 원인 파악을
해야해서 입니다.

**explain  plan  for**
select   ename,  sal
from   emp
where   sal    between   1000    and   3000 ;

**select  *  from  table(dbms_xplan.display);**

문제36. 81년 01월 01일 부터 81년 12월 31일 사이에 입사한 사원들의
이름과 입사일을 출력하시오 !

select ename, hiredate
from emp
where hiredate between '81/01/01' and '81/12/31';
낮은값 높은값

문제37. 월급이 1000 에서 3000 사이가 아닌 사원들의 이름과 월급을
출력하시오 ! ( not 을 쓰시면 됩니다)

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

▣ 012 비교 연산자 배우기 3(LIKE)

문자열에 중간 데이터를 검색할 때 유용한 연산자 입니다.
특정 단어를 포함하고 있는 데이터를 찾을때 유용합니다.

문법 : 우리반 테이블에서 성씨가 김씨인 학생들의 이름과 나이를
출력하시오 !

select ename, age
from emp17
where ename like '김%';

% 를 wild card 라고 하는데 이 의미는 이 자리에 뭐가 와도
관계없고 철자의 갯수가 몇개가 되든 관계없다는 뜻입니다.
like 와 % 는 서로 짝꿍 입니다. like 연산자를 썼을 때는
% 가 와일드 카드가 되는것이고 = 일때는 특수문자 % 로
인식합니다.

문제38. 사원 테이블에서 이름의 철자가 S 로 시작하는 사원들의
이름과 월급을 출력하시오 !

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

문제39. 이름의 끝글자가 T 로 끝나는 사원들의 이름과 월급을
출력하시오 !

select ename, sal
from emp
where ename like '%T';

문제40. 우리반 테이블에서 서울에서 사는 학생들의 이름과 주소를
출력하시오 !

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

문제41. 우리반에서 naver 메일을 사용하는 학생들의 이름과 이메일을
출력하시오 !

select ename, email
from emp17
where email like '%naver%';

※ 양쪽에 와일드카드(%) 를 쓰게되면 naver 를 포함하는 데이터를
검색합니다.

문제42. 이름에 두번째 철자가 M 인 사원들의 이름을 출력하시오 !

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

설명: _ (언더바) 의 의미는 이자리에 뭐가 와도 관계없는데
자릿수는 1개여야 한다.

※ like 연산자와 짝꿍인 키워드가 2가지

  1. % : 이 자리에 뭐가 와도 상관없고 갯수가 몇개가되는 관계없다.
  2. _ : 이 자리에 뭐가 와도 상관없는데 갯수가 1개여야 한다.

문제43. 우리반 테이블에서 읍에서 사는 학생들의 이름과 주소를
출력하시오 !

select ename, address
from emp17
where address like '%읍';

문제44. 우리반에서 성씨가 김씨가 아닌 학생들의 이름과 나이를
출력하시오 ! ( not 을 어딘가 쓰세요 ~ )

select ename, age
from emp17
where ename not like '김%';

문제45. 우리반에서 naver 메일을 사용하지 않는 학생들의 이름과
이메일을 출력하시오 !

select ename, email
from emp17
where email not like '%naver%';

※ 기타 비교 연산자  4가지

1. between .. and
2. like
3. is null
4. in

문제46. 사원 테이블에 아래의 데이터를 입력하시오 !

insert into emp(empno, ename, sal )
values( 1234, 'A%B', 3000 );

select *
from emp;

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

select ename

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

설명: m 바로 다음에 나오는 % 는 와일드 카드가 아니라
특수 문자 % 로 인식해라 ! ( ocp 시험 )

문제48.(오늘의 마지막 문제) 아래의 데이터를 입력하고
사원이름이 A%%B 인 사원의 이름과 월급을 출력하시오 !

insert into emp(empno, ename, sal )
values( 2222, 'A%%B', 4000 ) ;

select ename, sal
  from emp
  where ename like ‘_m%m%%’ escape ‘m’;

select ename, sal
  from emp
  where ename = 'A%%B';

답글로 SQL을 올려주세요 ~

마지막 문제 답글 자습시간에 자유롭게 올리시고 나머지 시간은
편하게 자습 하시면 됩니다.

▣ 013 비교 연산자 배우기 4(IS NULL)

  • 테이블에서 결측치 데이터를 database 에서는
    null 값이라고 호칭합니다.
  • null 값 ?
    1. 데이터가 없는 상태
    2. 알수 없는 값 ( unknown )

문제48. 이름과 커미션을 출력하시오 !

select ename, comm
from emp;

문제49. 이름, 커미션과 직업을 출력하시오 !

select ename, comm, job
from emp;

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

select ename, comm
from emp
where comm = null ;

※ null 값은 = 로 비교 할수 없습니다.
null 값을 검색하기 위한 특별한 비교연산자가
필요합니다.

※  연산자  3가지

1. 산술 연산자 : * / + -
2. 비교 연산자 : >, <, >= , <=, =, !=, <>, !=

- 기타 비교 연산자 4가지 ?
		1. between .. and
		2. like
		3. is null
		4. in
		3. 논리 연산자 : and , or, not

select ename, comm
from emp
where comm is null ;

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

select ename, comm
from emp
where comm is not null ;

문제52. 관리자 번호(mgr) 가 null 이 아닌 사원들의
이름과 월급과 관리자 번호를 출력하는데
월급이 높은 사원부터 출력하시오 !

select ename, sal, mgr
from emp
where mgr is not null
order by sal desc;

코딩순서: select --> from --> where --> order by
실행순서: from --> where --> select --> order by

▣ 014 비교 연산자 배우기 5(IN)

= 연산자는 하나의 값만 검색 할 수 있는데
in 연산자는 여러개의 값을 검색 할 수 있습니다.

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

select empno, ename
from emp
where empno = 7788;

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

select empno, ename
from emp
where empno in ( 7788, 7902, 7369 );

문제55. 직업이 SALESMAN, ANALYST 인 사원들의
이름과 월급과 직업을 출력하시오 !

select ename, sal, job
from emp
where job in ( 'SALESMAN', 'ANALYST' ) ;

문제56. 직업이 SALESMAN, ANALYST 가 아닌 사원들의
이름과 월급과 직업을 출력하시오 !

select ename, sal, job
from emp
where job not in ( 'SALESMAN', 'ANALYST' ) ;

문제57. 나이가 27, 29, 30 인 학생들의 이름과 나이와
주소를 출력하는데 나이가 높은 학생부터
출력하시오 !

select ename, age, address
from emp17
where age in ( 27, 29, 30 )
order by age desc;

문제58. (복습문제) 우리반에서 성씨가 김씨인 학생들의
이름과 나이와 주소를 출력하는데 주소를
ascending 하게 출력하시오 !

select ename, age, address
from emp17
where ename like '김%'
order by address asc ;

문제59. (복습문제) 우리반에서 송파구에 거주하지
않는 학생들의 이름과 나이와 주소를
출력하시오 !

select ename, age, address
from emp17
where address not like '%송파구%';

= 은 하나의 값만 비교할때 사용
in 은 여러개의 값을 비교할 때 사용

▣ 015 논리 연산자 배우기(AND, OR, NOT)

select 컬럼명
from 테이블명
where 검색조건1 and 검색조건2 ;
True and True

설명: and 는 검색조건이 전부 True 여야 데이터가
검색이 됩니다.

where 검색조건1 or 검색조건2 ;
True or False
where sal >= 1200 or job='SALESMA' ;

※ and 는 검색조건들이 전부다 true 여야 검색이 됩니다.
or 는 검색조건들중에 하나만 true 여도 검색이됩니다

문제60. 직업이 ANALYST 인 사원들이고 월급이 3000인
사원들의 이름과 월급과 직업을 출력하시오 !

select ename, sal, job
from emp
where job='ANALYST' and sal = 3000;

문제61. 월급이 1000 이상이거나 부서번호가 20번인
사원들의 이름과 월급과 부서번호를 출력하시오!

select ename, sal, deptno
from emp
where sal >= 1000 or deptno = 70 ;

문제62. 이름의 성씨가 김씨 이거나 이씨 인 학생들의
이름과 나이와 주소를 출력하는데
나이가 높은 학생부터 출력하시오 !

select ename, age, address
from emp17
where ename like '김%' or ename like '이%';

문제63. 주소가 서울, 경기에서 거주하는 학생들의
이름과 나이와 주소를 출력하시오 !

select ename, age, address
from emp17
where 1 = 1
or address like '서울%'

or address like '경기%';

문제64. 우리반 학생들중에 naver 메일을 사용하고
나이가 30대인 학생들의 이름과 나이와 이메일을
출력하시오 !

SELECT ename, age, address
FROM emp17
WHERE email LIKE '%naver%'
AND age BETWEEN 30 AND 39;

▣ 016 대소문자 변환 함수 배우기(UPPER, LOWER, INITCAP)

함수를 알면 좀더 쉽게 SQL을 작성해서 데이터를 검색해낼수
있습니다. 함수를 모르면 좀 힘들게 데이터를 검색하거나
아예 데이터를 검색 못 할 수 있습니다.

함수(fucntion) ? 특정 역활을 하는 기능이 다 코딩되어있는
객체(object)

데이터 베이스에의 함수의 역활은 ? 데이터 잘 검색하기 위한것

  • 함수의 종류 2가지 ? 테이블(table) 은 컬럼(column) 과 행(row) 으로 구성되어있음
    1. 단일행 함수 (single row function)

      하나의 행 (row) -----> 함수 ---> ****하나의 값

    2. 복수행 함수 (multiple row function)

      여러개의 행(row) ----> 함수 ---> 하나의 값

  • 단일행 함수의 종류 ? 문자, 숫자, 날짜, 변환, 일반
  • 복수행 함수의 종류 ? max, min, avg, sum, count ,
    기타 통계관련 함수들

▣ 016 대소문자 변환 함수 배우기(UPPER, LOWER, INITCAP)

upper : 영문자를 대문자로 변환하는 함수
lower : 영문자를 소문자로 변환하는 함수
initcap : 첫번째 철자는 대문자이고 나머지는 소문자로
변환하는 함수

문제65. 사원이름을 출력하는데 대문자로 출력하고
그 옆에 소문자로 출력하고 그 옆에 첫번째 철자
대문자 나머지는 소문자로 출력하시오 !

select upper(ename), lower(ename) , initcap(ename)
from emp;

설명: oracle 의 initcap 함수가 mysql 에는 없어서
따로 여러 함수들을 조합해서 작성해야합니다.

문제66. (점심시간문제) 서울에서 거주하지 않는 학생들의
이름과 나이와 주소를 출력하는데 나이가 높은 학생부터
출력하시오 !

select ename, age, address

from emp17

where address not like ‘서울%’

order by age desc;

문제67. 통신사가 kt 인 학생들의 이름과 통신사를 출력하시오!

select *
from emp17
where lower(telecom) ='kt';

문제68. 통신사가 sk 인 학생들의 이름과 통신사를 출력하시오!

select ename, telecom
from emp17

where lower(telecom) like '%sk%';

☆ 데이터가 정확하게 검색되게 쿼리를 작성하는게 1 순위 입니다.

문제69. 우리반에서 통신사가 lg 인 학생들의 이름과 통신사
를 출력하시오 !

select ename, telecom
from emp17
where lower(telecom) like '%lg%';

▣ 017 문자에서 특정 철자 추출하기(SUBSTR)

substr 함수를 이용하면 문자열에서 특정 부분만 잘라내서 출력할 수 있습니다.

예제. 우리반 테이블에서 이름의 성씨만 출력하시오 !

select substr( ename, 1, 2 ) 김하람
from emp17;

문제70. 우리반 테이블에서 이름의 끝철자만 출력하시오 !

select substr( ename, -1, 1 ) 김 하 람
from emp17; 1 2 3
-3 -2 -1

문제71. (아산병원 현장SQL) 우리반 테이블에 이름을 출력하는데
아래와 같이 가운데 철자를 *(별표) 로 출력하시오!


select substr( ename, 1, 1 ) || '*' || substr( ename, -1, 1 )
from emp17;

남궁*민

insert into emp17( empno, ename, age )
values( 9999, '남궁현민', 34 ) ;

commit;

select ename, age
from emp17;


남궁

김*명

select decode(length(ename), 4, substr(ename, 1,2) || '*' || substr (ename, -1,1),
                             3, substr(ename, 1,1) || '*' || substr (ename, -1,1),
                             ename)             
  from emp17;

select replace(ename, substr(ename, -2, 1), '*')
  from emp17;

select substr(ename, -4, 1) || substr(ename, -3, 1) || '*' || substr(ename, -1, 1) 
  from emp17;

SELECT SUBSTR(ename, 1, LENGTH(ename)-2 ) || '*' || SUBSTR(ename, -1, 1)
FROM emp17;

문제72. 우리반 테이블에서 주소를 출력하는데 앞에 3글자만
출력하시오 !

서울시 select substr( address, 1, 3 )
경기도 from emp17;
서울시

문제73. 이름, 주소를 출력하는데 주소가 앞에 3글자만
출력하고 출력되는 주소를 ascending 하게 출력하시오

select ename, substr( address, 1, 3 ) as 주소
from emp17
order by 주소 asc;

▣ 018 문자열의 길이를 출력하기(LENGTH)

length 는 문자열의 길이를 출력하는 함수 입니다.

예제. 이름과 이름의 철자의 길이를 출력하시오 !

select ename, length( ename )
from emp;

문제74. 이름, 이메일, 이메일의 철자의 길이를 출력하는데
이름의 철자의 길이가 큰 학생부터 출력하시오 !

select ename, email, length( email ) as 길이
from emp17
order by 3 desc;

문제75. 위의 결과를 다시 출력하는데 이메일의 철자의 길이가
8글자 이상인 학생들만 출력하시오 !

select ename, email, length( email ) as 길이
from emp17
where length(email) >= 8
order by 3 desc;

▣ 019 문자에서 특정 철자의 위치 출력하기(INSTR)

문자열에서 특정 철자의 위치(자리)번호를 출력하는 함수

예제. 우리반 테이블에서 이메일을 출력하고
이메일에서 @ 의 자리번호를 출력하시오 !

select email, instr( email, '@' )
from emp17;

문제76. 우리반 테이블에서 이름에 '민' 자가 포함된 학생들의
이름을 출력하시오!

select ename
from emp17
where ename like '%민%';

select ename
from emp17
where instr( ename, '민') > 0;

▣ 020 특정 철자를 다른 철자로 변경하기(REPLACE)

문자열에서 특정 철자를 다른 철자로 변경하는 함수

예제. 이름과 월급을 출력하는데 월급을 출력할 때에
숫자 0을 * 로 출력하시오 !

문법 : replace( 컬럼, 변경전 데이터, 변경후 데이터 )

select ename, replace( sal, 0, '*' )
from emp;

조금더 업그레이드해서 암호화를 하려면 ?

정규 표현식을 사용해야합니다.

select ename, regexp_replace( sal, '[0-3]', '*')

from emp;

설명: 월급을 출력할 때에 숫자 0~3까지를 * 로 변경해서
출력해라 !

문제77. 이름, 나이를 출력하는데 다음과 같이 출력하시오!

김정명 30대
김기찬 20대
: :

답: select ename, substr( age, 1, 1 ) || '0대'
from emp17;

문제78. (복습문제) 90년도에 태어난 학생들의 이름과 나이와
생일을 출력하는데 생일을 ascending 하게 출력하시오!

  • mySQL 용 ( 년도가 4자리)
    select ename, age, birth
    from emp17
    where age like '199%'
    order by birth asc ;
  • oracle ( 년도가 2자리 )
    select ename, age, birth
    from emp17
    where age like '9%'
    order by birth asc ;

▣ 021 특정 철자를 N개 만큼 채우기(LPAD, RPAD)

출력되는 숫자외에 다른 숫자를 집어넣지 못하도록 숫자를 출력할때 * 을 채워넣을 때 필요한 함수

예제. 이름과 월급을 출력하는데 월급을 출력할때
월급의 나머지 자리에 * 를 채워넣으시오 !

select ename, lpad( sal , 10, '*' ) <-- 월급을 출력하는데
from emp ; 전체 자리를 10자리로 출력하고
나머지 빈자리에 * 을 채워넣어라

KING **5000
BLAKE **2850
: :

▣ 022 특정 철자 잘라내기(TRIM, RTRIM, LTRIM)

문자열에서 특정 철자를 잘라낼때 사용하는 함수
주로 공백문자를 잘라낼때 아주 많이 사용합니다.

insert into emp(empno, ename, sal )
values( 1234, 'JACK ', 3400 );

commit;

select * from emp;

문제79. 이름이 JACK 인 사원의 이름과 월급을 출력하시오!

like 는 쓰지 말고 하세요 !

select ename, sal
from emp
where rtrim(ename)='JACK';

설명: rtrim(ename) 은 ename 에서 오른쪽에 있는 공백을
잘라내겠다는 뜻입니다.
trim(ename) 은 양쪽에 공백을 잘라내겠다는 뜻입니다

문제80. 우리반 테이블에서 이메일을 출력하는데
이메일 끝에 .com 을 잘라내서 출력하시오 !

select email, rtrim(email,'.com')
from emp17;

문제81. (복습문제) 직업이 SALESMAN, ANALYST 가
아닌 사원들의 이름과 월급을 출력하는데
월급이 높은 사원부터 출력되게하시오 !

3 select ename, sal
1 from emp
2 where job not in ( 'SALESMAN', 'ANALYST' )
4 order by sal desc ;

문제82. (복습문제) 우리반에서 통신사가 kt , lg 인
학생들의 이름과 나이와 통신사를 출력하는데
나이가 높은 학생부터 출력하시오 !

select ename, age, telecom
from emp17
where lower(telecom) like 'kt%'
or lower(telecom) like 'lg%'
order by age desc ;

문제83. (복습문제) 우리반 테이블을 가지고 다음과 같이
결과를 출력하시오 !

윤영민씨는 경기도에서 거주합니다.
김정명씨는 서울시에서 거주합니다.
:
:

SELECT ename || '씨는 ' || SUBSTR(address,1,3)||'에서 거주합니다'
FROM emp17;

문제84. (복습문제) 부서번호가 10번, 20번인 사원들의 이름과 입사일과 부서번호를 출력하는데

입사일이 최근에 입사한 사원부터 출력하고 컬럼명을 한글로 이름, 입사일, 부서번호라고 출력하시오

select ename as 이름, hiredate as 입사일, deptno as 부서번호
from emp
where deptno in (10, 20)
order by hiredate desc;

오라클의 문자함수중에 initcap 함수가 mySQL 에 없어서
따로 여러 함수들을 가지고 구현해야합니다.

오라클에서 먼저 initcap 을 안쓰고 다른 함수로 문자의 첫번째
철자 대문자 나머지 소문자로 출력을 해야합니다.

문제85. (오늘의 마지막 문제) 아래의 SQL 의 결과를
initcap 쓰지 말고 이름의 첫번째 철자는 대문자로
출력하고 나머지는 소문자로 출력하세요 !
( 오라클에서 수행 하세요 )

select upper(substr(ename, 1, 1)) || lower(substr, 2)

from emp

where ename not in ('A%%B' ,'A%B');

힌트 : substr, upper, lower, || 를 이용해서 하세요 ~

select initcap( ename )
from emp
where ename not in ('A%%B', 'A%B' );

King
Blake
Clark
Jones
Martin
Allen
Turner
James
Ward
Ford
Smith
Scott

0개의 댓글