www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
SQL Tryit Editor v1.6
WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, Opera, and Edge(79). If you use another browser you will still be able to use our Try SQL Editor, but a different ver
www.w3schools.com
[case문 학습]
devbox.tistory.com/entry/DBMS-CASEWHENTHEN
SUM, MAX, MIN
최대 값 구하기
SELECT MAX(DATETIME) 시간
FROM ANIMAL_INS
최소 값 구하기
SELECT MIN(DATETIME)
FROM ANIMAL_INS
동물 수 구하기
SELECT COUNT(ANIMAL_ID)
FROM ANIMAL_INS
중복 제거하기
SELECT COUNT(DISTINCT NAME) COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY
SELECT ANIMAL_TYPE , COUNT(ANIMAL_TYPE) COUNT
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC
SELECT *
FROM (SELECT NAME,COUNT(NAME) COUNT FROM ANIMAL_INS WHERE NAME IS NOT NULL GROUP BY NAME)
WHERE COUNT >=2
ORDER BY NAME
SELECT HOUR(DATETIME ) ,COUNT(HOUR (DATETIME ))
FROM ANIMAL_OUTS
WHERE HOUR (DATETIME )>=9 AND HOUR (DATETIME ) <=19
GROUP BY HOUR (DATETIME )
JOIN
SELECT B.animal_id, b.name
FROM ANIMAL_INS A full OUTER JOIN ANIMAL_OUTS B
on A.animal_id = b.animal_id
where A.name is null
and b.name is not null
order by B.animal_id , b.name asc
SELECT A.animal_id ,A.name
FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID =B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME ASC
SELECT *
FROM(
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME)
WHERE ROWNUM<=3
String Data
SELECT ANIMAL_ID,NAME,SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME= 'Lucy' OR NAME= 'Ella'OR NAME= 'Pickle'OR NAME= 'Sabrina'OR NAME= 'Mitty'OR NAME= 'Rogan'
ORDER BY ANIMAL_ID ASC
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%' OR SEX_UPON_INTAKE LIKE '%Spayed %' THEN 'O'
ELSE 'X' END AS 중성화
from ANIMAL_INS
ORDER BY ANIMAL_ID ASC
SELECT *
FROM (SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME-A.DATETIME DESC)
WHERE ROWNUM <=2
SELECT ANIMAL_ID,NAME,DATE_FORMAT (DATETIME,'%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
서브쿼리
- 중첩 서브쿼리 : 선택과목 B 테이블에서 'MATH'를 선택한 학생들의 이름을 찾아, 학생 A 테이블에서 모든 정보를 조회 (where절 안에)
- 인라인 뷰 (from절) : 각각의 공급자가 공급한 물품(item_name)과 총수량(total_amt)을 알고 싶은데, 두 정보가 서로 다른 테이블에 들어있는 경우, 공급자(suppliers)와 주문(oreders) 두 테이블로부터 각각 원하는 데이터를 불러와 출력하는 쿼리
- 스칼라서브쿼리 (select절) : 테이블에는 존재하지 않는 데이터(가격 평균/합 등)를 조회하고 싶을 때 사용하는 쿼리
SELECT *
FROM student A
WHERE A.student_name IN (SELECT B.student_name
FROM subject B
WHERE B.subject_name = 'MATH');
SELECT A.item_name, subquery1.total_amt
FROM suppliers A,
(SELECT supplier_id, SUM(B.amount) AS total_amt
FROM orders B
GROUP BY supplier_id) subquery1
WHERE subquery1.supplier_id = A.supplier_id;
SELECT product_name, list_price,
ROUND(
(SELECT AVG( list_price )
FROM products p1
WHERE p1. category_id = p2.category_id
), 2 ) avg_list_price
FROM products p2
ORDER BY product_name;
연습문제
두번 이상 쓰여진 이름과 그 갯수를 출력하기
인라인뷰 사용
select *
from
(SELECT NAME,COUNT(NAME) COUNT FROM ANIMAL_INS
WHERE NAME IS NOT NULL GROUP BY NAME)
where count >=2
order by name asc
HAVING 사용
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME
연습문제
기존의 시간
2015-09-16 13:07:00 --> 13 변경 시 HOUR(DATETIME) 이용 WHERE 이용시 HOUR(DATETIME)>=9 AND HOUR(DATETIME)<=19 HAVING 이용시 HAING HOUR >=9 AND HOUR <=19 |
SELECT HOUR (DATETIME ) , COUNT (DATETIME)
FROM ANIMAL_OUTS
WHERE HOUR (DATETIME )>=9 AND HOUR (DATETIME ) <=19
GROUP BY HOUR (DATETIME )
ORDER BY HOUR(DATETIME)
SELECT HOUR(DATETIME) HOUR, COUNT(DATETIME) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 and HOUR <= 19
연습문제
MySQL
SELECT B.ANIMAL_ID , B.NAME
FROM ANIMAL_INS AS A
RIGHT OUTER JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID ASC
Oracle
SELECT B.animal_id, b.name
FROM ANIMAL_INS A full OUTER JOIN ANIMAL_OUTS B
on A.animal_id = b.animal_id
where A.name is null
and b.name is not null
order by B.animal_id , b.name asc
MySQL
-- 코드를 입력하세요
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME >= B.DATETIME
ORDER BY A.DATETIME ASC
Oracle
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME>B.DATETIME
ORDER BY A.DATETIME ASC
MySQL
-- 코드를 입력하세요
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.ANIMAL_ID= B.ANIMAL_ID AND A.SEX_UPON_INTAKE!= B.SEX_UPON_OUTCOME
ORDER BY B.ANIMAL_ID ASC
Orcle, MySQL
select ANIMAL_ID, NAME,SEX_UPON_INTAKE
from ANIMAL_INS a
where a.name = 'Lucy' or name= 'Ella' or name= 'Pickle' or name ='Rogan'or name= 'Sabrina'or name= 'Mitty'
order by ANIMAL_ID asc
Oracle, MySQL
select ANIMAL_ID,NAME
from ANIMAL_INS
where ANIMAL_TYPE = 'Dog'and (name like '%el%' or name like '%EL%' or name like '%eL%' or name like '%El%')
order by name asc
CASE문 연습
CASE WHEN 컬럼명 = 'aaa' THEN 'bbb' WHEN 컬럼명2 = 'aa' THEN 'bb'
Oracle, MySQL
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 asc
select ANIMAL_ID,case when ANIMAL_ID = 'A355753' then '하이하이'
when ANIMAL_ID = 'A373219' then '하이' else '기타' end as 중성화
from ANIMAL_INS
MySQL : 상위 두개 출력
마지막 LIMIT 2
SELECT SUB.ANIMAL_ID, SUB.NAME
FROM
(
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A INNER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME- A.DATETIME DESC
) SUB
LIMIT 2
//이게 정답
SELECT B.ANIMAL_ID, B.NAME
FROM ANIMAL_INS A RIGHT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME - A.DATETIME DESC
LIMIT 2
Oracle : 상위 N개 출력
WHERE ROWNUM <=2
/*
select sub.ANIMAL_ID, b.NAME
from
(
select b.DATETIME-a.DATETIME 순위 , a.ANIMAL_ID
from ANIMAL_INS a inner join ANIMAL_OUTS b
on a.ANIMAL_ID = b.ANIMAL_ID
order by 순위 desc
) sub
inner join ANIMAL_OUTS b
on sub.ANIMAL_ID = b.ANIMAL_ID
WHERE ROWNUM <= 2
order by 순위 desc
*/
select sub.ANIMAL_ID, b.NAME
from (
select a.ANIMAL_ID
from ANIMAL_INS a inner join ANIMAL_OUTS b
on a.ANIMAL_ID = b.ANIMAL_ID
order by b.DATETIME-a.DATETIME desc
) sub
inner join ANIMAL_OUTS b
on sub.ANIMAL_ID = b.ANIMAL_ID
WHERE ROWNUM <= 2
MySQL
시간 포맷 바꿔주는 함수 : DATE_FORMAT(칼럼,'%y')
- 종류 : %Y,%y,%M,%m,%d,%D 시간 : %h : 다다름
GROUP BY + DATE_FORMAT + HAVING
문제
쿼리
-- 코드를 입력하세요
SELECT DATE_FORMAT(DATETIME,'%H') AS HOUR, COUNT(DATE_FORMAT(DATETIME,'%H')) AS COUNT
FROM ANIMAL_OUTS A
GROUP BY DATE_FORMAT(DATETIME,'%H')
HAVING HOUR >= 9 AND HOUR<20
ORDER BY DATE_FORMAT(DATETIME,'%H') ASC
문제
쿼리
-- 코드를 입력하세요
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS A
GROUP BY NAME
HAVING COUNT>=2 AND NAME IS NOT NULL
ORDER BY NAME ASC
2중 조인
테이블구조
테이블 명 | 필드 |
[OrderDetails] | OrderDetailID OrderID ProductID Quantity |
[Orders] | OrderID CustomerID EmployeeID OrderDate ShipperID |
[Customers] | CustomerID CustomerName ContactName Address City PostalCode Country |
SELECT *
FROM [Customers] A INNER JOIN [Orders] B
ON A.CustomerID =B.CustomerID
INNER JOIN [OrderDetails] C
ON B.OrderID=C.OrderID