web-dev-qa-db-fra.com

Sélectionnez les données de la requête MySQL "show tables"

Est-il possible de sélectionner show tables Dans MySQL?

SELECT * FROM (SHOW TABLES) AS `my_tables`

Quelque chose dans ce sens, bien que ce qui précède ne fonctionne pas (du moins le 5.0.51a).

52
BioTronic

Je pense que tu veux SELECT * FROM INFORMATION_SCHEMA.TABLES

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

42
Andrew

Pas que je sache, à moins que vous ne choisissiez parmi INFORMATION_SCHEMA, Comme d'autres l'ont mentionné.

Cependant, la commande SHOW est assez flexible, par exemple:

SHOW tables like '%s%'
20
Lucas Oman

Compter:

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

Lister:

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

Vous êtes peut-être plus proche que vous ne le pensez - SHOW TABLES se comporte déjà beaucoup comme SELECT:

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

Avez-vous examiné la possibilité d'interroger INFORMATION_SCHEMA.Tables? Un péché

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;
4
BigJim

Vous ne pouvez pas mettre les instructions SHOW dans une sous-requête, comme dans votre exemple. La seule instruction pouvant figurer dans une sous-requête est SELECT.

Comme d'autres réponses l'ont indiqué, vous pouvez interroger INFORMATION_SCHEMA directement avec SELECT et obtenir ainsi beaucoup plus de flexibilité.

Les instructions SHOW de MySQL ne sont que des requêtes internes sur les tables INFORMATION_SCHEMA.

L'utilisateur @physicalattraction a posté ce commentaire sur la plupart des autres réponses:

Cela vous donne des informations (méta) sur les tables, pas sur leur contenu, comme prévu par le PO. - attraction physique

Au contraire, la question de l'OP dit pas qu'ils veulent sélectionner les données dans toutes les tables. Ils disent qu'ils veulent choisir parmi le résultat de SHOW TABLES, qui n'est qu'une liste de noms de tables.

Si l'OP souhaite sélectionner toutes les données de toutes les tables, la réponse est non, vous ne pouvez pas le faire avec une seule requête. Chaque requête doit nommer explicitement ses tables. Vous ne pouvez pas faire d'un nom de table une variable ou le résultat d'une autre partie de la même requête. De même, toutes les lignes d'un résultat de requête donné doivent avoir les mêmes colonnes.

Donc, le seul moyen de sélectionner toutes les données de toutes les tables serait d’exécuter SHOW TABLES puis, pour chaque table nommée dans ce résultat, exécutez une autre requête.

4
Bill Karwin

Vous pouvez créer une procédure stockée et placer les noms de table dans un curseur, puis parcourir les noms de table pour afficher les données.

Premiers pas avec la procédure stockée: http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx

Création d'un curseur: http://www.mysqltutorial.org/mysql-cursor/

Par exemple,

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

Appelez ensuite la procédure stockée:

CALL ShowFromTables();
3
Bridget Arrington
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'

Ceci renverra le commentaire sur: myTable.myColumnName

3
Brian

Je pense que ce que vous voulez, c’est la vue information_schema de MySQL: http://dev.mysql.com/doc/refman/5.0/fr/tables-table.html

3
Matt Rogish
SELECT * FROM INFORMATION_SCHEMA.TABLES

Cela devrait être un bon début. Pour plus d'informations, consultez Tables INFORMATION_SCHEMA .

3
Sören Kuklau

dans MySQL 5.1, vous pouvez essayer

show tables like 'user%';

sortie:

mysql> show tables like 'user%';

+----------------------------+

| Tables_in_test (user%) |

+----------------------------+

| user                       |

| user_password              |

+----------------------------+

2 rows in set (0.00 sec)
2
MT467

Oui, SELECT from table_schema pourrait être très utile pour l’administration du système. Si vous avez beaucoup de serveurs, bases de données, tables ... parfois vous avez besoin de DROP ou UPDATE tas d'éléments. Par exemple, pour créer une requête pour DROP, toutes les tables portant le préfixe "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_%';
2
Srdjan

Je ne comprends pas pourquoi vous voulez utiliser SELECT * FROM dans le cadre de la déclaration.

12.5.5.30. Syntaxe de SHOW TABLES

1
Derek B. Bell