【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어
소개
예를 들어 oracle에서는 row_number()
같은 분석 함수가 준비되어 있지만 MySQL에서는 row_number()
가 없으므로 서브 쿼리를 사용하여 일련 번호를 흔들려고 생각합니다.
샘플 데이터
적당히 만든 테스트 성적표를 사용합니다.
이름
과목
점수
sato
Math
65
morita
과학
85
tahakashi
Math
45
이시이
영어
75
이시이
Math
40
tahakashi
과학
60
시미즈
영어
55
나카지마
영어
70
점수가 높은 순서로 정렬하여 일련 번호를 흔들어
위의 샘플 데이터를 다음과 같이 표시합니다. 일단 과목은 묻지 않습니다.
학교라면, 점수가 높은 순서로 게시판에 튀어나오는 아레입니다
No.
이름
과목
점수
1
morita
과학
85
2
이시이
영어
75
3
나카지마
영어
70
4
sato
Math
65
5
tahakashi
과학
60
6
시미즈
영어
55
7
tahakashi
Math
45
8
이시이
Math
40
실행된 SQL
select
(select count(*)+1 from テストの成績表 where 点数 >x.点数) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.点数 desc
;
해설
"점수가 높은 순서로"라는 것이므로 order by x.点数 desc
로 정렬합니다.
그 때, 「자신보다 점수가 높은 레코드가 몇건 있는가」를 산출하고 있는 것이 이 서브 쿼리입니다.
select count(*)+1 from テストの成績表 where (比較対象の)点数 >x.(自分の)点数
1위morita / Science / 85
님보다 높은 점수를 기록한 레코드는 0개입니다.
그 때문에, 「자신보다 점수가 높은 레코드의 건수」에 +1
하지 않으면, 1로부터 시작되는 일련번호가 되지 않는다고 하는 것입니다.
포인트는, 「재귀 집합이 되어 있다」 것 count(*)
하는 요소수가 반드시 하나씩 늘어나는 것이 보증됩니다.
덧붙여서, 점수가 낮은 순서로 일련번호를 흔들고 싶으면, where 点数 <x.点数
와 부등호의 방향을 반대로 합니다.
점수가 높은 순서로 정렬하고 과목별로 일련 번호를 흔든다.
위의 예라면 사용하기 어려운 적어도 과목마다 순위 붙이지요 ...라는 것으로, 다음과 같이 표시해 보겠습니다.
No.
이름
과목
점수
1
이시이
영어
75
2
나카지마
영어
70
3
시미즈
영어
55
1
sato
Math
65
2
tahakashi
Math
45
3
이시이
Math
40
1
morita
과학
85
2
tahakashi
과학
60
실행된 SQL
select
(select count(*)+1 from テストの成績表
where 科目 = x.科目 and 点数 > x.点数
) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.科目, x.点数 desc
;
해설
과목과 점수로 정렬하고 싶으므로 일단 order by x.科目, x.点数 desc
합니다.
"과목마다 일련번호"란, 즉 "같은 과목 안에 점수가 높은 레코드가 몇 건 있을까"라고도 말할 수 있으므로, 서브 쿼리 부분은 이렇게 됩니다
select count(*)+1 from テストの成績表
where
(比較対象の)科目 = x.(自分の)科目
and (比較対象の)点数 > x.(自分の)点数
하는 일은 조금 전과 같습니다. 과목이 일치하는지 여부를 보면 일련 번호를 재설정 할 수 있다는 카라 쿠리입니다
요약
row_number()
를 사용할 수 없어도 일련 번호를 흔들 수 있습니다.
다만, 테이블의 스캔이 2회가 되므로, row_number()
가 있다면, 솔직하게 row_number()
를 사용하는 것이 퍼포먼스는 올라갑니다.
그렇다고는 해도, 생각의 하나로서, 알아 두어도 좋을까라고 생각합니다.
덤
참고문헌
웹사이트
SQL 아타마 아카데미
제1회 연속번호의 특성을 이용하여 데이터 조작을 보다 자유롭게 SQL로 연속번호를 취급한다
(2) 행 집합에 일련 번호 지정
h tp // 기효. jp/에서 v/세리아 l/01/sql_아카로 my2/000102
책
SQL 실습 입문 ── 빠르고 이해하기 쉬운 쿼리 작성 WEB+DB PRESS plus
2015년 4월 11일 발매
믹의 저
h tp // 기효. jp/보오 k/2015/978ー4ー7741ー7301ー6
샘플 데이터
이번 샘플 데이터를 생성한 create table문과 insert문은 이쪽
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);
Reference
이 문제에 관하여(【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mtanabe/items/f6d567ae51caf5ad3eb3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
적당히 만든 테스트 성적표를 사용합니다.
이름
과목
점수
sato
Math
65
morita
과학
85
tahakashi
Math
45
이시이
영어
75
이시이
Math
40
tahakashi
과학
60
시미즈
영어
55
나카지마
영어
70
점수가 높은 순서로 정렬하여 일련 번호를 흔들어
위의 샘플 데이터를 다음과 같이 표시합니다. 일단 과목은 묻지 않습니다.
학교라면, 점수가 높은 순서로 게시판에 튀어나오는 아레입니다
No.
이름
과목
점수
1
morita
과학
85
2
이시이
영어
75
3
나카지마
영어
70
4
sato
Math
65
5
tahakashi
과학
60
6
시미즈
영어
55
7
tahakashi
Math
45
8
이시이
Math
40
실행된 SQL
select
(select count(*)+1 from テストの成績表 where 点数 >x.点数) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.点数 desc
;
해설
"점수가 높은 순서로"라는 것이므로 order by x.点数 desc
로 정렬합니다.
그 때, 「자신보다 점수가 높은 레코드가 몇건 있는가」를 산출하고 있는 것이 이 서브 쿼리입니다.
select count(*)+1 from テストの成績表 where (比較対象の)点数 >x.(自分の)点数
1위morita / Science / 85
님보다 높은 점수를 기록한 레코드는 0개입니다.
그 때문에, 「자신보다 점수가 높은 레코드의 건수」에 +1
하지 않으면, 1로부터 시작되는 일련번호가 되지 않는다고 하는 것입니다.
포인트는, 「재귀 집합이 되어 있다」 것 count(*)
하는 요소수가 반드시 하나씩 늘어나는 것이 보증됩니다.
덧붙여서, 점수가 낮은 순서로 일련번호를 흔들고 싶으면, where 点数 <x.点数
와 부등호의 방향을 반대로 합니다.
점수가 높은 순서로 정렬하고 과목별로 일련 번호를 흔든다.
위의 예라면 사용하기 어려운 적어도 과목마다 순위 붙이지요 ...라는 것으로, 다음과 같이 표시해 보겠습니다.
No.
이름
과목
점수
1
이시이
영어
75
2
나카지마
영어
70
3
시미즈
영어
55
1
sato
Math
65
2
tahakashi
Math
45
3
이시이
Math
40
1
morita
과학
85
2
tahakashi
과학
60
실행된 SQL
select
(select count(*)+1 from テストの成績表
where 科目 = x.科目 and 点数 > x.点数
) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.科目, x.点数 desc
;
해설
과목과 점수로 정렬하고 싶으므로 일단 order by x.科目, x.点数 desc
합니다.
"과목마다 일련번호"란, 즉 "같은 과목 안에 점수가 높은 레코드가 몇 건 있을까"라고도 말할 수 있으므로, 서브 쿼리 부분은 이렇게 됩니다
select count(*)+1 from テストの成績表
where
(比較対象の)科目 = x.(自分の)科目
and (比較対象の)点数 > x.(自分の)点数
하는 일은 조금 전과 같습니다. 과목이 일치하는지 여부를 보면 일련 번호를 재설정 할 수 있다는 카라 쿠리입니다
요약
row_number()
를 사용할 수 없어도 일련 번호를 흔들 수 있습니다.
다만, 테이블의 스캔이 2회가 되므로, row_number()
가 있다면, 솔직하게 row_number()
를 사용하는 것이 퍼포먼스는 올라갑니다.
그렇다고는 해도, 생각의 하나로서, 알아 두어도 좋을까라고 생각합니다.
덤
참고문헌
웹사이트
SQL 아타마 아카데미
제1회 연속번호의 특성을 이용하여 데이터 조작을 보다 자유롭게 SQL로 연속번호를 취급한다
(2) 행 집합에 일련 번호 지정
h tp // 기효. jp/에서 v/세리아 l/01/sql_아카로 my2/000102
책
SQL 실습 입문 ── 빠르고 이해하기 쉬운 쿼리 작성 WEB+DB PRESS plus
2015년 4월 11일 발매
믹의 저
h tp // 기효. jp/보오 k/2015/978ー4ー7741ー7301ー6
샘플 데이터
이번 샘플 데이터를 생성한 create table문과 insert문은 이쪽
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);
Reference
이 문제에 관하여(【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mtanabe/items/f6d567ae51caf5ad3eb3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
select
(select count(*)+1 from テストの成績表 where 点数 >x.点数) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.点数 desc
;
select count(*)+1 from テストの成績表 where (比較対象の)点数 >x.(自分の)点数
위의 예라면 사용하기 어려운 적어도 과목마다 순위 붙이지요 ...라는 것으로, 다음과 같이 표시해 보겠습니다.
No.
이름
과목
점수
1
이시이
영어
75
2
나카지마
영어
70
3
시미즈
영어
55
1
sato
Math
65
2
tahakashi
Math
45
3
이시이
Math
40
1
morita
과학
85
2
tahakashi
과학
60
실행된 SQL
select
(select count(*)+1 from テストの成績表
where 科目 = x.科目 and 点数 > x.点数
) as 'No.'
, 名前, 科目, 点数
from テストの成績表 as x
order by x.科目, x.点数 desc
;
해설
과목과 점수로 정렬하고 싶으므로 일단
order by x.科目, x.点数 desc
합니다."과목마다 일련번호"란, 즉 "같은 과목 안에 점수가 높은 레코드가 몇 건 있을까"라고도 말할 수 있으므로, 서브 쿼리 부분은 이렇게 됩니다
select count(*)+1 from テストの成績表
where
(比較対象の)科目 = x.(自分の)科目
and (比較対象の)点数 > x.(自分の)点数
하는 일은 조금 전과 같습니다. 과목이 일치하는지 여부를 보면 일련 번호를 재설정 할 수 있다는 카라 쿠리입니다
요약
row_number()
를 사용할 수 없어도 일련 번호를 흔들 수 있습니다.
다만, 테이블의 스캔이 2회가 되므로, row_number()
가 있다면, 솔직하게 row_number()
를 사용하는 것이 퍼포먼스는 올라갑니다.
그렇다고는 해도, 생각의 하나로서, 알아 두어도 좋을까라고 생각합니다.
덤
참고문헌
웹사이트
SQL 아타마 아카데미
제1회 연속번호의 특성을 이용하여 데이터 조작을 보다 자유롭게 SQL로 연속번호를 취급한다
(2) 행 집합에 일련 번호 지정
h tp // 기효. jp/에서 v/세리아 l/01/sql_아카로 my2/000102
책
SQL 실습 입문 ── 빠르고 이해하기 쉬운 쿼리 작성 WEB+DB PRESS plus
2015년 4월 11일 발매
믹의 저
h tp // 기효. jp/보오 k/2015/978ー4ー7741ー7301ー6
샘플 데이터
이번 샘플 데이터를 생성한 create table문과 insert문은 이쪽
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);
Reference
이 문제에 관하여(【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mtanabe/items/f6d567ae51caf5ad3eb3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
참고문헌
웹사이트
SQL 아타마 아카데미
제1회 연속번호의 특성을 이용하여 데이터 조작을 보다 자유롭게 SQL로 연속번호를 취급한다
(2) 행 집합에 일련 번호 지정
h tp // 기효. jp/에서 v/세리아 l/01/sql_아카로 my2/000102
책
SQL 실습 입문 ── 빠르고 이해하기 쉬운 쿼리 작성 WEB+DB PRESS plus
2015년 4월 11일 발매
믹의 저
h tp // 기효. jp/보오 k/2015/978ー4ー7741ー7301ー6
샘플 데이터
이번 샘플 데이터를 생성한 create table문과 insert문은 이쪽
create table testScore(name varchar(30), subject varchar(100), score integer);
insert into testScore(name, subject, score) values("sato", "Math", 65);
insert into testScore(name, subject, score) values("morita", "Science", 85);
insert into testScore(name, subject, score) values("tahakashi", "Math", 45);
insert into testScore(name, subject, score) values("ishii", "English", 75);
insert into testScore(name, subject, score) values("ishii", "Math", 40);
insert into testScore(name, subject, score) values("tahakashi", "Science", 60);
insert into testScore(name, subject, score) values("shimizu", "English", 55);
insert into testScore(name, subject, score) values("nakajima", "English", 70);
Reference
이 문제에 관하여(【SQL】row_number가 없는 MySQL에서 사용자 변수를 사용하지 않고 일련 번호를 흔들어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mtanabe/items/f6d567ae51caf5ad3eb3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)