문제


ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.


NAME 

TYPE 

NULLABLE 

ANIMAL_ID

VARCHAR(N) 

FALSE 

ANIMAL_TYPE

VARCHAR(N) 

FALSE 

DATETIME

DATETIME

FALSE

INTAKE_CONDITION

VARCHAR(N)

FALSE

NAME

VARCHAR(N)

TRUE 

SEX_UPON_INTAKE

VARCHAR(N)

FALSE


가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.


예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면


ANIMAL_ID

ANIMAL_TYPE 

DATETIME

INTAKE_CONDITION 

NAME

SEX_UPON_INTAKE 

A399552

Dog

2013-10-14 15:38:00

Normal

Jack

Neutered Male

A379998

Dog

2013-10-23 11:42:00

Normal

Disciple

Intact Male

A370852

Dog

2013-11-03 15:04:00

Normal

Katie

Spayed Female

A403564

Dog

2013-11-18 17:03:00

Normal

Anna

Spayed Female


가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.


DATETIME

2013-11-18 17:03:00


풀이




1
2
3
SELECT DATETIME
FROM ANIMAL_INS
WHERE DATETIME=(SELECT MAX(DATETIMEFROM ANIMAL_INS)
cs

  • DATETIME 이 나중일 수록 INT 값이 커지는거와 동일하게 WHERE 조건에 다시 SELECT MAX(DATETIME)을 하여 큰 값을 가져온다.





출처 : https://programmers.co.kr/learn/courses/30/lessons/59415

데이터베이스에서 값을 처리할 때 INT 형으로 되어있는 값들은 처리속도가 빠르다. IP, MAC, 문자열, DATETIME, PORT 등을 INT 형으로 바꿔 데이터베이스에 삽입할 수 있다. (단, 입력값은 모두 문자열이여야 함)


  • IP to INT
1
2
3
4
5
6
7
8
def ip2int(ip):
    try:
        #print("IP : %s    Type : %s" % (ip, type(ip)))
        return struct.unpack("!I", socket.inet_aton(ip))[0]
    except:
        #print(traceback.print_exc())
        #print(ip)
        return ''
cs



IP

2진수 → 16진수

INT

127.0.0.1

0b01111111000000000000000000000001

\x7f\x00\x00\x01

2130706433


  • MAC to INT
1
2
3
4
5
6
7
def mac2int(mac):
    try:
        return int(mac.replace(':'''), 16)
    except:
        #print(traceback.print_exc())
        return ''
 
cs


MAC

변환을 위한 치환

INT

AA:BB:CC:DD:EE:FF

AABBCCDDEEFF

187723572702975


  • ACTION to INT
1
2
3
4
5
def act2int(string):
    if '문자1' in string:
        return 1
    elif '문자2' in string:
        return 0
cs

- 0 또는 1로 나타냄으로써 해당 문자열에 대해 숫자로 표현이 가능하다.


  • DATETIME to INT
1
2
3
def date2int(date):
    time = datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
    return int(time.timestamp())
cs


DATETIME

문자열 → DATETIME

INT

2019-12-31 15:12:15

datetime.datetime(2019, 12, 31, 15, 12, 15)

time.timestamp() : 1577772735


  • PORT to INT
1
2
def port2int(port):
    return int(port)
cs

- PORT 자체는 '12345' 와 같이 들어온 문자 자체가 INT 형태이므로 특별한 처리 없이 바로 INT 형으로 변환했다.


'공부 > Python' 카테고리의 다른 글

python venv 설치방법  (0) 2019.11.05
[암호] Vigenere  (0) 2019.02.09
[전자서명]Python OpenSSL  (0) 2018.07.17

문제


ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.


NAME 

TYPE 

NULLABLE 

ANIMAL_ID

VARCHAR(N) 

FALSE 

ANIMAL_TYPE

VARCHAR(N) 

FALSE 

DATETIME

DATETIME

FALSE

INTAKE_CONDITION

VARCHAR(N)

FALSE

NAME

VARCHAR(N)

TRUE 

SEX_UPON_INTAKE

VARCHAR(N)

FALSE


동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.


예시

예를 들어 ANIMAL_INS 테이블이 다음과 같다면


ANIMAL_ID

ANIMAL_TYPE 

DATETIME

INTAKE_CONDITION 

NAME

SEX_UPON_INTAKE 

A399552

Dog

2013-10-14 15:38:00

Normal

Jack

Neutered Male

A379998

Dog

2013-10-23 11:42:00

Normal

Disciple

Intact Male

A370852

Dog

2013-11-03 15:04:00

Normal

Katie

Spayed Female

A403564

Dog

2013-11-18 17:03:00

Normal

Anna

Spayed Female


이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.


NAME 

Jack


※ 보호소에 가장 먼저 들어온 동물은 한 마리인 경우만 테스트 케이스로 주어집니다.


풀이



1
2
3
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME LIMIT 1
cs

  • 시간 순으로 정렬 후 상위 한 개의 값을 가져와야 한다.
  • LIMIT [숫자] : 상위에서부터 [숫자]만큼의 자료를 보여준다.





출처 : https://programmers.co.kr/learn/courses/30/lessons/59405

문제


ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.


NAME 

TYPE 

NULLABLE 

ANIMAL_ID

VARCHAR(N) 

FALSE 

ANIMAL_TYPE

VARCHAR(N) 

FALSE 

DATETIME

DATETIME

FALSE

INTAKE_CONDITION

VARCHAR(N)

FALSE

NAME

VARCHAR(N)

TRUE 

SEX_UPON_INTAKE

VARCHAR(N)

FALSE


동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.


예시

예를 들어, ANIMAL_INS 테이블이 다음과 같다면



ANIMAL_ID

ANIMAL_TYPE 

DATETIME

INTAKE_CONDITION 

NAME

SEX_UPON_INTAKE 

A349996

Cat

2018-01-22 14:32:00

Normal 

Sugar 

Neutered Male

A350276

Cat 

2017-08-13 13:50:00

Normal 

Jewel

Spayed Female 

A396810

Dog 

2016-08-22 16:13:00

Injured

Raven

Spayed Female

A410668

Cat

2015-11-19 13:41:00

Normal 

Raven

Spayed Female 


  1. 이름을 사전 순으로 정렬하면 다음과 같으며, 'Jewel', 'Raven', 'Sugar'
  2. 'Raven'이라는 이름을 가진 개와 고양이가 있으므로, 이 중에서는 보호를 나중에 시작한 고양이를 먼저 조회합니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.


ANIMAL_ID

NAME

DATETIME

A350276

Jewel

2017-08-13 13:50:00

A396810

Raven

2016-08-22 16:13:00

A410668

Raven

2015-11-19 13:41:00

A349996

Sugar

2018-01-22 14:32:00


풀이


1
2
3
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC
cs

  • 이름 사전순 = 오름차순, 나중에 보호한 시간 = 내림차순
  • ORDER BY 는 여러개 사용이 가능하다. 단, 왼쪽부터 순차적으로 진행되어 정렬이 되기에 순서를 고려해야한다.
  • ORDER BY NAME ASC (=ORDER BY NAME), DATETIME DESC






출처 : https://programmers.co.kr/learn/courses/30/lessons/59404

'코딩테스트 연습 > SQL' 카테고리의 다른 글

[MAX, MIN, SUM] 최솟값 구하기  (0) 2020.03.21
[SELECT] 상위 n개 레코드  (0) 2020.03.21
[SELECT] 동물의 아이디와 이름  (0) 2020.03.21
[SELECT] 어린 동물 찾기  (0) 2020.03.21
[SELECT] 아픈 동물 찾기  (0) 2020.03.21

+ Recent posts