1. 모든 레코드 조회하기
동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
SELECT(조회) * (모든 정보)
FROM ANIMAL_INS (ANIMAL_INS 테이블에서)
ORDER BY ANIMAL_ID ( ANIMAL_ID를 오름차순으로 정렬)
Order by는 "ASC" (오름차순)이 기본적으로 설정되어 있어서 굳이 작성하지 않아도 된다
2. 역순 정렬하기
동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요.
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
SELECT 옆에는 조회하고자하는 컬럼 이름을 작성해주면 된다.
"역순"으로 정렬 이므로, DESC를 사용!
3. 아픈 동물 찾기 - 조건문
동물 보호소에 들어온 동물 중 아픈 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
ORDER BY ANIMAL_ID
아픈 동물을 조회해야하므로 "조건문"을 사용해야한다
조건문 : WHERE 조건
이때, 아픈 동물은 INTAKE_CONDITION이 "Sick"인 경우이므로 위와 같은 코드가 완성된다!
아픈동물이 "Normal이 아닌 경우" 인줄 알고 계속 제출했다가 엄청 틀렸다
다음부턴 문제를 잘 읽어야겠다..
4. 어린 동물 찾기 - 조건문
동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID
젊은 동물은 INTAKE_CONDITION이 "Aged"가 아닌경우이므로, 조건문에 위와 같이 작성
5. 동물 아이디와 이름
동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
6. 여러 기준으로 정렬하기
동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.
SELECT ANIMAL_ID,NAME,DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC
" ORDER BY A (ASC/DESC), B (ASC/DESC)" 의 의미는
A 기준으로 정렬하되, 동일한 A 발생시, B 기준으로 정렬한다는 의미
Q. A에 ASC를 생략해도 같은 결과가 나오는가?
SELECT ANIMAL_ID,NAME,DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
A. 같은 결과가 나온다.
A와 B 조건은 따로기때문에
"ORDER BY A, B DESC" 로 쓴다고 해서 A 내림차순, B 내림차순이 절대! 아니다!!
7. 상위 n개 레코드 - MySQL(LIMIT 사용), ORACLE(rownum, 서브쿼리문 사용)
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.
* mysql
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME LIMIT 1
Mysql 에서는 ORDER BY에 "LIMIT n "를 사용해서 조회할 레코드 상위 n개를 설정해주면 된다
Limit를 사용하면 ~부터 ~까지도 조회할 수 있다
즉,
ORDER BY DATETIME LIMIT 5, 9 : DATAETIME으로 정렬한 후, 상위 5번째부터 9번째까지 조회!
* oracle
SELECT NAME
FROM (SELECT *
FROM ANIMAL_INS
ORDER BY DATETIME)
WHERE rownum = 1;
oracle은 살짝 복잡하다 rownum을 써야한다는 거까지는 알았는데
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME WHERE rownum = 1;
로 썼다가 계속 에러가 났었다;;
Q. rownum을 사용할 때, subquery를 사용해야 하는 이유?
A. rownum은 각 행에 대한 일련번호를 의미하는데, 선택된 테이블의 레코드에 자동으로 순차적으로 번호가 부여된다.
따라서, 테이블을 선택한 후에 특정 칼럼으로 정렬하여도, rownum은 정렬 전에 설정한대로 부여되어 있다..
즉, rownum은 테이블에 먼저 입력!(INSERT)된 순서대로 숫자가 부여되어서, 정렬을 하든 무슨짓을 하더라도 고유의 rownum을 가지고 있다..
따라서 원하는 테이블을 생성하여 사용해주면 되는데,, 그렇다고 새로운 테이블을 생성할 수도 없으니,,
일시적으로 사용이 가능한 Inline view( from절에서 사용하는 subquery)를 사용한다!
생성된 테이블에 고유번호 rownum을 부여한 후에, 조건문을 사용하여 원하는 수 만큼 조회하면 된다!
프로그래머스 SQL 고득점 kit - SELECT
https://programmers.co.kr/learn/courses/30/parts/17042
'Computer Science > 자료구조와 알고리즘' 카테고리의 다른 글
[프로그래머스\SQL 고득점 kit] GROUP BY - 고양이와 개는 몇마리 있을까, 동명 동물 수 찾기 (mysql) (0) | 2021.12.17 |
---|---|
[프로그래머스\SQL 고득점 kit] SUM, MAX, MIN :Mysql (0) | 2021.12.17 |
[Python] 수행시간과 메모리 사용량 측정 (0) | 2021.07.16 |
[프로그래머스/JAVA] 해시 - Lv1 완주하지 못한 선수 (2) | 2021.07.14 |
[JAVA] 백준 2675번 : 문자열 반복 (0) | 2021.07.10 |