DB

미션 :: user1계정의 test_tbl 테이블을 user2계정에 SELECT 권한 주기.

 

1) 테이블 SELECT 권한 주기

 

   GRANT SELECT ON TABLE user1.test_tbl TO user2

   => user2 계정으로 접속해서, SELECT * FROM test_tbl; 를 돌려보니, test_tbl 테이블을 찾지 못하는 오류 발생.

 

2) 스키마 접근 권한 주기

 

   GRANT USAGE ON SCHEMA user1 TO user2;

   => 여전히 test_tbl 테이블을 찾지 못함.

 

3) SEARCH_PATH 세팅

 

   show search_path; // 현재 search_path 확인

   SET search_path TO user2, user1, public

   => SELECT * FROM test_tbl; 정상 조회 가능.

 

   ※ search_path 관련 참고사항

      - serach_path는 입력된 순서대로 테이블 스페이스를 읽는다.

      - 영구적으로 설정해주기 위해서는 postgresql.conf 파일에 search_path를 명시해주어야 한다.

         1) SELECT name, setting FROM pg_settings WHERE category = 'File Locations'; //postgresql.conf 파일 찾기

         2) postgresql.conf 파일에 search_path='user2, user1, public' 명시

 

 

★ 결론

   GRANT 권한 줄 때, 테이블 SELECT 권한만 주면 끝나는 것이 아니기 때문에, 

   스키마 권한, search_path 모두 확인 해주어야 하고, 권한이 없으면 해당 권한까지 넘겨 주어야 한다.

SELECT ADDR FROM STUDENT WHERE ADDR != '서울'

 

서울이 아닌 지역을 출력하는 SELECT 쿼리이다.

이 때 ADDR은 'NULL 값은 비교대상에서 제외' 한 다른 지역의 주소들이 출력된다.

 

ex)

ADDR
인천
경기
부산

 

NULL값을 포함하여 NOT EQUAL을 사용하고 싶으면

IS DISTINCT FROM 절을 사용하면 된다.

 

SELECT ADDR FROM STUDENT WHERE ADDR IS DISTINCT FROM '서울'

== SELECT ADDR FROM STUDENT WHERE ADDR != '서울' or ADDR IS NULL

ex)

ADDR
인천
경기
부산
NULL

※ ADDR 컬럼이 NULL인 ROW가 존재할 경우에 NULL을 포함하여 출력됨.

1. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 각 선수별로 가능한 포메이션을 기준으로 ROW_NUM 세팅 )


 ROW_ID

NAME

FORMATION

 ROW_NUM

 1

ERIKSEN

 LWF

 1

 2

ERIKSEN

 RWF

 2

 3

ERIKSEN

CAM

 3

 4

ERIKSEN

CM

 4

 5

KANE

CF

 1

 6

SON

CF

 1

 7

SON

LWF

 2

 8

SON

RWF

 3

 9

SON

CAM

 4

 10

VERTONGHEN

CB

 1

 11

VERTONGHEN

LB

 2



SQL : 


SELECT 
   ROW_ID
  ,NAME
  ,FORMATION
  ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY ROW_ID ) AS ROW_NUM
FROM
  TOT_PLAYER
ORDER BY ROW_ID

해설 : 선수이름을 그룹으로 묶어서 ROW_NUMBER() 계산한다.

키워드 : ROW_NUMBER / PARTITION BY



2. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 득점순위 ROW_NUM 세팅 )
    * 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위가 발생하지 않음


 ROW_ID

NAME

GOAL

 ROW_NUM

 1

KANE

15

 1

 2

SON

15

 1

 3

ERIKSEN

6

 2

 4

ALLI

4

 3

 5

LAMELA

4

 3

 6

MOURA

4

 3

 7

VERTONGHEN

3

 4

 8

ALDERWEIRELD

2

 4



SQL : 


SELECT
   ROW_ID
  ,NAME
  ,FORMATION
  ,DENSE_RANK() OVER( ORDER BY GOAL DESC) AS ROW_NUM
FROM
TOT_PLAYER
ORDER BY ROW_ID

해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용

   동일한 득점이 있을 경우 그 다음 순위에 공백이 생기지 않는다 -> DENSE_RANK 함수 사용

키워드 : DENSE_RANK


3. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 득점 순위 ROW_NUM 세팅 )
    * 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위 발생


 ROW_ID

NAME

GOAL

 ROW_NUM

 1

KANE

15

 1

 2

SON

15

 1

 3

ERIKSEN

6

 3

 4

ALLI

4

 4

 5

LAMELA

4

 4

 6

MOURA

4

 4

 7

VERTONGHEN

3

 7

 8

ALDERWEIRELD

2

 7


SQL : 


SELECT
   ROW_ID
  ,NAME
  ,GOAL
  ,RANK() OVER( ORDER BY GOAL DESC ) AS ROW_NUM
FROM
   TOT_PLAYER
ORDER BY ROW_ID


해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용

   동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용

키워드 : RANK


4. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 선수 역할을 기준으로 득점 순위 계산 )

    * 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위 발생


 ROW_ID

 ROLL

NAME

GOAL

 ROW_NUM

 1

 ST

KANE

15

 1

 2

 ST

SON

15

 1

 3

 ST

 LIORENTE

10

 3

 4

 MF

ERIKSEN

6

 1

 5

 MF

ALLI

4

 2

 6

 MF

LAMELA

4

 2

 7

 MF

MOURA

4

 2

 8

 MF

 WANYAMA

1

 5

 9

 DF

VERTONGHEN

3

 1

 10

 DF

ALDERWEIRELD

2

 2


SQL : 


SELECT
   ROW_ID
  ,NAME
  ,GOAL
  ,RANK() OVER ( PARTITION BY ROLL ORDER BY GOAL DESC ) AS ROW_NUM
FROM
   TOT_PLAYER
ORDER BY ROW_ID

해설 : 포지션 별 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용

   동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용

    포지션을 그룹으로 묶어준다 -> PARTITION BY 사용

키워드 : RANK / PARTITION BY

+ Recent posts