连接两张表时可使用SELECT *吗?指定SQL查询是否有效?
关于多表查询中使用
*的问题解答 没问题,咱们一步步把这个事儿说清楚:
1. 多表连接时能不能用*?
完全可以!用SELECT *在多表连接场景下,会返回参与连接的所有表的全部字段。不过这里要提一个常见的坑:如果两张表有同名字段(比如你例子里的h_id),查询结果里会出现两个同名的列,这时候如果是在程序里读取结果,很多语言的数据库驱动会只保留最后一个同名字段的值,或者直接抛出异常,这一点要特别注意。
2. 你给出的查询语句是否有效?
你的这条语句:
Select * from hospital,favorite Where hospital.h_id=favorite.h_id AND favorite.u_id=$uid;
是完全有效的!它属于SQL里的隐式内连接写法(用逗号分隔两张表,通过WHERE子句指定关联条件),功能和显式的INNER JOIN写法完全等价:
SELECT * FROM hospital INNER JOIN favorite ON hospital.h_id = favorite.h_id WHERE favorite.u_id = $uid;
这条语句会返回所有满足「hospital和favorite的h_id匹配」且「favorite的u_id等于指定值$uid」的记录,包含两张表的所有字段。
3. 实用建议:尽量避免在生产环境用SELECT *
虽然*用起来省事,但在实际项目里更推荐明确写出需要的字段,原因有这几个:
- 性能优化:只查询业务需要的字段,减少数据库的数据传输量,尤其是当表包含大字段(比如长文本、二进制数据)时,效果会很明显
- 避免意外:如果后续表结构变更(比如新增字段),
SELECT *会自动把新字段也查出来,可能导致程序处理逻辑出错(比如前端页面多了不需要的字段,或者程序依赖的字段顺序被打乱) - 解决同名字段冲突:可以给字段加别名,比如
hospital.h_id AS hospital_hid,这样在结果里就能清晰区分不同表的同名字段了
内容的提问来源于stack exchange,提问作者Kapil Kumawat
相关产品推荐
相关产品推荐

