본문 바로가기

DataBase/필기일지

231012 [DB] - SQL - DML – select / 문자열 함수 / 날짜, 시간 관련 함수 / 그룹함수 group by / 집계함수 / 조인 join / 서브쿼리 subquery (중첩서브쿼리, 인라인뷰, 스칼라) / 데이터 export

반응형

[23.10.12] 48일차

 

<<진도>>

DB - SQL - DML – select

- 문자열 함수

- 날짜, 시간 관련 함수

- 그룹함수

- 집계함수

- 조인 join

- 서브쿼리 subquery (중첩서브쿼리, 인라인뷰, 스칼라)

- 데이터 export

 

<<오늘의 팁>>

- 여러 쿼리를 실행하려면 블록지정 후 ctrl + shft + Enter

but, 한 화면에 볼 수는 없다. 하나 당 탭 하나

 

- ** join은 테이블 간에 기본키-외래키로 관계설정이 잘되어있을 때 훨씬 잘 작동한다.

- join 에서의 fromas는 생략가능

- DBMS SQL동작을 효율적으로 내부변환 작동하는 옵티마이저

 

     

* function_ex02(1011)

 

* function_ex01

## [날짜 시간 함수]

 

 

## 날짜 또는 시간을 기준으로 더하거나 빼기한 값

## date_add(날짜, interval 값 기준);

## date_sub(날짜, interval 값 기준);

 

## interval 기준 : year, month, day, hour, minute, second

 

## [ / / / / / ]만 조회

select now(), year(now()), month(now()), day(now());

select now(), hour(now()), minute(now()), second(now());

 

## 월을 영어로 리턴 : monthname(날짜)

select now(), monthname(now());

select '2023-3-1', monthname('2023-3-1');

 

## 요일을 숫자로 리턴 / 일년을 기준으로 일수, 주수 / 날짜와 시간의 덧셈 뺄셈

 

 

## 형식 지정 (서식문자)

select now(), date_format(now(), '%y %Y %m %d %h %i %s'); 

select now(), date_format(now(), '%M %D');

-- October(월 영어로) 12th(일을 서수 형태)

select '2023-10-1', date_format('2023-10-1', '%M %D');

-- October 1st

* function_ex02

 

## [그룹 함수] 집계함수  =================================================

## count(컬럼명)    : 로우 개수 - null 제외

## count(*)         : 로우 개수 - null 포함

## sum(컬럼명)      :

## avg(컬럼명)      : 평균

## max(컬럼명)      : 최대값

## min()(컬럼명)    : 최소값

 

##[문법]

## select    컬럼명1, 그룹함수(컬럼명2)

## from      테이블명

## where     조건 - (선택사항)

## group by  컬럼명2

## having    조건; - (선택사항)

## ========================================================================

 

## 총 사원 수

select count(emp_no), count(*) -- 해당 컬럼의 row의 수

from employees;

 

select emp_no, title, from_date, to_date

from titles;

 

select count(emp_no), count(to_date),/* 해당 컬럼의 row null인 값은 세지 않음 */

       count(*) /* 컬럼 전체를 셀 때 row 1줄을 1개로 세기때문에 null값을 고려하지 않음 */

from titles;

 

## 사원들 전체 연봉 합, 최고 연봉, 최저 연봉

select sum(salary), max(salary), min(salary)

from salaries;

 

## 사원의 성별 별 수

select gender, -- 2) 그룹으로 묶고나면 일반컬럼은 해당컬럼만 올 수 있다

       count(emp_no) -- 다른 집계함수는 괜찮다.

from employees

group by gender; -- 1) 특정 컬럼을 그룹으로 묶고 집계

 

## 직책별 사원 수

select title, count(*) -- 집계함수의 결과도 가공의 table 취급

from titles

group by title

having count(*) >= 50000; -- 그룹(집계)함수의 결과로 조건을 걸때 having!

50000 이상만

 

## 여러개의 Table을 엮어서 함께 보는 형태 [join]

* join_union_union all

## [수직 조인]

## union    : 중복 제거

## union all : 중복 모두 표시

                

- union

 

-union all

** 다른 자료형인 컬럼들도 합쳐짐 (중복 없으므로 union 33)

**cf) DBMS의 종류에 따라 타입이 다르면 합쳐지지 않는 경우도 있다.!

 

!! 위 아래의 컬럼의 개수가 다르면 수직조인 불가 !!

 

 

* subquery

#####################################################################

## [서브쿼리] subquery

## : 쿼리 내 쿼리

## : 종류

##    - (중첩) 서브쿼리 : where , 단일로우 / 다중로우

##    - 인라인 뷰 : from , 테이블 형태 리턴

##    - 스칼라 서브쿼리 : select , 단일로우 / 단일컬럼

#####################################################################

 

1) [(중첩) 서브쿼리] ================================================

 

*** 사실 RDBMS 자체에의 옵티마이저내부적으로

서브쿼리 => 조인 / 조인 => 서브쿼리로

더 효율적인쪽으로 변환하여 작동한다.

 

2) [인라인 뷰] ======================================================

*** employees DB 설치 시 실제 TableERD Entity의 개수가 실제로 달랐던 예처럼

‘view’라는 가상테이블이 존재. subquery로 가상테이블()가 내부로 들어왔다고해서

인라인 뷰 라고 한다.

 

 

 

3) [스칼라 서브쿼리] ================================================

 

 

 

*** DataBase 시트 값을 export할수 있다.

.csv : 엑셀 호환이되나 기본적으로 콤마(,)형태로 구성된 파일

 

 

 

반응형