2023/08/17 개발일지(SQL 기초 & aws 배포 오류 및 해결)

장현웅·2023년 8월 17일
1
  • SQL(Structured Query Language) : 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어. 데이터베이스에 요청(Query)을 날려서 원하는 데이터를 가져오는 것을 도와주는 언어.

  • 데이터베이스(db=database) : 여러 사람들이 같이 사용할 목적으로 데이터를 담는 통. 어느 한 조직의 여러 응용 프로그램들이 공유하는 관련 데이터들의 모임. 서로 관련성을 가지며 중복이 없는 데이터의 집합.

  • db ex1) 고객 주문 내역을 엑셀로 정리할 경우 필요한 정보를 찾는데 시간이 걸린다는 점, 데이터가 많아지면 처리도 느려진다는 점 등 비효율적임

  • db ex2) 한 대학에서 학생 관리 프로그램, 교수 관리 프로그램, 성적 관리 프로그램의 3개의 응용 프로그램을 갖추고 있다고 하자. 각각의 응용 프로그램들은 개별적인 파일을 이용한다. 이런 경우의 파일에는 많은 정보가 중복 저장되어 있다. 그렇기 때문에 중복된 정보가 수정되면 관련된 모든 파일을 수정해야 하는 불편함이 있다. 예를 들어, 한 학생이 자퇴하게 되면 학생 정보 파일뿐만 아니라 교수 정보 파일, 성적 정보 파일도 수정해야 한다.

    이런 문제점을 해결하기 위해 나온 개념이 데이터베이스이다. 엄청나게 많은 양의 데이터를 효과적으로 저장할 수 있고, 수정/사용하기 위한 데이터를 신속하게 찾을 수 있다.

    [네이버 지식백과] 데이터베이스 (컴퓨터 개론, 2013. 3. 10., 김종훈, 김종진)
  • 데이터베이스 기능

    C (Create): 데이터의 생성
    R (Read): 저장된 데이터를 읽어오는 것
    U (Update): 저장된 데이터를 변경
    D (Delete): 저장된 데이터를 삭제

  • SQL의 기능

    데이터를 읽어오는 과정인 "R (Read)"를 엄청나게 편하게 만들어줌. 그리고, 데이터를 손쉽고 깔끔하게 정리/분석하는 기능도 지원.

쿼리(Query)문

쿼리(Query) : 질의. 데이터베이스에 명령을 내리는 것.

Select 쿼리문

Select 쿼리문 : 데이터베이스에서 '데이터를 선택해서 가져오겠다'는 의미

1. 어떤 테이블에서

테이블은 데이터를 구조화하고 저장하는 데이터베이스의 기본 단위. 테이블은 행(row)과 열(column)로 구성되며, 각 열은 특정한 데이터 유형과 속성을 가지는 필드(Field)를 나타낸다. 테이블은 데이터베이스 내에서 고유한 이름을 가지며, 데이터를 효율적으로 관리하기 위해 사용된다.


이런 형태의 값이 데이터베이스에 담기면, orders라는 이름의 테이블이 됨.

2. 어떤 필드의 데이터를 가져올지

필드는 테이블의 열(Column)로서, 테이블 내에서 특정한 유형의 데이터를 저장하는 데 사용된다. 필드는 데이터베이스의 스키마에 따라 데이터의 형식과 속성을 정의한다. 각 필드는 데이터베이스 내에서 고유한 이름을 가지며, 해당 열이 저장하는 데이터의 의미를 나타낸다.

  • 스키마
    스키마는 데이터베이스 내의 테이블, 필드, 제약 조건 등을 포함한 모든 객체들의 논리적인 설계와 구조. 즉, 스키마는 데이터베이스의 '계획서'

SQL 쿼리문을 사용하여 테이블과 필드를 생성하고 관리할 수 있으며, 이를 통해 데이터베이스 내에서 구조화된 데이터를 저장하고 검색할 수 있다. (예시. orders 테이블의 created_at, course_title, payment_method, email 필드를 가져와줘)

Select 쿼리문 연습

1. 데이터베이스의 테이블 보기 (스파르타 데이터베이스)

show tables;

SQL문 실행 : Ctrl + Enter

2. 테이블의 데이터 가져와보기 (orders 테이블)

select * from orders; // *은 모든 필드

3. 테이블의 특정 필드만 가져와보기 (orders 테이블)

select created_at, course_title, payment_method, email from orders; 

Select 쿼리문 : Where 절

Where 절 : Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것을 의미

예1) orders 테이블에서 결제수단이 카카오페이인 데이터만 가져와줘!

select * from orders

select * from orders where payment_method = 'kakaopay' 
// 'kakaopay'에 따옴표가 없으면 문자열이 아니라는 뜻으로 테이블명이나 필드명으로 인식하고 오류가 날 수도 있다.



Where 절에 있는 kakaopay라는 컬럼은 없다는 뜻. 여기서 컬럼은 필드. kakaopay에 따옴표가 없으니 글자를 컬럼(필드명)으로 인식함.

예2) point_users 테이블에서 포인트가 5000점 이상인 데이터만 가져와줘!

select * from point_users

select * from point_users
where point >= 5000

예3) orders 테이블에서 주문한 강의가 웹개발 종합반이면서, 결제수단이 카드인 데이터만 가져와줘!

select * from orders

select * from orders
where course_title = '웹개발 종합반'

select * from orders
where course_title = '웹개발 종합반' and payment_method = 'CARD'
// 여러 조건을 걸어주기 위해서는 and 를 넣어서 원하는 조건을 계속 추가해주면 된다.

예4) 포인트가 20000점보다 많은 유저만 뽑아보기

select * from point_users
where point > 20000

예5) 성이 황씨인 유저만 뽑아보기

select * from users
where name = '황**'

[쿼리 작성 꿀팁🍯]
1. show tables로 어떤 테이블이 있는지 살펴보기
2. 제일 원하는 정보가 있을 것 같은 테이블에 select from 테이블명 쿼리 날려보기
3. 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
4. 테이블을 찾았다! 조건을 걸 필드를 찾기
5. select
from 테이블명 where 조건 이렇게 쿼리 완성!

Where 절과 자주 같이쓰는 문법

1. '같지 않음' 조건 (!=)

ex) '웹개발 종합반'을 제외한 주문데이터

select * from orders
where course_title != "웹개발 종합반";

2. '범위' 조건 (between)

ex) 7월 15일, 7월 16일(7월 17일 전까지)의 주문데이터

select * from orders
where created_at between "2020-07-15" and "2020-07-17";

3. 포함' 조건 (in)

ex) 1, 3주차 사람들의 '오늘의 다짐' 데이터

select * from checkins 
where week in (1, 3);

4. '패턴' (문자열 규칙) 조건 (like)

ex) 다음 (daum) 이메일을 사용하는 유저

select * from users 
where email like '%daum.net';

[꿀팁🍯] Like의 다양한 사용법
4-1. email 필드값이 a로 시작하는 모든 데이터

select * from users 
where email like 'a%': 

4-2. email 필드값이 a로 끝나는 모든 데이터

select * from users 
where email like '%a'

4-3. email 필드값에 co를 포함하는 모든 데이터

select * from users 
where email like '%co%'

4-4. email 필드값이 a로 시작하고 o로 끝나는 모든 데이터

select * from users 
where email like 'a%o'

5. 일부 데이터만 가져오기 (Limit)

테이블에 어떤 데이터가 들어있나 잠깐 보려고 할 때 일부 데이터만 가져오는 기능

select * from orders 
where payment_method = "kakaopay"
limit 5; // 맨 뒤에 limit을 써주고 몇 개 출력할지 숫자를 적어주면 끝

6. 중복 데이터는 제외하고 가져오기 (Distinct)

결제 수단 종류만 궁금할 때

select distinct(payment_method) from orders;

7. 몇 개인지 숫자 세보기 (Count)

결제가 총 몇 건인지 궁금할 때

select count(*) from orders

6,7 응용 예제 1) 스파르타 회원 분들의 성(family name)이 몇 개인지

SELECT count(distinct(name)) from users;

6,7 응용 예제 2) 음식 주문이 있었던 식당이 몇 곳인지

select count(distinct(restaurant_name)) from food_orders

예1) 결제수단이 CARD가 아닌 주문데이터만 추출

select * from orders
where payment_method != 'card'

예2) 20000~30000 포인트 보유하고 있는 유저만 추출

select * from point_users
where point between '20000' and '30000'

예3) 이메일이 s로 시작하고 com로 끝나는 유저만 추출

select * from users
where email like 's%com'

예4) 이메일이 s로 시작하고 com로 끝나면서 성이 이씨인 유저만 추출

select * from users
where email like 's%com' and name = '이**'

예5) 성이 남씨인 유저의 이메일만 추출

select email from users
where name="남**"

예6) Gmail을 사용하는 2020/07/12~13에 가입한 유저를 추출

select * from users
where created_at between "2020-07-12" and "2020-07-14"
and email like "%gmail.com";

예7) Gmail을 사용하는 2020/07/12~13에 가입한 유저의 수

select count(*) from users
where created_at between "2020-07-12" and "2020-07-14"
and email like "%gmail.com";

예 8) naver 이메일을 사용하면서, 웹개발 종합반을 신청했고 결제는 kakaopay로 이뤄진 주문데이터

where payment_method = 'kakaopay'
and course_title ='웹개발 종합반'
and email like '%naver.com'

에러 메시지 해석해보기 1)

→ kakaopay라는 글자가 '컬럼(필드)' 이름으로 인식되어서 발생한 에러
→ Where 절에는 kakaopay라는 컬럼(필드)가 없음.

select * from orders
where payment_method = "kakaopay"

→ 글자를 ''로 감싸면 변수가 아닌, 문자열(값)로 인식하겠다는 의미
→ 결제수단이 kakaopay라는 값을 가진 데이터만 불러오기 위해서는, kakaopay를 문자열(값)으로 지정해줘야함.

에러 메시지 해석해보기 2)

→ SQL 구문 에러
→ 조건을 여러 개 붙일 때는 where 다음 조건 부터는 and로 조건을 붙여준다.

select * from users
where email like 's%net'
and name = "이**"

얼른 다 배워서 웹페이지에서도 SQL을 사용해보고 싶다. 아마 첫 미니팀프로젝트에서 했던 팀 소개 페이지에 넣은 댓글 기능에 SQL을 이용할 수 있을 것 같다.


AWS에서 배포하는 중에 에러가 났다.

터미널에서는

2023-08-17 05:30:12 ERROR Instance deployment failed to install application dependencies. The deployment failed.
2023-08-17 05:30:12 ERROR Instance deployment failed. For details, see 'eb-engine.log'.2023-08-17 05:30:14 ERROR [Instance: i-01eb5d006755f7398] Command failed on instance. Return code: 1 Output: Engine execution has encountered an error..
2023-08-17 05:30:14 INFO Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
2023-08-17 05:31:17 ERROR Create environment operation is complete, but with errors. For more information, see troubleshooting documentation.

ERROR: ServiceError - Create environment operation is complete, but with errors. For more information, see troubleshooting documentation.

이런 오류가 났고

ed log로 오류 기록을 보니

2023/08/17 05:30:12.619993 [ERROR] An error occurred during execution of command [app-deploy] - [InstallDependency]. Stop running the command. Error: fail to install dependencies with 
requirements.txt file with error Command /bin/sh -c /var/app/venv/staging-LQM1lest/bin/pip install -r requirements.txt failed with error exit status 1. Stderr:ERROR: Could not find a version that satisfies the requirement pywin32==306 (from versions: none)
ERROR: No matching distribution found for pywin32==306

이런 오류가 발생했다.

requirements.txt에 있는 pywin32==306이라는 것이 설치가 안되어있다는 것인데.. 알아서 생성된 requirements.txt가 날 배신하다니 그래서 그냥 requirements.txt에

beautifulsoup4==4.12.0
bs4==0.0.1
certifi==2022.12.7
charset-normalizer==3.1.0
click==8.1.3
colorama==0.4.6
dnspython==2.3.0
Flask==2.2.3
idna==3.4
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.2
pymongo==4.3.3
requests==2.28.2
soupsieve==2.4
urllib3==1.26.15
Werkzeug==2.2.3

이 목록만 넣고 다시 eb init을 했다. 근데 또 오류가 났다.

Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization
이것은 이전에 init을 했던 상태로 또 해서 나는 오류였다.
eb init --interactive으로 다시 자격증명을 하고 eb create myweb으로 초기 설정을 하니까 배포가 되었다.

http://myweb.eba-bjp2jgb6.ap-northeast-2.elasticbeanstalk.com/

다른 것도 만들어서 배포해봐야징

코드 수정 후 업데이트
→ deploy 폴더에서 변경할 코드를 적고 저장
→ 터미널에서 eb deploy 환경이름 을 입력하고 엔터
→ 조금 기다리면 적용됨.

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

SQL 구문들을 이해하기 쉽게 정리해 주셨네요!

답글 달기