• SQL 2020.10.22

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

+ Recent posts