SQL 기본 문법 이해 (CRUD)

1. SQL 기본 문법 (CRUD)의 개념과 쓰임 정리 

CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. SQL 정보를 조작하는 데 있어 CRUD는 기본적으로 쓰이는 명령어로 그 쓰임과 사용 방법에 대해 알아야 한다.

CRUD 조작 SQL
Create 생성 INSERT INTO 테이블명 VALUES 값
Read(또는 Retrieve) 읽기(또는 인출) SELECT 값 FROM 테이블명
Update 갱신 UPDATE 테이블명 SET 수정할 컬럼명 = '수정값'
Delete(또는 Destroy) 삭제(또는 파괴) DELETE FROM 테이블명 WHERE 조건

 

1. 데이터 생성 (CREATE) 

1) 테이블 전체에 대응하는 값을 모두 넣는 경우

INSERT INTO 테이블명 VALUES(값1, 값2, 값3, ...);

2) 테이블 특정 컬럼에 대응하는 값만 넣는 경우

INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3, ...) VALUES (값1, 값2, 값3, ...);

2. 데이터 읽기 (READ)

1) 테이블 전체 컬럼의 데이터 모두 읽기

SELECT * FROM 테이블명;

2) 테이블 특정 컬럼의 데이터만 읽기

SELECT 컬럼1, 컬럼2 FROM 테이블명;

3) 테이블 특정 컬럼의 데이터를 검색하되 표시할 컬럼명도 다르게 하기

SELECT 키존컬럼이름 AS 바꿀컬럼이름 FROM 테이블명;

4) 조건에 맞는 데이터만 검색하기 

  • WHERE 조건문으로 조건 검색
  • 논리연산자 (AND, OR) 사용 가능
SELECT * FROM 테이블명 WHERE 컬럼1 < 5 or 컬럼2 < 10
  • LIKE 통해 부분적으로 일치 데이터 추출 가능 
    • 개수와 상관 없이 모두 찾을 경우 '%' 한번  사용
    • 특정 개수 만큼 다른 경우를 찾을 경우 '_' 해당 글자수만큼 사용
SELECT * FROM 테이블명 WHERE 컬럼1 LIKE '홍%'
SELECT * FROM 테이블명 WHERE 컬럼1 LIKE '홍___'

5) 데이터 정렬해서 읽기

  • ORDER BY 정렬할 컬럼명 DESC 혹은 ASC
  • DESC는 내림차순 ASC는 오름차순
SELECT * FROM 테이블명 ORDER BY DESC
SELECT * FROM 테이블명 ORDER BY ASC

6) 결과 중 일부만 데이터 가져오기 

  • LIMIT N; : 첫 행부터 N개 추출
  • LIMIT N M; : N행부터 M개 추출 
SELECT * FROM 테이블명 LIMIT 100, 3;

 

3. 데이터 수정 (UPDATE)

1) 보통 WHERE 조건문과 함께 쓰여 특정한 조건에 맞는 데이터만 수정하는 것이 일반적인 사용법

UPDATE 테이블명 SET 수정할 컬럼명 = '수정할 컬럼값' WHERE 특정 칼럼 = '값';

2) 특정 조건에 따라 변하는 컬럼 값을 다수 설정 가능

UPDATE 테이블명 SET 수정할 컬럼명1 = '수정할 컬럼값1', 수정할 컬럼명2 = '수정할 컬럼값2'  WHERE 특정 칼럼 = '값';

4. 데이터 삭제 (DELETE) 

1) 보통 WHERE 조건문과 함께 쓰여서, 특정한 조건에 맞는 데이터만 삭제하는 경우가 많음

DELETE FROM 테이블명 WHERE 특정 컬럼 = '값';

2) 테이블에 지정된 모든 데이터를 삭제할 수도 있음 (하지만 기본적으로 기능 제한되어 있음)

DELETE FROM 테이블명;

BeautifulSoup - 초보 사용자를 위한 가장 간편한 라이브러리

0. BeautifulSoup find와 select 함수 이해

: BeautifulSoup 라이브러리를 통해 HTML 형태로 가공한 웹페이지 데이터 상에 필요한 정보를 특정하기 위해 추가적으로 함수 사용이 필요한데, 이때 사용되는 대표적인 함수 두 가지가 find와 select 함수이다. 기본적인 HTML, CSS 구조를 이해하고 find와 select 함수가 각각 어떻게 쓰이는지 정리해보고자 한다. 

✓ find 함수와 select 함수 사용법 및 결론 요약

: find 함수와 select 함수 중 select 함수 사용에 익숙해지는 것이 더 좋다. find와 select는 모두 태그명, 속성, 속성값을 활용하는 방식이지만, CSS는 보통 여러개의 선택자 (Selector)를 갖고 있기 때문에 태그를 특정하기 위해선 일반적으로 여러 요소(element)를 함께 조합해야 한다. 이때 경로를 지정하는 방식과 관련하여 find는 함수를 여러번 반복하여 코드를 작성해야 하는 반면 select는 하나의 함수 내에 직접 하위 경로를 지정할 수 있는 기능이 존재하기 때문이다. 

 

1) find 함수 사용법 - 아래 기본 구조 중 선택해 사용

  • data = soup.find('태그명')
  • data = soup.find('태그', class_ = 'class 값')
  • data = soup.find('태그', 'class 값')
  • data = soup.find(id = 'id값')
  • data = soup.find('태그', attrs = {'속성 이름' : '속성 값'})

1) select 함수 사용법 - 아래 기본 구조를 조합해 사용

  • data = soup.select('태그명')
  • data = soup.select('.클래스값')
  • data = soup.select('#id값')
  • data = soup.select('상위태그'  '자식태그')
  • data = soup.select('상위태그' > '자식태그')
  • data = soup.select_one('id값')[속성]
 

 

1. HTML과 CSS의 기본 구조 이해

: BeautifulSoup는 물론 앞으로 Selenium이나 Scrapy 같은 정보 추출을 위한 라이브러리를 활용하기 위해 우선적으로 HTML과 CSS 구조에 대해 이해해야 한다. 특히 하나의 요소 안에 담긴 속성명과 속성값의 개념을 이해하는 것과 태그 간의 관계성에 기반한 상위태그 자식태그의 개념 두 가지만 우선적으로 알아보자.

1. HTML 요소의 기본 구조

: HTML의 요소는 <시작태그>로 시작해 </종료태그>로 끝나는 하나의 구문을 말하며, 여러개의 속성을 가질 수 있다는 특징이 있다. (속성은 해당 태그에 추가적인 정보들을 담고 있다.) 우리가 일반적으로 추출하고자 하는 정보는 태그 사이에 있는 내용(아래 이미지 참고)에 위치해 있는 경우가 많아 태그명은 물론 속성명과 속성값에 대해 활용할 수 있어야 한다. 대표적으로 많이 사용되는 두 가지 속성 'Class'와 'Id'의 경우 별도의 표현 방식을 통해 해당 요소를 특정할 수 있어 데이터 추출 간 좋은 힌트가 될 수 있다.

2. 부모 태그와 자식 태그의 관계

: HTML은 요소들은 기본적으로 부모 자식 관계 혹은 형제 관계로 구분된다. 원하는 정보가 위치한 태그안에 해당 태그를 특정할 만한 속성 정보가 부족할 때, 해당 태그의 부모 태그까지 함께 이용하는 것이 가능하기 때문에 크롤링 과정에서 부모태그의 개념을 이해하는 것이 매우 중요하다. 부모 자식 관계는 들여쓰기 형태로 구분되어 있어 HTML 구문을 직접 보면서 바로 확인이 가능하다. 아래를 예시로 부모 자식 관계를 부등호 표시로, 형제 관계를 등호 표시로 표현해보자면 html > body > h1 = div > span = img 와 같이 정리 가능하다.

2. select 함수와 find 함수 사용법

✓ 활용 예제 : span 태그 내의 '상품명' 정보 추출하기

from bs4 import BeautifulSoup
html = """
<html>
    <body>
        <h1 id='head'>구좌명</h1>
        <div class='item'>
            <span class='title' id='first'> 상품명1 </span>
            <img class='main' id='first_img' src='이미지주소' width='50px'>
        </div>
        <div class='item'>
            <span class='title' id='first'> 상품명2 </span>
            <img class='main' id='first_img' src='이미지주소' width='50px'>            
        </div>
    </body>
</html>
"""
soup = BeautifulSoup(html,"html.parser")

1. find 함수를 활용한 정보 추출

: find 함수는 조건에 부합하는 태그 중에 가장 먼저 발견되는 하나의 값을 가져다 준다. (print로 출력) 또한 조건 간의 중복적으로 사용할 수 없기 때문에 하나의 함수에 조건만 추가할 수 있다. 만약 부모태그 정보를 넣고 싶다면 find 함수 자체를 여러번 사용해야 하는 불편함이 있을 수 있다.

 

1) find 함수를 사용해 정보 추출하기

 

- 태그명을 이용해 정보 추출하는 방법

- 태그명 + 클래스 값을 이용해 정보 추출하는 방법

- 아이디 값을 이용해 정보 추출하는 방법

- data = soup.find('태그', attrs = {'속성 이름' :'속성 값'})

2) find_all 함수를 사용해 조건에 부합하는 모든 값 추출하기 (for반복문 통해 출력)

3) find 함수 중복 사용을 이용한 부모 태그 정보 기입하기

2. select 함수를 활용한 정보 추출

: select 함수는 조건에 부합하는 모든 태그의 값을 리스트 형태로 반환한다. (for 반복문으로 출력) 또한 조건 간의 중복사용이 가능하기에 하나의 함수에 여러 조건을 함께 쓸 수 있다. 부모태그 정보도 함께 기입할 수 있는 기능이 있어 활용성이 find 함수에 비해 상대적으로 높다.

 

1) select 함수를 사용해 정보 추출하기

 

: 하나의 요소(element) 안에 놓인 태그명/ 클래스 값/ id 값을 띄어쓰기 없이 연속으로 적어 데이터 특정이 가능하다. 다만 작성간 아래 조건에 따라 각 속성들을 추가해야 한다.

  • data = soup.select('태그명')
  • data = soup.select('.클래스값')
  • data = soup.select('#id값')

2) select_one 함수를 사용해 정보 추출하기

 

: select_one 함수는 find 함수와 맞찬가지로 조건에 부합되는 값들 중 가장 먼저 발견되는 값을 가져와 print로 출력 가능하다

: select_one 함수를 활용하면 요소 안에 들어있는 내용뿐만 아니라 속성값 출력도 가능하다.

  • data = soup.select_one('id값')[속성]

3) select 함수 이용한 부모 태그 정보 기입하기

 

: select 함수는 단일 태그의 정보를 조합적으로 이용할 수 있으며 동시에 부모 태그 혹은 부모의 부모 태그 (그 이상까지도..) 하나의 함수로 직접 활용이 가능하다. 부모태그에 대해 띄어쓰기를 통해 표시하면 되지만 바로 앞에 위치한 부모태그의 경우 부등호 ('>') 표시를 통해 보다 정확하게 정보 표시가 가능하다.

  • data = soup.select('상위태그'  '자식태그')
  • data = soup.select('상위태그' > '자식태그')

select 함수를 사용한 추출 데이터 지정

0. 코드 정리

# 정보 추출할 사이트 주소와 데이터 특정할 인자 수정해 사용할 것 

import requests
from bs4 import BeautifulSoup
res = requests.get('정보 추출할 사이트 주소')
soup = BeautifulSoup(res.content,'html.parser')

# 데이터 특정 위한 인자 예시, 하단 설명 참고 
section = soup.select('p.item_title > a > span.prName_PrName')

for item in section:
    print(item.get_text())    #select() 함수는 리스트값을 결과로 입력하여 for 반복문을 통해 추출

1. 데이터 지정 간 select 함수를 사용하는 이유

: 정제되지 않은 웹사이트를 대상으로 상황에 맞는 크롤링 구문을 작성하다보니 크롤링 문법이 다른 문법에 비해 직관적이지 않게 보이는 특성이 있다. 그에 따라 보다 다양한 방법을 사전에 알고 있어야 다른 사람의 코드를 참조할 수 있는데 find()를 이용한 함수만큼 혹은 그 이상 사용되는 것이 select() 함수이다. find() 함수가 상대적으로 이해하기 쉬운 특징이 있는 반면 select() 함수는 보다 더 구체적인 구문을 특정하는데 용이하다는 특징이 있어 실제적으로 더 많이 이용되고 있다.

 

2. select 함수의 기본 사용 형태와 인자 작성법

1) 기본적인 사용 형태

: find() 함수와 기본적으로 사용 형태가 비슷해 보이지만 select() 함수의 경우 결과값을 받는 형태와 안에 들어가는 인자가 달라진다는 점에 유의해 사용해야 한다. find() 함수의 경우 결과값을 객체(object)로 받아 여러개의 값을 가져올 경우 find_all() 함수로 대체 사용해야 했다. 하지만 select() 함수의 경우 결과값을 기본적으로 리스트 형태로 받기 때문에 오히려 하나의 값에 대한 객체(object)로 받고자 할 때 select_one()이라는 함수로 대체 사용해야 하는 특징이 있다. 

# find()와 select() 함수는 호환이 가능한데, 정보 타입에 따라 select() 함수는 find_all() 함수와 select_one()함수는 find()함수와 교차사용이 가능하다. 

import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.okmall.com/products/list?cate=20008603&gi_num=2')
soup = BeautifulSoup(res.content,'html.parser')

section = soup.select('p.item_title > a > span.prName_PrName') # find() 대신 select() 사용

for item in section:
    print(item.get_text())    #select() 함수는 리스트값을 결과로 입력하여 for 반복문을 통해 추출

 

2) select() 함수 인자 작성법

: select() 함수 내 인자를 작성할 때에는 CSS 언어의 style 태그가 HTML 태그를 취할 때의 문법 구조와 동일하게 작성된다. tag 값은 별도의 표시 없이 값만 가져오며 class 값은 앞에 "."과 함께 그리고 id 값은 앞에 "#"과 함께 쓰인다. 동일한 태그 내의 정보를 중복으로 사용 가능하며 이런 구문을 작성할 때에는 띄어쓰기 없이 붙여 사용해야 한다.

#tag 값 : tag 값 입력
#class 값 : .class 값 입력
#id 값 : #id 값 입력

import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.okmall.com/products/list?cate=20008603&gi_num=2')
soup = BeautifulSoup(res.content,'html.parser')

section = soup.select('태그값.class값#id값') #단일 태그 안에 있는 정보를 기입할 떄에는 붙여서 사용 

for item in section:
    print(item.get_text())

또한 selcet()함수는 보다 구체적으로 특정 데이터를 특정하기 위해 상위 태그 정보를 함께 기입하는 방법도 존재한다. 기본적으로 띄어쓰기를 통해 상위태그와 하위태그 정보를 연속적으로 나열 가능하며 바로 앞에 있는 상위 태그임을 나태내고 싶다면 띄어쓰기 대신 ">" 기호를 추가할 수 있다. 다만 ">" 기호를 사용할 경우 바로 앞에 위치한 상위태그가 정보가 아닐 시에는 정보 추출이 제한된다는 점에 유의해야 한다.

#상위 태그 포함 예시
section = soup.select('태그명.class명 태그명#id명 > 태그명.class명' )

 

3) select() 함수 인자 추출 방법

: 웹페이지 내 '검사' 기능을 사용한다면 크롤링을 통해 추출하고자 하는 정보의 CSS selector 정보를 즉시적으로 복사할 수 있다. 웹페이지 검사 기능 내 원하는 정보가 담긴 구문을 우클릭한 후 'Copy' 안에 'Copy Selector'를 클릭한 뒤 해당 정보를 select() 함수 인자로 사용 가능한 정보를 추출 가능하다.

 

# 검사 기능 내 CSS selector 정보 카피하는 방법 이미지 

+ Recent posts