데이터분석

[23.06.21] SQL - 14(1)

gmwoo 2023. 6. 21. 16:42

 

나만 알아보는 SQL~~~


select * from student;
SELECT * FROM student;
SELECT * FROM professor;
select * from department;
select * from salgrade;
select * from tab;
select * from emp;

SELECT  name, birthdate
FROM    student
WHERE   birthdate between '81/01/01' and '83/12/31';

SELECT  name, grade, deptno
FROM    student
WHERE   deptno  IN  (102,201);

/* 사원 테이블에서 급여가 1500~5000 이고 직무가 PRESIDENT나 ANALYST가 아닌 모든 사원에 대해
사원, 이름, 직무, 급여를 출력 */
SELECT  empno, ename, job, sal
FROM    emp
WHERE   sal between 1500 and 5000
and     job in ('PRESIDENT', 'ANALYST');

/* LIKE 연산자 */
SELECT  name, grade, deptno
FROM    student
WHERE   name LIKE '김%';

/* 이름이 '영'으로 끝나는 학생 */ 
SELECT  name, grade, deptno
FROM    student
WHERE   name LIKE '%영';

SELECT  name, grade, deptno
FROM    student
WHERE   name LIKE '김_영';

/* 학생 테이블에서 여학생의 이름, 학년, 학과번호, 주민등록번호 출력 */
SELECT  name, grade, deptno, idnum
FROM    student
WHERE   idnum LIKE '______2%';

/* escape 옵션 - insert */
insert into student (studno, name)
values(33333, '황보_정호');
select * from student;

select  name
from    student
where   name like '황보\_%' escape '\';

SELECT  empno, sal, comm
FROM    emp;

SELECT  empno, sal + comm
FROM    emp;

SELECT  empno, sal, comm, sal + comm, NVL(sal+comm, sal), NVL2(sal+comm, sal, sal)
FROM    emp;

SELECT  name, position, comm
FROM    professor;

SELECT  name, position, comm
FROM    professor
WHERE   comm = NULL;

SELECT  name, position, comm
FROM    professor
WHERE   comm is null;

/* 사원 테이블에서 커미션을 받지 않고 급여가 2500 이상인 사원의 이름의 세번째 A를 포함하는 사원의 이름,
급여, 커미션 출력 */
SELECT  ename, sal, comm
FROM    emp
WHERE   comm is null
and     sal >= 2500
and     ename LIKE '__A%';

/* employee 테이블에서 커미션을 받지 않고 급여가 2500 이상, 이름의 세번째 e를 포함한
사원의 이름, 급여, 커미션 */
SELECT * FROM employees;

SELECT  first_name, salary, commission_pct
FROM    employees
WHERE   commission_pct is null
and     salary >= 2500
and     first_name LIKE '__e%';

SELECT  name, sal, comm, sal+comm sal_com
FROM    professor;

SELECT  name, grade AS G, deptno
FROM    student
WHERE   deptno = 102
AND     (grade = '1'
OR      grade = '4');

/* 집합 연산 */
CREATE TABLE    stud_heavy
AS SELECT *
FROM    student
WHERE   weight >=70 AND grade = '1';

CREATE TABLE    stud_101
AS SELECT *
FROM    student
WHERE   deptno = 101 AND grade = '1';

SELECT * FROM stud_heavy;
SELECT * FROM stud_101;

SELECT  studno, name
FROM    stud_heavy
UNION
SELECT  studno, name
FROM    stud_101;

SELECT  studno, name
FROM    stud_heavy
UNION ALL
SELECT  studno, name
FROM    stud_101;

/* 학생 테이블과 교수 테이블에 대해 UNION 연산을 수행하여 NAME, USERID, SAL 출력
SAL 없으면 0으로 출력. 전체 인원수 확인 */
SELECT  name, userid, 0 sal
FROM    student
UNION
SELECT  name, userid, sal
FROM    professor;

/* 교집합 */
SELECT  name    FROM    stud_heavy
intersect
SELECT  name    FROM    stud_101;

/* 차집합 */
SELECT  studno 학번, name 이름
FROM    stud_heavy
MINUS
SELECT  studno, name
FROM    stud_101;

SELECT  studno 학번, name 이름
FROM    stud_101
MINUS
SELECT  studno, name
FROM    stud_heavy;

/* 교수 테이블에서 전체 교수의 급여를 인상하기 위한 직원 명단을 출력하고자 함
MINUS 연산을 사용하여 직급이 전임강사인 사람들은 명단에서 제외 */

SELECT  name, position, sal
FROM    professor
MINUS
SELECT  name, position, sal
FROM    professor
WHERE   position = '전임강사';

SELECT  name, position, sal
FROM    professor
WHERE   position <> '전임강사';

/* 정렬 order by */
SELECT  name, grade, tel
FROM    student
Order By grade desc;

SELECT  ename, job, deptno, sal
FROM    emp
Order By deptno, sal desc, ename;

SELECT  ename, job, deptno, sal 
FROM    emp
Order By 3, 4 desc, 1;

SELECT  ename, deptno
FROM    emp
WHERE   deptno IN (10, 30)
Order By ename;

SELECT  ename, hiredate
FROM    emp
WHERE   hiredate LIKE '82%';

SELECT  ename, sal, comm
FROM    emp
Order By sal desc, comm desc;

SELECT  ename, sal, comm
FROM    emp
WHERE   comm >= sal * 0.2
and     deptno = 30;


/* 사원 테이블에서 급여가 1000~5000 이고 직무가 president나 analyst가 아니면서
보너스는 급여의 10% 이상인 모든 사원에 대해 job 내림차순, sal 내림차순 출력 */
SELECT  empno 사번, ename "사원의 이름", job 직무, sal 급여
FROM    emp
WHERE   sal between 1000 and 5000
and     job not in ('PRESIDENT', 'ANALYST')
and     comm >= sal*0.1
Order By job desc, sal desc;

DESC student;

CREATE TABLE ex_type
(c  CHAR(10),   v   VARCHAR2(10));

INSERT INTO ex_type
VALUES('sql', 'sql');

SELECT  *
FROM    ex_type
WHERE c ='sql';

SELECT  *
FROM    ex_type
WHERE v ='sql';

SELECT  *
FROM    ex_type
WHERE c =v;

/* sysdate */
select sysdate from dual;

SELECT rowid, empno, ename FROM emp;

SELECT rowid, empno, ename 
FROM emp
WHERE rowid = 'AAAE5yAAEAAAAH+AAM';

/* TIMESTAMP */
CREATE TABLE ex_time
(id             NUMBER(2),
basictime       TIMESTAMP,
standardtime    TIMESTAMP WITH TIME ZONE,
localtime       TIMESTAMP WITH LOCAL TIME ZONE);

INSERT INTO ex_time VALUES(1, sysdate, sysdate, sysdate);

set linesize 100
SELECT * FROM ex_time;

desc SYS.DUAL;

SELECT DUMMY FROM DUAL;

SELECT 20*30 FROM dual;

/* 오라클이 생성될 때 데이터 딕셔너리에 자동 생성, 모든 사용자들의 접근 허용
sys가 소유한 테이블 데이터가 있는 테이블에서 유래하지 않는 상수값, 의사열, 표현식 등의
값을 단 한 번만 돌리거나 현재 날짜, 시각을 알고자 할 때 일시적 산술, 날짜 연산 등에 주로 사용 */

SELECT sysdate -1 Yesterday, sysdate Today, sysdate +1 Tomorrow
From dual;

/* ---- 함수 ----  */
select name, userid, INITCAP(userid)
FROM student
WHERE name = '김영균';

/* 'Smith' 사원이 있는지 확인하고 있으면 사번, 이름 출력 */
SELECT empno, ename
FROM emp
WHERE INITCAP(ename) = 'Smith';

/* Lower, Upper - 대소문자 */
SELECT userid, LOWER(userid), UPPER(userid)
FROM student
WHERE studno = 20101;

/* manager들만 이름, job, deptno를 ename 순으로 출력 */
SELECT ename, job, deptno
FROM emp
WHERE LOWER(job) = 'manager'
Order By ename;

SELECT dname, LENGTH(dname), LENGTHB(dname)
FROM department;


/*현재 캐릭터셋 확인*/
SELECT *
FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';


/* 문자 조작 함수 */
SELECT concat(concat(concat(name, '의 직책은 '),position), '이다.')
FROM professor;

SELECT name, idnum, SUBSTR(idnum, 1, 6) birth_date, SUBSTR(idnum,3,2) birth_mon
FROM student
WHERE grade = '1';

SELECT name, idnum, SUBSTR(idnum, 1, 6) birth_date, SUBSTR(idnum,3,2) birth_mon
FROM student
WHERE grade = '1'
and SUBSTR(idnum, 7, 1) = 2;

/* 이름이 J,A 또는 M으로 시작하는 모든 사원에 대해서 첫 번째 문자는 대문자로
그리고 나머지는 모두 소문자로 나타나는 사원의 이름과 이름 길이를 출력
각 열에 Name, Length 라는 레이블 부여*/
SELECT INITCAP(ename) "Name", INITCAP(LENGTH(ename)) "Length"
FROM emp
WHERE SUBSTR(ename, 1, 1) IN ('J', 'A', 'M');

SELECT dname, INSTR(dname, '과')
FROM department;

SELECT position, LPAD(position, 10, '*') lpad_position, userid,
    RPAD(userid, 12, '+') rpad, userid
FROM professor;

SELECT LTRIM('xyxXxyLASTWORD','xy')
FROM DUAL;

SELECT RTRIM('TURNERyxXxy','xy')
FROM DUAL;

SELECT dname, RTRIM(dname, '과')
FROM department;

/* ---- 숫자 함수 ---- */
SELECT name, sal, sal/22, ROUND(sal/22), ROUND(sal/22, 2),
        ROUND(sal/22, -1), TRUNC(sal/22, -1)
FROM professor
WHERE deptno = 101;

SELECT name, sal, comm, MOD(sal, comm)
FROM professor
WHERE deptno = 101;

SELECT CEIL(19.7), FLOOR(12.345)
FROM dual;

/* ---- 날짜 함수 ---- */

SELECT name, hiredate, hiredate+30, hiredate+60
FROM professor
WHERE profno = 9908;

SELECT profno, hiredate, MONTHS_BETWEEN(SYSDATE, hiredate) TENURE,
        ADD_MONTHS(hiredate, 6) REVIEW
FROM professor
WHERE MONTHS_BETWEEN(SYSDATE, hiredate) < 360;

 

문제

1. 학생 테이블에서 이름이 '진'으로 끝나고, 지도교수가 배정되지 않는 101번 학과 학생의
아이디, 이름, 학년, 학과 번호를 출력하세요.

2. MANAGER이거나 SALESMAN이며 급여가 $1500, $3000 또는 5000이 아닌 모든 사원에 대해서 이름, 업무, 그리고 급여를 출력하세요.(결과가 아래와 같이 나오도록)

 ENAME         JOB                 SAL
-----------       ----------            ---------
 JONES      MANAGER         2975
 BLAKE      MANAGER         2850
             .
             .
3. 사원 테이블에서 2월에 입사한 사원을 출력해 보세요.(substr 사용)

4. 직급이 'manager'인 사원을 검색하려고 아래와 같은 질의문을 작성하였으나,'선택된 레코드가 없습니다.'라고 나옴
   이유를 설명하고 직급이 'manager'인 사원을 검색하도록 질의문을 수정해 보세요.
SELECT  empno, ename, job
FROM emp
WHERE  job='manager';

5. 사원 테이블에서 사원 번호, 이름, 급여 그리고 12% 증가된 급여를 모두 출력하세요.(소수점 3째 자리에서 반올림)
(아래와 같은 결과가 나오도록) 

 EMPNO  ENAME         SAL New      Salary     Increase
-------     ----------             ----------        ----------    ----------
   7369    SMITH             800                960          160
   7499    ALLEN            1600              1920         320
   7521    WARD             1250             1500         250

/* ---- 문제 ---- */
SELECT userid, name, grade, deptno
FROM student
WHERE SUBSTR(name, 3, 1) = '진'
and PROFNO IS NULL 
and deptno = 101;

SELECT ename, job, sal
FROM emp
WHERE job in ('MANAGER', 'SALESMAN')
and sal not in (1500, 3000, 5000)
order by sal desc;

SELECT ename, hiredate
FROM emp
WHERE SUBSTR(hiredate, 4, 2) = '02';

SELECT empno, ename, job
FROM emp
WHERE job='MANAGER';

SELECT empno, ename, sal, round(sal*1.12) "New Salary", round(sal*1.12 - sal) "Increase"
FROM emp;
반응형

'데이터분석' 카테고리의 다른 글

[23.06.23] SQL - 16(1)  (0) 2023.06.23
[23.06.22] SQL - 15(1)  (0) 2023.06.22
[23.06.20] SQL - 13(1)  (0) 2023.06.20
[23.06.19] Python time series - 12(3)  (0) 2023.06.19
[23.06.19] Python pandas titanic problem - 12(2)  (0) 2023.06.19