DB/MariaDB(SQL)

[DB] SQL(DML) / Python 스크립트 적용 방법

Yoonsoo Park 2024. 10. 14. 14:22

*Rocky Linux 9.4와 MariaDB 기반으로 정리한 포스팅입니다. 

 

테이블에 레코드를 넣어보자: DML(Data Manipulatation Language)

DML(Data Manipulation Language)데이터베이스에서 데이터를 조회하거나 조작(추가, 수정, 삭제)하기 위해 사용된다. DDL과 다르게 데이터베이스의 구조를 변경하는 것이 아닌, 테이블 내의 데이터를 관리(Manipulation)하기 위한 SQL이라고 이해하면 쉽다. DML에는 SELECT, INSERT, UPDATE, DELETE가 있다. 

 

1) SELECT : 테이블에서 데이터 출력

테이블의 레코드 모두 출력

select * from [출력할 테이블명]  

EX) 
select * from memberTB; //memberTB 테이블에 있는 모든 레코드를 조건없이 출력된다.

 

원하는 컬럼(column)만 선택하여 출력 

select [출력할 컬럼명1], [출력할 컬럼명2], ... from [출력할 테이블명];

ex) 
select id, name from memberTB; // id와 name만 출력

 

조건과 일치하는 레코드(=row)만 출력

select * from 테이블명 where [레코드를 선택할 조건]

ex) 
select * from memberTB where id = 'trump'; //id가 trump인 모든 레코드를 출력하라
select * from memberTB where id <> 'trump'; //id가 trump가 '아닌' 모든 레코드를 출력하라

 

컬럼의 값이 조건보다 크거나/작거나/크거나 같거나/작거나 같은 레코드만 출력

select * from memberTB where point > 0 //0보다 큰 

select * from memberTB where point < 1000000 //1000000보다 작은

select * from memberTB where point >= 1000000 //1000000보다 크거나 같은

select * from memberTB where point <= 1000000 //1000000보다 작거나 같은

 

정규표현식(regex, regular expression)을 이용하는 방법

% = * (Any)

select * from memberTB where name like '%Lee%' //이름에 Lee가 들어간 모든 레코드를 출력하라

 

여러 조건을 동시에 설정하는 방법

select * from 테이블명 where 조건1 and 조건2 

select * from 테이블명 where 조건1 or 조건2 

ex) 
select * from memberTB where point >=1000000 or regdate > '2018-2-1' 
//포인트가 1000000보다 크거나 같거나, regdate가 2018-2-1 이후인 레코드를 모두 출력하라

 

 

2) INSERT : 테이블에 레코드 삽입 

단일 레코드 삽입

INSERT INTO Employees (FirstName, LastName, HireDate, Salary) 
VALUES ('Alice', 'Johnson', '2024-01-15', 55000.00); //기본 설정 방법

INSERT INTO memberTB VALUES ('jeong1234', 'StrongPass6#', '정우성', 110000, '2024-06-01'); 
//모든 컬럼의 값을 입력하는 경우 INSERT INTO에서 컬럼명을 언급하지 않아도 된다

 

벌크 입력(여러 레코드를 한번에 삽입)

INSERT INTO Employees (FirstName, LastName, HireDate, Salary) 
 VALUES 
 ('Bob', 'Smith', '2024-02-20', 60000.00), 
 ('Charlie', 'Brown', '2024-03-10', 50000.00); 
 ('David', 'Wilson', '2024-04-15', 40000.00);

 

DEFAULT 값 사용 

INSERT INTO Products (ProductName, Price) 
VALUES ('Gadget', DEFAULT); 
//값을 생략하거나, DEFAULT를 적어주면 DEFAULT값이 입력된다

 

** 데이터를 다룰 때는 홑 따옴표(')로 묶어주어야 한다. 단, 예외적으로 숫자, 예약어(DEFAULT, NULL..)은 홑 따옴표를 사용하지 않는다.

<INSERT 예시>

 

 

3) UPDATE : 테이블 레코드 수정하기 

update 테이블명 set 컬럼명='값' // 모든 레코드의 내용이 수정된다. 

update 테이블명 set 컬럼명='값'  where 조건 

update 테이블명 set 컬럼명1='값1', 컬럼명2='값2', 컬럼명3='값3'  where 조건 

update 테이블명 set 컬럼명1='값1', 컬럼명2='값2', 컬럼명3='값3'  where 조건1 and 조건2 

update 테이블명 set 컬럼명1='값1', 컬럼명2='값2', 컬럼명3='값3'  where 조건1 or 조건2
update memberTB set pass='Good bye' where id='abe'; 

update memberTB set point = point - 2 where id = '2mb'; 

update memberTB set name='NalGangDoo', pass='1818' where id='ronaldo';

 

4) DELETE : 테이블 레코드 삭제하기

delete from 테이블명 // 테이블의 레코드를 한개씩 차례대로 모두 삭제함. 

delete from 테이블명 where 조건 // 조건과 일치하는 레코드만  삭제함
delete from memberTB where id='ronaldo'; 

delete from memberTB ; // 모든 레코드 삭제;;

 

 

 

** 벌크 데이터 생성 및 적용 방법

 DML을 이용하여 테이블에 레코드를 삽입할 수 있지만, 10000개가 넘어가는 대량의 데이터(벌크 데이터)를 생성하고 삽입해야하는 경우는 어떻게 할까? 

https://www.mockaroo.com/

 

Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel

Mock your back-end API and start coding your UI today. It's hard to put together a meaningful UI prototype without making real requests to an API. By making real requests, you'll uncover problems with application flow, timing, and API design early, improvi

www.mockaroo.com

 

다음 사이트는 샘플 데이터 자동 생성 스크립트를 만들어주는 사이트이다. 해당 사이트에 들어가서 얻고자 하는 데이터의 조건을 입력해주면 다음과 같은 파이썬 스크립트를 만들어준다. 그렇게 어려운 스크립트는 아니기 때문에 직접 만들어보는 것도 추천한다.

import random 

import string 

 

def generate_user_data(n): 

    users = [] 

    for i in range(n): 

        user_id = f'user{i+1:04d}'  # user0001, user0002, ... 

        password = ''.join(random.choices(string.ascii_letters + string.digits + "!@#$%^&*", k=10)) 

        name = f'회원{i+1}' 

        point = 100000 

        regdate = f'2024-01-{(i % 31) + 1:02d}'  # 날짜는 1일부터 31일까지 반복 

        users.append(f"('{user_id}', '{password}', '{name}', {point}, '{regdate}')") 

    return users 

 

data = generate_user_data(1000) 

insert_query = "INSERT INTO memberTB (id, pass, name, point, regdate) VALUES \n" + ",\n".join(data) + ";" 

 

print(insert_query)

 

 해당 파이썬 스크립트를 FTP 서버(filezilla)를 통해 DB 서버로 업로드 해준 후, 다음 명령으로 실행해주면, 벌크 데이터가 데이터베이스에 적용된다.

mysql -u root -p shopDB < memberTB.sql

select count(*) from memberTB;

<select count(*) from memberTB;>

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"불이 꺼지려고 하거든, 더 자주 장작을 집어넣어주자. 끊임없이 동기부여하고, 나태함과 권태를 이겨내자"