Выберите данные из запроса MySQL "показать таблицы"

Можно ли в MySQL выбрать show tables?

SELECT * FROM (SHOW TABLES) AS `my_tables`

Что-то в этом роде, хотя вышеперечисленное не работает (по крайней мере, на 5.0.51a).

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
58
0
172 629
13

Ответы 13

Вы изучали запросы к таблицам INFORMATION_SCHEMA.? Как в

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.

physicalattraction 13.04.2015 13:25

Я думаю тебе нужен SELECT * FROM INFORMATION_SCHEMA.TABLES

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

Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как предполагал OP.

physicalattraction 13.04.2015 13:25

Это дает имена таблиц в нижнем регистре в Windows, в то время как SHOW TABLES дает указанный регистр.

AndreKR 04.01.2017 20:05

Я думаю, что вам нужно представление MySQL information_schema: http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как предполагал OP.

physicalattraction 13.04.2015 13:27

SELECT * FROM INFORMATION_SCHEMA.TABLES

Это должно быть хорошим началом. Для получения дополнительной информации проверьте INFORMATION_SCHEMA Таблицы.

Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как предполагал OP.

physicalattraction 13.04.2015 13:27

Я не понимаю, почему вы хотите использовать SELECT * FROM как часть заявления.

12.5.5.30. ПОКАЗАТЬ ТАБЛИЦЫ Синтаксис

OP хочет извлечь данные из таблиц, возвращаемых SHOW TABLES, но не иметь информации о самих таблицах.

physicalattraction 13.04.2015 13:27

Не то, чтобы я знал, если вы не выберете INFORMATION_SCHEMA, как упоминали другие.

Однако команда SHOW довольно гибкая, Например.:

SHOW tables like '%s%'

Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как предполагал OP.

physicalattraction 13.04.2015 13:28

SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'

Это вернет комментарий к: myTable.myColumnName

Это дает вам (мета) информацию о таблицах, а не о содержимом таблицы, как предполагал OP.

physicalattraction 13.04.2015 13:25

Да, 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.

physicalattraction 13.04.2015 13:26

в 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.

physicalattraction 13.04.2015 13:28

Вы не можете помещать операторы SHOW в подзапрос, как в вашем примере. Единственный оператор, который может входить в подзапрос, - это SELECT.

Как указывалось в других ответах, вы можете запросить INFORMATION_SCHEMA напрямую с SELECT и получить таким образом гораздо больше гибкости.

Операторы MySQL SHOW внутренне представляют собой просто запросы к таблицам INFORMATION_SCHEMA.

Пользователь @physicalattraction оставил этот комментарий к большинству других ответов:

This gives you (meta)information about the tables, not the contents of the table, as the OP intended. – 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 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;

Вы можете создать хранимую процедуру и поместить имена таблиц в курсор, а затем перебрать имена таблиц, чтобы отобразить данные.

Начало работы с хранимой процедурой: 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();

Другие вопросы по теме