SQL - Select

김재령·2022년 2월 25일
0

DB

목록 보기
4/15
post-thumbnail

Select   from   where   gruop by   having   orderby[asc/desc]

1차 정렬

select 열이름 from 테이블 order by 열이름 desc;
select * from mem order by name desc;

2차 정렬하기
// 순서안에서 또 다른 순서를 만들기
// age로 정렬하고 name으로 정렬하기(age가 동일하면 name으로 정렬이 된다)

select * from mem order by age desc, name asc;
select ROWNUM,id,birthday,age from mem order by age;

Q. 왜 rownum이 섞이는가..? > rownum은 where절에서 생성되기 때문에 order by를 하게되면 섞이게 된다
-- where 여기서 만든 번호가
-- group by
-- order by 여기서 섞이게 된것이다
-- 정렬하고 rownum을 붙여야 하는 경우가 있다
-- 이때 row_number()함수를 사용한다

select ROW_NUMBER() OVER (ORDER BY age) as ro, id, birthday, age from mem;

-- 정렬된 상태에서 일련번호를 붙이고 싶을 때 row_number() over(order by [정렬할 컬럼])을 사용한다

-- 정렬된 상태에서 랭크를 매기고 싶을때는 row_number()대신 rank()를 사용한다
-- row_number는 일련번호이고 rank()는 등수이다 그래서 값이 같으면 공동 등수가 발생한다

select rank() OVER (ORDER BY age) as ro, id, birthday, age from mem;

-- 만약 공동 등수가 발생하면 4 4 이렇게 나오면 원래는 다음등수가 6이다
-- 근데 다음 등수를 5로 하고 싶다면 dense_rank()를 사용한다

select dense_rank() OVER (ORDER BY age) as ro, id, birthday, age from mem;

-- id별 작성한 내용의 등수를 확인하고 싶다면 partition by를 사용한다
-- id를 그룹별로 묶어서 내용의 등수를 확인하는 쿼리문
-- 여기서 partition by를 한 id가 오름차순으로 정렬된 것을 확인할 수 있다
-- 여기서 age를 desc하면 age에 대한 desc가 일어나지만 id는 여전히 오름차순으로 정렬이다

select ROW_NUMBER() OVER (PARTITION BY id ORDER BY age) as ro, id, birthday, age from mem;

구절의 순서를 바꿔야 하는 경우

select * from member where rownum between 1 and 10;

-> 최신 등록순으로 정렬한 결과에서 상위 10명을 원하는 경우라면???

select * from member order by pegdate desc where rownum between 1 and 5;

-> 순서 떄문에 오류가 발생한다

그럼 해결 방법은

select * from (select * from member order by pegdate desc) where rownum between 1 and 5;

-> from절에 정렬된 결과를 넣어서 다시 rownum으로 자른다
-> from절에는 반드시 테이블이 와야하는 것이 아니라 격자형 데이터가 와도 된다
-> 괄호가 서브쿼리를 나타낸다

select *
from (select * from mem order by age desc)
where rownum between 1 and 5;

-> 이런식으로 사용가능하다

평균 나이 이상인 회원 목록을 조회하시오

select *
from mem
where age >=
(select avg(age) from mem);

-> select avg(age) from mem으로 평균나이를 구하고 where절로 평균나이보다 큰 회원을 조회한다

profile
with me

0개의 댓글