<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>datagoori_03.log</title>
        <link>https://velog.io/</link>
        <description>컴공생의 전공 기록장</description>
        <lastBuildDate>Sun, 13 Jul 2025 13:03:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>datagoori_03.log</title>
            <url>https://velog.velcdn.com/images/datagoori_03/profile/28d091b5-49e4-417f-bca9-ebd84cf0436f/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. datagoori_03.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/datagoori_03" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[혼공S]2주차_SQL기본문법]]></title>
            <link>https://velog.io/@datagoori_03/%ED%98%BC%EA%B3%B5S2%EC%A3%BC%EC%B0%A8SQL%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@datagoori_03/%ED%98%BC%EA%B3%B5S2%EC%A3%BC%EC%B0%A8SQL%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Sun, 13 Jul 2025 13:03:31 GMT</pubDate>
            <description><![CDATA[<p>지난주에는 데이터베이스 및 테이블 만들기로 전체 구성에 대해 맛보기로 경험해보았다면 이제 SQL 문법들을 하나씩 알아보고자 한다.</p>
<p><strong>SELECT ~ FROM ~WHERE</strong>
먼저, SELECT문은 테이블에서 데이터를 추출하는 기능을 하며, 아무리 많이 사용해도 기존 데이터가 변경되지는 않는다.</p>
<p>SELECT를 실습하기 위해서는 데이터베이스가 있어야한다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/a798465a-277d-4811-b9ff-717f601073a6/image.png" alt="">
다음 &#39;인터넷 마켓 DB 구성도&#39;는 인터넷 마켓에서 운영하는 데이터베이스를 단순화한 것이다.</p>
<p>혼공자료실에서 market_db.sql파일을 다운로드 하여 미리 작성된 
SQL문을 활용하여 하나씩 알아보자.
<img src="https://velog.velcdn.com/images/datagoori_03/post/5bf4ad23-4df7-420a-a436-af3f098462aa/image.png" alt=""></p>
<p>&lt;기본 조회하기&gt;
&#39;인터넷 마켓 DB 구성도&#39;를 활용하여 SELECT문을 배워보자.</p>
<p>*<em>USE문
*</em> USE문은 사용할 데이터베이스를 지정할때 사용한다.
USE 데이테베이스이름;
여기서 우리는 market_db를 활용할 것이기에
USE market_db;
라고 쓰면 된다.</p>
<p>보통 <strong>SELECT문의 기본 형식</strong>은 아래와 같다.
SELECT 열 이름
FROM 테이블 이름
WHERE 조건식
GROUP BY 열 이름
HAVING 조건식
ORDER BY 열 이름
LIMIT 숫자</p>
<p>그렇다면 
USE market_db;
SELECT * FROM member;
라는 쿼리를 쓴다면 market_db안에 있는 member라는 테이블 전체 데이터들이 출력 될것이다.</p>
<p>여기서 특정 조건만 조회하고 싶다 하면 WHERE 문이 사용된다.
WHERE이 없으면 테이블의 모든 행들이 출력되지만, WHERE문을 사용하면 내가 지정한 조건에 맞게 데이터를 출력할 수 있다.</p>
<p>SELECT * FROM member
WHERE mem_name= &#39;블랙핑크&#39;;
라는 쿼리를 작성하면, member테이블에서 mem_name이라는 열 데이터 값이 블랙핑크인 데이터들만 출력하게 된다.</p>
<p>추가적으로 관계연산자와 논리 연산자를 활용하여
SELECT mem_id, height, mem_number
FROM member
WHERE height &gt;=165 and mem_number&gt;6;
이런식으로 쿼리를 작성할 수 있는데
그렇게 되면 키가 165 이상이고 멤버수가 6초과인 데이터들의 mem_id, height,mem_number 열들의 데이터를 출력하여 확인할 수 있다.</p>
<p><strong>BETWEEN~AND</strong>
BETWEEN A AND B로 보통 사용이 되는데,
이때 의미는 A보다 크거나 같고,B보다 작거나 같은 수치들을 의미하며, WHERE뒤에서 부등호 대신 유용하게 사용할 수 있다.</p>
<p><strong>IN()</strong>
IN은 OR로 연결한 데이터를 더 간결하게 표기할수 있다.
예를들어
SELECT mem_name, addr
FROM member
WHERE addr IN(&#39;경기&#39;, &#39;전남&#39;, &#39;경남&#39;);
이라는 쿼리가 있다고 가정하자.
그러면 여기서 경기 또는 전남 또는 경남 이라는 addr 데이터값을 가진 정보들을 출력할수 있다.</p>
<p>따라서 단순하게 보면 IN에 묶여있는 값중에 하나라도 속하면 출력되는 구조이다.</p>
<p><strong>LIKE</strong>
문자열의 일부 글자를 검색하는데 사용한다.
SELECT * 
FROM member
WHERE mem_name LIKE &#39;우%&#39;
%의 의미는 무엇이든 허용한다이며
우로 시작하고 뒤에 어떤것이 올수 있는 단어가 mem_name에 들어있는 정보를 출력하는 것이다.</p>
<p>또한 다른 방법으로는 LIKE &#39;__ 핑크&#39;;
로 언더바를 활용하여 앞의 두글자가 오며 뒤에 핑크가 붙은 데이터를 출력할때도 활용한다.</p>
<p><strong>ORDER BY절</strong>
ORDER BY절은 결과의 값이나 개수에 영향을 미치지는 않지만,
결과가 출력되는 순서를 조절하는 역할을 한다.</p>
<p>SELECT mem_id, mem_name, debut_date
FROM member
ORDER BY debut_date;
라는 쿼리가 있다면
member라는 테이블에서 위 3개의 열의 데이터를 출력하고,
ORDER BY문을 통해 debut_date를 기준으로 오름차순으로 정렬하여 출력한다.
따라서 데뷔날짜가 빠른순으로 출력이 될것이다.</p>
<p>데뷔를 늦게한 순서대로 출력하고 싶으면 내림차순으로 출력해야 되며,
ORDER BY debut_date DESC; 
라고 표기하면 된다.
위에 오름차순을 표기하지 않은 이유는 ASC는 기본값이며 아무것도 쓰지 않으면 오름차순으로 출력된다.</p>
<p><strong>LIMIT</strong>
출력 개수를 제한하는 역할을 한다.
SELECT mem_id,  debut_date
FROM member
ORDER BY debut_date
LIMIT 3;
이면 데뷔를 일찍한 3개의 팀의 데이터가 출력이 된다.</p>
<p><strong>DISTINCT</strong>
중복된 결과를 제외하는 역할을 한다.
기본적으로
SELECT addr FROM member;
하면 member테이블에 있는 addr의 모든 정보, 즉 모든 주소를 출력할 것이다.
이때 겹치는 주소를 한번만 출력하고 싶을때
SELECT 뒤에 DISTINCT를 붙이면, 한번씩만 출력해준다.</p>
<p><strong>GROUP BY절</strong>
GROUP BY절은 말 그대로 그룹으로 묶어주는 역할을 한다.
집계함수를 활용하기도 하며, 집계함수는 아래와 같다
<img src="https://velog.velcdn.com/images/datagoori_03/post/7f539221-12e4-4188-bd25-fffebc2903ea/image.png" alt="">
SELECT mem_id, COUNT(*) as member_counts
FROM buy
GROUP BY mem_id;
다음 쿼리를 보면 mem_id를 기준으로 grouping을 한다.
id가 5인거끼리묶고, 2인거끼리 묶고 이런식으로..</p>
<p>그 다음 SELECT에서 집계함수를 활용하면 MEM_ID와 MEM_ID별로 멤버들이 몇명있는지를 알아낼수 있다.
이래서 집계함수를 활용하는 것이다.</p>
<p><strong>HAVING절</strong>
Having절도 WHERE절과 기능적으로는 같은 조건절이지만,
HAVING은 Group by문 뒤에 붙어 grouping한것들에 조건을 건다는 점에서 차이가 있다.
따라서 GROUP BY절에서 했던 대로 집계함수를 활용하여 조건을 정할 수 있다.
<strong>WHERE절에서는 집계함수를 사용할 수 없다</strong></p>
<p>그렇다면 이번엔 좀더 긴 쿼리를 작성해보자.
SELECT mem_id AS 회원 아이디, SUM(price * amount) AS 총 구매 금액
FROM buy
GROUP BY mem_id
HAVING SUM(price * amount)&gt;1000
ORDER BY SUM(price*amount) DESC;</p>
<p>쿼리를 작성하는 것도 중요하지만 작성된 쿼리를 읽고 어떤 데이터를 표현하고자 하는 쿼리인지
해석하는 능력도 중요하다.
위 쿼리를 보면 buy테이블에서
mem_id별로 grouping을 하고 그룹힝한 데이터들 중에 price와 amount를 곱하고 더한 값이 1000초과인 mem_id를 기준으로 하여, 그 mem_id와 sum값을 출력할것이고
sum값은 내림차순이니까 큰값부터 쓰겠다라는 의미이다.</p>
<p>이때 나는 가장 큰 값만 출력하고 싶다 하면 LIMIT 1;을 추가로 작성하여 최댓값까지 산출할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/datagoori_03/post/8a390773-2ed8-4f40-afdd-24fdcd9f0ce2/image.png" alt=""></p>
<p>문제 해설) SELECT-FROM-WHERE-(GROUP BY-HAVING)-ORDER BY-LIMIT 이 순서도를 
기억하고 문제를 풀면된다.
참고로 LIMIT뒤에 숫자 두개가 나오면, LIMIT 시작, 개수라는 의미를 가진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[혼공S] 1주차_데이터베이스와 SQL]]></title>
            <link>https://velog.io/@datagoori_03/%ED%98%BC%EA%B3%B5S-1%EC%A3%BC%EC%B0%A8%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-SQL</link>
            <guid>https://velog.io/@datagoori_03/%ED%98%BC%EA%B3%B5S-1%EC%A3%BC%EC%B0%A8%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-SQL</guid>
            <pubDate>Sun, 06 Jul 2025 08:25:09 GMT</pubDate>
            <description><![CDATA[<p>폭포수 모델: 소프트웨어 개발 단계중 하나로, 폭포가 떨어지듯 개발단계가 진행된다.
인터넷 쇼핑몰을 구축하려한다. 
이때 단계는 아래와 같다.
1.프로젝트 계획: 물건들을 온라인으로 판매하기 위한 계획
2.업무분석: 업무가 어떻게 돌아가는지 파악
3.시스템설계: 업무분석을 컴퓨터에 적응시키기 위해 다듬는 과정
4.프로그램구현:설계의 결과를 프로그래밍 언어로 코딩하는 단계
5.테스트: 오류 확인 과정
6.유지보수: 실제로 운영하면서 문제점 보완 및 기능 추가</p>
<p>위 단계의 단점은 폭포에서 내려가기는 쉬워도 거슬러 올라가기는 힘든 것처럼 문제가 발생할 경우 앞 단계로 돌아가기가 어렵다는 점이다.
하지만, 각 단계자체는 명확하기 때문에 지금도 많이 사용되고 있다.</p>
<p>우리가 진행할 데이터베이스 모델링은 폭포수 모델에서 업무분석과 시스템설계단계에 해당한다.</p>
<p>&lt;데이터베이스 모델링&gt;
데이터베이스 모델링: 사물이나 작업을 DBMS의 데이터베이스 개체로 옮기기위한 과정</p>
<p>&lt;전체 데이터베이스 구성도&gt;
<img src="https://velog.velcdn.com/images/datagoori_03/post/d21a1290-0cc2-4a14-bd61-0782d8bbcc5e/image.png" alt=""></p>
<p>그렇다면 이번엔 위와 같은 구조로 쇼핑몰 데이터 베이스를 만들어보자.
&lt;데이터베이스 구축 절차&gt;
데이터베이스 만들기--&gt; 테이블만들기--&gt;데이터입력/수정/삭제--&gt;데이터 조회/활용</p>
<ol>
<li>DBMS설치하기
기존에 설치한 MYSQL을 활용할 예정이다</li>
</ol>
<p>2.데이터베이스 만들기
<img src="https://velog.velcdn.com/images/datagoori_03/post/cb88d6a5-7740-43c2-966a-a57f97a43f1c/image.png" alt="">
스키마(=데이터베이스)를 보면 기본적으로 들어있는 3개의 데이터베이스가 보인다.
여기서 create schema를 해서, &#39;shop_db&#39;라는 데이테베이스를 만든다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/2d97751c-c5ac-4a0b-8db9-ded3e42f13e9/image.png" alt="">
&lt;테이블 만들기&gt;
전체 데이터베이스 구성도를 보면 2개의 테이블이 보일것이다.
이 두개의 테이블을 만들어보자.</p>
<p>테이블을 생성하기 위해서도 설계가 필요하다.
열이름, 영문이름, 데이터형식, 문자의 최대길이, 널허용할건지안할건지를 
설계한 후에 테이블을 생성하면 된다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/4ba8f82f-3a10-47d9-a5e3-f856543a3bb1/image.png" alt="">
테이블이름은 member이고,
열은 id, name, address 가 있으며 데이터형식과 pk(기본키여부),NN(널허용)을 결정하여 테이블을 만든다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/77fde049-b8b0-42b2-b161-feccca167424/image.png" alt="">
실제로는 위와 같은 SQL코드로 테이블을 제작하게 된다.
product테이블도 위와 같은 방법으로 만든다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/ec05dfe4-4b14-4db7-9e3a-7d8d4e5e310a/image.png" alt="">
<img src="https://velog.velcdn.com/images/datagoori_03/post/dcd3c34e-40fa-4d4a-8979-eb1cf5d14a16/image.png" alt="">
&lt;데이터 입력하기&gt;
그다음엔 실제로 데이터를 입력한다.
회원테이블엔 4건, 제품테이블엔 3건의 데이터를 입력하였다.
스키마 패널에서 [shop_db]-[Tables]-[member]를 선택하고
마우스 오른쪽 버튼 클릭후 [selectRows-Limits 1000]을 선택한다.
그리고 데이터를 입력한다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/754e2af4-b116-4386-bfc7-f6c4c5fbf6c2/image.png" alt="">
<img src="https://velog.velcdn.com/images/datagoori_03/post/ae3a7453-4c5f-4d63-8ebf-b3d67fd43004/image.png" alt="">
저장을 하게 되면, 기본키로 설정한 열을 기준으로 하여 오름차순으로 자동정렬된다.
product 테이블도 위와같은 방법으로 데이터를 입력한다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/c8411f8f-c57a-4627-b217-0e423029d022/image.png" alt="">
+여기서 데이터를 삭제하거나, 추가하게 되면 SQL문으로 추가시에는 UPDATE문이 뜨고 삭제시에는 DELETE문이 뜬다.</p>
<p>&lt;데이터 활용하기&gt;
작업할 데이터베이스를 선택하기 위해 스키마 패널의 &#39;shop_db&#39;를 더블 클릭한다.
--&gt;앞으로 입력할 SQL이 선택된 &#39;shop_db&#39;에 적용된다는 의미이다.</p>
<p><img src="https://velog.velcdn.com/images/datagoori_03/post/45d3925f-11aa-48b7-abf2-4349a8a33c97/image.png" alt="">
member테이블에서 이름과 주소 모두 출력하기</p>
<p>그 다음은 이번 과제인, 아이유회원에 대한 정보만 추출해 보자.
아이유 회원에 대한 모든 정보를 추출해야 됨으로 SELECT *를 활용한다.
결과 화면은 아래와 같다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/6fa13703-42a4-4b4b-a25d-5baaaa33d134/image.png" alt="">
여기서 추가적으로 필요한 부분만 마우스로 드래그하여 실행하면 하나의 결과 탭만 생성되게 된다.
<img src="https://velog.velcdn.com/images/datagoori_03/post/3688e7f0-f811-4a7e-924d-d69016c61943/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>