乐趣区

关于mysql:在MySQL里写个生成select语句的SQL

最近遇到一个需要,一个表里有 50 个字段左右。我须要写一个详情接口,把这些字段都查出来。我想这很简略呀,我间接 select * 不就好了嘛。于是我就这样干了

select * from foo;

嗯,仿佛很完满,然而忽然发现,这个表里有个敏感字段的内容是不能输入的,也就是我得从其中去掉一个字段。那就麻烦了,我可不想 select column1,column2,column3,column4, 这样一个个写,要是这样一个个的写完,这么多的字段,我手都得残废了。我就想能不能写个 SQL 来主动拼接字段名称。答案当然是能够的,咱们来看看这个 SQL

select GROUP_CONCAT(concat('`', COLUMN_NAME,'`')) from information_schema.`COLUMNS`
    where TABLE_SCHEMA='dbname' and TABLE_NAME='tablename';

对的,就这样就能够了。这下难受了。
当然 SQL 语句后面的 select 前面 from 和 where 就依据本人的理论须要来补充了。

简略阐明一下,应用下面 SQL 的时候要把 dbname 换成你的数据库的名称,tablename 换成表名。比方咱们查 wordpress 的 wp_user 表。

mysql> select GROUP_CONCAT(concat('`', COLUMN_NAME,'`')) from information_schema.`COLUMNS` where TABLE_SCHEMA='blog' and TABLE_NAME='wp_users';
+--------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(concat('`', COLUMN_NAME,'`'))                                                                                                 |
+--------------------------------------------------------------------------------------------------------------------------------------------+
| `ID`,`user_login`,`user_pass`,`user_nicename`,`user_email`,`user_url`,`user_registered`,`user_activation_key`,`user_status`,`display_name` |
+--------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

有人说,要不要解析一下这个 SQL。好的,这就解析一下

  1. 从 information_schema.COLUMNS 这个表里把所有的字段名称查出来,就是 COLUMN_NAME 这个字段。
  2. 通过 concat 函数,给字段名前后加上 ` 这个字符
  3. 通过 group_concat 这个函数,拼接成一行。
退出移动版