È possibile selezionare da show tables
in MySQL?
SELECT * FROM (SHOW TABLES) AS `my_tables`
Qualcosa del genere, anche se quanto sopra non funziona (almeno su 5.0.51a).
Penso che tu voglia SELECT * FROM INFORMATION_SCHEMA.TABLES
Vedi http://dev.mysql.com/doc/refman/5.0/en/tables-table.html
Non che io sappia, a meno che non selezioni da INFORMATION_SCHEMA
, come altri hanno già detto.
Tuttavia, il comando SHOW
è piuttosto flessibile, ad es .:
SHOW tables like '%s%'
Contare:
SELECT COUNT(*) as total FROM (SELECT TABLE_NAME as tab, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY tab) tables;
Elencare:
SELECT TABLE_NAME as table, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY table;
Potresti essere più vicino di quanto pensi - SHOW TABLES si comporta già in modo molto simile a 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";
}
Hai esaminato la query di INFORMATION_SCHEMA.Tables? Come in
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;
Non puoi inserire SHOW
istruzioni in una sottoquery come nel tuo esempio. L'unica istruzione che può andare in una sottoquery è SELECT
.
Come indicato da altre risposte, è possibile eseguire una query di INFORMATION_SCHEMA direttamente con SELECT
e ottenere molta più flessibilità in questo modo.
Le istruzioni SHOW
di MySQL sono internamente solo query rispetto alle tabelle INFORMATION_SCHEMA.
L'utente @physicalattraction ha pubblicato questo commento sulla maggior parte delle altre risposte:
Ciò fornisce (meta) informazioni sulle tabelle, non sul contenuto della tabella, come previsto dall'OP. - attrazione fisica
Al contrario, la domanda del PO non dice che vogliono selezionare i dati in tutte le tabelle. Dicono che vogliono selezionare dal risultato di SHOW TABLES
, che è solo un elenco di nomi di tabelle.
Se l'OP desidera selezionare tutti i dati da tutte le tabelle, la risposta è no, non è possibile farlo con una query. Ogni query deve denominare le proprie tabelle in modo esplicito. Non è possibile rendere un nome di tabella una variabile o il risultato di un'altra parte della stessa query. Inoltre, tutte le righe di un determinato risultato della query devono avere le stesse colonne.
Quindi l'unico modo per selezionare tutti i dati da tutte le tabelle sarebbe eseguire SHOW TABLES
e quindi per ogni tabella denominata in quel risultato, eseguire un'altra query.
È possibile creare una procedura memorizzata e posizionare i nomi delle tabelle in un cursore, quindi scorrere i nomi delle tabelle per mostrare i dati.
Introduzione alla procedura memorizzata: http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx
Creazione di un cursore: http://www.mysqltutorial.org/mysql-cursor/
Per esempio,
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
Quindi chiamare la procedura memorizzata:
CALL ShowFromTables();
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
Questo restituirà il commento su: myTable.myColumnName
Penso che ciò che vuoi siano le viste di information_schema di MySQL: http://dev.mysql.com/doc/refman/5.0/en/tables-table.html
SELECT * FROM INFORMATION_SCHEMA.TABLES
Questo dovrebbe essere un buon inizio. Per ulteriori informazioni, seleziona INFORMATION_SCHEMA Tables .
in MySql 5.1 puoi provare
show tables like 'user%';
scita:
mysql> show tables like 'user%';
+----------------------------+
| Tables_in_test (user%) |
+----------------------------+
| user |
| user_password |
+----------------------------+
2 rows in set (0.00 sec)
Sì, SELECT da table_schema potrebbe essere molto utile per l'amministrazione del sistema. Se hai molti server, database, tabelle ... a volte devi DROP o AGGIORNARE un gruppo di elementi. Ad esempio per creare una query per DROP tutte le tabelle con il prefisso "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_%';
Non capisco perché vuoi usare SELECT * FROM
come parte dell'istruzione.