[23.10.12] 48일차
<<진도>>
DB - SQL - DML – select
- 문자열 함수
- 날짜, 시간 관련 함수
- 그룹함수
- 집계함수
- 조인 join
- 서브쿼리 subquery (중첩서브쿼리, 인라인뷰, 스칼라)
- 데이터 export
<<오늘의 팁>>
- 여러 쿼리를 실행하려면 블록지정 후 ctrl + shft + Enter
but, 한 화면에 볼 수는 없다. 하나 당 탭 하나
- ** join은 테이블 간에 기본키-외래키로 관계설정이 잘되어있을 때 훨씬 잘 작동한다.
- join 에서의 from의 as는 생략가능
- 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 설치 시 실제 Table과 ERD의 Entity의 개수가 실제로 달랐던 예처럼
‘view’라는 가상테이블이 존재. subquery로 가상테이블(뷰)가 내부로 들어왔다고해서
“ 인라인 뷰 ” 라고 한다.
3) [스칼라 서브쿼리] ================================================
*** DataBase 시트 값을 export할수 있다.
.csv : 엑셀 호환이되나 기본적으로 콤마(,)형태로 구성된 파일