You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MariaDB四表关联查询获取指定字段?

关联四张酒店表的SQL查询解决方案

嘿,作为数据库新手,要关联这四张表获取你需要的字段其实很简单,我先帮你理清楚表之间的关联关系,再给出对应的SQL语句。

首先先确认下四张表的结构信息:

表结构详情

transaksi表(交易表)

MariaDB [nava_hotel]> desc transaksi;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| kode_transaksi | varchar(10) | NO   | PRI | NULL    |       |
| kode_pemesanan | varchar(10) | YES  |     | NULL    |       |
| lama_menginap  | int(3)      | YES  |     | NULL    |       |
| total          | bigint(20)  | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

pemesanan表(预订表)

MariaDB [nava_hotel]> desc pemesanan;
+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| kode_pemesanan | varchar(10) | NO   | PRI | NULL    |       |
| kode_tamu      | varchar(10) | YES  |     | NULL    |       |
| kode_kamar     | varchar(10) | YES  |     | NULL    |       |
| tgl_checkin    | datetime    | YES  |     | NULL    |       |
| tgl_checkout   | datetime    | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

tamu表(客人表)

MariaDB [nava_hotel]> desc tamu;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| kode_tamu | varchar(10) | NO   | PRI | NULL    |       |
| nama      | varchar(30) | YES  |     | NULL    |       |
| alamat    | text        | YES  |     | NULL    |       |
| telepon   | varchar(15) | YES  |     | NULL    |       |
| email     | varchar(20) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

kamar表(房间表)

MariaDB [nava_hotel]> desc kamar;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| kode_kamar  | varchar(10) | NO   | PRI | NULL    |       |
| jenis_kamar | varchar(20) | YES  |     | NULL    |       |
| fasilitas   | text        | YES  |     | NULL    |       |
| harga       | bigint(20)  | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

关联查询SQL语句

表之间的关联逻辑是:transaksi通过kode_pemesanan关联pemesanan,pemesanan又分别通过kode_tamu关联tamu、kode_kamar关联kamar。下面给你两种常用的查询方式:

方式1:只返回全关联匹配的记录(INNER JOIN)

这种方式只会保留所有表中都有对应关联数据的记录,适合你只需要完整交易-预订-客人-房间信息的场景:

SELECT 
    t.kode_transaksi,
    p.kode_pemesanan,
    p.kode_kamar,
    k.jenis_kamar,
    p.kode_tamu,
    tm.nama
FROM transaksi t
INNER JOIN pemesanan p ON t.kode_pemesanan = p.kode_pemesanan
INNER JOIN kamar k ON p.kode_kamar = k.kode_kamar
INNER JOIN tamu tm ON p.kode_tamu = tm.kode_tamu;

方式2:保留所有交易记录(LEFT JOIN)

如果有些交易可能还没有关联的预订信息,或者预订信息缺少客人/房间数据,你想保留这些交易记录的话,可以用LEFT JOIN,缺失的字段会显示为NULL:

SELECT 
    t.kode_transaksi,
    p.kode_pemesanan,
    p.kode_kamar,
    k.jenis_kamar,
    p.kode_tamu,
    tm.nama
FROM transaksi t
LEFT JOIN pemesanan p ON t.kode_pemesanan = p.kode_pemesanan
LEFT JOIN kamar k ON p.kode_kamar = k.kode_kamar
LEFT JOIN tamu tm ON p.kode_tamu = tm.kode_tamu;

我给每个表都起了短别名(比如t代表transaksi),这样写起来更简洁,也避免了不同表中字段名重复的问题,你可以直接复制这些语句去执行哦~

内容的提问来源于stack exchange,提问作者APSB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:29