2. 다음 SQL문 실행결과는? (실제 시험에스는 전항 정답 처리 되었지만 확정답안 발표를 참고하여 문제를 적절히 수정하여 정상적으로 문제를 풀수 있도록 조치 하였습니다.)

 

SELECT A.학번, A.이름, B.학점

FROM 학생 A, 성적 B

WHERE A.학번 = B.학번 AND B.과목이름 = "DB"

 

FROM

1) 학생 테이블을 A로 이름을 붙혀 주었다

2) 성적 테이블을 B로 이름을 붙혀 주었다

 

WHERE 에서 붙혀주기를 해주었다 

1) 학번이 같은 것 끼리 묵어주었다

AND

2) 과목 이름이 "DB" 인것만 추출하였다

 

SELECT

1) 학생에서 학번 출럭

2) 학생에서 이름 출력

3) 성적에서 학점 출럭

 

단 과목이름이 "DB"인것만

 

답은 (4)번 

 

블로그 이미지

Or71nH

,

 

1.다음 관계대수 중 순수 관계 연산자가 아닌 것은?

 

(1) 차집합 ( difference)   (2) 프로젝트(project)

(3) 조인 (join)               (4) 디비전(division)

 

순수 관계연산자

 

SELECT

- 리레이션에 존재하는 튜플들을 구하는 것으로, 수평 연산이라고도 한다

- SELECT 연산의 기호는 그리스 문자 시그마(σ)이다

- 표기 형식 : σ(조건)(R)

     · R은 릴레이션

     · 조건에서는 =, ≠, <, ≤, >, ≥ 등의 기호를 사용한 비교 연산이 허용, AND(∧), OR(∨), NOT(ㄱ) 등의 논리 연산자를 사용하여 여러 개의 조건들을 하나의 조건으로 결합시킬 수도 있다.

 

PROJECT

- 주어진 릴레이션에서 속성 리스트에 제시된 속성 값만을 추출하여 새로운 릴레이션을 만든다. 단, 연산 결과에 중복이 발생하면 중복이 제거된다.

- 릴레이션에서 열에 해당하는 속성을 추출하는 것으로, 수직 연산이라고도 한다.

- PROJECT 연산의 기호는 그리스 문자 파이(π)이다.

- 표기 형식 : π(속성 리스트)(R)

 

JOIN

- 공통 속성을 중심으로 2개의 릴레이션을 하나로 합쳐서 새로운 릴레이션을 만든다.

- JOIN 연산의 결과로 만들어진 릴레이션의 차수는 조인된 두 릴레이션의 차수를 합한 것과 같다.

- JOIN 연산의 결과는 CARTESIAN PRODUCT 연산을 수행한 다음 SELECT 연산을 수행한 것과 같다.

- JOIN 연산의 기호는 ▷◁ 이다.

- 표기 형식 : R◁(JOIN 조건)S

· R, S는 릴레이션

· =, ≠, <, ≤, >, ≥ ≥ 등의 비교 연산자를 비교 연산자를 θ로 일반화하여  θ로 표현될 수 있는 조인을 세타 조인(θ-join, Theta JOIN)이라고 한다.

· 자연 조인과 반대로 중복된 속성을 나타내는 연산은 동일 조인(Equi JOIN)이다.

 

DIVISION

- 두 릴레이션 R(X)과 S(Y)에 대해 Y⊆X, X-Y=Z라고 하면, R(X)와 R(Z,Y)는 동일한 표현이다. 이때, 릴레이션 R(Z,Y)에 대한 S(Y)의 DIVISION 연산은 S(Y)의 모든 튜플에 연관되어 있는 R(Z)의 튜플을 선택하는 것이다.

- 표기 형식 : R[속성r ÷ 속성s]S

· 속성 r은 릴레이션 R의 속성, 속성 s는 릴레이션 S의 속성이며, 속성 r과 s는 동일 소성 값을 가지는 속성이어야 한다.

 

블로그 이미지

Or71nH

,

무료지만 정말 좋은 교육이였다

이 강의로 중요한것을 해결하고 부가적으로 좀더 찾아서 

첼린지를 도전한다

repl.it/@liebespaar93/ThisisReal#main.py

 

ThisisReal

A Python repl by liebespaar93

repl.it

여기가 내가 작성한 모든 2주첼린지 과정이다

생각보다 난이도가 중간에 높았고 후반갈수록 낮아졌다

숫자를 입력하여 그날의 프로그램을 실행할 수 있게 해놧다~

다들 잼있게 코딩 공부 하자~~

 

 

이제 난 크롤링 능력을 하나 획득하였다

nomadcoders.co/

 

노마드 코더 Nomad Coders

코딩은 진짜를 만들어보는거야!. 실제 구현되어 있는 서비스를 한땀 한땀 따라 만들면서 코딩을 배우세요.

nomadcoders.co

 

블로그 이미지

Or71nH

,

마즈막 과제이다

"""
These are the URLs that will give you remote jobs for the word 'python'

https://stackoverflow.com/jobs?r=true&q=python
https://weworkremotely.com/remote-jobs/search?term=python
https://remoteok.io/remote-dev+python-jobs

Good luck!
"""

import requests
from flask import Flask, render_template, request
from bs4 import BeautifulSoup
import os , sys
import csv

os.system("clear")



############ 크롤링~ #################

headers = {'User-Agent' : 'Mozilla.5.0 (Macintosh; Intel Mac OS X 10_9_3)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'}
def makesoup(url):
  data = requests.get(url,headers =headers)
  datasoup = BeautifulSoup(data.text, "html.parser")
  return datasoup

def stackpage(stackurl):
  stackpagenation = []  
  stacksoup = makesoup(stackurl)
  stackdatadiv = stacksoup.find("div",{"class":"s-pagination"}).find_all('a')
  print(stacksoup.find("div",{"class":"s-pagination"}))
  for i in stackdatadiv:
    stackpagenation.append(i["href"])
  return stackpagenation

def stackdataget(stackurl, bigdata):
  stacksoup = makesoup(stackurl)
  stackdatadiv = stacksoup.find("div",{"class":"listResults"})
  stackdatalist = stackdatadiv.find_all("div",{"class":"grid--cell fl1"})
  print("stackdata downloading")
  for i in stackdatalist:
    smalldata = []
    try:
      a = i.find("h2",{"class":"mb4 fc-black-800 fs-body3"}).find('a')
      smalldata.append(a.string)    
      span = i.find("h3",{"class":"fc-black-700 fs-body1 mb4"}).find('span')
      smalldata.append(span.string.replace("\r","").replace("\n","").rstrip())
      smalldata.append("https://stackoverflow.com"+a["href"])
      bigdata.append(smalldata)
    except:
      pass
  return bigdata
    

def weworkdataget(weworkurl, bigdata):
  weworksoup = makesoup(weworkurl)
  weworkdatasection = weworksoup.find("section",{"id":"category-2"})
  weworkdatalist = weworkdatasection.find_all("li",{"class":"feature"})
  print("wework downloading")
  for i in weworkdatalist:
    smalldata = []
    try:
      a = i.find_all('a')[1]
      smalldata.append(a.find('span',{"class":"title"}).string)
      smalldata.append(a.find('span',{"class":"company"}).string)      
      smalldata.append("https://weworkremotely.com"+a['href'])
      bigdata.append(smalldata)
    except:
      pass
  return bigdata
  


def remotedataget(remoteurl, bigdata):
  remotesoup = makesoup(remoteurl)
  remotedatadiv = remotesoup.find("div",{"class":"container"})
  remotedatalist = remotedatadiv.find_all("tr",{"data-stack":""})
  print("remote downloading")
  for i in remotedatalist:
    smalldata = []
    if i.find("h2",{"itemprop":"title"}):
      smalldata.append(i.find("h2",{"itemprop":"title"}).string)
      smalldata.append(i.find("h3",{"itemprop":"name"}).string)
      smalldata.append("https://remoteok.io/"+i.find("a",{"class":"companyLink"})["href"])
      bigdata.append(smalldata)
  return bigdata


def webdatacomefile(language):
  Bigdata = []
  stackurl = f"https://stackoverflow.com/jobs?q={language}"
  Bigdata = stackdataget(stackurl,Bigdata)
  
  weworkurl = f"https://weworkremotely.com/remote-jobs/search?utf8=%E2%9C%93&term={language}"
  Bigdata = weworkdataget(weworkurl,Bigdata)
  print(1)
  Bigdata = weworkdataget(weworkurl,Bigdata)
  print(2)
  remoteurl = f"https://remoteok.io/remote-{language}-jobs"
  Bigdata=remotedataget(remoteurl,Bigdata)
  print(3)
  
  ###################################
  """
  # 페이지네이션 나중에 수정  page 가 삭제된 양도 다 포함되있음 동적후 page 양혹은 jobs양 받아와야함 
  
  stackpageurl = stackpage(stackurl)

  for stack in stackpageurl:
    Bigdata = stackdataget("https://stackoverflow.com"+stack,Bigdata)
    print(1)
  """
  ######################################
  return Bigdata
  

###############  크롤링 끝  ################
    
def save(bigdataforcvs,language):
  file = open(f"day13/csv/{language}.csv", mode="w")
  writer = csv.writer(file)
  writer.writerow(["Title","Company","Link"])

  for jobs in bigdataforcvs:
    writer.writerow(jobs)
  return
#########################

def startgame():
  app = Flask("Final")

  @app.route("/")
  def home():
    return render_template("day13home.html")
  
  @app.route("/search")
  def search():
    dataurl = request.args.get('term')
    if dataurl in DB:
      Bigdatalist=DB[dataurl]
    else:
      Bigdatalist=webdatacomefile(dataurl)
      DB[dataurl]=Bigdatalist
      save(Bigdatalist,dataurl)
    return render_template("day13jobs.html",data = Bigdatalist, datalen = len(Bigdatalist), language = dataurl)
  
  @app.route("/export")
  def csvdownload():
    dataurl = request.args.get('term')
    csv = open(f"day13/csv/{dataurl}.csv")
    return csv.read()

  app.run(host="0.0.0.0")



## 디렉토리 이용방법, CSV 이용방법 DB구축 2가지
DB = {}

 

<!DOCTYPE html>
<html>

<head>
	<title>
    Remote Jobs
  </title>
  <link href="https://andybrewer.github.io/mvp/mvp.css" rel="stylesheet"></link>
</head>

<body>
  <header>
    <h1>Remote Jobs</h1>
  </header>
  <main>
    <form action="/search">
      <h3>Search by term:</h3>
      <input placeholder="i.e python" required name="term" />
      <button type="submit">Find my job</button>
    </form>
  </main>
</body>

</html>

<!DOCTYPE html>
<html>

<head>
	<title>
    Remote Jobs
  </title>
  <link href="https://andybrewer.github.io/mvp/mvp.css" rel="stylesheet"></link>
</head>

<body>
  <header>
    <h1>Remote Jobs</h1>
    <h3>{{datalen}} {{language}} jobs found.</h3>
    <h5><a href="/export?term={{language}}" download="{{language}}.csv">Export to CSV</a></h5>
    <h6><a href="/">&larr; Go back</a></h6>
  </header>
  <main>
    {% for i in data %}
      <div>
        <h3>{{i[0]}}</h3>
        <h4>{{i[1]}}</h4>
        <a href="{{i[2]}}" target="_blank">Apply</a>
      </div>
      <hr />
    {% endfor %}
  </main>
</body>

</html>

이렇게 해서

클로링 데이터 csv에 저장

그리고 빠른 데이터 불러오기를위한 가짜 db를 구동

뭔가 밎밎해 보이지만 있을껀 다있다

이렇게 다운로드도 가능~!

블로그 이미지

Or71nH

,
import requests
from flask import Flask, render_template, request
from bs4 import BeautifulSoup
import os
import re
os.system("clear")

"""
When you try to scrape reddit make sure to send the 'headers' on your request.
Reddit blocks scrappers so we have to include these headers to make reddit think
that we are a normal computer and not a python script.
How to use: requests.get(url, headers=headers)
"""

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'}

"""
All subreddits have the same url:
i.e : https://reddit.com/r/javascript
You can add more subreddits to the list, just make sure they exist.
To make a request, use this url:
https://www.reddit.com/r/{subreddit}/top/?t=month
This will give you the top posts in per month.
"""

subreddits = [
    "javascript",
    "reactjs",
    "reactnative",
    "programming",
    "css",
    "golang",
    "flutter",
    "rust",
    "django"
]

def webdatacomefile(language):
  Bigdata = []
  for upvotes in language:   
    url = f"https://www.reddit.com/r/{upvotes}/top/?t=month"
    data = requests.get(url,headers =headers)
    datasoup = BeautifulSoup(data.text, "html.parser")
    datalistclass = datasoup.find_all("div",{'data-testid':re.compile('^t3_[\w&.\-]{1,6}$')})
    for i in datalistclass:
      smalldata = []
      findnum = i.find("div",{"class":"_1rZYMD_4xY3gRcSS3p8ODO"})
      smalldata.append(findnum.string)
      findtitle = i.find("h3",{"class":"_eYtD2XCVieq6emjKBH3m"})
      smalldata.append(findtitle.string)
      findurl = i.find("a",{"class":"SQnoC3ObvgnGjWt90zD9Z _2INHSNB8V5eaWp4P0rY_mE"})
      smalldata.append(findurl["href"])
      smalldata.append(upvotes)
      Bigdata.append(smalldata)

  return Bigdata
    
  
def popularset(datalist):
  bigdataset = sorted(datalist, key=lambda x: int(x[0].replace(".","").replace("k","000").replace("m","000000")), reverse=True)

  return bigdataset

def homelanguageset():
  languagedata = ["javascript","reactjs","reactnative","programming","css","golang","flutter","rust","django"]
  return languagedata


def startgame():
  app = Flask("DayEleven")
  
  @app.route("/")
  def start():  
    languageset = homelanguageset()
    return render_template("day11home.html", data = languageset)

  @app.route("/<readurl>")
  def finding(readurl):
    dataurl = request.args
    webbigdata = webdatacomefile(dataurl)
    cleanbigdata = popularset(webbigdata)
    for i in cleanbigdata:
      print(i)
    return render_template("day11read.html",data = cleanbigdata, headhunter = dataurl)

  app.run(host="0.0.0.0")

생각보다 빨리 끝넷다 

재미가 붙었다  크롤링이 점점 쉬워진다

<!DOCTYPE html>
<html>

<head>
	<title>
    Reddit Reader
  </title>
  <link href="https://andybrewer.github.io/mvp/mvp.css" rel="stylesheet"></link>
</head>

<body>
  <header>
    <h1>Reddit Reader</h1>
    <h3>A service to aggregate all your favourite subreddits</h3>
  </header>
  <main>
    <form action="/read">
      <h4>Select the subreddits you're interested on:</h4>
      <ul>
        {% for i in data %}        
          <li>
            <input type="checkbox" name="{{i}}" id="{{i}}" />
            <label for="{{i}}">
            r/{{i}}
            </label>
          </li>
        {% endfor %}        
      </ul>
      <button type="submit">Aggregate</button>
    </form>
  </main>
</body>

</html>

받는 url  이다 input을 받아 irl 속성값을 전달한다~!

 

<!DOCTYPE html>
<html>

<head>
	<title>
    Reddit Reader
  </title>
  <link href="https://andybrewer.github.io/mvp/mvp.css" rel="stylesheet"></link>
</head>

<body>
  <header>
    <h1><a href="/">Reddit Reader</a></h1>
    <h3>Reading: {% for i in headhunter %} r/{{i}}{% endfor %}</h3>
  </header>
  <main>
    {% for i in data %}
      <div>
        <h3>
          <a href="https://reddit.com{{i[2]}}">
          {{i[1]}}
          </a>
        </h3>
        <h4>
          {{i[0]}} upvotes ·  r/{{i[3]}}
        </h4>
        <hr />
      </div>
    {% endfor %}
  </main>
</body>

</html>

 

찾은 결과값 여러가지를 한번에 할 수 도 있다

순서는 저기 숫자순~

블로그 이미지

Or71nH

,