【问题标题】:Select data from "show tables" MySQL query从“显示表”MySQL 查询中选择数据
【发布时间】:2010-09-09 01:22:47
【问题描述】:

是否可以在 MySQL 中从show tables 中进行选择?

SELECT * FROM (SHOW TABLES) AS `my_tables`

一些类似的东西,虽然上面不起作用(至少在 5.0.51a 上)。

【问题讨论】:

    标签: mysql sql metadata


    【解决方案1】:

    您是否考虑过查询 INFORMATION_SCHEMA.Tables?如

    SELECT ic.Table_Name,
        ic.Column_Name,
        ic.data_Type,
        IFNULL(Character_Maximum_Length,'') AS `Max`,
        ic.Numeric_precision as `Precision`,
        ic.numeric_scale as Scale,
        ic.Character_Maximum_Length as VarCharSize,
        ic.is_nullable as Nulls, 
        ic.ordinal_position as OrdinalPos, 
        ic.column_default as ColDefault, 
        ku.ordinal_position as PK,
        kcu.constraint_name,
        kcu.ordinal_position,
        tc.constraint_type
    FROM INFORMATION_SCHEMA.COLUMNS ic
        left outer join INFORMATION_SCHEMA.key_column_usage ku
            on ku.table_name = ic.table_name
            and ku.column_name = ic.column_name
        left outer join information_schema.key_column_usage kcu
            on kcu.column_name = ic.column_name
            and kcu.table_name = ic.table_name
        left outer join information_schema.table_constraints tc
            on kcu.constraint_name = tc.constraint_name
    order by ic.table_name, ic.ordinal_position;
    

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案2】:

    我想你想要SELECT * FROM INFORMATION_SCHEMA.TABLES

    http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    • 这在 Windows 上给出了小写的表名,而SHOW TABLES 给出了指定的大小写。
    【解决方案3】:

    我认为你想要的是 MySQL 的 information_schema 视图: http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案4】:
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    

    这应该是一个好的开始。更多信息,请查看INFORMATION_SCHEMA Tables

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案5】:

    我不明白你为什么要在声明中使用SELECT * FROM

    12.5.5.30. SHOW TABLES Syntax

    【讨论】:

    • OP 想要从 SHOW TABLES 返回的表中提取数据,但没有关于表本身的信息。
    【解决方案6】:

    据我所知,除非您像其他人提到的那样从INFORMATION_SCHEMA 中选择。

    不过,SHOW 命令非常灵活, 例如:

    SHOW tables like '%s%'
    

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案7】:
    SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
    

    这将返回对 myTable.myColumnName 的评论

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案8】:

    是的,SELECT from table_schema 对于系统管理可能非常有用。如果你有很多服务器、数据库、表……有时你需要删除或更新一堆元素。例如,为 DROP 所有带有前缀名称“wp_old_...”的表创建查询:

    SELECT concat('DROP TABLE ', table_name, ';') FROM INFORMATION_SCHEMA.TABLES
    WHERE table_schema = '*name_of_your_database*'
    AND table_name LIKE 'wp_old_%';
    

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案9】:

    在MySql 5.1你可以试试

    show tables like 'user%';
    

    输出:

    mysql> show tables like 'user%';
    
    +----------------------------+
    
    | Tables_in_test (user%) |
    
    +----------------------------+
    
    | user                       |
    
    | user_password              |
    
    +----------------------------+
    
    2 rows in set (0.00 sec)
    

    【讨论】:

    • 这会为您提供有关表格的(元)信息,而不是 OP 的预期内容。
    【解决方案10】:

    您不能像示例中那样将 SHOW 语句放在子查询中。唯一可以进入子查询的语句是SELECT

    正如其他答案所述,您可以直接使用 SELECT 查询 INFORMATION_SCHEMA,并获得更大的灵活性。

    MySQL 的 SHOW 语句在内部只是针对 INFORMATION_SCHEMA 表的查询。

    用户@physicalattraction 已在大多数其他答案上发表了此评论:

    这为您提供有关表格的(元)信息,而不是表格的内容,正如 OP 所期望的那样。 – 物理吸引力

    相反,OP 的问题确实没有说他们想要选择所有表中的数据。他们说他们想从SHOW TABLES的结果中进行选择,这只是一个表名列表。

    如果 OP 确实想从所有表中选择所有数据,那么答案是否定的,你不能用一个查询来做到这一点。每个查询都必须明确命名其表。您不能使表名成为变量或同一查询的另一部分的结果。此外,给定查询结果的所有行必须具有相同的列。

    因此,从所有表中选择所有数据的唯一方法是运行 SHOW TABLES,然后针对该结果中命名的每个表,运行另一个查询。

    【讨论】:

      【解决方案11】:

      你可能比你想象的更接近——SHOW TABLES 的行为已经很像 SELECT 语句。这是一个PHP 示例,说明如何获取它的“行”:

      $pdo = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
      foreach ($pdo->query("SHOW TABLES") as $row) {
          print "Table $row[Tables_in_$dbname]\n";
      }
      

      SHOW TABLES 的行为类似于单列表上的 SELECT。该列名称是Tables_in_ 加上数据库名称。

      【讨论】:

        【解决方案12】:

        计数:

        SELECT COUNT(*) as total FROM (SELECT TABLE_NAME as tab, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY tab) tables;
        

        要列出:

        SELECT TABLE_NAME as table, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY table;
        

        【讨论】:

          【解决方案13】:

          您可以创建一个存储过程并将表名放在游标中,然后遍历表名以显示数据。

          存储过程入门: http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx

          创建游标: http://www.mysqltutorial.org/mysql-cursor/

          例如,

          CREATE PROCEDURE `ShowFromTables`()
          BEGIN
          
          DECLARE v_finished INTEGER DEFAULT 0;
          DECLARE c_table varchar(100) DEFAULT "";
          
          DECLARE table_cursor CURSOR FOR 
          SELECT table_name FROM information_schema.tables WHERE table_name like 'wp_1%';
          
          DECLARE CONTINUE HANDLER 
              FOR NOT FOUND SET v_finished = 1;
          
          OPEN table_cursor;
          
          get_data: LOOP
          
          FETCH table_cursor INTO c_table;
          
          IF v_finished = 1 THEN 
          LEAVE get_data;
          END IF;
          
          SET @s=CONCAT("SELECT * FROM ",c_table,";");
          
          PREPARE stmt FROM @s;
          EXECUTE stmt;
          DEALLOCATE PREPARE stmt;
          
          END LOOP get_data;
          
          CLOSE table_cursor;
          
          END
          

          然后调用存储过程:

          CALL ShowFromTables();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-28
            • 1970-01-01
            • 2019-03-16
            • 1970-01-01
            相关资源
            最近更新 更多