🐒

[DB]where句のinで値が重複した場合の挙動

2022/05/26に公開

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