Можно ли выбрать из show tables
в MySQL?
SELECT * FROM (SHOW TABLES) AS `my_tables`
Что-то в этих строках, хотя выше не работает (по крайней мере 5.0.51a).
Можно ли выбрать из show tables
в MySQL?
SELECT * FROM (SHOW TABLES) AS `my_tables`
Что-то в этих строках, хотя выше не работает (по крайней мере 5.0.51a).
Я думаю, что вы хотите SELECT * FROM INFORMATION_SCHEMA.TABLES
См. http://dev.mysql.com/doc/refman/5.0/en/tables-table.html
Не знаю, о чем я знаю, если вы не выберите из INFORMATION_SCHEMA
, как упомянули другие.
Однако команда SHOW
довольно гибкая,
Например:.
SHOW tables like '%s%'
Считать:
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;
Вы заглянули в запрос 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;
Я думаю, что вы хотите, это представление MySQL information_schema: http://dev.mysql.com/doc/refman/5.0/en/tables-table.html
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
Это вернет комментарий: myTable.myColumnName
Вы не можете поместить выражения SHOW
внутри подзапроса, как в вашем примере. Единственным утверждением, которое может быть в подзапросе, является SELECT
.
Как указывалось в других ответах, вы можете напрямую запросить информацию INFORMATION_SCHEMA с помощью SELECT
и получить гораздо больше гибкости.
Операторы MySQL SHOW
представляют собой внутренние запросы к таблицам INFORMATION_SCHEMA.
Пользователь @physicalattraction опубликовал этот комментарий к большинству других ответов:
Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как это предполагал ОП. - физическая аттракция
Напротив, вопрос OP не говорит, что они хотят выбирать данные во всех таблицах. Говорят, что они хотят выбрать из результата SHOW TABLES
, который является всего лишь списком имен таблиц.
Если OP хочет выбрать все данные из всех таблиц, тогда ответ будет отрицательным, вы не можете сделать это с одним запросом. Каждый запрос должен явно указывать свои таблицы. Вы не можете сделать имя таблицы переменной или результатом другой части того же запроса. Кроме того, все строки заданного результата запроса должны иметь одинаковые столбцы.
Таким образом, единственный способ выбрать все данные из всех таблиц - запустить SHOW TABLES
, а затем для каждой таблицы, названной в этом результате, запустить другой запрос.
Вы можете быть ближе, чем вы думаете. SHOW TABLES уже ведет себя так же, как 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";
}
SELECT * FROM INFORMATION_SCHEMA.TABLES
Это должно быть хорошим началом. Подробнее см. Таблицы INFORMATION_SCHEMA.
Я не понимаю, почему вы хотите использовать SELECT * FROM
как часть инструкции.
Да, SELECT из table_schema может быть очень полезным для системного администрирования. Если у вас много серверов, баз данных, таблиц... иногда вам нужно DROP или UPDATE группировать элементы. Например, чтобы создать запрос для 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_%';
в 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)
Вы можете создать хранимую процедуру и поместить имена таблиц в курсор, а затем пронумеровать имена таблиц, чтобы показать данные.
Начало работы с хранимой процедурой: 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();