如何通过单条查询语句从多张数据表中获取数据?
如何用单条SQL语句从多张数据表中获取数据?
嘿,这个问题我熟!用单条SQL从多张表取数据核心就是多表连接操作,你给出的示例已经用到了其中一种方式,不过我来给你理清楚逻辑,再优化下写法,避免踩坑~
首先先看你给出的原始查询:
SELECT tbl_category.`cat_name` AS tbl_category_cat_name, registration.`firm_name` AS registration_firm_name, tbl_prod.`prod_name` AS tbl_prod_prod_name, tbl_prod.`prod_desc` AS tbl_prod_prod_desc, tbl_prod.`prod_size` AS tbl_prod_prod_size, tbl_prod.`prod_prate` AS tbl_prod_prod_prate, tbl_prod.`prod_mrp` AS tbl_prod_prod_mrp, tbl_prod.`prod_srate` AS tbl_prod_prod_srate, tbl_unit.`unit` AS tbl_unit_unit, tbl_brand.`bnd_name` AS tbl_brand_bnd_name FROM `tbl_category` tbl_category, `registration` registration, `tbl_prod` tbl_prod, `tbl_unit` tbl_unit, `tbl_brand` tbl_brand
这是用隐式内连接的写法——通过逗号分隔多张表,但这里有个大问题:你没加任何表之间的连接条件!这会导致数据库返回所有表行的笛卡尔积(也就是所有表的行互相组合),结果数据量会爆炸,几乎不可能是你想要的结果。
正确的多表查询步骤&优化写法
1. 先明确表之间的关联关系
首先你得搞清楚每张表之间的关联字段,比如:
tbl_prod(产品表)应该和tbl_category(分类表)有一个cat_id字段关联tbl_prod和tbl_unit(单位表)有unit_id关联tbl_prod和tbl_brand(品牌表)有bnd_id关联tbl_prod和registration(商家表)有firm_id关联
这些关联字段是写多表查询的核心基础。
2. 使用可读性更强的显式连接写法
现在行业内更推荐用INNER JOIN(内连接)这种显式写法,逻辑清晰,不容易遗漏连接条件。下面是基于你的需求优化后的查询:
SELECT tbl_category.cat_name AS category_name, registration.firm_name AS firm_name, tbl_prod.prod_name AS product_name, tbl_prod.prod_desc AS product_description, tbl_prod.prod_size AS product_size, tbl_prod.prod_prate AS product_purchase_rate, tbl_prod.prod_mrp AS product_mrp, tbl_prod.prod_srate AS product_sale_rate, tbl_unit.unit AS product_unit, tbl_brand.bnd_name AS brand_name FROM tbl_prod INNER JOIN tbl_category ON tbl_prod.cat_id = tbl_category.cat_id INNER JOIN registration ON tbl_prod.firm_id = registration.firm_id INNER JOIN tbl_unit ON tbl_prod.unit_id = tbl_unit.unit_id INNER JOIN tbl_brand ON tbl_prod.bnd_id = tbl_brand.bnd_id;
3. 用简化别名让SQL更简洁
你还可以给表起短别名,减少重复书写,让SQL更清爽:
SELECT c.cat_name AS category_name, r.firm_name AS firm_name, p.prod_name AS product_name, p.prod_desc AS product_description, p.prod_size AS product_size, p.prod_prate AS product_purchase_rate, p.prod_mrp AS product_mrp, p.prod_srate AS product_sale_rate, u.unit AS product_unit, b.bnd_name AS brand_name FROM tbl_prod p INNER JOIN tbl_category c ON p.cat_id = c.cat_id INNER JOIN registration r ON p.firm_id = r.firm_id INNER JOIN tbl_unit u ON p.unit_id = u.unit_id INNER JOIN tbl_brand b ON p.bnd_id = b.bnd_id;
几个关键注意事项
- 必须加连接条件:这是避免笛卡尔积的核心,一定要通过
ON子句(显式连接)或者WHERE子句(隐式连接)指定表之间的关联规则 - 字段加表前缀:如果不同表中有同名字段(比如多个表都有
id),一定要用表名/别名前缀区分,避免歧义 - 选择合适的连接类型:如果需要包含主表中没有匹配关联的行(比如某些产品还没分配分类),可以用
LEFT JOIN代替INNER JOIN
内容的提问来源于stack exchange,提问作者Umashankar Kusnure
相关产品推荐
相关产品推荐

