🐒
[DB]where句のinで値が重複した場合の挙動
where句のinで値が重複した場合ってどうなるんだっけ? とふと思ったのでお試し実行してみました
概要
- where句のinで値が重複した場合の挙動確認
環境
- Oracle Database 11g (11.2.0.2.0 64bit)
→ 古いですが、環境による影響は出ない内容の認識
事前準備
お試し実行用のテーブル作成DDL
t_class
create table t_class (
id number not null
, class varchar2(256) not null
, teacher_name varchar2(256) not null
, constraint t_class_pk primary key (id)
) ;
t_student
create table t_student (
id number not null
, name varchar2(256) not null
, class varchar2(256) not null
, total_score int not null
, constraint t_student_pk primary key (id)
) ;
お試し実行用のデータ挿入DML
t_class
insert into t_class values (1, 'a', '積木泰介');
insert into t_class values (2, 'b', '千草元');
insert into t_class values (3, 'b', '堤康子');
insert into t_class values (4, 'c', '小林友恵');
-- 結果確認用
select * from t_class;
t_student
insert into t_student values (1, '田中健太', 'a', 450);
insert into t_student values (2, '鈴木幸子', 'b', 400);
insert into t_student values (3, '中山亮', 'a', 470);
insert into t_student values (4, '加藤美弥', 'c', 320);
insert into t_student values (5, '沢木里穂', 'b',380);
insert into t_student values (6, '久納桂', 'b', 420);
-- 結果確認用
select * from t_student;
本題
事前準備の通り、t_classテーブルにclass bのレコードが2件存在する状態で、以下のようにclassごとの生徒数をカウントおよび合計(SUM)するとどうなるか?というお話。
count
まずは、カウントから
確認用SQL①(count)
select class, count(*) as count from t_student
where class in (select class from t_class)
group by class;
-- 上記は以下と同義
select class, count(*) as count from t_student
where class in ('a', 'b', 'b', 'c')
group by class;
実行結果は以下の通り
実行結果
CLASS COUNT
a 2
b 3
c 1
t_classテーブルに、classがbのレコードが2件あるからといって、classごとの生徒数まで、3×2 = 6になることはありませんでした(逆に、そうなったら困りますね)
sum
続いて、合計(SUM)
確認用SQL②(sum)
select class, sum(total_score) as sum from t_student
where class in (select class from t_class)
group by class;
-- 上記は以下と同義
select class, sum(total_score) as sum from t_student
where class in ('a', 'b', 'b', 'c')
group by class;
実行結果
CLASS SUM
a 920
b 1200
c 320
こちらも、t_classテーブルに、classがbのレコードが2件あるからといって、classごとの生徒数まで、1200×2 = 2400になることはありませんでした
後片付け用DDL
最後に作成した確認用テーブルたちを削除して終了です
後片付け用DDL
-- t_classの削除
drop table t_class;
-- t_studentの削除
drop table t_student;
終わりに
疑問が解決してスッキリしました
初歩的な内容で、ごめんなさい
Discussion