DB

DB_5강

삼색이삼랑해 2022. 10. 6. 10:45

  날짜와 시간

날짜를 기본값으로 설정하는 방법은 다양하다.

날짜와 시간을 구하는 함수는 now()이며, 타입에 따라 날짜 및 시간을 구할 수 있다.

 

1. now()

now()는 현재 날짜와 시간을 구하는 함수로, 데이터 입력 시 INSERT문에서 사용한다.

 

2. 날짜 기본값 설정

- DATE 타입

   컬럼명 DATE DEFAULT (CURRENT_DATE) 또는
   컬럼명 DATE DEFAULT (curdate())

 

- TIME 타입

  컬럼명 TIME DEFAULT (CURRENT_TIME) 또는
  컬럼명 DATE DEFAULT (curtime())

 

- DATETIME 타입

  컬럼명 DATETIME DEFAULT CURRENT_TIMESTAMP 또는
  컬럼명 DATETIME DEFAULT (CURRENT_TIME) 또는
  컬럼명 DATE DEFAULT now()

CREATE TABLE date_test (
   d_no INT AUTO_INCREMENT PRIMARY KEY,
    d_date DATE DEFAULT (curdate()),
    d_time TIME DEFAULT (CURRENT_TIME),
    d_dt DATE DEFAULT now()
);

INSERT INTO date_test
-- VALUES (null, DEFAULT, DEFAULT, DEFAULT); -- 테이블을 만들 당시 시간
VALUES (null, now(), now(), now()) -- 값을 입력했을 때 시간
;

COMMIT;
SELECT * FROM date_test;

  서브쿼리(Subquery)

하나의 쿼리는 여러 쿼리문으로 구성되는 형태를 가지는데, 이때 내부에 포함되는 쿼리문을 하위 질의문, 서브쿼리라고 한다.

 

  • 단일행 서브쿼리 : WHERE절에 위치함 => 서브쿼리의 실행 결과가 하나의 행(컬럼도 한 개)
  • 다중행 서브쿼리 : WHERE절에 위치함 => 서브쿼리의 실행 결과가 여러 행(컬럼은 한 개)
  • 다중컬럼 서브쿼리 : WHERE절에 위치함 => 서브쿼리의 실행 결과가 여러 행, 여러 컬럼
-- 단일행 서브쿼리 예제
-- 사원번호가 7698번인 사원과 같은 직함을 가진 사원 정보

-- 1) 사원번호가 7698번인 사원의 직함 조회
SELECT job FROM emp WHERE empno = 7698;
-- 2) 같은 직함을 가진 사원 조회
SELECT * FROM emp WHERE job = 'MANAGER';
-- 3) 두 쿼리를 합친다
SELECT * FROM emp
WHERE job = (
   SELECT job
    FROM emp
    WHERE empno = 7698
);
-- 다중행 서브쿼리 예제
-- 부서별로 가장 많은 급여를 받는 사원 정보를 조회

-- 1) 부서별 가장 많은 급여 조회
SELECT max(sal) FROM emp GROUP BY deptno;
-- 2) 각 급여에 해당하는 사원 정보 조회
SELECT * FROM emp WHERE sal = 5000 -- 첫 번째 방법
    OR sal = 3000 OR sal = 2850;
-- SELECT * FROM emp WHERE sal IN (5000, 3000, 2850); -- 두 번째 방법
-- 3) 두 쿼리를 합침
SELECT * FROM emp
WHERE sal IN (
    SELECT max(sal)
    FROM emp
    GROUP BY deptno
);
-- 다중컬럼 예제
-- 여러 테이블을 같이 조회할 때 서브쿼리를 많이 사용
-- 사원번호가 7654번인 사원의 부서명과 위치를 조회

SELECT * FROM emp;
SELECT * FROM dept;
-- 1) 7654번 사원의 부서번호 조회
SELECT deptno FROM emp WHERE empno = 7654;
-- 2) 30번 부서의 이름과 위치를 조회
SELECT dname, loc FROM dept WHERE deptno = 30;
-- 3) 두 쿼리를 합침
SELECT dname, loc
FROM dept
WHERE deptno = (
    SELECT deptno
    FROM emp
    WHERE empno = 7654
);

* any : 서브쿼리의 여러 결과 중 어느 하나의 값만 만족하면 결과로 가져오는 연산자

   all : 모든 서브쿼리의 결과에 만족하면 결과로 가져오는 연산자