SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION ='Sick'
ORDER BY ANIMAL_ID;
젊은 동물1의 아이디와 이름을 조회하는 SQL
ID순으로 조회
db index는 1부터 시작
SELECT animal_id, name
from animal_ins
where INTAKE_CONDITION != 'Aged'
order by 1;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC , DATETIME DESC ;
SELECT NAME
FROM (
select name,datetime
from animal_ins
order by datetime asc
)
WHERE ROWNUM <= 1;
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME LIMIT 1;
SELECT MAX(DATETIME) FROM ANIMAL_INS;
SELECT min(datetime) from ANIMAL_INS
SELECT count(ANIMAL_TYPE) as count from ANIMAL_INS;
SELECT count(distinct(name)) as count
from animal_ins
where name is not null;
SELECT ANIMAL_TYPE , count(ANIMAL_TYPE) as count
from animal_ins
group by ANIMAL_TYPE
order by ANIMAL_TYPE;
SELECT NAME, COUNT(NAME) as COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >=2
ORDER BY NAME;
09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
ORACLE
- TO_CHAR(SYSDATE,'HH24'), 시간을 24시 형식으로 표시
SELECT TO_CHAR(DATETIME,'HH24') AS "HOUR", COUNT(*) AS "COUNT"
FROM ANIMAL_OUTS
WHERE TO_CHAR(DATETIME,'HH24') BETWEEN 9 AND 20
GROUP BY TO_CHAR(DATETIME,'HH24')
ORDER BY 1;
SELECT HOUR(DATETIME) AS HOUR , COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) <= 19
GROUP BY HOUR(DATETIME)
🔍 계층형 쿼리란?
계층형 쿼리는 테이블에 저장된 데이터를 계층형 구조로 반환하는 쿼리를 말합니다.
START WITH 조건으로 최상위 노드를 설정하고,
CONNECT BY 절로 계층형 구조에서의 연결조건을 설정할 수 있습니다.0 부터 23까지의 숫자를 나타내주기 위해 LEVEL, CONNECT BY절을 이용
select LEVEL-1 as HOUR from dual CONNECT BY LEVEL <=24;
레벨은 기본 1부터 시작, LEVEL-1, LEVEL <=23 -> 0~23컬럼 반환
0~23시에 데이터가 없더라도 결과 출력 -> 조인으로 해결(LEFT)
Oracle
SELECT HOUR, COUNT(O.DATETIME) AS COUNT
FROM
(
SELECT LEVEL-1 AS HOUR
FROM DUAL
CONNECT BY LEVEL<=24)A LEFT join ANIMAL_OUTS O
ON A.HOUR = to_char(O.DATETIME,'HH24')
GROUP BY HOUR
ORDER BY HOUR;
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
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL ORDER BY ANIMAL_ID
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
oracle : case when ~ else ~ end
select ANIMAL_TYPE,
case
when name is null then 'No name'
else name end,
SEX_UPON_INTAKE
from ANIMAL_INS
order by animal_id
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
select OUTS.ANIMAL_ID, OUTS.NAME
from ANIMAL_OUTS OUTS LEFT OUTER JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
order by OUTS.animal_id;
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME
SELECT *
FROM (
SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME
)
WHERE ROWNUM <=3;
보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL문 작성
- LEFT OUTER JOIN은 두가지 방식으로 표현: LEFT OUTER JOIN 구문을 사용하는 것과 (+)를 사용하는 것
SELECT b.animal_id, b.animal_type, b.name
FROM animal_ins a, animal_outs b
where b.animal_id = a.animal_id(+)
and b.sex_upon_outcome != a.sex_upon_intake
order by b.animal_id;
위 코드는 아래와 같다. (+)를 사용하면 훨씬 간결해짐. 단 + 사용시 where 조건에 on 조건을 명시하고, 제약조건을 and에서 표현.
select b.animal_id, b.animal_type, b.name
FROM animal_ins a left outer join animal_outs b
on a.animal_id = b.animal_id
where b.sex_upon_outcome != a.sex_upon_intake
order by b.animal_id;
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY 1;
SELECT animal_id, name
FROM animal_ins
where animal_type='Dog'
and (name like '%el%' or name like '%El%')
order by name;
SELECT ANIMAL_ID, NAME,
CASE
when SEX_UPON_INTAKE like 'Neutered%' then 'O'
when SEX_UPON_INTAKE like 'Spayed%' then 'O'
else 'X' end "중성화"
FROM ANIMAL_INS
order by ANIMAL_ID;
SELECT *
FROM (
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS INS, ANIMAL_OUTS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY OUTS.DATETIME - INS.DATETIME DESC
)
WHERE ROWNUM <=2;
SELECT ANIMAL_ID, NAME, TO_CHAR(DATETIME,'YYYY-MM-DD') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID