PostgreSQL 에서 sysdate 쓰는법

PostgreSQL에서는

    SELECT SYSDATE()

라는 쿼리문으로 현재 시스템의 시간이 출력되지 않는다.
(오라클에서는 FROM DUAL이 필요하지만 PostgreSQL에서는 필요하지 않다.

PostgreSQL에서 현재 시간을 알기 위해서는

    SELECT NOW();

의 쿼리를 사용하면 된다.

시간의 형식도 가져 오고 싶다면

    TO_CHAR( NOW(), 'YYMMDD')::NUMERIC

와 같이 ::(두개의 세미콜론)과 변환할 타입을 선언해 준다.

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] TIMESTAMP TO MILLIS  (0) 2020.04.09
[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] JOIN  (0) 2019.12.27

PostgreSQL Data Directory 변경하기.

Windows 기반의 로컬 서버와 테스트 서버에서 돌리는 PostgreSQL의 Data 저장경로가 C로 잡혀 있었음.
D 드라이브로 옮길 필요가 있어서 열심히 구글링 했으나,
거의 대부분의 자료가 Linux 기반이고, PostgreSQL의 버젼도 구버젼인 경우가 많아서 내가 정리 해보고자 함.

진행 환경

OS : Windows10, Windows Server 2008 R2 Standard
DB : PostgreSQL 10.10, compiled by Visual C++ build 1800, 64-bit
PostgreSQL 11.5, compiled by Visual C++ build 1914, 64-bit

진행


  1. PostgreSQL 데이터 저장경로 확인

    • SQL Shell을 실행 접속 후, show data_directory; 명령을 내리면 현재 PostgreSQL이 데이터를 저장하는 경로를 알려줌.
     Server [localhost]:
     Database [postgres]:
     Port [5432]:
     Username [postgres]:
     postgres 사용자의 암호:
     psql (10.10)
     도움말을 보려면 "help"를 입력하십시오.
    
     postgres=# show data_directory;
       data_directory
     ---------------------
     C:\Program Files\PostgreSQL\10\data
     (1개 행)
    • 경로 확인후 SQL Shell 종료.

  1. PostgreSQL 서버 종료.

    • PostgreSQL 10버전 이후의 서버 종료방법 찾기도 쉽지 않았음.

    • PowerShell을 관리자 권한으로 실행.

    • PostgreSQL의 설치 경로 하위의 scripts 경로로 들어감.

    • .\serverctl.vbs stop 명령어 실행.

       PS C:\WINDOWS\system32> cd 'C:\Program Files\PostgreSQL\10\scripts'
       PS C:\Program Files\PostgreSQL\10\scripts> .\serverctl.vbs stop
      
       Microsoft (R) Windows Script Host 버전 5.812
       Copyright (C) Microsoft Corporation. All rights reserved.
      
       postgresql-x64-10 - PostgreSQL Server 10 서비스를 멈춥니다..
       postgresql-x64-10 - PostgreSQL Server 10 서비스를 잘 멈추었습니다.

  1. 현재 데이터 저장 경로의 하위 디렉토리를 새 디렉토리로 이동함.

    • 나의 경우는 1에서 확인한 디렉토리에서 D:\dev\postgre\data로 복사.
    • 복사후, data 폴더를 우클릭 -> 속성보기 -> 보안 -> 사용권한이 잘 있는지 확인 해야 함. 일반적으로는 이상 없는듯.
      • 복사후, 이전 경로롸 새 경로의 권한이 같은지, 갖지 않다면 새 경로에 권한 추가를해 줘야 한다.
      • Windows Server 2008 R2 OS로 서버를 돌리는 경우에는 NETWORK SERVICE라는 유져의 접근이 가능해야 함.

  1. 설정 변경

    • 새로 옮긴 경로에서 postmaster.opts 파일(D:\dev\postgre\data\postmaster.opts)을
      텍스트 편집기로 열어서, 다음과 같은 내용으로 변경해줌

       C:/Program Files/PostgreSQL/10/bin/postgres.exe "-D" "D:\dev\postgre\data"

      대충 실행파일 위치와 데이터 저장 위치를 표기하는 듯.


  1. 레지스트리 변경

    • 레지스트리 편집기를 실행 후, 컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\postgresql-x64-10 경로까지 내려감.

    ImagePath를 선택 후 값을 변경해줌.

     "C:\Program Files\PostgreSQL\10\bin\pg_ctl.exe" runservice -N "postgresql-x64-10" -D "D:\dev\postgre\data" -w

    대충 3번과 같은 의미인듯 함.


  1. 서버 재시작.

    • 2에서 실행한 경로에서 .\serverctl.vbs start 명령을 내려주면 됨.
     PS C:\Program Files\PostgreSQL\10\scripts> .\serverctl.vbs start
     Microsoft (R) Windows Script Host 버전 5.812
     Copyright (C) Microsoft Corporation. All rights reserved.
    
     postgresql-x64-10 - PostgreSQL Server 10 서비스를 시작합니다...
     postgresql-x64-10 - PostgreSQL Server 10 서비스가 잘 시작되었습니다.
    • 새 경로에 접속 권한이 없다면 서버 시작이 되지 않으므로 꼭 권한 확인 해야 함.

  1. 경로 확인.

    • 1에서 확인한 방법으로 PostgreSQL의 데이터 저장 경로가 새 경로인지 확인.
     postgres=# show data_directory;
       data_directory
     ---------------------
     D:/dev/postgre/data
     (1개 행)

참고 자료

  • https://confluence.curvc.com/pages/viewpage.action?pageId=10092649
  • https://www.dbrnd.com/2016/08/postgresql-change-or-move-default-data-directory-in-windows-operating-system/
  • https://kugancity.tistory.com/entry/postgreSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EB%B3%80%EA%B2%BD
728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] 랜섬웨어  (0) 2020.03.03
[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26

 

조인 외에도 테이블 간의 데이터를 조회하는 방법이 있음.
집합 연산자는 SELECT 문을 여러개 연결하여 작성,
각 SELECT 문의 조회 결과를 하나로 합치거나 분리할 수 있음.
즉, 합집합, 교집합, 차집합과 같음.

OPERATOR DESC KIND
UNION 조회 결과의 합집합. 중복행은 1번만 출력. 합집합
UNION ALL 조회 결과의 합집합. 중복되는 행도 출력. 합집합
INTERSET 조회 결과의 교집합. 중복되는 행만 출력. 교집합
MINUS 첫 번째 조회 결과에서 두 번째 조회 결과를 뺀다. 차칩합
SELECT        열 이름
FROM          테이블 이름
집합 연산자   <---  UNION, UNION ALL, INTERSET, MINUS
SELECT        열 이름
FROM          테이블 이름
[ORDER BY     열 이름 [ASC or DESC]]
  • SELECT 문에서 기술한 열과 두 번째 SELECT 문에서 기술한 열은
    왼쪽부터 순서대로 1 : 1로 대응함,
    열 개수와 데이터 타입이 일치해야 함.
    열의 순서가 다르거나 데이터 타입이 일치하지 않으면 에러남.
  • SELECT 문에 대한 연산은 위에서 아래로 수행됨.
  • ORDER BY 절은 SELECT 문의 맨 끝에 기술함.

UNION

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    UNION
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

UNION ALL

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    UNION ALL
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

INTERSECT

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    employees
    INTERXECT
    SELECT  department_id
    FROM    departments
    ORDER BY department_id
  );

MINUS

SELECT COUNT(*)
FROM
  (
    SELECT  department_id
    FROM    departments
    MINUS
    SELECT  department_id
    FROM    employees
    ORDER BY department_id;
  );
728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] sysdate 쓰는법  (0) 2020.02.14
[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26

JOIN

관계형 데이터베이스에서 테이블 안에 있는 행들을 논리에 땨라 연결할 수 있도록 하는 기법.

JOIN DESC
EQUI JOIN 조건이 정확히 일치하는 경우, 결과 출력.
NON EQUI JOIN 조건이 정확히 일치하지 않는 경우, 결과 출력.
SELF JOIN 자체 테이블 내에서 조인.
OUTER JOIN 조건이 정확히 일치하지 않아도 모든 결과를 출력.
곱집합 (Cartesian Product) 가능한 모든 행을 조인.

EQUI JOIN

양쪽 테이블에서 공통적으로 존재하는 컬럼 값이 일치하는 행만 가져오는 일반적인 조인.
등호 (=) 연결 연산자를 사용해서 조건 값이 정확히 일치할 때만 행을 가져오기 때문에,
EQUI JOIN 혹은 INNER JOIN 이라고 함.
주로 PK와 FK의 관계를 이용해 조인하지만, 다양한 조건으로 조인할 수 있음.

SELECT
    A.열 이름1, B.열 이름 2
FROM
    테이블 1 A, 테이블 2 B
WHERE
    테이블 1.열 이름 = 테이블 2.열 이름
SELECT
    *
FROM
    employees A, departments B
WHERE
    A.department_id = B.department_id;
SELECT
    A.employee_id, A.department_id, B.department_name, C.location_id, C.city
FROM
    employees A, departments B, locations C
WHERE
    A.department_id = B.department_id
AND
    B.location_id = C.location_id

NON-EQUI JOIN

대상 테이블 간 동일 칼럼 없이, 다른 조건으로 조인할 때 사용.
같은 조건이 아닌 크거나 작은 경우 JOIN을 수행하는 방법.

SELECT
  A.employee_id, A.first_name, A.salary,
  B.grade
FROM
  employees A, salarygrade B
WHERE
  A.salary BETWEEN B.losalary AND B.hisalary;

HR 테이블에서는 적절한 예제가 없다.
위 예제도 salarygrade라는 테이블이 따로 필요함.
정상은 아님.


SELF JOIN

자기 자신의 테이블을 조인하는 것.

SELECT
    A.열 이름, B.열 이름
FROM
    테이블 1 A, 테이블 1 B
WHERE
    테이블 1.열 이름 1 = 테이블 1.열 이름 2
SELECT
    A.employee_id, A.first_name, A.last_name, A.manager_id,
    B.first_name|| ' ' ||B.last_name AS manager_name
FROM
    employees A, employees B
WHERE
    A.manager_id = B.employee_id
ORDER BY
    A.employee_id;

OUTER JOIN

조건을 만족하지 않는 행도 모두 출력하기 위해 사용.
조인시 값이 없는 테이블 측에 (+)연산자를 붙임.

SELECT
    A.열 이름1, B.열 이름 2
FROM
    테이블 1 A, 테이블 2 B
WHERE
    테이블 1.열 이름 = 테이블 2.열 이름(+)
SELECT
    A.employee_id, A.first_name, A.last_name,
    B.department_id, B.department_name
FROM
    employees A, departments B
WHERE
    A.department_id = B.department_id(+)
ORDER BY
    A.employee_id DESC
SELECT
    A.employee_id, A.first_name, A.last_name,
    B.department_id, B.department_name
FROM
    employees A, departments B
WHERE
    A.department_id(+) = B.department_id
ORDER BY
    A.employee_id DESC

ANSI JOIN

ANSI / ISO SQL 표준인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN을 지원.
ANSI JOIN이 명시적을 표형하기 때문에 더 가독성이 좋은 느낌.

INNER JOIN

그냥 묶을 때 사용.
INNER 생략 가능.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
INNER JOIN
    departments D
ON
    E.department_id = D.department_id;

LEFT OUTER JOIN

(+) 기호 대신 명시적으로 사용.
오른쪽 테이블에 조인 시킬 값이 없는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
LEFT OUTER JOIN
    departments D
ON      
    E.department_id = D.department_id;

RIGHT OUTER JOIN

왼쪽 테이블에 조인 시킬 값이 없는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
RIGHT OUTER JOIN
    departments D
ON
    E.department_id = D.department_id;

FULL OUTER JOIN

양쪽 모두 OUTER JOIN을 걸어야 하는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
FULL OUTER JOIN
    departments D
ON
    E.department_id = D.department_id;ㅋ

cross join은 뭐지?

728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24

GROUP BY

한 테이블 내의 특정 컬럼을 기준으로 그룹화 하여 테이블의 행들을 그룹별로 구별해야 한다면,
GROUP BY를 이용하여 같은 값을 갖는 행끼리 그룹화할 수 있음.

  SELECT    `기준 열`, 그룹 함수( 열 이름 )     --  4
  FROM      테이블 이름                        --  1
  [WHERE    조건 식]                         --  2
  GROUP BY  열 이름                         --  3
  [ORDER BY 열 이름]                         --  5

논리 순서

  1. 테이블 접근.
  2. WHERE 조건에 맞는 데이터를 고름.
  3. 기술될 기준 열을 기준으로 같은 데이터 값끼리 그룹화.
  4. 결과를 출력.
  5. ASC 혹은 DESC로 정렬.
    • SELECT 절에 기준 열과 그룹 함수가 같이 지정되면,
      GROUP BY 절의 기준 열 이름이 반드시 기술되어야 함.
      ( SELECT 절에 그룹 함수만 기술되고, 열 이름이 기술되지 않으면,
      GROUP BY 절을 반드시 기술할 필요는 없음. )
    • WHERE 절을 사용하면 행을 그룹으로 묶기 전에 앞서 조건식이 적용됨.
    • SELECT 절에 그룹 함수를 사용하지 않아도 GROUP BY 절만으로 사용할 수 있음.
SELECT
  job_id AS 직무, SUM(salary) 직무별_총급여, AVG(salary) 직무별_평균급여
FROM
  employees
WHERE
  employee_id >= 10
GROUP BY
  job_id
ORDER BY
  직무별_총급여 DESC,
  직무별_평균급여;

그룹에 대한 그룹

SELECT
  job_id AS 대그룹,
  manager_id AS 중그룹,
  SUM(salary) 그루핑_총급여,
  AVG(salary) 그루핑_평균급여
FROM
  employees
WHERE
  employee_id >= 10
GROUP BY
  job_id,
  manager_id
ORDER BY
  그루핑_총급여 DESC,
  그루핑_평균급여;

HAVING

연산된 그룹 함수 결과에 조건 적용하기.
SELECT 절에서 WHERE로 조건을 주어주듯,
HAVING으로 GROUP BY에서 조건식을 적용할 수 있음.

  SELECT    열 이름, 그룹 함수(열 이름)  -- 5
  FROM      테이블 이름                -- 1
  [WHERE    조건식]                   -- 2
  GROUP BY  열 이름                   -- 3
  [HAVING   조건식]                   -- 4
  [ORDER BY 열 이름]                  -- 6

논리 순서

  1. 테이블 접근.
  2. WHERE 조건식에 맞는 데이터 값을 고름.
  3. 기술된 기준 열을 기준으로 같은 데이터 값끼리 그룹화.
  4. 그룹화된 값에 대해 조건식을 적용.
  5. 결과를 가져옴.
  6. ASC, DESC로 정렬.
SELECT
  job_id AS 직무,
  SUM(salary) 직무별_총급여,
  AVG(salary) 직무별_평균급여
FROM
  employees
WHERE
  employee_id >= 10
GROUP BY
  job_id
HAVING
  SUM(salary) > 30000
ORDER BY
  직무별_총급여 DESC,
  직무별_평균급여;

HAVING과 WHERE의 비교

WHERE HAVING
조건을 사용하여 결과를 제한 그룹의 결과를 제한
테이블에서 특정 조건에 부합하는 자료만을 검색 할 때 사용 그룹함수를 적용해서 나온 값 중에서 원하는 조건에 부합하는 자료만 산출할 때 사용
단순 컬럼 그룹함수

DQL의 실행 순서 재정리

  SELECT            -- 5
  FROM              -- 1
  [WHERE            -- 2
  GROUP BY          -- 3
  [HAVING           -- 4
  [ORDER BY 열 이름]  -- 6

그룹 함수를 GROUP BY와 함께 봐야 할까?

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] JOIN  (0) 2019.12.27
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23

FUNCTION

DB에서 제공하는 미리 정의 된 기능.

  • 데이터 값을 계산하거나 조작. (단일 행 함수)
  • 열의 데이터 타입을 변환.
  • 행의 그룹에 대해 계산하거나 요약. (그룹 함수)

DUAL 테이블

쿼리문의 수행 결과가 하나의 ROW로 출력되기 위한 DUMMY 컬럼만 갖고 있음.
함수를 위한 임시 테이블 같은 개념.

단일 행 함수 : 데이터 값을 계산 혹은 조작

  • 각 행에 대해 수행.
  • 데이터 타입에 맞는 함수를 사용 해야 함.
  • 행렬로 하나의 결과를 반환.
  • SELECT, WHERE, ORDER BY 절 등에서 사용 가능.
  • 함수 속의 함수로 중첩해서 사용 가능.

단일 행 함수의 종류.

종류 DESC
문자 타입 문자를 입력받아 문자와 숫자를 반환.
숫자 타입 숫자를 입력받아 숫자를 반환.
날짜 타입 날짜 연산, 날짜 값 반환.
변환 타입 임의의 데이터 타입의 값을 다른 데이터 타입으로 변환.
일반 함수 NVL, DECODE, CASE, WHEN, 순위 함수 등.

문자 처리 함수

     
lower 소문자 반환 lower('fuck DB') = 'fuck db'
upper 대문자 반환 upper('fuck DB') = 'FUCK DB'
initcap 문자열의 첫글자 대문자, 나머지 소문자 initcap('fuck DB') = 'Fuck Db'
substr 문자를 잘라 추출 (한글1byte) substr('Welcome to Oracle',4,3) = 'com' substr('Welcome to Oracle',-4,3) = 'acl'
substrb 문자를 잘라 추출 (한글 2byte) substr('웰컴투오라클',3,4) = 투오라클, substrb('웰컴투오라클’,3,4) = 컴투
concat 문자의 값을 연결 CONCAT('fuck', ' DB')
length 문자의 길이 반환 (한글 1byte) length('오라클’) = 3
lengthb 문자의 길이 반환 (한글 2byte) lengthb('오라클’) = 6
lpad / rpad 입력 받은 문자열과 기호를 정렬하여 특정 길이의 문자열로 반환 "lpad('oracle',10,'#') = '####oracle'"
trim / ltrim / rtrim 잘라내고 남은 문자 표시 rtrim(' oracle ') = ' oracle'trim('a' from 'aaaORACLEaaa') = 'ORACLE'
convert char set으로 변환  
chr ascii 코드 값으로 변환  
ascii ascii 코드값을 문자로 반환 ascii('Oracle')
replace 문자열에서 특정문자 변경  
instr 특정 문자의 위치 반환 instr('Welcome to Oracle', 'o') = 5instr(대상,찾을글자,시작위치,몇번째발견)

숫자 처리 함수

     
round 특정 자릿수에서 반올림. ( -시 정수값도 가능) round(대상,(-)자릿수)
trunc 특정 자릿수에서 버림, 절단.( -시 정수값도 가능) trunc(대상,(-)자릿수)
ceil 올림  
floor 버림  
'' '' ''
abs 절대값 반환  
cos cosine  
exp e의 n승  
floor 소수점 아래를 자름 (버림)  
log log값 반환  
power power(man) m의 n승 반환  
sign sign(n) n<0이면 -1 n=0이면 0,n>0이면 1
sin sine값 반환  
tan tangent값 반환  
mod 입력 받은 수를 나눈 나머지값 반환. mod(대상,2) = 1 (java 에서 %)

날짜 처리 함수

날짜 연산

날짜 연산 DESC 반환값
Date + Number 날짜에 일수를 더한다. Date
Date - Number 날짜에 일수를 뺀다. Date
Date - Date 날짜에서 날짜를 뺀다. 일 수
Date + Number / 24 날짜에 시간을 더할 때는 시간을 24로 나누어서 날짜에 더한다. Date
SELECT
  TO_CHAR( SYSDATE, 'YY/MM/DD/HH24:MI' ),
  SYSDATE + 1,
  SYSDATE - 1,
  (SYSDATE + 1) - (SYSDATE - 7),
  SYSDATE + 13 / 24
FROM
  DUAL;

날짜 처리 함수

MONTH_BETWEEN 함수 외에는 모두 날짜 타입을 반환함.

     
sysdate 시스템상 현재 날짜 반환 sysdate+1 = 내일날짜
months_between 두 날짜 사이가 몇 개월인지 반환 between(date1, date2)
add_months 특정 날짜에 개월수 더함 add_months(date, number)
next_day 특정 날짜에서 최초 요일의 날짜 반환 next_day(date, 요일)sysdate, next_day(sysdate, '수')09.01.17, 09.01.21
last_day 해당 달의 마지막달 반환 last_day(sysdate) = 18.07.31
round 인자로 받은 날짜를 특정 기준으로 반올림 round(date, format)round(hiredate, month) = day < 16 = 이달.01, day > 16 = 담달.01
trunc 인자로 받은 날짜를 특정 기준으로 버림 trunc(date, format)

MONTHS_BETWEEN

두 날짜 사이의 개월 수 계산

  MONTHS_BETWEEN( 날짜, 날짜 )
SELECT
  SYSDATE, hire_date, MONTHS_BETWEEN( SYSDATE, hire_date )
FROM
  employees
WHERE
  department_id = 100;

ADD_MONTHS

월에 날짜 더하기

  ADD_MONTHS( 날짜, 숫자 )
SELECT
  hire_date,
  ADD_MONTHS( hire_date, 3),
  ADD_MONTHS( hire_date, -3)
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

NEXT_DAY

돌아오는 요일의 날짜 개산하기

  NEXT_DAY( 날자, '요일' or 숫자 )
SELECT
  hire_date,
  NEXT_DAY( hire_date, 'Friday'),
  NEXT_DAY( hire_date, 6)
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

LAST_DAY

돌아오는 월의 마지막 날짜 계산하기

  LAST_DAY( 날짜 )
SELECT
  hire_date,
  LAST_DAY( hire_date )
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

ROUND, TRUNC

날짜를 반올림 혹은 절삭

  ROUND or TRUNC ( 날짜, 지정 값[MONTH, YEAR등] )
SELECT
  hire_date,
  ROUND( hire_date, 'MONTH' ),
  ROUND( hire_date, 'YEAR' ),
  TRUNC( hire_date, 'MONTH' ),
  TRUNC( hire_date, 'YEAR' )
FROM
  employees
WHERE
  department_id BETWEEN 100 AND 106; 

형 변환 함수

TO_DATE

날짜를 나타내는 문자열을 명시도니 날짜 형식으로 변환하는 함수

  TO_DATE( 문자열, '지정형식' )
SELECT
  TO_DATE( '20111217', 'YYYYMMDD')
FROM
  DUAL;

TO_NUMBER

숫자 타입의 문자열을 숫자 데이터 타입으로 변환하는 함수. 데이터 타입만 바뀜.

  TO_NUMBER( '숫자' )
SELECT
  TO_NUMBER('1234')
FROM
  DUAL;

TO_CHAR

숫자 값을 지정한 데이터 형식의 문자열로 변환

  TO_CHAR( 숫자 데이터 타입, '지정 형식' )
지정 형식 DESC EX RESULT
9 9로 출력 자릿수 지정 TO_CHAR( 42000, '99999999' ) ' 42000'
0 자릿수 만큼 0을 출력 TO_CHAR( 42000, '09999999' ) 00042000
$ 달러 TO_CHAR( 42000, '$9999999' ) $42000
L 지역 화폐 기호 TO_CHAR( 42000, 'L9999999' ) $42000
, 명시한 위치에 쉼표 TO_CHAR( 42000, '9,999,999' ) 43,000
. 명시한 위치에 소수점 TO_CHAR( 42000, '9999999.99' ) 42000.00

TO_CHAR

날자 값을 지정한 형식의 문자열 타입으로 면환

  TO_CHAR( 날짜 데이터 타입, '지정 형식' )
지정 형식 DESC
CC 세기
YY 연도
YEAR 문자 연도
Q 분기
MM 숫자값 월
MONTH 문자값 월
MON 문자값 약어 월
RM 로마자 월
W 년월의 주
DD 년월주의 일
DAY 요일이름
DY 요일 이름 약어

일반 함수

NVL

  NVL( 열이름, '치환 값' )

NULL 값을 치환 값으로 처리함.

SELECT
  salary * NVL( commission_pct, 1 )
FROM
  employees
ORDER BY
  commission_pct;

NVL2

  NVL2( COLUMN1, COLUMN2, COLUMN3 )

COLUMN1의 값이 NULL이면 COLUMN3를 출력 NULL이라면 COLUMN2를 출력.

DECODE

조건 논리 처리.
3항 연산과 같음.

  DECODE( 열 이름, 조건 값, 치환 값, 기본 값 )
SELECT
  first_name,
  last_name,
  department_id,
  salary as 급여,
  DECODE( department_id, 60, salary * 1.1, salary )   as 조정급여,
  DECODE( department_id, 60, '10%인상', '미인상' )    as 인상여부
FROM
  employees;
ORDER BY
  commission_pct;

CASE

복잡한 조건 논리처리 하기

CASE
  WHEN  조건 1  THEN  출력 값 1
  WHEN  조건 3  THEN  출력 값 2
  ...
  ELSE  출력 값 3
END
SELECT
  employee_id, first_name, last_name, salary,
  CASE
    WHEN salary >= 9000 THEN 'TOP'
    WHEN salary BETWEEN 6000 AND 8999 THEN 'MID'
    ELSE 'LOW'
  END AS salary_grade
FROM
  employees
WHERE
  job_id = 'IT_PROG';

RANK, DENSE_RANK, ROW_NUMBER

데이터 값에 순위 매기기

FUNC DESC EX
RANK 공동 순위를 출력하되, 공동 순위만큼 건너 뛰어 다음 순위 출력. 1, 2, 2, 4, ...
DENSE_RANK 공동 순위를 출력하되, 건너 뛰지 않고 이어서 다음 순위 출력. 1, 2, 2, 3, ...
ROW_NUMBER 공동 순위없이 순위 출력. 1, 2, 3, 4, ...
  RANK () OVER ( [PARTITION BY 열 이름] ORDER BY 열 이름)
SELECT
  employee_id, salary,
  RANK()       OVER( ORDER BY salary DESC ) AS RANK_SALARY,
  DENSE_RANK() OVER( ORDER BY salary DESC ) AS DENSE_RANK_SALARY,
  ROW_NUMBER() OVER( ORDER BY salary DESC ) AS ROW_NUMBER_SALARY
FROM
  employees;
SELECT
  A.employee_id, A.department_id, B.department_name, A.salary,
  RANK()       OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS RANK_SALARY,
  DENSE_RANK() OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS DENSE_RANK_SALARY,
  ROW_NUMBER() OVER( PARTITION BY A.department_id ORDER BY salary DESC ) AS ROW_NUMBER_SALARY
FROM
  employees A, departments B
WHERE
  A.department_id = B.department_id
ORDER BY B.department_id, A.salary DESC;

그룹 함수

집계 함수라고도 함.
단일 행 함수와 달리 여러 행에 대해 함수가 적용되어 하나의 결과를 나타내는 함수.
기준 열에 대해 같은 데이터 값 기리 그룹으로 묶고,
묶은 행의 집합에 대해 그룹 함수 연산이 필요하다면 GROUP BY 절을 이용하여 처리할 수 있음.
묶은 그룹에 대해 조건이 필요하다면 HAVING 절을 이용함.

그룹 함수의 사용법

  SELECT  그룹함수( 열 이름 )
  FROM    테이블 이름
  [WHERE 조건식]
  [ORDER BY 열 이름]

주요 그룹 함수

예제 생략

FUNC DESC EX  
count 행 개수를 셈 count(comm) NULL값도 셈
sum 합계 sum(comm)  
avg 그룹의 평균 avg(salary)  
max 그룹의 최댓값 max(salary)  
min 그룹의 최소값 min(salary)  
stddev 그룹의 표준편차    
variance 그룹의 분산    
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] JOIN  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB(Database)란  (0) 2019.12.23

조건 절 WHERE를 활용한 데이터 검색

  • 원하는 결과를 얻기위해 조건을 제한함.
  • WHERE절은 FROM절 다음에 위치한다.
  • 문자열, 날짜는 'Single Quotation'안에 표기해야 함.
    • 명령어는 대소문자 구분을 하지 않지만,
      테이블 내에 저장된 데이터 값은 대소문자를 구분함.
  • 수행될 조건 절에는 비교 연산자, SQL 연산자, 논리 연산자, 열 이름, 표현식, 숫자, 문자 등 사용 가능.
  SELECT  열 이름    <-- 출력 하려는 열
  FROM    테이블 이름 <-- 참조 하려는 테이블
  WHERE   원하는 조건 <-- 조건 식
  • 데이터가 조회되는 논리 순서
    1. FROM : 참조하려는 테이블로부터
    2. WHERE : 해당하는 조건이 맞는
    3. SELECT: 열을 선택해서 조회

WHERE절에 사용하는 연산자의 종류

연산자 설명 예시
비교 조건을 비교 =, <, > 등
SQL 비교 조건 확장 BETWEEN, IN 등
논리 논리 조건 연결 AND, OR

연산자의 우선 순위

괄호 > 부정 연산 > 비교 연산 > SQL 연산
NOT > AND > OR 순
연산자의 순서는 데이터 조회 속도에 영향을 미침 -> 고급 SQL 영역임.

비교 연산자 : 비교 조회 조건 주기

SELECT *
FROM  employees
WHERE employee_id = 100;
SELECT *
FROM  employees
WHERE first_name = 'David';
SELECT
  *
FROM employees
WHERE employee_id >= 105;

SQL 연산자 : 조회 조건 확장하기

BETWEEN

SELECT
  *
FROM employees
WHERE
  salary BETWEEN 10000 AND 20000;

IN

SELECT
  *
FROM employees
WHERE
  salary IN (10000, 17000, 24000);

LIKE와 '%'

SELECT
  *
FROM employees
WHERE
  job_id LIKE 'AD%';

'_'

SELECT
  *
FROM employees
WHERE
  job_id LIKE 'AD___';

IS NULL

SELECT
  *
FROM employees
WHERE
  manager_id IS NULL;

논리 연산자 : 조건 논리를 계속 연결하기

AND

SELECT
  *
FROM employees
WHERE
  salary > 4000
AND
  job_id = 'IT_PROG'

OR

SELECT
  *
FROM employees
WHERE
  salary > 4000
AND
  job_id = 'IT_PROG'
OR
  job_id = 'FL_ACCOUNT'

!=와 <>

SELECT
  *
FROM employees
WHERE
  employee_id != 105
SELECT
  *
FROM employees
WHERE
  employee_id <> 105

IS NOT NULL

SELECT
  *
FROM employees
WHERE
  manager_id IS NOT NULL
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] GROUP  (0) 2019.12.26
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB(Database)란  (0) 2019.12.23
DB 설치 없이 SQL 실습하기  (0) 2019.12.21

데이터 조회

  • sql명령어는 여러개의 절이 모여 하나의 문장을 구성,  `;` 으로 마쳐야 함.
  • 대소문자 구분하지 않음.

SELECT 기본 문법

기본적으로 SELECT절과 FROM절로 구성.

  • SELECT : 출력하고자 하는 칼럼의 이름들을 기술.
  • FROM : 조회하고자 하는 테이블의 이름을 기술.
    ex)
    SELECT    열 이름
    FROM      테이블 이름

전체 데이터 조회하기

테이블내 모든 컬럼을 출력하고자 한다면 컬름 이름 대신 *로 조회.

SELECT  *
FROM    employees;

원하는 열만 조회하고 정렬하기

SELECT employee_id, first_name, last_name
FROM   employees
ORDER BY  employee_id DESC;

중복된 출력값 제거하기

DISTINCT 뒤에 열 이름이 계속 나열된다면 원하는 값이 나오지 않을 수 있으니 ()를 신경 써야 함.

SELECT DISTINCT job_id, employee_id
FROM   employees;
SELECT DISTINCT( job_id ), employee_id
FROM   employees;

효율적인 SQL을 위한 별칭(alias)

AS를 붙일 수도 있고, 떼도 됨.
가독성을 위해서는 붙이는 걸 권장함.

SELECT
  employee_id AS 사원번호
  ,   first_name 이름
  ,   last_name   성
FROM
  employees;

데이터 값 연결하기

연결 연산자 ||
[ 열 이름 ] || [ 열 이름 ] or [ 열 이름 ] '[문자]'

SELECT
  employee_id,
  first_name || ' ' || last_name,
  email || '@' || 'company.com'
FROM   employees;

산술 처리: 데이터 값 계산

데이터 값을 계산할 때 사용.
산술 표현식에는 열 이름, 숫자, 날짜, 산술 연산자 등을 포함 할 수 있음.
산술 연산자는 가감승제( +, -, *, / )가 있음.
연산은 (), *, /, +, -순으로 함.

employees 테이블에서 employee_id, salary, salary에 500을 더한 값, 100을 뺀값. 10%를 추가해서 2로 나눈값을 출력하시오.

SELECT
  employee_id,
  salary,
  salary + 500,
  salary - 100,
  (salary * 1.1) / 2
FROM
  employees;
SELECT
  employee_id AS 사번,
  salary AS 급여,
  salary + 500 AS 추가급여,
  salary - 100 AS 인하급여,
  (salary * 1.1) / 2 AS 조정급여
FROM
  employees;
728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
DB(Database)란  (0) 2019.12.23
DB 설치 없이 SQL 실습하기  (0) 2019.12.21
nodejs mysql 연동 에러  (0) 2019.12.11

DB : Database

데이터의 집합, 검색 수정 삭제 추가등 관리.

파일 시스템의 문제점 해결

  • 데이터의 종속
  • 데이터의 중복
    • 일관성 - 동일성을 유지하기 위해 데이터 중복을 피하기 위해
    • 보안성 - 동일한 수준에서 보안 유지
    • 경제성 - 저장되는 공간에 대한 비용 절감
    • 무결성 - 데이터의 정확성을 유지

DB의 정의

  • 통합된 데이터 (Integrated Data)
    • 원칙적으로 데이터 중복되어 있지 않게함
  • 저장된 데이터 (Stored Data)
    • 기억장치에 저장된 데이터
  • 운영 데이터 (Operational Data)
    • 존재 목적이 명확하고 유용성을 지니고 있음
  • 공용 데이터 (Shared Data)
    • 여러 사용자들이 서로 다른 목적으로 공유가 가능한.

DB의 특징

실시간 접근성, 지속적인 변화, 동시 공유, 내용에 대한 참조

데이터베이스 관리시스템 (DBMS : DataBase Management System)

효율적으로 관리하고 검색할 수 있는 환경을 제공, 체계적인 활용을 가능케함.
응용프로그램과 데이터베이스의 중계

관계형 데이터베이스 관리 시스템

일반적인 DB, 작성과 이용이 편함, 응용프로그램을 변경하지 않아도 참삭이 편함.
정보들을 Table형태로 저장함.
테이블은 2차원 형태의 표처럼 row(행), column(열)로 구성.

Table ; 표

Row \ Table Column Column Column
Number 1 2 3
Eng Char A B C
Kor Char

참고

SQL? (Structured Query Language)

사용자와 관계형 데이터베이스를 연결시켜주는 표준 검색언어.
쉽게 얘기해서 데이터베이스를 다루기위해 디자인된 언어임.
프로그래밍 언어는 아니지만 Java 등 다른 프로그래밍 언어보다 더 많이 사용될 수밖에 없음.

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB 설치 없이 SQL 실습하기  (0) 2019.12.21
nodejs mysql 연동 에러  (0) 2019.12.11

DB 설치 없이 Oracle DB 실습하기.

SQL에서 부족한 점이 느껴져서 공부 하려고 했는데 Oracle DB를 어디에 설치할지 고민이였음,
BUT!! Oracle에서 설치 없이 SQL을 돌릴 수 있는 웹 기반 서비스가 있었음..
당연히 오라클 계정이 있어야 함.
https://livesql.oracle.com/

세션, 쿠키, JS 기반으로 테이블과 데이터들을 정의하고, 일정 시간이 지나면 데이터가 삭제 되는 듯?

Oracle 테스트 데이터인 HR을 사용하고 싶다면,
https://livesql.oracle.com/apex/livesql/file/content_GV8MU6SITA2V3VYI179FAJUCY.html로 접속,
RUN SCRIPT 버튼을 눌러주면 내 계정에서 사용이 가능함.

https://livesql.oracle.com/apex/f?p=590:49:::NO:::로 접속 하면 그 외 샘플 데이터와 학습 자료들이 있음.
단점이라면 영어라는것..?

728x90
반응형

'Database' 카테고리의 다른 글

[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24
[SQL] 데이터 조회 SELECT  (0) 2019.12.23
DB(Database)란  (0) 2019.12.23
nodejs mysql 연동 에러  (0) 2019.12.11

+ Recent posts