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() 함수를 쓰면 됩니다. 하지만 대출일수의 데이터 타입은 숫자형이 아닌 것 같습니다.
데이터들의 타입을 확인해보겠습니다. 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, SUBSTRING을 사용하면 됩니다. sqlite에서는 SUBSTR()입니다.
SELECT *, SUBSTR(대출일수, 1, (length(대출일수)-1)) AS 대출일수_수정
FROM 도서대출내역2;
하지만 여기서 '일'만 떼어내기엔 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 함수를 이용하여, 잘라내진 부분에 더하여 숫자로 변환해 보겠습니다.
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에 따른 함수 등을 살펴보았습니다!