반응형

✔ 테이블에 컬럼 추가하기

 

-- 11_Table_Alter
-- 테이블 구조(설계)변경하기 : DBA(Database Administrator : DB 관리자)
-- 실습 테이블 : DEP20 (구조만 복사)
CREATE TABLE DEPT20
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;

-- 결과보기
SELECT * FROM DEPT20;

-- 예제 1) 부서 테이블에 날짜 자료형(DATE)을 가지는 BIRTH 컬럼 추가하기
-- 날짜 자료형 : DATE 사용(크기 없음)
-- 테이블에 새로운 컬럼 추가하기
ALTER TABLE DEPT20
ADD(BIRTH DATE);

-- 결과보기
SELECT * FROM DEPT20;

 

✔ 컬럼의 크기 변경하기

-- 예제 2) 부서 테이블에(DEPT20) 부서명(DNAME)의 크기를 변경하기-- 예제 2) 부서 테이블에(DEPT20) 부서명(DNAME)의 크기를 변경하기
-- 테이블의 컬럼 변경(크기변경, 자료형 변경 등)
ALTER TABLE DEPT20 MODIFY DNAME VARCHAR2(30);
-- 테이블 구조보기 : DESC 테이블명
DESC DEPT20;

 

✔ 테이블의 컬럼 삭제하기

-- 예제 3) 부서테이블(DEPT20) BIRTH 컬럼 삭제하기
ALTER TABLE DEPT20 DROP COLUMN BIRTH;
SELECT * FROM DEPT20;

 

✔ 테이블 이름 변경하기

-- 예제 4) 테이블 이름 변경하기 : DEPT20 -> DEPT30
RENAME DEPT20 TO DEPT30;
DESC DEPT30; -- DEPT20에서 DEPT30으로 변경확인

 

✔ 연습문제

-- 12_Table_Alter_Exam
-- 테이블 구조(설계) 연습문제

-- 1) DEPT 테이블을 생성하세요.
-- 단 , DEPT 이 있으면 삭제하고(DROP TABLE ~) 재생성하세요.
-- 컬럼명 : DNO   NUMBER(2)
--         DNAME VARCHAR2(14)
--         LOC   VARCHAR2(13)
DROP TABLE DEPT;

CREATE TABLE DEPT(
    DNO NUMBER(2),
    DNAME VARCHAR2(14),
    LOC VARCHAR2(13)
);

-- 2) EMP 테이블을 생성하세요.
-- 단, EMP 테이블이 있으면 삭제하고(DROP TABLE ~) 재생성하세요.
-- 컬럼명 : ENO   NUMBER(4)
--         ENAME VARCHAR2(10)
--         DNO   NUMBER(2)
DROP TABLE EMP;

CREATE TABLE EMP(
    ENO NUMBER(4),
    ENAME VARCHAR2(10),
    DNO NUMBER(2)
);

-- 3) EMP 테이블을 수정하세요.(ENAME 컬럼 크기)
-- 컬럼명 : ENO   NUMBER(4)
--         ENAME VARCHAR2(25)
--         DNO   NUMBER(2)

ALTER TABLE EMP MODIFY ENAME VARCHAR2(25);
DESC EMP;

-- 4) EMPLOYEE 테이블을 복사해서 EMPLOYEE2 테이블을 생성하되
--    사원번호, 이름, 급여, 부서번호 컬럼만 복사하고,
--    새로 생성된 테이블의 컬럼명은 각각 
--    EMP_ID, NAME, SAL, DEPT_ID로 지정하세요.
--   (데이터도 복사)
-- 힌트) CREATE TABLE 복사테이블명(변경될컬럼명, 변경될컬럼명2 ...)
--      AS 
--      SELECT 원본컬러명, 원본컬럼명2,... FROM 테이블명
-- 참고 사용법) ALTER TABLE 테이블명 RENAME COLUMN 원본컬럼명 TO 변경될컬럼명;


CREATE TABLE EMPLOYEE2(EMP_ID, NAME, SAL, DEPT_ID)
AS
SELECT ENO, ENAME, SALARY, DNO FROM EMPLOYEE;


-- 5) EMP 테이블을 삭제하세요.

DROP TABLE EMP;

-- 6) EMPLOYEE2란 이름을 EMP로 변경하세요.

RENAME EMPLOYEE2 TO EMP;

-- 7) DEPT 테이블에서 DNAME 컬럼을 제거하세요.

ALTER TABLE DEPT DROP COLUMN DNAME;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

시퀀스와 인덱스  (0) 2023.09.14
TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
반응형
-- 08_Table_CUD
-- 테이블 생성
-- CRUD : 약어, DB 또는 실무 프로젝트에서 많이 사용
-- C(CREATE문, 생성), R(READ, SELECT문, 조회), U(UPDATE문, 수정), D(DELETE문, 삭제)
-- 테이블 의미 : DB(데이터베이스)에서 자료를 저장하는 곳(논리적 공간)
-- 프로젝트 : 개발자 계정으로 접속해서 테이블 등을 생성함 (SCOTT 계정)

-- 1) 테이블 생성 : DDL ( DATA DEFINITION LANGUAGE : 데이터 정의어)
-- NUMBER(크기) : 숫자 자료형 (실수, 정수 등등)
-- 예) NUMBER(2) : 두 자리수 정수, NUMBER(2, 3) : 두 자리수 정수 + 세 자리수 소수점
--     NUMBER : 실수, 정수 무한 크기로 지정가능
-- 단, 크기가 지정되면 그 크기 이하로만 값을 넣을 수 있음
-- VARCHAR2(크기) : 문자형 자료형 , 가변 자료형 (VS CHAR(크기): 고정 자료형)
-- 예) VARCHAR2(4000) : 최대 크기, VARCHAR2 : 잘 안씀(1글자만 들어감)
-- 사용법) CREATE TABLE 테이블명(
--        컬럼명   NUMBER(2),        // 2자리수 숫자
--        컬럼명2  VARCHAR2(14),     // 14자리 문자
--        ...
--          );

CREATE TABLE DEPT(
        DNO NUMBER(2),
        DNAME VARCHAR2(14),
        LOC   VARCHAR2(13)
);

-- 예제 1) 사원테이블 : EMP
--        컬럼명 : ENO(사원번호, 숫자(4,0)
--                ENAME (사원명, 문자형(10)
--                JOB(직위, 문자형(9)
--                MANAGER(관리자) 숫자(4,0)
--                HIREDATE 입사일, 날짜형 (DATE)
--                SALARY 월급, 숫자형(7,2)
--                COMMISSION 상여금, 숫자형(7,2)
--                DNO  부서번호,  숫자형(2,0)  

CREATE TABLE EMP (
        ENO NUMBER(4, 0),
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MANAGER NUMBER(4, 0),
        HIREDATE DATE,
        SALARY NUMBER(7, 2),
        COMMISSION NUMBER(7, 2),
        DNO NUMBER(2, 0)
);

-- 실무 예 : 테이블 만들기 : 테이블 복사(카피)
-- 예제 2) DEPARTMENT 테이블 복사하기 : DEPT_COPY 테이블을 만드세요
-- 1) 데이터까지 포함해서 복사
-- 사용법 )  CREATE TABLE 복사할 테이블명
--          AS
--          SELECT * FROM 원본테이블;
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT;


-- 2) 데이터빼고 테이블 설계(디자인)만 복사
--  CREATE TABLE 복사할 테이블명
--  AS
--  SELECT * FROM 원본테이블
--  WHERE 거짓조건;
CREATE TABLE DEPT_COPY2
AS
SELECT * FROM DEPARTMENT
WHERE 1=2; -- 거짓 조건 아무거나 붙이면 데이터 빼고 복사됨


-- 컬럼/테이블 주석 : 테이블이나 컬럼에 상세 설명을 붙일 수 있음
-- 예제 3) DEPT 테이블에 컬럼 주석 달기
-- 1) 테이블 주석달기
-- 사용법 ) COMMENT ON TABLE 테이블명 IS '테이블주석';
COMMENT ON TABLE DEPT IS '부서정보';

-- 2) 컬럼 주석달기
-- 사용법 ) COMMENT ON COULUMN 테이블명.컬럼명 IS '컬럼주석';
COMMENT ON COLUMN DEPT.DNO IS '부서번호';
COMMENT ON COLUMN DEPT.DNAME IS '부서명';
COMMENT ON COLUMN DEPT.LOC IS '부서위치';

-- 예제 3) 사원테이블의 EMP 의 테이블 주석/컬럼주석을 작성해서
--      만들어 주세요
--    보기 : EMP ( 테이블주석 : 사원정보 )
--       컬럼주석 : ENO(사원번호), 
--                 ENAME(사원명), 
--                 JOB(직위), 
--                 MANAGER(관리자), 
--                 HIREDATE(입사일), 
--                 SALARY(월급), 
--                 COMMISSION(상여금), 
--                 DNO(부서번호) 

COMMENT ON TABLE EMP IS '사원정보';

COMMENT ON COLUMN EMP.ENO IS '사원번호';
COMMENT ON COLUMN EMP.ENAME IS '사원명';
COMMENT ON COLUMN EMP.JOB IS '직위';
COMMENT ON COLUMN EMP.MANAGER IS '관리자';
COMMENT ON COLUMN EMP.HIREDATE IS '입사일';
COMMENT ON COLUMN EMP.SALARY IS '월급';
COMMENT ON COLUMN EMP.COMMISSION IS '상여금';
COMMENT ON COLUMN EMP.DNO IS '부서번호';

-- 2) 테이블 삭제
-- 사용법 ) DROP TABLE 삭제할테이블명
DROP TABLE DEPT_COPY;

-- 예제 5) DEPT_COPY2 를 삭제
DROP TABLE DEPT_COPY2;

-- 3) 데이터 추가(INSERT(CREATE)/삭제(DELECT)/수정(UPDATE) 명령어 : CUD
-- DML문(DATA MANIPULATION LANGUAGE): 데이터 조작어
-- 특징 : 명령문 실행 후 취소(ROLLBACK)
-- 1) 테이블 복사 : DEPT_COPY

CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPARTMENT
WHERE 1=2;


-- 예제 6) DEPT_COPY 테이블에 데이터 INSERT
-- 컬럼 : DNO(NUMBER(2,0)), DNAME(VARCHAR2(14)), LOC(VARCHAR2(13))
-- 사용법 :  INSERT INTO 테이블명(컬럼명, 컬럼명2, ...)
--          VALUES(값, 값2, ...);

INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(10, 'ACCOUNTING', 'NEW YORK'); -- 데이터 추가

SELECT * FROM DEPT_COPY; -- 데이터 확인

-- 취소
ROLLBACK;

-- 영구반영 : 취소불가상태
-- 의미 : 영구반영하면 다른 유저가 현재 생성/수정/삭제한 데이터를 볼 수 있음
COMMIT;


-- 예제 7) 임시적으로 NULL 값을 입력해서 INSERT 하기ㅣ
-- 1) 암묵적으로(눈에 안보이지만) NULL 값 INSERT 하기
INSERT INTO DEPT_COPY(DNO, DNAME)
VALUES(30, 'SALES');

SELECT * FROM DEPT_COPY; -- 데이터 확인

-- 영구반영
COMMIT;

-- 2) 명시적으로 NULL 값 넣기
INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(40, 'OPERATIONS', NULL);

SELECT * FROM DEPT_COPY;

COMMIT;

-- 연습 2) DEPT_COPY 테이블에 50부서 'COMPUTING' 만들고 LOC는 ' ' 공백으로 INSERT 하세요

INSERT INTO DEPT_COPY(DNO, DNAME, LOC)
VALUES(50, 'COMPUTING', ' ');

SELECT * FROM DEPT_COPY;

COMMIT;

-- 연습용 테이블 복사
CREATE TABLE EMP_COPY
AS
SELECT * FROM EMPLOYEE
WHERE 1=2;

-- 연습 2)
INSERT INTO EMP_COPY(ENO, ENAME, JOB, HIREDATE, DNO)
VALUES (7000, 'CANDY', 'MANAGER', '2012/05/01', 10);

SELECT * FROM EMP_COPY;

COMMIT;

-- 예제 8) 명시적으로 날짜형으로 변환해서 INSERT하기
-- 날짜함수: TO_DATE(문자열, '날짜포맷')
-- 날짜포맷 : 'YYYY-MM-DD HH24:MI:SS'
INSERT INTO EMP_COPY (ENO, ENAME, JOB, HIREDATE, DNO)
VALUES(7010, 'CANDY2', 'MANAGER', TO_DATE('2012/05/01', 'YYYY-MM-DD HH24:MI:SS'), 10);

SELECT * FROM EMP_COPY;
COMMIT;

-- 예제 9) INSERT 할때 현재날짜(시간) 데이터 넣기 : SYSDATE(현재날짜)
INSERT INTO EMP_COPY (ENO, ENAME, JOB, HIREDATE, DNO)
VALUES(7020, 'CANDY3', 'MANAGER', SYSDATE, 10);

SELECT * FROM EMP_COPY;
COMMIT;

-- 예제 10) 다른 테이블의 데이터만 복사하기
SELECT * FROM DEPT_COPY;
-- 빠른 삭제 : DELETE 문 보다 속도 빠름 전체 삭제만 됨, 취소불가(ROLLBACK)
-- 사용법) TRUNCATE TABLE 테이블 명
TRUNCATE TABLE DEPT_COPY;

-- 다른 테이블의 데이터 복사(원본데이터 : DEPARTMENT(부서), 구조가 같아야함)
-- 사용법 ) INSERT INTO 복사될 테이블명
--         SELECT * FROM 원본 테이블명;
INSERT INTO DEPT_COPY
SELECT * FROM DEPARTMENT;
-- 결과 확인
SELECT * FROM DEPT_COPY;
-- 영구반영
COMMIT;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CONSTRAINT  (0) 2023.09.14
TABLE_ALTER  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
반응형
-- 07_Subquery
-- 서브쿼리 : 단일행 서브쿼리(1건만 나옴)
-- 부등호나 등호를 사용하여 비교함
-- 예제 1) SCOTT 사원보다 급여를 많이 받는 사원을 찾기위한 SQL문을 작성하세요
-- 해결 1-1) 사원테이블에서 SCOTT 사원의 급여를 찾은 후에 (1번)
-- 해결 1-2) 그 급여를 비교해서 많이 받는 사원을 추가로 찾아야함 (2번)
-- 1번
SELECT SALARY
FROM EMPLOYEE
WHERE ENAME = 'SCOTT'; -- 3000(급여)

-- 2번
SELECT ENAME, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000;

-- 문제점 : 성능저하 : 여러번 쿼리로 인해
-- WHERE 절의 컬럼과 서브쿼리의 SELECT 컬럼이 동일해야함
-- 사용법
-- SELECT 컬럼명 FROM 테이블명
-- WHERE 비교컬럼 > (SELECT 비교컬럼 FROM 테이블명);              
SELECT ENAME, SALARY
FROM EMPLOYEE
WHERE SALARY > (SELECT SALARY
                FROM EMPLOYEE
                WHERE ENAME = 'SCOTT');
                
-- 예제1 : SCOTT 사원과 동일한 부서에서 DNO 근무하는 사원 구하기
SELECT ENAME
FROM EMPLOYEE
WHERE DNO = (SELECT DNO 
            FROM EMPLOYEE 
            WHERE ENAME = 'SCOTT');

-- 예제2 : 30번 부서에서 최소급여를 구한후 그 최소 급여보다 부서별 최소 급여가 큰 부서만 출력하세요
SELECT MIN(SALARY)
FROM EMPLOYEE
WHERE DNO = 30;

SELECT DNO, MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO
HAVING MIN(SALARY) > (SELECT MIN(SALARY)
                      FROM EMPLOYEE
                      WHERE DNO = 30);
                      
-- 3) 특수한 경우 아래처럼 사용도 가능함
-- SELECT 문 안에도 들어감
SELECT 2*3, (SELECT 4*3 FROM DUAL)
FROM DUAL;

-- FROM 문 안에도 들어감
SELECT EMP.ENAME, EMP.ENO
FROM (SELECT ENAME, ENO FROM EMPLOYEE) EMP;

-- 2) 다중 행 서브쿼리(자식쿼리) : 여러 건이 나옴
-- 예제 4) (1) 부서별 최소급여를 받는 사원 중에서 (2) 사원번호와 이름을 출력하세요
-- (1) 부서별 최소급여 받는 사원 출력
SELECT MIN(SALARY)
FROM EMPLOYEE
GROUP BY DNO;

-- (2) 950, 1300, 800 급여를 받는 사원번호와 이름 출력
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN (950, 1300, 800);

-- 최종쿼리
SELECT ENO, ENAME
FROM EMPLOYEE
WHERE SALARY IN (SELECT MIN(SALARY)
                    FROM EMPLOYEE
                    GROUP BY DNO);
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_ALTER  (0) 2023.09.14
TABLE_CUD  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본(2)  (0) 2023.09.08
반응형
-- 05_Group_Func
-- 그룹 함수 : 데이터 전체집계 함수들(총액, 평균, 최고, 최저액, 총개수)
-- 결과 특징)  1건이 나옴
--            SUM(컬럼명), AVG(컬럼명), MAX(컬럼명), MIN(컬럼명), COUNT(컬럼명)
-- 예제 1) 사원들의 급여 총액, 평균액, 최고액 출력하기
SELECT SUM(SALARY) AS 총액
      ,ROUND(AVG(SALARY)) AS 평균액
      ,MAX(SALARY) AS 최고액
      ,MIN(SALARY) AS 최저액
FROM EMPLOYEE;

-- 예제 1) 최근에 입사한 사원과 가장 오래전에 입사한 사원의 입사일 출력하기
SELECT MAX(HIREDATE) AS 최근
      ,MIN(HIREDATE) AS 오래전
FROM EMPLOYEE;

-- 예제 2) 사원들의 상여금(COMMISSION) 총액 출력
SELECT SUM(COMMISSION) AS "상여금 총액"
FROM EMPLOYEE;

-- 예제 3) 사원들의 총인원을 출력하세요
-- 사용법) COUNT(컬럼명[*])
SELECT COUNT(*) AS 총인원
FROM EMPLOYEE;

-- 예제 4) 상여금(COMMISSION) 받는 사원의 수 계산하기
-- COMMISSION 컬럼 NULL 있음(상여금 못받음)
-- 집계함수는 자동으로 NULL 제외하고 계산
SELECT COUNT(COMMISSION) AS "상여금 받는 사원의 수"
FROM EMPLOYEE;

-- 예제 5) NOT NULL 인 데이터만 계산하기
SELECT COUNT(COMMISSION) AS 사원수
FROM EMPLOYEE
WHERE COMMISSION IS NOT NULL;


-- 예제 6) 직위(JOB) 종류가 몇 개인지 출력하기
-- DISTINCT : 중복제거 키워드
-- 사용법 COUNT(DISTINCT 컬럼명)
-- 컬럼별칭(*) : 컬럼명 AS 별칭
-- 테이블 별칭(*) : 테이블명 별칭
-- 사용법        : 별칭.컬럼명
SELECT COUNT(DISTINCT EMP.JOB) AS 직업개수
FROM EMPLOYEE EMP;

-- 전체 집계 함수 특징 : 1) 1건이 결과로 나옴
--                    2) 일반 컬럼과 같이 사용할 수 없음 : 에러 발생

--SELECT ENAME, MAX(SALARY)
--FROM EMPLOYEE; -- 에러 (일반컬럼(ENAME), MAX(SALARY) 같이 사용불가)

-- 2) 부분(컬럼별)집계하기 : GROUP BY (예약어)
-- 사용법 ) GROUP BY 컬럼명, 컬럼명2, ...
-- 예제 7) 소속 부서별(DNO) 평균 급여를 부서번호와 함께 출력하세요
-- TRUNC() : 버림(절삭)
-- 전체집계시에는 일반컬럼과 같이 사용할 수 없지만
-- 부분집계시에는 일반컬럼과 같이 사용가능 (GROUP BY 사용하기 때문)
SELECT DNO
, TRUNC(AVG(SALARY)) AS 평균급여
FROM EMPLOYEE
GROUP BY DNO; -- 부서번호 컬럼별 집계(부서번호 컬럼은 출력할 수 있음)
-- 주의점 ) 1) 그룹함수와 일반컬럼은 같이 사용불가
--         단, 컬럼별 집계에서 그 컬럼은 그룹함수와 같이 사용할 수 있음
--SELECT DNO, ENAME
--, TRUNC(AVG(SALARY)) AS 평균급여
--FROM EMPLOYEE
--GROUP BY DNO;  -- 에러 : ENAME 컬럼은 GROUP BY 대상 컬럼이 아니므로 그룹함수와 같이 출력할 수 없음

-- 예제 8) 부서번호(DNO)별, 직위별(JOB), 데이터 건수(COUNT) 및 급여(SALARY) 총액(SUM) 구하기
SELECT DNO, JOB
      ,COUNT(*)
      ,SUM(SALARY)
FROM EMPLOYEE
GROUP BY DNO, JOB;

-- GROUP BY 사용시 조건을 추가 : HAVING 키워드 // GROUP 함수에만 사용가능
-- 사용법) HAVING 그룹함수(컬럼명) > 값
-- 예제 9) 부서번호별(DNO) 최고급여가 3000 이상인 부서의 번호와 최고금액 구하기
SELECT DNO ,MAX(SALARY)
FROM EMPLOYEE
GROUP BY DNO
HAVING MAX(SALARY) >= 3000;

-- 연습 1) 사원테이블에서(EMPLOYEE) JOB(직위)이 1) MANAGER 인
--       값을 제외하고 3) 급여(SALARY) 총액(SUM)이 5000 이상인
--       2) 직급별(JOB) 총액 구하기

SELECT JOB, SUM(SALARY)
FROM EMPLOYEE
WHERE JOB NOT LIKE '%MANAGER%'
GROUP BY JOB
HAVING SUM(SALARY) >= 5000;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본(2)  (0) 2023.09.08
SQL 기본  (0) 2023.09.08
반응형

📌 문자함수 - 대/소문자 변환

 
-- 1) 문자 함수
-- 사용법) 대문자변환 : UPPER('문자열') -- 문자열 대신 컬럼명도 올 수 있음
--        소문자변환 : LOWER('문자열')
--        첫글자만대문자 : INITCAP('문자열')
-- 원본을 조작하지 않음(화면에만 임시로 바뀜)
SELECT 'Oracle mania'
       ,UPPER('Oracle mania') AS "대문자"
       ,LOWER('Oracle mania') AS "소문자"
       ,INITCAP('Oracle mania') AS "첫 글자만 대문자"
FROM DUAL;

-- 연습 1) 사원테이블에서 사원명(ENAME)을 소문자로 출력하고,
--        직위(JOB)은 첫글자만 대문자로 출력하세요
SELECT LOWER(ENAME),
       INITCAP(JOB)
FROM   EMPLOYEE;

-- 연습 2) SCOTT 사원을 조회해서 사원번호(ENO), 사원명(ENAME), 부서번호(DNO) 출력하기
-- 단, SCOTT 이 대소문자 구분없이 비교된다고 가정하고 작성하세요
SELECT ENO, ENAME, DNO FROM EMPLOYEE
WHERE  ENAME = UPPER('scott');

📌 문자함수 - 문자열 길이 리턴 함수


-- 1-2) 문자 길이를 RETURN 하는 함수
-- LENGTH(문자열) : 한글/영어 상관없이 문자개수를 세어서 RETRUN 하는 함수
-- 코딩 언어셋 : 영어 표현(1BYTE), 한글표현(3BYTE) [UTF-8 표현식(국제표준)]
SELECT LENGTH('Oracle mania')
      ,LENGTH('오라클매니아')
FROM DUAL;

-- 1-3) 문자 조작함수 : 문자열 붙이기
-- 함수 :  CONCAT('문자열 1','문자열 2')
-- 기호 : '문자열1'||'문자열2'
SELECT 'Oracle'
       ,'mania'
       ,CONCAT('Oracle','mania')
       ,'Oracle'||'mania'
FROM DUAL;

📌 문자함수 - 문자열 자르기, 붙이기, 공백제거


-- 1-4) 문자 조작함수 : 문자열 자르기
-- SQL : 인덱스번호 1부터 시작
-- 사용법) SUBSTR('대상컬럼',시작위치,자를개수)
-- 단, 시작위치가 음수이면 뒤에서 셈
SELECT SUBSTR('Oracle mania',4,3)
      ,SUBSTR('Oracle mania',-1,1)
FROM DUAL;

-- 예제 3) 이름이 N으로 끝나는 사원 화면에 출력하기
-- SUBSTR 함수 사용
-- SQL 성능이 좋게 작성하는 것이 어려움
-- WHERE 왼편(함수 사용) = 오른쪽값 ==> 성능이 대폭 저하
-- WHERE 절 오른쪽값에 함수를 쓰는 것이 성능에 좋음
SELECT * FROM EMPLOYEE
WHERE SUBSTR(ENAME, -1, 1) = 'N';

-- 1-5) 문자열에서 대상 문자를 찾아서 인덱스번호를 RETURN 함수
-- SQL의 인덱스번호는 1부터 시작함
-- 사용법)
SELECT  INSTR('Oracle maina','a')
       ,INSTR('오라클매니아','라')
FROM DUAL;

-- 1-6) 컬럼에 어떤 문자를 붙이기 함수 : LPAD, RPAD
-- LPAD 함수 : 어떤 문자를 왼쪽에 채우기 함수
-- 사용법 : LPAD(대상컬럼, 자리수, 채울문자)
-- 자리수에서 빈칸은 채울문자로 채워짐(왼쪽)
SELECT LPAD(SALARY, 10, '*')
FROM EMPLOYEE;

-- RPAD 함수
SELECT RPAD(SALARY, 10, '*')
FROM EMPLOYEE;

-- 1-7) 문자열에서 공백제거 함수 LTRIM, RTRIM, TRIM(*)
-- 사용법) LTRIM(컬럼명) : 왼쪽 공백제거
--        RTRIM(컬럼명) : 오른쪽 공백제거
--         TRIM(컬럼명) : 양쪽 공백제거
SELECT 'Oracle mania'
      ,LTRIM('          Oracle mania            ')
      ,RTRIM('          Oracle mania            ')
      ,TRIM('          Oracle mania            ')
FROM DUAL;


 

📌 숫자함수 - 반올림, 버림, 나머지 연산

-- 1) 반올림 : ROUND()
-- 사용법) ROUND(대상컬럼, 자리수)
-- 참고) 자리수가 음수일 경우 일의 자리부터 반올림이 됨
SELECT 98.7654
       ,ROUND(98.7654)          -- 0 자리에서 반올림
       ,ROUND(98.7654, 2)       -- 2nd 자리에서 반올림
       ,ROUND(98.7654, 1)       -- 1st 자리에서 반올림
       ,ROUND(98.7654, -1)      -- 1의 자리에서 반올림
FROM DUAL;

-- 2) 버림, 내림 : TRUNC(), 특정자리수에 버림
SELECT 98.7654
       ,TRUNC(98.7654)          -- 소수점 첫번째 자리에서 버림
       ,TRUNC(98.7654, 2)       -- 소수점 두번째 이하 버림
       ,TRUNC(98.7654, -1)      -- 1의 자리에서 버림
FROM DUAL;

-- 3) MOD : 나머지 연산 함수 ( == % : 나머지 연산자(JS))
-- 사용법) MOD(대상컬럼, 나눌숫자) : 결과 나머지가 RETURN 됨
SELECT MOD(31, 2)
      ,MOD(31, 5)
      ,MOD(31, 8)
FROM DUAL;

-- 연습 1) 모든 사원의 급여를 각각 500으로 나눈 나머지를 계산해서 출력하세요
SELECT MOD(SALARY, 500)
FROM   EMPLOYEE;

📌 날짜함수

-- 날짜 함수
-- 1) SYSDATE : 시스템에 저장된 현재 날짜를 RETURN 하는 함수(*****)
-- DB의 자료형 : 문자열(VARCHAR2 형, CHAR 형), 숫자(NUMBER 형), 날짜(DATE 형)
-- 단, 오라클 기준
SELECT SYSDATE FROM DUAL;

-- 예제 1) 오늘, 어제 내일 날짜를 출력해보세요
SELECT  SYSDATE - 1 AS 어제
       ,SYSDATE     AS 오늘
       ,SYSDATE + 1 AS 내일
FROM DUAL;

-- 예제 2) 근무일수 계산하기
-- 공식 : 현재시간 - 입사일 : 근무일수
SELECT ROUND(SYSDATE - HIREDATE) AS 근무일수
FROM EMPLOYEE;

-- 2) MONTHS_BETWEEN(현재날짜, 과거날짜) : 두 날짜 사이의 개월수 리턴
-- 각 사원들이 근무한 개월 수 구하기
SELECT ENAME, SYSDATE, HIREDATE
    ,TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) AS 개월수
FROM EMPLOYEE;

-- 3) ADD_MONTHS(날짜컬럼, 숫자)
-- 예제 4) 입사일에서 6개월이 지난 날짜 구하기
SELECT ENAME, HIREDATE,
       ADD_MONTHS(HIREDATE, 6) AS 개월수더하기
FROM   EMPLOYEE;

-- 4) NEXT_DAY(날짜컬럼, '요일')
-- 날짜컬럼에서 최초로 도래하는 요일의 날짜를 RETURN 함수
-- 예제 5) 오늘을 기준으로 최초로 도래하는 토요일의 날짜 구하기
SELECT SYSDATE
      ,NEXT_DAY(SYSDATE, '토요일')
FROM DUAL;

-- 5) LAST_DAY(날짜 컬럼)
-- 날짜컬럼의 그 달(월)의 마지막 날의 날짜를 구해주는 함수
-- 예제 6) 입사한 날의 그 달의 마지막 날 구하기
SELECT ENAME, HIREDATE,
       LAST_DAY(HIREDATE)
FROM EMPLOYEE;

 

📌 자료형 변환함수

-- DB 자료형 : 문자열(VARCHAR2(가변문자열), CHAR(고정문자열))
--            숫자(NUMBER, 실수, 정수)
--            날짜형(DATE)
-- 1) TO_CHAR : 날짜 -> 문자열로 바꾸는 함수
-- 사원 : EMPLOYEE
-- 날짜컬럼 : HIREDATE(입사일)
-- 사용법 ) TO_CHAR(컬럼명, '날짜포멧')
-- 날짜포멧 :
-- YYYY(년도(4자리)), YY(2자리) [YEAR]
-- MM(월(2자리))               [MONTH]
-- DD(일(2자리))               [DAY]
-- DAY(요일)                   [요일]
-- HH(1~12까지의 시간)          [HOUR]
-- HH24(1~24까지의 시간)
-- MI(분(2자리))               [MINUTES]
-- SS(초(2자리))               [SECOND]

SELECT ENAME, HIREDATE,
       TO_CHAR(HIREDATE, 'YY-MM') AS 단축날짜,
       TO_CHAR(HIREDATE, 'YYYY-MM-DD HH24:MI:SS') AS 날짜
FROM EMPLOYEE;

-- 연습 1) 현재 날짜와 시간을 표현하세요
SELECT SYSDATE,
      TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS') AS 현재날짜
      FROM DUAL;
     
-- 2) TO_CHAR : 숫자 -> 문자로 변환
-- 사용법) TO_CHAR(숫자컬럼, '숫자포맷')
-- 예제 2) 급여를 출력하면서 통화기호를 (W, $ 등) 포함해서 출력하세요
-- 숫자포맷 : L - 각 나라별 통화 기호를 자동으로 붙여줌(W, $ 등)
--          9 - 3자리를 잡고 자리수가 모자라도 따로 0을 채워주지 않음
--          0 - 3자리를 잡고 자리수가 모자라면 0을 채워줌
--          , - 각 통화의 중간에 쉼표(,)를 자동으로 추가해줌
SELECT ENAME, SALARY,
TO_CHAR(SALARY, 'L999,999'),
TO_CHAR(SALARY, 'L000,000')
FROM EMPLOYEE;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
SQL 기본(2)  (0) 2023.09.08
SQL 기본  (0) 2023.09.08
반응형

📌 데이터에 조건을 붙여 조회하기(WHERE)

-- 파일명 : 02_Select_Where.sql
-- 데이터에 조건을 붙여 조회하기
-- 1) 비교연산자로 조건절 사용하기
-- 예제 1) 월급(SALARY)이 1500 이상인 사원 조회하기
-- 사용법) SELECT 컬럼명, 컬럼명2... FROM 테이블명
--        WHERE 조건절(컬럼명 (부등호 >, >=, <, <=, =(같다), <>(같지않다)) 값);
SELECT ENAME, SALARY FROM EMPLOYEE
WHERE SALARY > 1500;
 

-- 예제 2) 10번 부서의 소속 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE DNO = 10;

-- 예제 3) 사원명(ENAME)이 SCOTT인 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE ENAME='SCOTT';

-- 예제 4) 입사일이(HIREDATE) 이 '1981/01/01' 이전인 사원만 출력
SELECT * FROM EMPLOYEE
WHERE HIREDATE <= '1981/01/01';

📌 논리연산자와 함께 조건절 사용하기


-- 2) 논리 연산자와 함께 조건절 사용하기
-- 논리 연산자 : AND, OR, NOT
-- 성능 : AND > OR(NOT)
-- 예제 5) 부서번호(DNO) 가 10이고, 직급(JOB)이 'MANAGER'인 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE DNO = 10
AND   JOB = 'MANAGER';

-- 연습 1) 급여가 1000과 1500 사이의 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY >= 1000
AND SALARY <= 1500;

-- 예제 6) 부서번호가 10이거나 직급이 'MANAGER' 인 사원만 출력하기
SELECT * FROM EMPLOYEE
WHERE DNO = 10
OR    JOB = 'MANAGER';

-- 예제 7) 10번 부서에 소속된 사원을 제외하고 나머지 사원 출력하기
-- 사용법) SELECT 컬럼명 FROM 테이블명
--        WHERE NOT 컬럼명; (그 값에 반대되는 데이터가 출력됨)
SELECT * FROM EMPLOYEE
WHERE NOT DNO = 10;

-- 다른 방법 : 비교연산자 <> 사용
SELECT * FROM EMPLOYEE
WHERE DNO <> 10;

-- 연습 2) 급여가 1000 미만이거나 1500 초과인 사원 출력
SELECT * FROM EMPLOYEE
WHERE SALARY < 1000
OR SALARY > 1500;

-- 연습 3) 커미션이 300 이거나 500이거나 1400 인 사원 출력
SELECT * FROM EMPLOYEE
WHERE COMMISSION = 300
OR    COMMISSION = 500
OR    COMMISSION = 1400;

📌 BETWEEN 예약어


-- 3) BETWEEN 예약어
-- 예제 8) 급여가 1000과 1500 사이의 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY >= 1000
AND SALARY <= 1500;

-- BETWEEN 사용
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 BETWEEN 작은값 AND 큰 값;  
-- 사용처 : 작은값 ~ 큰 값 사이의 결과 조회하기 할 때 사용
SELECT * FROM EMPLOYEE
WHERE SALARY BETWEEN 1000 AND 1500;

-- NOT BETWEEN
-- 예제 9) 급여가 1000 미만 이거나 1500 초과인 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY < 1000
OR SALARY > 1500;

-- NOT BETWEEN 사용
SELECT * FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 1000 AND 1500;

-- 연습 3) 1982년에 입사한 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE HIREDATE BETWEEN '1982/01/01' AND '1982/12/31';

📌 IN 예약어


-- 4) IN 예약어
-- 예제 10) 상여금(COMMISSION)이 300이거나 500이거나 1400인 사원 조회
SELECT * FROM EMPLOYEE
WHERE COMMISSION = 300
OR    COMMISSION = 500
OR    COMMISSION = 1400;

-- IN 사용
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 IN (값, 값2, 값3....);
-- 사용처 : OR로 연결된 데이터를 간단하게 사용가능
SELECT * FROM EMPLOYEE
WHERE COMMISSION IN (300, 500, 1400);

-- NOT IN 사용
-- 예제 11) 상여금(COMMISSION)이 300이 아니고, 500이 아니고, 1400이 아닌 사원 조회
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 NOT IN (값, 값2, 값3....);
SELECT * FROM EMPLOYEE
WHERE COMMISSION NOT IN (300, 500, 1400);

📌 LIKE 검색


-- 5) LIKE 검색(*****)
-- 정의 : 일부 키워드(영문자, 한글)만 사용해서 비슷한 것들만 추려서 조회하기
-- 예제 12) 이름이 'F'로 시작하는 사원 조회하기
-- 사용법) SELECT 컬럼명 FROM 테이블명
--        WHERE 컬럼명 LIKE '%키워드%';
-- % : 키워드를 제외한 문자들
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE 'F%';

-- 연습 4) 이름에 'M'이 포함되어 있는 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '%M%';

-- 연습 5) 이름이 'N'으로 끝나는 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '%N';

-- 예제 13) 이름의 두번 째 글자가 'A'인 사원 조회하기
-- LIKE기호 : %(키워드를 제외한 어떤 문자열을 의미)
--         : _(키워드를 제외한 어떤 한 문자를 의미)
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '_A%';

-- 연습 6) 이름의 세번 째 글자가 'A'인 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '__A%';

-- 예제 14)IN, BETWEEN 의 반대를 나타낼 때 NOT 앞에 붙여서 사용했음
-- LIKE의 반대를 나타낼 때 똑같이 사용할 수 있음 : NOT LIKE
-- 이름에 A가 포함되지 않는 사람을 조회하세요
SELECT * FROM EMPLOYEE
WHERE ENAME NOT LIKE '%A%';

📌 NULL 검색

-- 6) NULL 검색(조회)
-- 예제 15) 상여금(COMMISSION)이 NULL 인 사원을 조회하세요
-- NULL의 특징 : 연산/비교 모든 것이 안됨 -> 결과는 NULL
-- 예약어 : NULL 조회시 : WHERE 컬럼명 IS NULL;
SELECT * FROM EMPLOYEE
WHERE COMMISSION IS NULL;

-- IN과 BETWEEN, LIKE의 반대는 앞에 NOT
-- IS NOT NULL이 존재함
SELECT * FROM EMPLOYEE
WHERE COMMISSION IS NOT NULL;

📌 ORDER BY 정렬


-- 7) ORDER BY : 정렬 기능
-- 예제 16) 사원 테이블을 오름차순으로 정렬하세요
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         ORDER BY 정렬대상컬럼 ASC/DESC;
-- 참고) 이 기능을 사용하면 성능이 대폭 저하
SELECT * FROM EMPLOYEE
ORDER BY SALARY ASC; -- ASC(오름차순, 생략가능)

-- 내림차순으로 정렬
SELECT * FROM EMPLOYEE
ORDER BY SALARY DESC; -- DESC(내림차순, 생략불가)

-- 연습7) 사원 테이블에서 사원명으로 오름차순 정렬
SELECT * FROM EMPLOYEE
ORDER BY ENAME;

-- 연습8) 입사일 데이터로 내림차순 정렬
SELECT * FROM EMPLOYEE
ORDER BY HIREDATE DESC;

-- 연습9) 사원테이블에서 급여는 내림차순으로 정렬하고, 사원명은 오름차순으로 정렬
SELECT * FROM EMPLOYEE
ORDER BY SALARY DESC, ENAME ASC;

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본  (0) 2023.09.08
반응형

📌 SQL 기본이론

-- sql-developr 툴 : DB 접속 툴(== DB 클라이언트 툴)
-- oracle 설치     : DB 서버
-- DB서버 <- 사용자가 접속해서 사용함(계정/암호)
-- system 계정 : 관리자( 계정생성, 권한관리 또는 DB 환경관리용으로 사용)
-- scott 계정  : 개발자(사용자) 계정 -> 벡엔드 개발을 진행함
-- sql-developer 툴 단축키 :
-- 1) 주석              : ctrl + /
-- 2) 커서 위치 한줄 실행 : ctrl + enter (아이콘 : 삼각형)
-- 3) 여러 줄 실행       : f5           (아이콘 : 문서 + 삼각형)
-- SQL 질의문(query)특징 : 대소문자 구분 없음(오라클 DB : 대문자가 성능이 빠름)
-- DB(데이터베이스) : 데이터를 관리 또는 저장하기 위한 최소단위 : 테이블
-- 1) SQL 문 : 검색(조회): SELECT ~ FROM 문
-- 사용법) SELECT 컬럼명, 컬럼명2... FROM 테이블명;
--                * : 모든 컬럼

DEPARTMENT

EMPLOYEE

📌 전체를 의미하는 *

 
SELECT * FROM DEPARTMENT; -- 전체부서를 조회하는 쿼리(질의문)
 
 

-- 예제 1) 사원테이블의 모든 컬럼 정보를 보기
SELECT * FROM EMPLOYEE;
 

📌 SELECT (컬럼명....) FROM 테이블명 : 해당 테이블에서 해당 컬럼만 조회


-- 예제 2) 사원테이블의 컬럼 중 ENO, ENAME 컬럼만 정보를 보기
SELECT ENO, ENAME FROM EMPLOYEE;

-- 예제 3) 부서테이블의 컬럼 중 DNO, LOC 컬럼만 조회하기
SELECT DNO, LOC FROM DEPARTMENT;

-- 예제 4) 힌트) 컬럼에 (/, +, -:) 연산자 사용해보기
-- 사원테이블 : EMPLYOEE
-- 월급 : SALARY
-- 사원명 : ENAME
-- 사원 테이블에서 사원명과 1년 연봉을 화면에 출력해보세요
SELECT ENAME ,(SALARY*12) FROM EMPLOYEE;

-- 예제 5) 사원테이블에서 사원이름과 커미션을 더한 연봉 구하기
SELECT ENAME,(SALARY*12)+COMMISSION FROM EMPLOYEE;

-- 예제 5-2) 위의 데이터 값 보정하기
-- NULL 특징 : NULL과 산술연산을 할 수 없음 (결과 : NULL)
-- 함수 : 사용법 : NVL(NULL 값이 있는 컬럼, 변경될 값)
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) FROM EMPLOYEE;

📌 alias : 컬럼에 별칭 붙이기


-- 예제 6) 컬럼에 별명(별칭) 붙이기
-- 사용법) SELECT 컬럼명 AS 별명 FROM 테이블명;
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) AS 연봉 FROM EMPLOYEE;

-- 예제 6-2) 별명에 공백을 넣어서 사용하기 : ""(쌍따옴표 사용)
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) AS "연        봉" FROM EMPLOYEE;

📌 중복을 제거하는 DISTINCT


-- 예제 7) 중복된 데이터를 한번씩만 출력하게 하는 예제
-- 사용법) SELECT DISTINCT 중복컬럼명 FROM 테이블명;
-- 사원테이블에 부서번호(DNO)를 중복을 제거해서 화면에 출력하기
SELECT DISTINCT DNO FROM EMPLOYEE;

-- 비교) 원본 DNO 질의문
SELECT DNO FROM EMPLOYEE;

📌 테스트 테이블 DUAL


-- 예제 8) 간단한 산술연산 및 테스트 용도 테이블 소개
-- DUAL 테이블 : 테스트용 테이블
SELECT * FROM DUAL;

-- 활용도)
SELECT 4*5+1 FROM DUAL;
-- SQL 문의 문자열 : '문자열' : 홑따옴표 사용
SELECT '홍길동' FROM DUAL;
-- 오늘 날짜 : SYSDATE 속성
SELECT SYSDATE FROM DUAL;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본(2)  (0) 2023.09.08

+ Recent posts