Table of contents

    이번 글에서는 Python을 이용하여, 데이터를 조회해보게습니다. 데이터를 조회하기 이전에는 아래와 같은 절차가 필요합니다.

    • DB생성
    • TABLE 생성
    • 데이터 추가

    위 절차가 궁굼하다면 아래의 링크들을 참조하세요.

     

    2022.02.19 - [소프트웨어/Python] - Python MySQL DB 생성, 삭제

     

    2022.02.19 - [소프트웨어/Python] - Python MySQL 테이블 생성, 제거

     

    2022.02.19 - [소프트웨어/Python] - Python MySQL 데이터 단일 행, 다중 행 추가

     

     

    1. 정리

    1.1. TABLE 구조 및 데이터 구성

    데이터를 조회하기에 앞서, 조회하고자 하는 TABLE의 구조를 파악해야 합니다.

     

    이번 글에서 실습하고자 하는 TABLE의 구조는 아래와 같습니다.

    이름 종류
    dateTime datetime
    name varchar(255)
    val1 smallint(6)
    val2 smallint(6)

     

     

    다음으로는 TABLE에 어떠한 값들이 있는지를 파악해야 합니다.

     

    TABLE에는 아래의 값들이 있으며, 이는 선행작업을 한 것입니다. 데이터가 없다면, 데이터를 추가하세요.

     

    데이터들은 아래 표와 같이, dateTime과 name이 모두 같고 va1 및 val2과 1씩 증가한 데이터들이 존재하고 있습니다.

    dateTime name val1 val2
    2021-03-26 17:54:43 test 0 0
    2021-03-26 17:54:43 test 1 1
    2021-03-26 17:54:43 test 2 2
    2021-03-26 17:54:43 test 3 3
    2021-03-26 17:54:43 test 4 4
    2021-03-26 17:54:43 test 5 5
    2021-03-26 17:54:43 test 6 6
    2021-03-26 17:54:43 test 7 7
    2021-03-26 17:54:43 test 8 8
    2021-03-26 17:54:43 test 9 9

     

    1.2. 데이터 전체 조회

    먼저, TABLE의 전체 데이터를 조회해보겠습니다.

     

    데이터를 추가했던 경우와 전반적인 흐름은 같습니다.

     

    가장 큰 차이점 중 하나는 쿼리문입니다.

     

    데이터 전체 조회를 위한 쿼리문은 'SELECT * FROM 테이블명' 입니다.

     

    현재, 검색하고자 하는 TABLE의 이름은 TEST_TABLE이므로 쿼리문은 'SELECT * FROM TEST_TABLE'이 되겠네요.

     

    excute함수를 통해, 쿼리문을 실행하겠습니다.

     

    이 다음, fetchall 함수의 결과를 result라는 변수에 저장합니다.

     

    fetchall의 함수는 결과의 모든 것을 return 해줍니다. 아래의 목록과 같이, 다른 종류의 fetch 관련 함수도 있으나 편의상 모든 데이터를 가져오고 python내에서 데이터를 정리하는 것이 좋아보이네요.

     

    아직, 설명드린 내용은 아니지만, DB 서버의 부하가 걱정된다면, 쿼리문에 조건문을 추가해 데이터를 조금씩 조회하는 방법도 있습니다.

    • fetchall(): 쿼리문의 결과를 모두 리턴합니다.
    • fetchone(): 쿼리문의 결과 중 하나의 row만 리턴합니다.
    • fetchmany(개수): 쿼리문의 결과 중 개수만큼 리턴합니다.

     

    fetch 동작을 한 이후에는 다른 작업들과 같이, commit을 하고 close를 해줍니다. result의 결과를 출력하면 다음과 같습니다.

     

    ((datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 0, 0),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 1, 1),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 2, 2),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 3, 3),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 4, 4),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 5, 5),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 6, 6),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 7, 7),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 8, 8),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 9, 9))

     

     

     

    import pymysql
    
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #데이터 전체 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()

     

    1.3. WHERE를 이용한 데이터 조회

    방금 전에는 TABLE에 존재하는 모든 데이터를 조회했습니다.

     

    만약에 데이터가 100만건이 넘게 존재한다면 100만건을 모두 조회하기는 비효율적이지 않을까요? DB 서버에 부하도 많이 줄 것입니다.

     

    이번에는 이러한 상황을 막기 위해, WHERER를 이용하여 데이터를 조회해보겠습니다.

     

    전체 조회할 경우와의 차이점은 쿼리문에만 있습니다. 차이점은 보이시나요? 쿼리문의 형태는 'SELECT * FROM 테이블명 WHERE 컬럼명 = 값' 입니다.

     

    아래의 코드에서는 val1의 값이 1인 것만 찾고자 하고 있으며, 쿼리문은 'SELECT * FROM TEST_TABLE WHERE val1 = 1'이됩니다. result의 출력 값은 다음과 같습니다.

     

     

    ((datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 1, 1),)

     

    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #WHERE를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE WHERE val1 = 1'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()

     

    1.4. ORDER BY를 이용한 데이터 조회

    TABLE에 존재하는 데이터들을 특정한 값으로 정렬하여 보고 싶은 경우가 있습니다.

     

    물론, TABLE 데이터를 받아와서 python에서 정렬 후, 처리도 가능하지만 쿼리문을 이용하여 정렬된 데이터를 받아올 수도 있습니다. 이번에는 TABLE의 데이터를 정렬하여 조회해보겠습니다.

     

    쿼리문은 'SELECT * FROM 테이블명 ORDER BY 컬럼명 정렬방식' 입니다.

     

    아래의 코드에서는 val1 컬럼에 대하여 내림차순으로 정렬할 것이므로, 쿼리문은 'SELECT * FROM TEST_TABLE ORDER BY val1 DESC' 와 같이 작성했습니다. 오름차순 순 및 내림차순에 대한 명령어는 다음과 같습니다.

    • ASC: 오름차순
    • DESC: 내림차순

    출력은 다음과 같습니다. val1에 대해 내림차순된 모습을 볼 수 있네요.

     

     

     

    ((datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 9, 9),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 8, 8),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 7, 7),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 6, 6),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 5, 5),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 4, 4),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 3, 3),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 2, 2),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 1, 1),
     (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 0, 0))

     

    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #ORDER BY를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE ORDER BY val1 DESC'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()

     

    1.5. LIMIT를 이용한 데이터 조회

    지금까지 조건에 따른 데이터 조회, 정렬된 데이터 조회를 해보았습니다.

     

    그런데 문든 궁굼한 점이 생길 것입니다.

     

    위 두개만 가지고도 많은 경우를 해결할 수 있지만, 개수에 대한 제한을 걸고 싶은 경우가 있을 것입니다.

     

    예를 들면, 상위 몇 개의 데이터만 추출하고 싶은 경우가 있습니다. 다행히도, 개수에 제한을 주는 LIMIT 기능이 있습니다.

     

    이번에는 전체 데이터 중 5개의 데이터를 조회해보겠습니다.

     

    방식은 지금까지와 유사하고 5개의 데이터만 조회하고자 하니 쿼리문은 'SELECT * FROM TEST_TABLE LIMIT 5'이 됩니다.

     

    출력은 다음과 같습니다.

     

     

    ((datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 0, 0),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 1, 1),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 2, 2),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 3, 3),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 4, 4))

     

    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #LIMIT를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE LIMIT 5'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()

     

    1.6. 데이터 조회 예제

    이제는 데이터를 조회할 때, 조건을 이용할 수 있고 정렬도 가능하며 개수의 제한도 가능해졌습니다.

     

    이번에는 다양한 기능을 활용 데이터를 조회해보겠습니다.

     

    name 컬럼 값이 'test'이고 val1 컬럼 값에 대해 내림차순한 데이터 중 5개만 조회해보겠습니다.

     

    쿼리문은 'SELECT * FROM TEST_TABLE WHERE name = "test" ORDER BY val1 DESC LIMIT 5' 과 같이 되겠네요. 아래 코드에서는 보기좋게 하기 위해, ''' ''' 를 이용했습니다.

     

    결과에 대한 출력은 아래와 같습니다. 예상한 것과 같나요?

     

     

    ((datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 9, 9),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 8, 8),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 7, 7),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 6, 6),
    (datetime.datetime(2021, 3, 26, 17, 54, 43), 'test', 5, 5))

     

    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #데이터 조회 예제
    try:
        with conn.cursor() as cursor:
            sql = '''
            SELECT *
            FROM TEST_TABLE
            WHERE name = "test" 
            ORDER BY val1 DESC
            LIMIT 5
            '''
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()

     

    2. 전체코드

    import pymysql
    
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #데이터 전체 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()
        
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #WHERE를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE WHERE val1 = 1'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()
        
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #ORDER BY를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE ORDER BY val1 DESC'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()
        
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #LIMIT를 이용한 데이터 조회
    try:
        with conn.cursor() as cursor:
            sql = 'SELECT * FROM TEST_TABLE LIMIT 5'
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()
        
    
    #db 연결
    conn = pymysql.connect(host='localhost', user='root', password='', db='TEST', charset='utf8')
    
    #데이터 조회 예제
    try:
        with conn.cursor() as cursor:
            sql = '''
            SELECT *
            FROM TEST_TABLE
            WHERE name = "test" 
            ORDER BY val1 DESC
            LIMIT 5
            '''
            cursor.execute(sql)       
            result = cursor.fetchall()
        conn.commit()
    finally:
        conn.close()