[DB] function

2024. 8. 29. 19:01·Database

[작성일: 2023. 03. 22]

 

function

single row function

  • 한 줄 입력, 한 줄 출력

numeric

  • abs(x)   절대값
  • ceil(x)   올림
  • floor(x)   내림
  • round(x, y)   반올림
-- abs : 절대값
select abs(1.1) from dual;
select abs(-50.1) from dual;

-- ceil : 올림
select ceil(2.83) from dual;
select ceil(-2.83) from dual;

-- floor : 내림
select floor(3.14) from dual;
select floor(-3.14) from dual;

-- round : 반올림
select round(2.83) from dual;
select round(-2.83) from dual;
select round(-2.83, 3) from dual;
select round(2.83, -3) from dual;

-- 특정한 테이블에서 값을 가져오는 것이 아닐 때 dual 테이블을 사용함.

 

 

 

text

  • lower(str)   소문자
  • upper(str)   대문자
  • length(str)   길이 구하기
  • substr(str, m , n)   문자열 일부를 선택하기
  • replace(s1, s2, s3)   s1(컬럼명)에서 s2를 찾아 s3로 바꾸기
  • concat(s1, s2, s3...)   문자열들을 연결해줌.
-- lower, upper, length
-- 한글은 3byte로 인식.
select lower('Good Morning'),
upper('Good Morning'),
length('Good Morning'),
length('굿모닝')
from dual;

-- substr
select substr('Good Morning', 3, 6),
substr('Good Morning', 3)
from dual;

-- 영화 이름과 개봉 일을 출력하되 아래와 같은 형식이 되게 하기
-- 베놈2 04월18일
select movie_name, concat(substr(open_date,5,2),'월',substr(open_date,7,2),'일') from movie;

select substr(movie_name,1, 3) from movie;

-- 영화 제목을 출력하되 뒤에서 2글자만 출력하시오.
select substr(movie_name,-2) from movie;
-- 영화 제목을 출력하되 뒤에서 2번째 글자부터 1개만 출력하기
select substr(movie_name,-2, 1) from movie;

-- replace : 특정한 문자가 나오면 바꿔준다. 중첩해서 사용 가능하다.
SELECT REPLACE(REPLACE('서울시', '서울', 'SEOUL'), '시', ' city') AS city FROM DUAL;

 

 

 

date

  • add_months()   월을 더해줌.
  • sysdate()   현재 시간이 출력됨.

 

 

 

char

  • to_char()    문자로 바꿔줌.   
-- to_char
SELECT sysdate(), to_char(sysdate(), 'yyyymmdd') AS yyyymmdd1
				, to_char(sysdate(), 'yyyy/mm/dd') AS yyyymmdd2
				, to_char(sysdate(), 'dd-mm-yyyy') AS yyyymmdd3
				, to_char(sysdate(), 'dd-mm-yy') AS yyyymmdd4 
				, to_char(sysdate(), 'HH') AS HH
				, to_char(sysdate(), 'hh24miss') AS hh24miss
				, to_char(sysdate(), 'yyyymmddhh24miss') AS date
				FROM DUAL;

 

 

 

 

 

group(aggregate) function

  • 여러 줄 입력, 한 줄 출력

 

 

 

count(*), distinct 

-- Aggregate Function
-- 1. count(*) 인덱스가 있다면 인덱스 넣기, 보통은 primary key로 카운팅 함. 
-- null은 세지 않음.
SELECT count(*), count(x_loc) FROM hptl_mast;

-- 선행학습 : 지역별 병원 수를 구하시오.
SELECT SIDO_CD_NM, count(*) FROM hptl_mast GROUP BY SIDO_CD_NM;

-- 2. distinct : 중복 제외
SELECT DISTINCT TYP_CD_NM FROM HPTL_MAST;

-- count와 distinct의 조합
-- 병원이 있는 시군구 수 구하기
SELECT count(DISTINCT SIGGU_CD_NM) FROM hptl_mast;

 

 

 

min(), max(), avg(), sum()

-- 3. min(), max(), avg(), sum()
-- 최소 의사 수, 최대 의사 수, 평균 의사 수, 총 의사 수를 구해보시오.

SELECT min(DOC_NUM), MAX(DOC_NUM), AVG(DOC_NUM), SUM(DOC_NUM) FROM HPTL_MAST;

-- 시도별 최소 의사 수, 최대 의사 수, 총 의사 수
SELECT SIDO_CD_NM, MIN(DOC_NUM), MAX(DOC_NUM), SUM(DOC_NUM) FROM HPTL_MAST GROUP BY SIDO_CD_NM;

 

 

 

order by, group by, having

  • SQL의 결과를 정렬하기 위한 문법
  • order by   순서 정렬하기
    • order by 컬럼명1 [asc|desc], 컬럼명2
  • group by   그룹으로 묶기
    • Aggregate 함수를 그룹별로 나누어서 적용시킬 때 사용하는 문법
    • group by 컬럼명1, 컬럼명2, ...
  • having   group by 등으로 나온 결과를 필터링 하기
    • 그룹의 결과물에 대한 조건을 부여할 때 where가 아닌 having 을 사용함.
    • having count(*) > 200
    • with절 사용
-- 4. order by
-- 의사가 많은 순서대로 병원 이름과 의사 수 출력하기
SELECT hptl_nm, doc_num FROM hptl_mast ORDER BY DOC_NUM DESC;

-- 실습과제 4
-- 가장 오래된 전통있는 병원부터 병원이름, 오픈일, 주소를 출력하시오.
-- 오픈일자가 같으면 병원명 오름차순으로 정렬
-- 오픈일자가 없는 병원은 '99991231'로 셋팅

SELECT hptl_nm, CASE WHEN open_date = '' THEN '9999-12-31'
WHEN open_date = '1900-01-01' THEN '9999-12-31' ELSE open_date END AS open_dt,addr
FROM hptl_mast 
ORDER BY open_dt, hptl_nm;

-- 5. group by
-- 시도별, 병원타입별, 병원 수, 의사 수
SELECT sido_cd_nm, typ_cd_nm, count(*) AS "병원 수", sum(doc_num) AS "의사 수" FROM hptl_mast 
GROUP BY sido_cd_nm, typ_cd_nm
ORDER BY typ_cd_nm;

-- 6. having
WITH cntbysido AS (
	SELECT sido_cd_nm, count(*) AS cnt FROM hptl_mast 
	GROUP BY sido_cd_nm
), manyhospitals AS (
	SELECT * FROM cntbysido WHERE cnt > 3000
)
SELECT * FROM manyhospitals;

SELECT sido_cd_nm, count(*) AS cnt FROM hptl_mast 
GROUP BY sido_cd_nm 
HAVING cnt > 3000 
ORDER BY cnt desc;

 

 

 

 

 

요약

select 컬럼명들... from 테이블명 where 조건식 group by 컬럼명들 having 조건식 order by 컬럼명들

* 특이사항: with절 존재

* select에서 가장 중요한 부분은 where 조건에서 가능한 많은 범위를 줄여줘야 함.

 

 

 

 

 

 

 

 

 

 


🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

 

저작자표시 비영리 변경금지 (새창열림)
'Database' 카테고리의 다른 글
  • [DB] 반정규화
  • [DB] 데이터베이스 정규화
  • [DB] case when, Scalar Subquery
  • [DB] alias, concatenation, between
뚜비
뚜비
1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
  • 뚜비
    뚜비의 개발로그
    뚜비
  • 전체
    오늘
    어제
  • 글쓰기     관리
    • Devlog
      • Back-End
        • Java
        • Spring
        • JPA
        • HTTP
        • Security
        • Back-End
        • Front-End
      • 알고리즘
      • iOS
        • Swift
      • Database
      • Tips
        • Git & GitHub
        • A to Z
      • 프로젝트
      • 생각정리
  • 태그

    스프링
    의존성주입
    javascript
    JPA
    html
    생성자
    Spring Security
    데이터베이스
    알고리즘
    spring
    자바
    jsp
    Security
    최주호
    프로그래머스
    게시판만들기
    Swift
    변수
    Java
    성능최적화
    DB
    객체
    김영한
    sql
    Database
    자바스크립트
    HTTP
    다형성
    MVC
    백준
  • hELLO· Designed By정상우.v4.10.0
뚜비
[DB] function
상단으로

티스토리툴바