私は次のデータベースの例を持っています:
この例はほぼ自明です。定義された期間(time_start、time_end)に各期間に教師が開催するレッスンがあります->レッスン接続には独自のmax_students番号があります。
3つのテーブル(およびmax_students)のすべての情報を含むすべてのレッスンを一覧表示したいと思っています。私はそのようにします(そのようなテーブルに参加するのが最速の方法だと聞いた):
SELECT * FROM lesson, teacher, time, teacher_has_lesson, time_has_lesson
WHERE lesson.lesson_id = teacher_has_lesson.lesson_lesson_id
AND teacher.teacher_id = teacher_has_lesson.teacher_teacher_id
AND lesson.lesson_id = time_has_lesson.lesson_lesson_id
AND time.time_id = time_has_lesson.time_time_id
1.)これは、3つのテーブルを結合したいだけの場合、またはより良いテーブルがありますか?
2.)このSQL呼び出しは、教師と時間のあるレッスンのみを提供します。また、データベースにあるレッスンを表示したいのですが、まだ先生や時間を持っていません。どうやってやるの?
回答:
回答№1は1これを使用してこれを記述する別の方法があります join
構文。あなたが持っているものは inner join
、一致する行のみが表示されます:
select
*
from
lesson l
inner join
teacher_has_lesson tl
on l.lession_id = tl.lesson_lesson_id
inner join
teacher t
on tl.teacher_teacher_id = t.teacher_d
inner join
time_has_lesson tml
on l.lesson_id = tml.lesson_lesson_id
inner join
time tm
on tml.time_time_id = tm.time_ud
別のタイプの結合と呼ばれるものがあります outer join
、1つのテーブルのすべての行が表示され、他のテーブルに一致する値がない場合はnull値が提供されます。 2つまたは3つのバリエーションがあります。 left outer join
最初のテーブルのすべての行を表示します。 right outer join
2番目のテーブルのすべての行を表示します。 full outer join
両方のテーブルのすべての行を表示します。したがって、2番目のクエリでは次を使用できます。
select
*
from
lesson l
left outer join
teacher_has_lesson tl
on l.lession_id = tl.lesson_lesson_id
left outer join
teacher t
on tl.teacher_teacher_id = t.teacher_d
left outer join
time_has_lesson tml
on l.lesson_id = tml.lesson_lesson_id
left outer join
time tm
on tml.time_time_id = tm.time_ud