14주차 화 1121(데이터 분석, 연산자, 문제풀이) :: newb

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14주차 화 1121(데이터 분석, 연산자, 문제풀이)
    광주인력개발원 일일포스팅(메모장) 2023. 11. 21. 17:10
    728x90
    반응형

    별칭사용하기
    별칭을 사용하는 이유 : 긴 단어를 줄여서 사용하는데 좋음
    /*
    SQL에서 별칭을 사용할 수 있는 곳
     - 컬럼명 대신 별칭 사용 : 예시) mem_id as id
     - 테이블명 대신 별칭 사용 : 예시) From member mem
    */

    -- 회원 테이블 전체 조회하기
    -- 컬럼명 : [mem_id, mem_pass, ...]
    -- [{'a001','ab',...},{'b001','bc',...},{'...'},,,]
    SELECT *
    FROM member;

    -- 회원의 마일리지 값이 10 이상인 데이터만 조회하기
    -- 조회컬럼은 회원아이디, 회원이름, 마일리지
    -- 별칭, id, mame, point
    -- 사용할 테이블명 : member
    -- 사용할 컬럼명 : mem_mileage, mem_id, mem_name
    -- 조건이 무엇인지 : mem_mileage >= 10

    1.

    SELECT 
    mem_mileage AS POINT,
          mem_id AS id,
          mem_name AS name
    FROM member
    WHERE mem_mileage >= 10;


    2.
    SELECT 
    mem_mileage POINT,
          mem_id id,
          mem_name name
    FROM member
    WHERE mem_mileage >= 10;


    3.
    SELECT 
    mem_mileage 'POINT',
          mem_id 'id',
          mem_name 'name'
    FROM member
    WHERE mem_mileage >= 10;

     

    4.
    SELECT 
    mem_mileage 'mem POINT',
          mem_id 'id',
          mem_name 'name'
    FROM member
    WHERE mem_mileage >= 10;

    <<<< 컬럼에 띄어쓰기가 가능하지만 추천하지 않는다. >>>>

     

    다 같이 별칭으로 사용 가능한 문법이지만 첫번째

    SELECT 
    mem_mileage AS POINT,
          mem_id AS id,
          mem_name AS name
    FROM member
    WHERE mem_mileage >= 10;

    이 방법을 추천한다.

     

    SELECT 
    mem_mileage,
          mem_id,
          mem_name
    FROM member
    WHERE mem_mileage >= 10
    -- AND mem_name = '김은대'
    ORDER BY mem_mileage DESC, 
    mem_id ASC;
    /*
    <처리 순서>
    1. select
    2. from
    3. 테이블 메모리 올리기
    4. where 조건
    5. and 조건 또는 or 조건
    6. 조회할 컬럼
    7. 정렬
    */

     

     

    컴파일 순서에 따라 별칭사용하는 부분을 고려해야한다.

    SELECT 
          mem_mileage AS POINT,
          mem_id AS id,
          mem_name AS name
    FROM member
    WHERE mem_mileage >= 10       <<< 컬럼별칭은 모르는 시기
    ORDER BY point DESC;
                        ㄴ 숫자(1,2,3)을 적어 정렬을 할 수 있다.

                               + 1 = point / 2 = id / 3 = name 

     

    [문제]
    /*
    회원 중에 76년 1 월 1일 이후에 태어난 회원을 조회해주세요
     - 단, 주민등록번호 앞자리 6자리를 이용
     - 조회컬럼 : 회원아이디, 이름, 주민번호 앞 6자리
     - 사용할 테이블명 : member
     - 사용할 컬럼명 : mem_id, mem_name, mem_regno1
     - 조건이 무엇인지 : mem_regno1 > 760101
    */
    SELECT
    mem_id,
    mem_name,
    mem_regno1
    FROM member
    WHERE mem_regno1 > '760101';

    -- 비교연산자 : >, <, >=, <=, =, <>, ! 
    -- 논리연산자 : And, Or
    -- 산술연산자 : +, -, *, /

    [문제]
    -- 상품분류코드가 P201이고,
    -- 상품판매가격이17만원인
    -- 상품코드, 상품명, 상품분류코드, 상품판매가격 조회
    -- 정렬은 상품명을 기준으로 오름차순
    -- 사용할 테이블 : prod
    -- 사용할 컬럼 : prod_id, prod_name, prod_lgu, prod_sael
    -- 일반조건 : prod_sale = 17만, prod_lgu = 'P210'
    -- 정렬조건 : prod_name = asc
    SELECT
    prod_id,
    prod_name,
    prod_lgu,
    prod_sale
    FROM prod
    WHERE prod_sale = 170000
    AND prod_lgu = 'P201'
    ORDER BY prod_name ASC;

    [문제]
    -- 상품 판매가격이 15만원 또는 17만원 또는 33만원인 상품을 조회
    -- 조회컬럼은 상품명, 판매가격, 
    SELECT 
    prod_name,
    prod_sale
    FROM prod
    WHERE prod_sale = 150000 
    OR prod_sale = 170000
    OR prod_sale = 330000;

    SELECT 
    prod_name,
    prod_sale
    FROM prod
    WHERE prod_sale IN (150000, 170000, 330000);

    위와 같은 문제를 in을 사용하여 코드를 줄일 수 있다.

     

    [문제]
    -- 상품명에 삼성이라는 단어가 있는 데이터 조회
    -- 조회컬럼, 상품명, 상품코드
    -- like : 문자내 특정 단어 포함여부 검색
    SELECT
    prod_name,
    prod_id
    FROM prod
    -- 상품명 중에 첫글자가 "삼"으로  시작하는 모든 것 찾기
    -- WHERE prod_name LIKE '삼%';
    -- 상품명 중에 ""으로 시작하는 모든 것 찾기 
    -- WHERE prod_name LIKE '_성%';
    -- 언더바는 글자 하나를 의미
    -- 상품명 중에 마지막 단어가 '치'로 끝나는 모든 것 찾기
    -- WHERE prod_name LIKE '%치';
    -- 상품명 중에 '여름'이라는 단어가 포함된 모든 것 찾기
    -- 여름이 앞, 가운데, 뒤 어디에 있든 나오게된다.
    -- 가장많이 쓴다.
    WHERE prod_name LIKE '%여름%';

     

    [문제]
    -- 회원의 거주 지역이 서울이고,
    -- 마일리지가 1000 이상인 회원의
    -- 아이디, 이름, 주소(앞), 마일리지 조회하기
    SELECT
    mem_id,
    mem_name,
    mem_add1,
    mem_mileage
    FROM member
    WHERE mem_mileage > 1000
    AND mem_add1 LIKE '%서울%';

     

    -[문제]
    -- 회원 중에 생일이 1975년도에 태어난 회원조회
    -- 조회컬럼은 회원이름, 회원생일
    SELECT
    mem_name,
    mem_bir
    FROM member
    WHERE mem_bir LIKE '1975%';


    -- between A and B : A이상 B이하의 범위 조건

    -- 날자 타입 또는 숫자 타입에 대한 범위 ㅇ녀산 조건에 사용됨
    SELECT
    mem_name,
    mem_bir
    FROM member
    -- WHERE mem_bir BETWEEN '1975-01-01' AND '1975-12-31';
    -- WHERE mem_bir BETWEEN '19750101' AND '19751231';
    -- WHERE mem_bir BETWEEN '1975.01.01' AND '1975.12.31';
    WHERE mem_bir BETWEEN '1975/01/01' AND '1975/12/31';

    -- 날자 형식(포멧형식)
    -- 0000-00-00, 0000.00.00, 0000/00/00, 00000000

       ㄴ 제일 많이 쓰임

     

    [문제]
    -- 회원 마일리지의 값이 10이상이고, 100000이하이며,
    -- 회원의 성씨가 김씨인 회원들에 대한
    -- 회원이름, 마일리지 조회하기
    SELECT 
    mem_name,
    mem_mileage
    FROM member
    WHERE mem_name LIKE '김%'
    And mem_mileage BETWEEN 10 AND 100000;


    -- 회원의 출생년도(생일기준)가 1975년생이 아닌 회원에 대한
    -- 회원이름, 회원생일 조회
    -- Not In, Not Like, Not Between
    -- 부정 포함되어 있지 않다면...
    SELECT
    mem_name,
    mem_bir
    FROM member
    -- WHERE mem_bir Not BETWEEN '1975-01-01' AND '1975-12-31';
    -- 결과 1975를 제외한 모든 것들
    WHERE mem_bir NOT LIKE '1975%';

    -- 회원이름, 회원주민번호(앞-뒤), 주소(앞-뒤)
    -- 컬럼 데이터 합치기(병합) : concat(값1, 값2, 값3,...) 함수 사용
    SELECT
    mem_name,
    CONCAT(mem_regno1, '-', mem_regno2) AS mem_regno,
    CONCAT(mem_add1, ' ', mem_add2) AS mem_add
    FROM member;

     

    함수
    -- 대소문자 변환
    SELECT 
    LOWER(mem_id) AS '소문자', UPPER(mem_id) AS '대문자'
    FROM member;

    -- 공백 제거하기
    SELECT
    '       왼쪽공백',
    LTRIM('   왼쪽공백제거'),
    '오른쪽공백    ',
    RTRIM('오른쪽공백제거      '),
    '    좌우공백   ',
    TRIM('   좌우공백    ');

    -- 특정 자릿수까지의 문자 추출하기
    -- mysql or mariaDB 용 
    SELECT
    LEFT(prod_id, 4),
    RIGHT(prod_id, 6)
    FROM prod;


    -- [문제]
    -- P101 상품분류에 대해 새로운 상품을 등록하려고 합니다.
    -- P101000006이현재 마지막 번호입니다.
    -- 마지막 번호에 1 증가시키고자 합니다.
    -- P101000007
    SELECT
    CONCAT(
    LEFT('P101000006',4),
    RIGHT('P101000007',6)
    ) AS new;

    SELECT
    concat(LEFT('P101000006', 9),
    RIGHT('P101000006',1)+1);

    -- 문자열 내 특정 위치값 추출하기
    SELECT SUBSTRING('Java Program',7, 3),
    SUBSTRING('Java Program',1, 3)

    -- 표준 : In, Like, Between
    -- 회사에서 만든 것 : concat, substring

     

    [문제]
    -- 상품명의 4번째 자리부터 2개의 문자가 '칼라'인 것에대한
    -- 상품코드, 상품명 조회
    SELECT
    prod_id,
    prod_name
    FROM prod
    WHERE substring(prod_name,4,2) = '칼라' ;

    -- [문제]
    -- 회원의 성씨가 김씨이고,
    -- 지역이 서울 또는 대전에 거주하고,
    -- 기념일에 걸혼이 포함되어 있는 회원 정보조회하기
    -- 조회컬럼 : 회원이름, 지역(지역만), 기념일명
    SELECT

    FROM member
    WHERE substring(mem_name, 1, 1) = '김'
    AND substring(mem_add1, 1, 2) IN('서울', '대전')
    AND mem_memorial LIKE '%결혼%';

    [문제]
    -- 아이디가 a001인 회원의 마지일리지 이상인 회원조회
    -- 조회컬럼은 회원아이디, 회원마일리지
    SELECT 
    mem_mileage
    FROM member

    WHERE mem_id = 'a001';

    -- subQuery(서브쿼리)
    SELECT mem_id, mem_mileage
    FROM member
    WHERE mem_mileage >= (
    SELECT 
    mem_mileage
    FROM member
    WHERE mem_id = 'a001');

    [문제]
    -- 한번도 주문한적이 없는 회원을 조회해보자
    -- 조회 컬럼 : 회원아이디, 회원이름
    SELECT
    mem_name,
    mem_id
    FROM member
    -- In 함수를 이용해서 서브쿼리를 사용할 경우 규칙
    -- 하나의 컬럼에 여러개의 값을 조회 할 수 있음
    -- 단일 컬럼에 다중 행이라고 칭합니다.
    WHERE mem_id NOT In (SELECT 
    cart_member
    FROM cart
    );

    SELECT
    mem_name,
    mem_id
    FROM member
    WHERE mem_id Not IN(SELECT
    cart_member
    FROM cart);


    [문제]
    -- 상품정보에 존재하지 않는 상품분류를 조회
    -- 상품분류코드, 상품분류명 조회
    SELECT
    lprod_gu,
    lprod_nm
    FROM lprod
    WHERE lprod_gu NOT IN(SELECT
    prod_lgu
    FROM prod);


    [문제]
    -- 주문번호, 주문자아이디, 주문자이름, 주문상품코드, 주문수량을 조회
    -- 조회
    -- select 뒤에 조회할 컬럼명 대신해서 서브쿼리 작성 규칙
    -- 하나의 컬럼에 하나의 값만 조회 가능
    -- 단일 컬럼에 단일 행
    SELECT
    *,
    (SELECT
    mem_name
    FROM member
    WHERE mem_id = cart_member
    )AS mem_name
    FROM cart;

    [문제]
    -- 상품명, 상품판매가격, 상품분류코드, 상품분류명 조회
    SELECT
    prod_name,
    prod_sale,
    prod_lgu,
    (
    select
    lprod_nm
    FROM lprod
    WHERE lprod_gu = prod_lgu
    ) AS Lprod_nm
    FROM prod;

    [문제]
    -- 주문번호, 주문상품코드, 주문수량 ,주문상품명, 상품분류명 조회
    -- 단, 회원의 거주지역이 서울 또는 대전인 경우
    SELECT 
                   cart_no, cart_prod, cart_qty,
                   (select
                   prod_name
                   FROM prod
                   WHERE prod_id = cart_prod)
                    AS prod_name,
                    (select
                              lprod_nm
                    FROM lprod
                    WHERE lprod_gu = SUBSTRING(cart_prod, 1, 4))
                    AS lprod_nm
    FROM cart
    where cart_member IN (
                                           SELECT mem_id
                                           FROM member
                                           WHERE mem_add1 LIKE '서울%' OR mem_add1 LIKE '대전%')
                                           -- where substirng(mem_add1, 1,2) In ('서울','대전')

    ORDER BY cart_no ASC, cart_qty DESC;

     

    [메인 문제]

    -- 상품코드, 상품명, 상품판매가격, 거래처명 조회하기
    -- 단, 회원의 마일리지 값이 100 이상이고, 
    --     주문수량이 5 이상이고,
    --     상품분류명에 "컴퓨터"가 포함되어 있는 경우
    --     거래처 주소지 지역이 서울or대전or광주인 경우

     

     <<<< 내 코드 >>>>

    SELECT
                   prod_id, prod_name, prod_sale,
                   (select
                               buyer_name
                   FROM buyer
                   WHERE buyer_id = Prod_buyer) AS buyer_name
    FROM prod
    WHERE prod_id IN (
    SELECT 
                   cart_prod
    FROM cart
    WHERE cart_qty >= 5
         AND substring(cart_prod,1,4) IN (
                                                                  SELECT lprod_gu
                                                                   FROM lprod
                                                                   where lprod_nm LIKE '%컴퓨터%')
         AND cart_member IN (
                                               SELECT mem_id
                                                FROM member
                                                WHERE SUBSTRING(mem_add1, 1, 2) IN ('서울', '대전', '광주')
                                                      AND mem_mileage > 100)
    );  

     

     <<<< 강사님 코드 >>>>

    SELECT prod_id, prod_name, prod_sale,
                  (SELECT buyer_name FROM buyer
                   WHERE buyer_id = prod_buyer) AS buyer_name
    FROM prod
    WHERE prod_id IN(SELECT cart_prod FROM cart
                                      WHERE cart_member IN(
                                                    -- 회원의 마일리지 값이 100이상
                                                    SELECT mem_id FROM member
                                                     WHERE mem_mileage >= 100)
                                        -- 주문수량이 5 이상
                                        AND cart_qty >= 5)
    -- 상품분류명에 "컴퓨터"가 포함
    AND prod_lgu IN (SELECT lprod_gu FROM lprod
                                    WHERE lprod_nm LIKE '%컴퓨터%')
    -- 거래처 주소지 지역이 서울 or 대전 or 광주
    AND prod_buyer IN (
            SELECT buyer_id FROM buyer
            WHERE SUBSTRING(buyer_add1, 1, 2) IN ('서울','대전','광주'));

     

     

     

     

    복사 붙여넣기 했는데 간격 맞춘게 다 풀려서 복구하려다 포기함

    \(´◓Д◔`)/

    728x90
    반응형
Designed by Tistory.