정렬 명령문 ORDER BY
를 적용하는 문제이며 정렬 방법은 크게 오름차순 ASC
와 내림차순 DESC
로 나뉜다.
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
특정 데이터를 조회하는 방법으로 WHERE
절을 사용한다.
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION='Sick';
특정 데이터를 조회하는 방법은 !=
부호를 사용하면 특정 데이터를 제외한 나머지 데이터를 조회할 수 있다.
SELECT ANIMAL_ID, NAME from ANIMAL_INS where INTAKE_CONDITION !='Aged' ;
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC;
두 열의 데이터 정렬기준으로 서로 다르게 할 경우는 별개의 데이터 정렬 방식을 정의 해주면 된다.
` ORDER BY “1번 정렬”, “2번 정렬” `
SELECT ANIMAL_ID,NAME,DATETIME from ANIMAL_INS order by NAME asc, DATETIME DESC;
정렬된 데이터를 위에서 혹은 아래서 N개의 데이터를 조회하고 싶은 경우는 어떠할까?
LIMIT
명령어는 사용자가 원하는 데이터의 개수를 입력하면 위에서부터 데이터를 조회할 수 있도록 해준다.
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;
아래 두가지 방법을 사용할 수 있지만 정석 방식은 MAX() 혹은 MIN() 방식을 사용하여 최대 최소를
구하는 방식이다.
ORDER BY
사용범의 기본적인 방법이며 추가적으로 DESC
는 내림차순 정렬 명령어 이다.
LIMIT
는 지정된 갯수 만큼 출력하는 명령어 이다.
SELECT MAX(DATETIME) FROM ANIMAL_INS;
OR
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1;
최댓값 구하기
문제에서 오름차순 정렬 후 1개의 데이터를 뽑으면 되는 문제이다.
** 정석 **
SELECT MIN(DATETIME) FROM ANIMAL_INS;
OR
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;
테이블 상에서 전체 동물의 수는 행의 갯수(애트리뷰트)를 구하면 된다.
행의 갯수는 COUNT(*)
명령어 이다.
SELECT COUNT(*) FROM ANIMAL_INS;
만일 특정 테이터의 갯수를 구하고 싶다면?
“DOG” 의 갯수 구하기
SELECT COUNT(ANIMAL_TYPE) FROM ANIMAL_INS WHERE ANIMAL_TYPE = 'DOG';
OR
SELECT COUNT(CASE WHEN ANIMAL_TYPE ='DOG' THEN 1 END) FROM ANIMAL_INS;
칼럼의 갯수를 구하거나 동일 데이터가 많을 경우 중복을 제거하는 명령어가 존재한다.
DISTINCT
는 별개의
라는 뜻을 가지고 있으며 중복을 제거해주는 명령어이다.
문제에서 이름 NAME
데이터으 중복성 제거와 이름의 상태가 ‘NULL’ 인 데이터를 제외한 테이블의 갯수를
요구하는 문제이다.
여기서 사용해야하는 명령어는 DISTINCT
IS NOT NULL
COUNT
세가지 명령어를 사용하면 된다.
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL;
핵심은 Group By와 COUNT() 명령어를 얼마나 잘 이해하였는 지에 대한 문제이다.
출력의 결과가 타입과, 타입별 동물의 마릿수 이므로 COUNT() 명령어를 추가적으로 입력해주고
단, 동물 전체의 마리수(개+ 고양이) 가 아닌 각 동물의 마릿수가 출력될 수 있도록 group by 명령어를 추가 입력해 주도록 한다.
SELECT ANIMAL_TYPE, count(ANIMAL_TYPE)
from ANIMAL_INS
group by ANIMAL_TYPE
order by ANIMAL_TYPE;
집계 함수 (SUM(), COUNT() … )사용시에는 WHERE절을 사용할 수 없는 것을 꼭 알고 있어야한다.
집계함수 사용시 WHERE절과 같은 조건문을 사용하고 싶다면 HAVING 문을 사용해야 한다.
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >1
ORDER BY NAME;
가장 눈여겨 봐야할 문법은 시간을 관리하는 HOUR 명령어 일것이다. 동시에 시간과 시간 사이의 조건을 더해줄 AND 절까지
작성하면 될것이다.
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <=19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)
테이플의 형태는 입양 시각 구하기(1)과 동일하나
다음 문제는 어느 시간이 가장 활발하게 이루어지는가에 대한 문제이다. 때문에 모든 시간 (00 ~ 24시)의 시간을 모두 구분하여 확인해야한다.
우선 시간에 따른 테이블을 만들어준다. (답은 아래)
@변수
를 통해 시간 증가를 튜플의 크기만큼 시간을 부여한다.
(해당 테이블은 99개의 튜플로 이루어져 있기 때문에 0 ~ 99
까지 1씩 증가하는 튜플이 만들어진다.)
SET @hour := -1
SELECT (@hour := @hour + 1)
FROM ANIMAL_OUTS;
@hour := @hour + 1
는 java에서 변수++;
와 동일하다.
SELECT문
을 작성해 주어야 한다는 것이다.HOUR에 대한 애트리뷰트를 작성은 어렵지 않다.
SET @hour := -1; -- 변수 선언
SELECT (@hour := @hour + 1) as HOUR
FROM ANIMAL_OUTS
WHERE @hour < 23
@hour
은 프로세스가 종료되기 까지 1씩 증가되므로WHERE절
에 조건으로 사용해주면 동일 시간대의 갯수를 구할 수 있다.
SET @hour := -1; -- 변수 선언
SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour as `COUNT`;
SET @hour := -1; -- 변수 선언
SELECT (@hour := @hour + 1) as HOUR,
(SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23
<추가>
MySQL에서 '=' 연산자는 두 가지 의미로 해석됨
우선 SET 문이나 UPDATE 문의 SET 절에서 사용되면, 왼쪽 피연산자에 오른쪽 피연산자를 대입하는 대입 연산자로 해석
SET 문이나 UPDATE 문의 SET 절 이외에서 사용되면, 왼쪽 피연산자와 오른쪽 피연산자를 비교하는 비교 연산자로 해석
</div>
</details>
### 🐹 IS NULL
#### 이름이 없는 동물의 아이디
전체 테이블을 조회 후 조건절에 null
값을 초회 해주면 되겠다.
단, 조건절에서 ==
등호는 사용할 수 없으니 반드시 IS
명령어를 사용해야한다.
SELECT ANIMAL_ID from ANIMAL_INS WHERE NAME IS NULL;
그렇다면 반대로 이름을 조회할 경우는 어떻게 구현할까?
IS
명령어가 WHERE
절에서 ==
와 같은 의미라면
IS NOT
은 !=
와 같은 의미 입니다.
SELECT ANIMAL_ID from ANIMAL_INS WHERE NAME IS NOT NULL;
테이블의 일부 데이터가 NULL
값인 경우 그 의미를 모르는 사용자 들에게 No name
을 반환 하도록 구현하려한다.
우선 NULL
값을 조회하는 쿼리를 작성 후 생각해보자.
SELECT ANIMAL_TYPE FROM ANIMAL_INS WHERE NAME IS NULL;
그 후, 출력 부분인 SELECT
부분을 통해 해당 값이 NULL
일 경우 “NO name”으로 출력 되도록 조건절을 주어야 한다.
여기서 IFNULL
명령어를 사용하면 되겠다. 동시에 WHERE
문은 필요가 없으니 지워주도록 한다.
SELECT ANIMAL_TYPE, ifNULL(NAME, "No name") FROM ANIMAL_INS;
마지막으로 원하는 테이블을 출력할 수 있도록 구현해주면 된다.
SELECT ANIMAL_TYPE, IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS;