본문 바로가기
DataBase/Data & SQL

[SQL] MySQL의 Binding Variables, 바인딩 변수 사용법(mysql,python), 장점

by 스파이디웹 2023. 1. 10.
728x90

1. 바인딩 변수 사용의 장점

바인딩 변수의 장점은 SQL문 처리과정 중 Parsing과정에서 드러나게 됩니다.

 

1) SQL문 처리 과정

  1. 사용자가 SQL문장(Select)을 실행
  2. SQL 파싱(parsing)
  3. SQL 최적화(optimizer)
  4. 실행(Execution)
  5. 추출(Fetch)


2) Parsing 과정

  1. 서버프로세스는 Shared Pool의 LibraryCache를 조회해서 문자 하나하나 공백, 대소문자까지 비교하여 동일한 SQL문장이 있는지 확인
    • Soft Parsing: 동일한 SQL문장과 SQL구문을 보낸 사용자나 옵티마이저 MODE관련 설정까지 일치하는 SQL커서가 존재하고 있다면, Library Cache의 parse-tree와 Query Execution Plan을 가지고 와서 실행
      • optimization, row source generation 과정을 생략하고 직접 execution 단계로 가서 처리
    • Hard Parsing: 동일한 SQL문장과 SQL구문을 보낸 사용자나 옵티마이저 MODE관련 설정까지 일치하는 SQL커서가 존재하지 않는다면, 사용자 SQL 문장의 문법체크(Syntax Check)를 우선 진행, 테이블 및 컬럼 존재 여부 체크, USER의 권한 체크,(Semantic Check)를 Data Dictionary를 통해 체크하는데 이후 parse-tree를 만들고 반복 되는 쿼리 실행에 대비해 Library Cache에 저장
      • 필요한 오브젝트의 래치(Use Serialization Device)를 획득 후 빈번히 라이브러리 캐시및 데이터 딕셔너리를 탐색하게 되어 성능이 떨어짐(CPU 점유율이 높아지고 실행이 느려짐)
  2. Syntax, Semantic 체크를 모두 통과하였다면 이 SQL 구문은오류가 없는 문장이 되며 해당 문장에 해싱 알고리즘을 적용하여 해시키를 만들고 해시키를 이용하여 검색하여 동일한 해시키값을 가지는 SQL문장을 검색하여 존재하는지를 체크(Shared Pool check, V$SQL.SQL_ID)

3) 바인딩 변수의 역할

바인드 변수를 사용하면, 변수의 값이 달라져도 같은 문장으로 인식하여 불필요한 hard parse 를 없앰

DBMS에서 PreparedStatement(binding variable)를 쓰고 안쓰고의 차이는 CPU 차지율이 20% 이상 차이남


4) SQL 처리과정과 바인딩 변수 결론

  1. SQL문을 실행하면, 데이터베이스는 아스키 값으로 계산
  2. 대문자, 띄어쓰기, 주석에 따라 아스키 값이 다르므로 표현이 달라지면 다른 SQL문으로 인식
  3. 같은 결과를 얻지만 표현이 다른 SQL문은 실행할때마다 library Cache에서 하드파싱 됨
  4. 하드파싱은 SQL문의 검색과 공간확보를 위해 Shared Pool Latch와 Library Cache Latch를 필요로 함
  5. 잦은 하드파싱은 리소스를 과도하게 사용하고 래치를 오래 점유하므로 SQL문의 수행에 지연이 발생
  6. 따라서 SQL문을 재사용하는 소프트 파싱이 필요
  7. 이를 위해 SQL문 작성시, 대문자, 띄어쓰기, 주석에 대한 원칙을 세워야 함
  8. 바인드 변수를 사용하면 변수에 들어가는 값에 관계없이 파싱 함
  9. 파싱이 끝나면 바인드값을 대입하게 되는데, 적용되는 값에 상관없이 SQL을 공유할 수 있게 되는 것
  10. SQL을 수행하게되면 Library Cache에서 해당 래치를 획득하고 수행하려는 SQL 실행정보(LCO:Library Cache Object)가 있는지 검색
  11. SQL이 있으면 LCO의 생성과정을 거치지 않고 바로 실행할 수 있음. 이것을 소프트파싱이라고 함
  12. 그런데, SQL이 Library Cache에 존재하지 않는 새로운 SQL이라면 LCO를 만들어 실행정보를 저장 함
  13. Shared Pool 래치를 획득하여 저장할 공간을 확보
  14. 공간이 마련되면 SQL의 LCO가 생성되고, 여기에 SQL문과 실행계획 등의 정보를 저장
  15. 이렇게 만들어진 LCO를 통해 SQL이 수행. 이와 같이 SQL문이 Library Cache 내에 존재하지 않아 LCO를 만들고, 여기에 실행정보를 저장하는 과정을 하드 파싱이라고 함
  16. 하드파싱과 소프트파싱은 Library Cache 내의 SQL 존재유무에 따라서 구별
  17. 최초로 수행되는 SQL은 하드파싱을 피할 순 없음. 그러나 두번째 수행부터는 소프트파싱을 하는게 보다 빠르고 적은 리소스를 사용하니 효율적

 


2. 바인딩 변수 사용법

1) mysql 내에서 사용

SET @변수명 = 값;
select @NUM AS bndg_var;

SET @NUM = 20; -- 바인딩 변수 설정

SELECT *
from actor
where actor_id = @NUM; -- 조건절에 바인딩 변수 사용


2) python과 연동하여 사용(Select)

mysql-connector-python 설치(mysql server version과 동일 해야 함)

파이썬 코드 내 mysql 연동 정보 입력

import mysql.connector
    
mydb = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="root",
    database="sakila"
)

 

c언어 스타일

바인딩 변수가 적용 된 채로 loop 쿼리를 실행

def bind_var_Cstyle():
    cur = mydb.cursor()
    for i in range(1,101):
        bind_var = i
        sql = '''SELECT * FROM sakila.actor WHERE actor_id = %s'''
        cur.execute("SELECT * FROM sakila.actor WHERE actor_id = %s" % (bind_var))
        select_all_result = cur.fetchall()
        print(select_all_result[0])

if __name__=="__main__":
    bind_var_test()

 

format

바인딩 변수가 적용 된 채로 loop 쿼리를 실행

def bind_var_format():
    cur = mydb.cursor()
    for i in range(1,101):
        bind_var = i
        sql = '''SELECT * FROM sakila.actor WHERE actor_id = %s'''
        cur.execute("SELECT * FROM sakila.actor WHERE actor_id = {}".format(bind_var))
        select_all_result = cur.fetchall()
        print(select_all_result[0])

 

f-string

바인딩 변수가 적용 된 채로 loop 쿼리를 실행

def bind_var_fstring():
    cur = mydb.cursor()
    for i in range(1,101):
        bind_var = i
        sql = '''SELECT * FROM sakila.actor WHERE actor_id = %s'''
        cur.execute(f"SELECT * FROM sakila.actor WHERE actor_id = {bind_var}")
        select_all_result = cur.fetchall()
        print(select_all_result[0])

 

결과

(1, 'PENELOPE', 'GUINESS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(2, 'NICK', 'WAHLBERG', datetime.datetime(2006, 2, 15, 4, 34, 33))
(3, 'ED', 'CHASE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(4, 'JENNIFER', 'DAVIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(5, 'JOHNNY', 'LOLLOBRIGIDA', datetime.datetime(2006, 2, 15, 4, 34, 33))
(6, 'BETTE', 'NICHOLSON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(7, 'GRACE', 'MOSTEL', datetime.datetime(2006, 2, 15, 4, 34, 33))
(8, 'MATTHEW', 'JOHANSSON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(9, 'JOE', 'SWANK', datetime.datetime(2006, 2, 15, 4, 34, 33))
(10, 'CHRISTIAN', 'GABLE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(11, 'ZERO', 'CAGE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(12, 'KARL', 'BERRY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(13, 'UMA', 'WOOD', datetime.datetime(2006, 2, 15, 4, 34, 33))
(14, 'VIVIEN', 'BERGEN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(15, 'CUBA', 'OLIVIER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(16, 'FRED', 'COSTNER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(17, 'HELEN', 'VOIGHT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(18, 'DAN', 'TORN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(19, 'BOB', 'FAWCETT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(20, 'LUCILLE', 'TRACY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(21, 'KIRSTEN', 'PALTROW', datetime.datetime(2006, 2, 15, 4, 34, 33))
(22, 'ELVIS', 'MARX', datetime.datetime(2006, 2, 15, 4, 34, 33))
(23, 'SANDRA', 'KILMER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(24, 'CAMERON', 'STREEP', datetime.datetime(2006, 2, 15, 4, 34, 33))
(25, 'KEVIN', 'BLOOM', datetime.datetime(2006, 2, 15, 4, 34, 33))
(26, 'RIP', 'CRAWFORD', datetime.datetime(2006, 2, 15, 4, 34, 33))
(27, 'JULIA', 'MCQUEEN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(28, 'WOODY', 'HOFFMAN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(29, 'ALEC', 'WAYNE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(30, 'SANDRA', 'PECK', datetime.datetime(2006, 2, 15, 4, 34, 33))
(31, 'SISSY', 'SOBIESKI', datetime.datetime(2006, 2, 15, 4, 34, 33))
(32, 'TIM', 'HACKMAN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(33, 'MILLA', 'PECK', datetime.datetime(2006, 2, 15, 4, 34, 33))
(34, 'AUDREY', 'OLIVIER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(35, 'JUDY', 'DEAN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(36, 'BURT', 'DUKAKIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(37, 'VAL', 'BOLGER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(38, 'TOM', 'MCKELLEN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(39, 'GOLDIE', 'BRODY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(40, 'JOHNNY', 'CAGE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(41, 'JODIE', 'DEGENERES', datetime.datetime(2006, 2, 15, 4, 34, 33))
(42, 'TOM', 'MIRANDA', datetime.datetime(2006, 2, 15, 4, 34, 33))
(43, 'KIRK', 'JOVOVICH', datetime.datetime(2006, 2, 15, 4, 34, 33))
(44, 'NICK', 'STALLONE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(45, 'REESE', 'KILMER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(46, 'PARKER', 'GOLDBERG', datetime.datetime(2006, 2, 15, 4, 34, 33))
(47, 'JULIA', 'BARRYMORE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(48, 'FRANCES', 'DAY-LEWIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(49, 'ANNE', 'CRONYN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(50, 'NATALIE', 'HOPKINS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(51, 'GARY', 'PHOENIX', datetime.datetime(2006, 2, 15, 4, 34, 33))
(52, 'CARMEN', 'HUNT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(53, 'MENA', 'TEMPLE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(54, 'PENELOPE', 'PINKETT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(55, 'FAY', 'KILMER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(56, 'DAN', 'HARRIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(57, 'JUDE', 'CRUISE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(58, 'CHRISTIAN', 'AKROYD', datetime.datetime(2006, 2, 15, 4, 34, 33))
(59, 'DUSTIN', 'TAUTOU', datetime.datetime(2006, 2, 15, 4, 34, 33))
(60, 'HENRY', 'BERRY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(61, 'CHRISTIAN', 'NEESON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(62, 'JAYNE', 'NEESON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(63, 'CAMERON', 'WRAY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(64, 'RAY', 'JOHANSSON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(65, 'ANGELA', 'HUDSON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(66, 'MARY', 'TANDY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(67, 'JESSICA', 'BAILEY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(68, 'RIP', 'WINSLET', datetime.datetime(2006, 2, 15, 4, 34, 33))
(69, 'KENNETH', 'PALTROW', datetime.datetime(2006, 2, 15, 4, 34, 33))
(70, 'MICHELLE', 'MCCONAUGHEY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(71, 'ADAM', 'GRANT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(72, 'SEAN', 'WILLIAMS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(73, 'GARY', 'PENN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(74, 'MILLA', 'KEITEL', datetime.datetime(2006, 2, 15, 4, 34, 33))
(75, 'BURT', 'POSEY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(76, 'ANGELINA', 'ASTAIRE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(77, 'CARY', 'MCCONAUGHEY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(78, 'GROUCHO', 'SINATRA', datetime.datetime(2006, 2, 15, 4, 34, 33))
(79, 'MAE', 'HOFFMAN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(80, 'RALPH', 'CRUZ', datetime.datetime(2006, 2, 15, 4, 34, 33))
(81, 'SCARLETT', 'DAMON', datetime.datetime(2006, 2, 15, 4, 34, 33))
(82, 'WOODY', 'JOLIE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(83, 'BEN', 'WILLIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(84, 'JAMES', 'PITT', datetime.datetime(2006, 2, 15, 4, 34, 33))
(85, 'MINNIE', 'ZELLWEGER', datetime.datetime(2006, 2, 15, 4, 34, 33))
(86, 'GREG', 'CHAPLIN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(87, 'SPENCER', 'PECK', datetime.datetime(2006, 2, 15, 4, 34, 33))
(88, 'KENNETH', 'PESCI', datetime.datetime(2006, 2, 15, 4, 34, 33))
(89, 'CHARLIZE', 'DENCH', datetime.datetime(2006, 2, 15, 4, 34, 33))
(90, 'SEAN', 'GUINESS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(91, 'CHRISTOPHER', 'BERRY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(92, 'KIRSTEN', 'AKROYD', datetime.datetime(2006, 2, 15, 4, 34, 33))
(93, 'ELLEN', 'PRESLEY', datetime.datetime(2006, 2, 15, 4, 34, 33))
(94, 'KENNETH', 'TORN', datetime.datetime(2006, 2, 15, 4, 34, 33))
(95, 'DARYL', 'WAHLBERG', datetime.datetime(2006, 2, 15, 4, 34, 33))
(96, 'GENE', 'WILLIS', datetime.datetime(2006, 2, 15, 4, 34, 33))
(97, 'MEG', 'HAWKE', datetime.datetime(2006, 2, 15, 4, 34, 33))
(98, 'CHRIS', 'BRIDGES', datetime.datetime(2006, 2, 15, 4, 34, 33))
(99, 'JIM', 'MOSTEL', datetime.datetime(2006, 2, 15, 4, 34, 33))
(100, 'SPENCER', 'DEPP', datetime.datetime(2006, 2, 15, 4, 34, 33))

 


3) python과 연동하여 사용(Insert)

import random
def bind_var_fstring_insert(num):
    cur = mydb.cursor()

    sql2 = '''INSERT INTO sakila.actor(FIRST_NAME,LAST_NAME) VALUES("%s","%s")'''
    first_name_lists = ["tom", "christopher", "alex", "jane", "jenny", "christina"]
    last_name_lists = ["hanks", "hardy", "softy", "cruise", "holland", "esber", "judge", "lee", "park"]

    for i in range(num):
        rand_fname = random.choice(first_name_lists)
        rand_lname = random.choice(last_name_lists)
        cur.execute(sql2 % (rand_fname,rand_lname))
    mydb.commit()

    sql1 = "SELECT max(actor_id) FROM sakila.actor"
    cur.execute(sql1)
    last_actor_id = cur.fetchone()[0]

    print(num, "record inserted")
    print("last_row: ",last_actor_id)


if __name__=="__main__":
    bind_var_fstring_insert(100)

insert 확인

(400, 'jenny', 'esber', datetime.datetime(2023, 1, 12, 13, 2, 21))
(401, 'jenny', 'park', datetime.datetime(2023, 1, 12, 13, 2, 21))
(402, 'jane', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(403, 'tom', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(404, 'christina', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(405, 'christina', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(406, 'alex', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(407, 'alex', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(408, 'christopher', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(409, 'alex', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(410, 'christopher', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(411, 'christina', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(412, 'jenny', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(413, 'jane', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(414, 'christina', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(415, 'jenny', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(416, 'tom', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(417, 'christopher', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(418, 'tom', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(419, 'christopher', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(420, 'tom', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(421, 'christopher', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(422, 'tom', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(423, 'jenny', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(424, 'christina', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(425, 'jenny', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(426, 'jenny', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(427, 'jane', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(428, 'jenny', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(429, 'christopher', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(430, 'jenny', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(431, 'christopher', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(432, 'alex', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(433, 'jane', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(434, 'alex', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(435, 'jane', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(436, 'christopher', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(437, 'christopher', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(438, 'christina', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(439, 'christopher', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(440, 'tom', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(441, 'alex', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(442, 'christopher', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(443, 'tom', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(444, 'jane', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(445, 'jane', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(446, 'tom', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(447, 'alex', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(448, 'jane', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(449, 'tom', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(450, 'jane', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(451, 'tom', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(452, 'tom', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(453, 'jane', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(454, 'jenny', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(455, 'alex', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(456, 'tom', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(457, 'alex', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(458, 'alex', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(459, 'jenny', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(460, 'tom', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(461, 'tom', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(462, 'jane', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(463, 'christopher', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(464, 'christina', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(465, 'jenny', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(466, 'christopher', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(467, 'tom', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(468, 'jenny', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(469, 'christina', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(470, 'christina', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(471, 'jenny', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(472, 'tom', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(473, 'christopher', 'holland', datetime.datetime(2023, 1, 13, 12, 20, 59))
(474, 'tom', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(475, 'christina', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(476, 'christopher', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(477, 'jane', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(478, 'christina', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(479, 'tom', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(480, 'jenny', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(481, 'jenny', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(482, 'jenny', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(483, 'christina', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(484, 'christina', 'lee', datetime.datetime(2023, 1, 13, 12, 20, 59))
(485, 'jenny', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(486, 'jane', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(487, 'tom', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(488, 'christina', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(489, 'jenny', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(490, 'christina', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(491, 'christopher', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))
(492, 'christopher', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(493, 'jenny', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(494, 'jenny', 'hardy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(495, 'christina', 'park', datetime.datetime(2023, 1, 13, 12, 20, 59))
(496, 'tom', 'judge', datetime.datetime(2023, 1, 13, 12, 20, 59))
(497, 'jane', 'softy', datetime.datetime(2023, 1, 13, 12, 20, 59))
(498, 'jane', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(499, 'christopher', 'cruise', datetime.datetime(2023, 1, 13, 12, 20, 59))
(500, 'christina', 'esber', datetime.datetime(2023, 1, 13, 12, 20, 59))
(501, 'jane', 'hanks', datetime.datetime(2023, 1, 13, 12, 20, 59))

 

참조:

http://ojc.asia/bbs/board.php?bo_table=LecOrccleTun&wr_id=113 

http://dbcafe.co.kr/wiki/index.php/%EC%98%A4%EB%9D%BC%ED%81%B4_%ED%8D%BC%ED%8F%AC%EB%A8%BC%EC%8A%A4_%ED%8A%9C%EB%8B%9D#.ED.8D.BC.ED.8F.AC.EB.A8.BC.EC.8A.A4_.ED.8A.9C.EB.8B.9D.EC.9D.98_.EC.88.9C.EC.84.9C

728x90

댓글