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).
Je pense que tu veux SELECT * FROM INFORMATION_SCHEMA.TABLES
Voir http://dev.mysql.com/doc/refman/5.0/fr/tables-table.html
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%'
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;
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";
}
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;
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.
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();
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
Ceci renverra le commentaire sur: myTable.myColumnName
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
SELECT * FROM INFORMATION_SCHEMA.TABLES
Cela devrait être un bon début. Pour plus d'informations, consultez Tables INFORMATION_SCHEMA .
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)
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_%';
Je ne comprends pas pourquoi vous voulez utiliser SELECT * FROM
dans le cadre de la déclaration.