SQL(2) Data Type

미남로그·2021년 8월 27일
0

SQL

목록 보기
4/5

DATA TYPE

Data에도 다양한 타입이 있습니다.

테이블을 보면 숫자는 대부분 INT로 끝나고, INT는 종류별로 그 안에 넣을 수 있는 바이트(bite) 수가 다릅니다. 숫자의 범위와 크기에 따라 데이터 타입을 정해줍니다.

SELECT * FROM 도서대출내역2;

for row in c.execute('SELECT * FROM 도서대출내역2;'):
	print(row)
    
>>> 
('101', '문강태', '2020-06', '20일')
('102', '고문영', '2020-06', '10일')
('103', '문상태', '2020-06', '8일')
('104', '강기둥', '2020-06', '3일')

데이터 타입을 바꿔보도록 하겠습니다!

위의 데이터는 테이블로 다시 보면

해당 데이터인데요. 여기서 평균 대출일수를 알고 싶다면 대출일수에 AVG() 함수를 쓰면 됩니다. 하지만 대출일수의 데이터 타입은 숫자형이 아닌 것 같습니다.

TYPE 확인 - pragma table_info('테이블명')

데이터들의 타입을 확인해보겠습니다. sqlite에서는 데이터의 타입 정의를 pragma table_info('테이블명')문을 제공합니다.

import os
db_path = os.getenv('HOME')+'/mydb.db'
conn = sqlite3.connect(db_path)
c = conn.cursor()

for row in c.execute('pragma table_info(도서대출내역)'):
	print(row)
    
>>>
(0, 'ID', 'varchar', 0, None, 0)
(1, '이름', 'varchar', 0, None, 0)
(2, '도서ID', 'varchar', 0, None, 0)
(3, '대출일', 'varchar', 0, None, 0)
(4, '반납일', 'varchar', 0, None, 0)

데이터 타입을 보니 모드 VARCHAR로 되어 있습니다. 문자형 데이터니 숫자형으로 변환시켜 보겠습니다.

대출일수 데이터 뒤에 붙은 '일'을 떼어내야겠습니다.

LEFT, RIGHT, SUBSTR() 함수

문자열을 떼어내는 함수는 LEFT, RIGHT, SUBSTRING을 사용하면 됩니다. sqlite에서는 SUBSTR()입니다.

SELECT *, SUBSTR(대출일수, 1, (length(대출일수)-1)) AS 대출일수_수정
FROM 도서대출내역2;

split_part()

하지만 여기서 '일'만 떼어내기엔 8일, 10일 등 글자수가 ○일, ○○일 등 형태가 다릅니다. 이때 split_part() 함수를 사용합니다.

for row in c.execute('SELECT *, SUBSTR(대출일수, 1, length(대출일수)-1)) AS 대출일수_수정 FROM 도서대출내역2;'):
	print(row)
    
>>>
('101', '문강태', '2020-06', '20일', '20')
('102', '고문영', '2020-06', '10일', '10')
('103', '문상태', '2020-06', '8일', '8')
('104', '강기둥', '2020-06', '3일', '3')

CAST()

그 다음은 CAST 함수를 이용하여, 잘라내진 부분에 더하여 숫자로 변환해 보겠습니다.

SELECT *, CAST(SUBSTR(대출일수, 1, (length(대출일수)-1)) AS INT) AS 대출일수_수정
FROM 도서대출내역2 ;

for row in c.execute('SELECT *, CAST(SUBSTR(대출일수, 1, length(대출일수)-1)) AS INT) AS 대출일수_수정 FROM 도서대출내역2 ;'):
	print(row)
    
>>>
('101', '문강태', '2020-06', '20일', 20)
('102', '고문영', '2020-06', '10일', 10)
('103', '문상태', '2020-06', '8일', 8)
('104', '강기둥', '2020-06', '3일', 3)

CAST()는 형 변환을 위한 함수입니다.

CAST(형 변환하고 싶은 컬럼명 AS 변환하고 싶은 타입)

대출일수_수정 컬럼은 그렇게 INT형으로 바뀌었답니다.

이제 필요한 컬럼만 불러오겠습니다.

SELECT ID, 이름, 대출년월, AVG(CAST(SUBSTR(대출일수, 1, length(대출일수)-1)) AS INT)) AS 대출일수_평균
FROM 도서대출내역2
GROUP BY 1, 2, 3;

for row in c.execute('SELECT ID, 이름, 대출년월, AVG(CAST(SUBSTR(대출일수, 1, (length(대출일수)-1)) AS INT)) AS 대출일수_평균 FROM 도서대출내역2 GROUP BY 1, 2, 3;'
	print(row)
    
>>>
('101', '문강태', '2020-06', 20.0)
('102', '고문영', '2020-06', 10.0)
('103', '문상태', '2020-06', 8.0)
('104', '강기둥', '2020-06', 3.0)

집계함수를 사용할 때는 GROUP BY를 씁니다. 뒤에는 컬럼명 또는 숫자를 적어주면 됩니다.

여기까지 DATA TYPE에 따른 함수 등을 살펴보았습니다!

profile
미남이 귀엽죠

0개의 댓글