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

pom.xml

pom.xml에 다음과 같은 Dependency를 추가 해 준다.
버전에 따라 지원이 되지 않을 수 있다.

<!-- JSON을 위한 Dependency -->
<dependency>
  <groupId>net.sf.json-lib</groupId>
  <artifactId>json-lib</artifactId>
  <version>2.4</version>
  <classifier>jdk15</classifier>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
</dependency>
<!-- JSON을 위한 Dependency -->

servlet.xml

servlet.xml 혹은 dispatcher-servlet.xml

<mvc:annotation-driven>
  <mvc:message-converters>
  
  <!-- 
    이 부분은 Controller에서 일반적인 HTML을 리턴하기 위한 설정이다.
    JSON을 리턴하지 않을 경우는 Default 값으로 지정 되어 있기 때문에 설정 할 필요 없지만,
    JSON 리턴과 HTML 리턴을 모두 하려면은 명시적으로 설정 해 줘야 한다.
   -->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
      <property name="supportedMediaTypes">
        <list>
          <value>text/html; charset=UTF-8</value>
        </list>
      </property>
    </bean>
    
    <!--
      Controller에서 JSON 리턴시 객체를 변환 해주기 위해서 MessageConverter가 필요하다. 
    -->
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="supportedMediaTypes">
        <list>
          <value>application/json; charset=UTF-8</value>
        </list>
      </property>
    </bean>
    
  </mvc:message-converters>
</mvc:annotation-driven>

Controller

Controller는
필수적으로 @ResponceBody
권장 사항으로 produces = "application/json; charset=UTF-8" 를 명시 해 준다.
produces 속성은 Response의 Content-Type을 제어한다.

@RequestMapping(
    value = "/reqWaterDepth.do",
    method = RequestMethod.POST,
    produces = "application/json; charset=UTF-8")
@ResponseBody
public Map<String, List<WaterDepthDTO>> reqWaterDepth (
    HttpServletRequest req,
    HttpServletResponse res,
    @RequestParam Map<String, String> area
      ) throws Exception {
  logger.info("\n\tREQ Water Depth . do \n" + area.get("area") + "\n");
  return service.getWaterDepthInRange(area.get("area"));
}

Ajax Request

Request 부분에서는 딱히 설정할 것이 없다.

function getData(area) {
  return new Promise(function(resolve, reject) {
    console.group('drawSurvArea getData');
    area = {
      'area' : area
    };
    //  console.log( area );
    $.ajax({
      type : "POST",
      url : "/reqWaterDepth.do",
      data : area,
      dataType : 'json',
      beforeSend : function(xhr, opts) {
        console.log("before send");
        // when validation is false
        if (false) {
          xhr.abort();
        }
      },
      success : function(res) {
        console.log("SUCCESS");
        console.log(res);
        if (Object.keys(res).length === 0
            && JSON.stringify(res) === JSON.stringify({})) {
          alert('해당 영역에 수심데이터가 없습니다.');
          return;
        } else {
          resolve(res);
        }
      },
      error : function(err) {
        console.log("ERR");
        console.error(err.statusText);
        alert('데이터를 처리 하던중 에러가 발생했습니다.\n' + err.statusText + ' : ' + err.status);
        reject(err);
      }
    });
    console.groupEnd('drawSurvArea getData');
  })
}
getData(area).then(function(data) {
  console.log('THEN')
  console.log(data);
});
728x90
반응형

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

mysql CMD 접속

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '사용할패스워드'

이거 한줄이면 해결 됨.

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
DB 설치 없이 SQL 실습하기  (0) 2019.12.21

좌표계 (Coordinate System)

좌표계는 공간상의 한 점의 위치를 표시라는 숫자들의 순서 쌍인 좌표를 정하기 위한 체계로,
원점과 기준 길이, 기준 축이나 기준선들의 집합을 통틀허 이르는 말임.
서로 수직인 직선을 기준 축으로 갖는 Rectangular Coordinate System이(직교 좌표계, 평면 좌표계 또는 데카르트 좌표계라고도 함) 가장 널리 쓰이고 그 밖에 곡선 좌표계들이 있음.
데카르트는 천장에 붙은 파리의 위치를 표현하기 위해 고안 했다고 함.

좌표계의 종류

  • 극 좌표계 (Polar Coordinate System)
  • 원기둥 좌표계 (Cylindical Coordinate)
  • 구면 좌표계 (Spherical Coordinate)
  • 동차 좌표계 (Homogeneous Coordinate)
  • 세계 지구 좌표 시스템 (World Geodetic System : WGS )

EPSG:3857

  • [14541934.699146198, 4291217.769314549]와 같은 형식
  • Google Map, Open Street Map에서 사용
  • 미터 단위를 사용함
  • Open Street Map과 OpenLayers가 밀접한 관계에 있기 때문에, OpenLayers의 기본 좌표임.

EPSG:4326 -> WGS84(라고도 함)

  • [130.63242200911046, 35.93162949347317]와 같은 형식
    • [±180 , ±90]
  • Google Earth에서 사용, 거의 모든 GPS에서 사용.
  • 소수점 단위를 사용함 (decimal degrees)

경도와 위도

좌표는 경도(Longtitude)와 위도(Latitude) 로 이루어 져 있음.

  • 경도 : X축 이라고 보면 됨.(동경, 서경)
    • 지구를 세로선으로 나눈것.
    • 영국의 그리니치 천문대를 기준으로 동경 180도, 서경 180도로 나눔.
    • 동경 180도와 서경 180도가 만나는 세로선이 날짜 변경선이 됨.
  • 위도 : Y축 이라고 보면 됨.(북위, 남위)
    • 적도를 0도로 기준잡고 지구를 남과 북으로 나누어서 북위, 남위 각각 0 ~ 90도로 구분함.

순서가 헷깔릴 땐 경위도, lola 로 기억하면 됨.

출처

  • 위키 백과
  • 네이버 물리학 백과
  • BizGIS
728x90
반응형

'ETC > GIS' 카테고리의 다른 글

[OpenLayers] 마우스 커서 위치에 대한 지도 좌표 보기  (0) 2019.11.15
OpenLayers로 지도 띄우기.  (1) 2019.11.08

+ Recent posts