루티
10
2018-11-10 01:05:45 작성 2018-11-10 01:06:27 수정됨
13
392

SQL 생초보가 SQL문 만드는것좀 도와주시면 감사하겠습니다.



SQL 질의문 만드는것좀 도와주세요 ㅠㅠ


투수: Pitchers (pid: string, name: string, salary: integer)

해당 key = pid


구단: Teams(tid: string, location: string, manager: string)

해당 key = tid



경기기록: Records (rid: string, home_team_id: string, visiting_team_id: string, starting_pitcher_home: string, starting_pitcher_away: string)

해당 KEY = rid


starting_picther_away는 원정 선발 등판한 투수의 ID임. Pitchers의 PID와 동일한 도메인임.
starting_picther_home은 홈 경기 선발 등판한 투수의 ID임


1. 위와 같은 테이블이 주어졌을 시, 모든 구단을 상대로 원정 선발 등판한 기록이 있는 투수들 중 가장 낮은 연봉 (salary)을 가진 투수를 반환하는 SQL 질의문을 구하시오.


2. 단 한 구단에도 선발 등판하지 않은 투수들 중 가장 높은 연봉을 가진 투수를 반환하는 SQL 질의문을 쓰시오


1번 문제의 경우 대수관계로 경기기록(home_tead_id,pitcher_away) /(디비젼) (tid) 해서 나온 투수들중 min salary 를 구하면 될것 같은데 sql문으로 나타낼 방법을 모르겠습니다.

2번 문제의 경우 starting_pitcher_home, starting_pitcher_away 에 없는 투수들을 골라 그중 최대 max를 구하면 될것 같은데 이 또한 sql문으로 나타낼 방법을 모르겠네요 ㅠㅠ


가능하시다면 도움좀 부탁드리겠습니다..

실습 시간에 배운거라고는 오라클 다운받는것 까지 배운게 없고 이론적으로 SQL은 직접적으로 알려주지 않으셨습니다 ㅠㅠ

 

도움 주시면 감사하겠습니다.


0
0
  • 답변 13

  • 나나낭
    92
    2018-11-10 02:13:46 작성 2018-11-10 02:15:47 수정됨

    님아 죄송한데 지능이라는게 있으시면

    "모든 구단을 상대로 원정 선발 등판한 기록이 있는 투수들 중 가장 낮은 연봉 (salary)을 가진 투수를 반환하는 SQL 질의문"

    투수: Pitchers (pid: string, name: string, salary: integer) 


    이 테이블 컬럼으로 불가능하신거 모르세요??????ㅠㅠㅠㅠㅠㅠ

    어떤구단을 어떤 선발 등판한 기록이 어떤 컬럼에 있을까요?


    숙제를 남한테 시키려면 최소한 "그대로 정확히 베끼는 성의"라도 보여주셔요^^


    그 와중에 쓸데없이 pid 굵은표시하고 sql 이론을 안알려줘서 못하겠다고 구구절절

    진짜쓸데없이 설명하는 성의좀 보소.... 눈물난다

    -5
  • 두루루룹
    76
    2018-11-10 04:06:02

    sql에 대한 지식이 없으시다고 봐도 되겠네요. 그러니까 당연하게 기본적인 것들이 궁금한것이고 뭔가 처음접하는거일수록 광범위하게 느껴지다보니까 검색도 몇번 하다가 안되면 포기하게 되고..저도 처음것을 시작할때는 그런거같아요 ㅠㅠ

    까칠하신분들 많이 상주하고 계신거같은데 힘내세요 친절하신분들도 많습니다..ㅠㅠ

    0
  • 라임두
    165
    2018-11-10 09:02:04

    저기 테이블  컬럼이라도 통째로 다 보여주세요.

    SQL짜는 거는 순서도 같이 혹은 수학문제 푸는 과정처럼 나열하는 것과 같아요. 단순한 쿼리 맞는데 컬럼을 다 주셔야 짤 수 있고요. 그게 아니어도 설명은 가능하나...그리 설명하면 못알아 보실듯 해요.

    0
  • 라임두
    165
    2018-11-10 09:14:04

    휴대폰으로 쓰는거라..대략

    1.

    Select Min(연봉) from 전체구단

    Where 등판기록여부


    2.

    Select Max(연봉) from 전체구단

    Where 등판여부


    컬럼을 다보여주셔야 할듯요. 대략적인건 위와같은 흐름으로 생각하셔서 작성하세요.


    0
  • isNotEmpty
    2k
    2018-11-10 11:21:04 작성 2018-11-10 11:21:20 수정됨

    1. 모든 구단을 상대로 원정 선발 등판한 기록이 있는 투수들 중 가장 낮은 연봉 (salary)을 가진 투수를 반환하는 SQL 질의문을 구하시오.

    - select절에서 뽑아야할 데이터의 테이블과 컬럼을 먼저 정합니다.
    테이블(투수) : Pitchers, 컬럼(이름) : name

    - where절에서 조건으로 쓸 테이블과 컬럼을 정합니다.
    '모든 구단을 상대로 원정 선발 등판한 기록이 있는 투수들 중'
    테이블(경기기록) : Records, 컬럼(원정 선발 등판한 투수의 ID) : starting_pitcher_away


    - ORDER BY 순서 정렬이 필요한지 확인합니다.
    가장 낮은 연봉(salary)이 필요합니다.




    SELECT
    	*
    FROM (
    	SELECT
    		NAME /* 투수명 */
    	FROM PITCHERS
    	WHERE 1=1
    	  AND PID IN (/* 원정경기의 투수ID가 있는 목록을 WHERE 조건절로 씁니다. */
    					SELECT 
    						STARTING_PITCHER_AWAY
    					FROM RECORD
    				  )
    	ORDER BY SALARY ASC /* 연봉이 가장 낮은 투수를 맨위로 뽑기 위해 정렬을 합니다. */
    )
    WHERE ROWNUM <= 1 /* 맨 위의 값 1개의 로우만 출력합니다. */


    0
  • isNotEmpty
    2k
    2018-11-10 11:32:50 작성 2018-11-10 11:33:14 수정됨

    1. 단 한 구단에도 선발 등판하지 않은 투수들 중 가장 높은 연봉을 가진 투수를 반환하는 SQL 질의문을 쓰시오

    - select절에서 뽑아야할 데이터의 테이블과 컬럼을 먼저 정합니다.
    테이블(투수) : Pitchers, 컬럼(이름) : name

    - where절에서 조건으로 쓸 테이블과 컬럼을 정합니다.
    '단 한 구단에도 선발 등판하지 않은 투수들 중'
    테이블(경기기록) : Records, 컬럼(원정 선발 등판한 투수의 ID) : starting_pitcher_away
    테이블(경기기록) : Records, 컬럼(홈 경기 선발 등판한 투수의 ID) : starting_pitcher_home


    - ORDER BY 순서 정렬이 필요한지 확인합니다.
     가장 높은 연봉(salary)이 필요합니다.



    SELECT
    *
    FROM (
    	SELECT
    		NAME /* 투수명 */
    	FROM PITCHERS
    	WHERE 1=1
    	  AND PID NOT IN ( /* NOT IN을 사용한 원정경기와 홈경기 기록이 없는 투수 목록 */
    						SELECT 
    							STARTING_PITCHER_AWAY
    						FROM RECORDS
    						UNION ALL
    						SELECT 
    							STARTING_PITCHER_AWAY
    						FROM RECORDS
    					)
    	ORDER BY SALARY DESC /* 연봉이 큰 투수를 맨 위로 정렬 */
    )WHERE ROWNUM <= 1 /* 맨 위의 값 1개의 로우만 출력 */


    0
  • 루티
    10
    2018-11-10 12:49:59 작성 2018-11-10 12:55:44 수정됨

    나나낭 님 답글 달아주셔서 감사합니다. ㅠㅠ 말 그대로 체만 바꾸고 그대로 내용은 긁어온거라 제가 아는 컬럼은 전부 적었습니다.

    어떤구단을 상대로 선발 등판한 기록은 각각 Records 에  starting_pitcher_away , starting pitcher_home에서 알수 있는거 아닌건가요 ㅠㅠ 정말 죄송합니다.


     님 말씀대로 처음 접하는게 너무 어렵네요ㅠㅠ

    그래도 sql 프로그램 까는것도 어렵고 질의문 공부도 어렵네요 ㅎㅎ... 답글 감사합니다.


    라임두 님 조언 감사합니다.

    아쉽게도 정말 테이블에 있는 컬럼을 싹다 가져왔습니다. 엑셀로도 테이블 만들어봐서 대수 표현은 해봤는데 sql문을 만들지 못해서 진행을 하지 못했습니다.

    기본적인 틀을 짜주셔서 정말로 감사합니다.

    0
  • 루티
    10
    2018-11-10 13:11:14

    님 정말로 도움 감사드립니다!

    각각의 질의 줄마다 설명까지 첨부해주시고 어떤 의미인지도 명확하게 써주셔서 해석하는데 정말 도움이 되었습니다.


    민폐지만 1번에 관해서 모든 구단을 상대로 원정 선발 등판한 기록이 있는 투수들 부분을

    원정경기를 뛴 투수 ID를 구하셔서 푼걸로 이해했습니다. (맞나요...?)

    원하는 결과값은 A, B, C, D 라는 팀이 있고 // PP, QQ 라는 투수가 있을때

    PP는 A,B,C,D 전부를 상대로 원정경기를 뛰었고 QQ는 ABC 3팀만 원정 경기를 뛰었을때

    AB라는 투수를 뽑아낼수는 없는건가요?

    문자 그대로 모든팀을 상대로 원정 선발한 투수들을 구하고 싶어요..

    대수표현은 경기기록(home_tead_id,pitcher_away) /(디비젼) (tid) 해서 나온 투수들을 구하는 방법인데 이런식으로도 SQL문 작성이 가능한가요...


    2번째 질문에 대한 답변도 정말 감사드립니다.

    자세하게 답변해주신분께 또 다시 여쭤보는게 민폐지만 조금만 도움주시면 감사하겠습니다.

    바쁘신 주말에 귀찮게 해드려서 죄송합니다. 


    0
  • isNotEmpty
    2k
    2018-11-10 13:40:11

    '원정 선발 등판한 기록이 있는 투수들' 이라고만 생각했네요.

    '모든 구단을 상대'라는 조건이면 쿼리는 많이 달라집니다.



    SELECT
    	*
    FROM (
    	SELECT
    		PID /* 테이블의 키값은 항상 불러옵니다. */
    		, NAME /* 투수명 */
    	FROM PITCHERS
    	WHERE 1=1
    	  AND PID IN (/* 원정경기의 투수ID가 있는 목록을 WHERE 조건절로 씁니다. */
    					SELECT /* 원정 선수들이 상대한 구단의 수를 구함*/
    						STARTING_PITCHER_AWAY
    						, COUNT(*) AS CNT
    					FROM (
    							/* 상대 홈 구단에 출정한 원정 투수의 목록을 중복 제거 */
    							SELECT DISTINCT 
    								HOME_TEAM_ID
    								, STARTING_PITCHER_AWAY
    							FROM RECORDS
    						)
    					GROUP BY STARTING_PITCHER_AWAY
    					HAVING COUNT(*) = (SELECT COUNT(*) -1 AS CNT FROM TEAMS) /* (원정 선수가 출전한 구단 수) = (전체 구단 수 -1)
    				  )
    	ORDER BY SALARY ASC /* 연봉이 가장 낮은 투수를 맨위로 뽑기 위해 정렬을 합니다. */
    )
    WHERE ROWNUM <= 1 /* 맨 위의 값 1개의 로우만 출력합니다. */





    0
  • 루티
    10
    2018-11-10 14:12:07



    님 빠른 답변 감사합니다!


    SELECT /* 원정 선수들이 상대한 구단의 수를 구함*/
    STARTING_PITCHER_AWAY, COUNT(*) AS CNT


    이부분에서 자꾸 값의 수가 많다며 프로그램이 실행되질 않네요 ㅠㅠ..


    테이블도 그렇게 긴편이 아닌데 이유가 뭘까요...


    0
  • 라임두
    165
    2018-11-10 17:20:39

    아침에 대충보고 댓글 달았는데 죄송..보니 테이블명 뒤에가 컬럼이군요. 언뜻 보기에 테이블명을 컬럼으로 보았네요. 해결이 잘 되시길...너무 급하게 하시지 말고 차근차근 하나씩 풀어가시면 될꺼에요. 화이팅

    0
  • isNotEmpty
    2k
    2018-11-10 18:33:47

    좀 늦게 확인했습니다.

    해당 오류는 쿼리내에서 컬럼의 수가 많아서 생기는 오류입니다.

    where 절의 in 부분에는 컬럼이 1개만 들어가서 값을 조건으로 사용되여야하지만

    제가 작성한 쿼리에서는 컬럼이 2개 들어가 있죠. 그래서 생긴 오류라고 예상됩니다.



    SELECT
    	*
    FROM (
    	SELECT
    		PID /* 테이블의 키값은 항상 불러옵니다. */
    		, NAME /* 투수명 */
    	FROM PITCHERS
    	WHERE 1=1
    	  AND PID IN (/* 원정경기의 투수ID가 있는 목록을 WHERE 조건절로 씁니다. */
    					SELECT /* 원정 선수들이 상대한 구단의 수를 구함*/
    						STARTING_PITCHER_AWAY
    					FROM (
    							/* 상대 홈 구단에 출정한 원정 투수의 목록을 중복 제거 */
    							SELECT DISTINCT 
    								HOME_TEAM_ID
    								, STARTING_PITCHER_AWAY
    							FROM RECORDS
    						)
    					GROUP BY STARTING_PITCHER_AWAY
    					HAVING COUNT(*) = (SELECT COUNT(*) -1 AS CNT FROM TEAMS) /* (원정 선수가 출전한 구단 수) = (전체 구단 수 -1)
    				  )
    	ORDER BY SALARY ASC /* 연봉이 가장 낮은 투수를 맨위로 뽑기 위해 정렬을 합니다. */
    )
    WHERE ROWNUM <= 1 /* 맨 위의 값 1개의 로우만 출력합니다. */



    0
  • 루티
    10
    2018-11-11 18:49:10 작성 2018-11-11 18:51:05 수정됨


    isNotEmpty


    먼저 감사 답글이 늦은것부터 죄송합니다.


    그리고 정말 정말로 도움 감사드립니다.


    덕분에 깔끔하게 해결되었습니다.


    끝까지 신경써주시고 도와주셔서 한번더 감사드립니다.


    마지막 부분에

    HAVING COUNT(*) = (SELECT COUNT(*) -1 AS CNT FROM TEAMS

    이부분을 HAVING COUNT(*) = (SELECT COUNT(*)  AS CNT FROM TEAMS 수정하여 적용하였더니 원하던 결과값이 나왔습니다!

    (제가 전달력이 부족해서 원하는 결과를 정확히 설명 못드린것 같네요 죄송합니다.)

    ㅎㅎ  정말로 도와주셔서 다시한번 감사드립니다.

    늦었지만 남은 주말 행복한 시간 되시길 바랍니다!


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.