在SQL中,如何从SELECT * FROM ...中排除结果?

时间:2010-12-29 22:40:33

标签: mysql select

我知道我的标题不是很具描述性......让我在这里详细解释。

假设一个表有26个字段。例如field_a ... field_z。我只想要一个选择查询只返回15个字段。

所以,通常,我会做SELECT field_a,field_b ... field_o FROM myTable。

这很繁琐。在MYSQL中是否有一种方法可以做SELECT *并告诉它不要返回某些字段?

e.g。如SELECT * exclude(field_p,field_q .. field_z)FROM myTable?


谢谢大家的答案。 :)

6 个答案:

答案 0 :(得分:4)

SELECT * is evil.

你永远不应该在生产代码中使用它。

您应该始终指定要返回的列,如下所示:

SELECT `column1`, `column2`, `someothercolumn`
FROM `myTable`

与往常一样,the documentation可以帮助实现细节!

答案 1 :(得分:3)

SQL本身不支持您要求的功能。 (如果确实如此,它会遇到与select *相同的问题。请参阅其他评论)

这是我在使用MySQL时所做的事情:

  1. 启动mysql命令行客户端
  2. 执行describe my_table
  3. 复制字段列(鼠标选择)
  4. 中的数据
  5. 在我的编辑器(TextPad)中粘贴数据
  6. 手动删除我不需要的列
  7. 运行一个宏,用新行替换逗号(并插入表别名)
  8. 总而言之,无论列数如何,创建选择列表大约需要20-30秒。这样可以确保我不会拼错或遗忘任何列。

答案 2 :(得分:2)

delimiter //
DROP PROCEDURE IF EXISTS `getColumnNames`//
CREATE PROCEDURE `getColumnNames` (db_name CHAR(255), t_name CHAR(255), ex_name CHAR(255))
BEGIN
SELECT group_concat(column_name) FROM `information_schema`.`COLUMNS` C 
WHERE
table_schema = db_name
AND
table_name = t_name
AND 
column_name not in (ex_name)
GROUP BY table_schema,table_name;
END

//
delimiter ;


call getColumnNames("Db_name", "tbl_name", "col_to_exclude");

答案 3 :(得分:1)

不使用您想要的字段(即使您想要所有字段,也请选择* shouold不会出现在生产代码中)。我不知道mySQL,但在SQL Server中我可以拖放列,这使得它易于指定,有没有办法通过拖放来减少这种繁琐?

答案 4 :(得分:1)

没有办法做到这一点,因为无论如何,'SELECT *'在生产环境中是一个坏主意。想想如果存在这样的事情就需要做的所有额外错误捕获 - 如果表中不存在排除字段会怎么样?这会造成错误吗?警告?

列举所有字段确实很乏味,但这是正确的方法。它使您的代码(更多一点)自我记录,并有助于在周期的早期停止错误。例如,如果'user_name'由于某种原因最终被重命名为'username',那么SQL语句将失败,并且您的代码中没有奇怪的数据等待跟踪。

答案 5 :(得分:0)

我希望没有办法做到这一点。即使有一个,我建议不要使用它。

种类的解决方案是创建一个排除您想要排除的行的视图,并且可以从视图中选择*。