카테고리 없음

SQL 20221122

동혼 2022. 11. 22. 11:31

DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT DR_NAME, DR_ID, MCDP_CD, TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC



--ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 
--재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

SELECT USER_ID, PRODUCT_ID
  FROM ONLINE_SALE 
GROUP BY USER_ID, PRODUCT_ID
 HAVING COUNT(*) > 1
ORDER BY USER_ID, PRODUCT_ID DESC

 

 

- HAVING 절이란?


- HAVING 절이란?
​   GROUP BY를 통해 묶인 레코드 그룹에 대해 조건을 거는 역활을 합니다.
SELECT [컬럼명] FROM [테이블명] GROUP BY [컬럼명] HAVING [조건절]

 [참고사항] HAVING 절과 WHERE 절의 차이
   HAVING 절과 WHERE 절은 동일하게 조건검색을 위해 사용되지만 집계함수를 사용하느냐 못하느냐의 차이점이 존재합니다.
   HAVING 절은 집계함수를 사용할 수 있으며, WHERE 절은 집계함수를 사용할 수 없습니다.
   집계함수 - COUNT, SUM, MAX, MIN, AVG





-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME 
  FROM ANIMAL_INS 
 WHERE INTAKE_CONDITION IN ('Sick', 'Injured' )
ORDER BY ANIMAL_ID DESC
 





SELECT ANIMAL_ID, NAME 
from ANIMAL_INS
where INTAKE_CONDITION <>"Aged"
order by ANIMAL_ID

 오라클 != <> ^= 차이 

XML에서 <>가 지원안되면 !=를 써주자



 

 

 

오라클 != <> ^= 차이

오라클에서

!= <> ^= 세개로

특정 값이 아닌 경우의

조건을 걸 수 있는데

세 개중에 어느 것을 사용해도 성능 차이는 없다

 

뭘 쓰는게 가장 낫냐면

 

역시 <>를 쓰는 것이 가장 낫다

SQL 기본 문법에서 NOT EQUAL은

<>를 사용하기 때문에

 

어느 DB를 사용한다 할지라도

<>는 똑같이 적용이 가능하다

따라서 3개를 사용 가능하고 성능은 모두 똑같지만

가급적이면 <>를 사용하는 것이 가장 낫다

 

( XML에서 <>가 지원안되면 !=를 써주자)

 

 

 

 

 


# 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.
정렬에 관한 문제라 ORDER BY NAME ASC(순차정렬), DATETIME DESC(역순정렬) 하면 되네요'


SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC


--동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

SELECT name
    from ANIMAL_INS
    order by Datetime asc fetch first 1 rows with ties;

-- MIN
SELECT NAME 
FROM ANIMAL_INS 
WHERE DATETIME IN ( SELECT MIN (DATETIME)
                      FROM ANIMAL_INS);

--MIN
select name from animal_ins a where a.datetime=R
(SELECT min(datetime) from animal_ins)


-- ORDER BY, limit 사용
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
limit 1;
 
-- ROWNUM SOL1
SELECT A.NAME 
FROM (
    SELECT *
    FROM ANIMAL_INS
    ORDER BY DATETIME ASC
) A
WHERE ROWNUM <= 1;

-- ROWNUM SOL2
SELECT NAME
FROM 
    (SELECT NAME
        FROM ANIMAL_INS
        ORDER BY DATETIME)
WHERE ROWNUM=1;

-- RANK
SELECT NAME
FROM(
SELECT NAME, RANK() OVER (ORDER BY DATETIME ASC) RNK
        FROM ANIMAL_INS
)
WHERE RNK=1




--테이블에서 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.



SELECT COUNT(*) FROM USER_INFO
WHERE EXTRACT(YEAR FROM JOINED) = 2021 AND 20 <= AGE AND AGE <= 29

SELECT Count(*) AS USERS FROM USER_INFO WHERE AGE BETWEEN 20 AND 29 AND YEAR(JOINED) = 2021



SELECT COUNT(*)
  FROM USER_INFO
 WHERE TO_CHAR(JOINED, 'YYYY') = '2021'
   AND AGE BETWEEN 20 AND 29
;






-- 코드를 입력하세요
-- 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회
--  컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

SELECT  MCDP_CD          AS "진료과코드"
     ,  COUNT(APNT_NO)   AS  "5월예약건수"
FROM    APPOINTMENT 
WHERE   1=1
 AND TO_CHAR(APNT_YMD , 'MM') = '05'
GROUP BY MCDP_CD
ORDER BY "5월예약건수" ASC , "진료과코드" ASC

-- 남의 소스1
SELECT MCDP_CD as 진료과코드, COUNT(*) as 5월예약건수
FROM APPOINTMENT
WHERE YEAR(APNT_YMD)=2022 AND MONTH(APNT_YMD)=5
GROUP BY MCDP_CD
ORDER BY 5월예약건수, 진료과코드
-- 남의소스2
SELECT  MCDP_CD          AS "진료과코드"
     ,  COUNT(APNT_NO)   AS  "5월예약건수"
FROM    APPOINTMENT 
WHERE   1=1
AND     TO_CHAR(APNT_YMD,'YYYY-MM') = '2022-05'
GROUP BY MCDP_CD
ORDER BY "5월예약건수" ASC , "진료과코드" ASC