Как найти все таблицы базы данных, содержащие столбцы с определенным именем с помощью SQL-запросов LIKE?
Содержание
- Основной запрос INFORMATION_SCHEMA
- Специфические для баз данных подходы
- Использование шаблонов с LIKE
- Особенности учета регистра
- Оптимизация производительности
- Практические примеры
Основной запрос INFORMATION_SCHEMA
Наиболее универсальный метод для поиска таблиц, содержащих столбцы с определенными именами, использует представление INFORMATION_SCHEMA.COLUMNS, которое является частью стандарта SQL и доступно в большинстве систем баз данных. Этот подход позволяет искать по всей схеме вашей базы данных, не зная имен таблиц заранее.
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%ваш_поисковый_термин%';
Для более точной фильтрации можно добавить дополнительные условия:
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Ваше_Имя_Базы_Данных'
AND COLUMN_NAME LIKE '%ваш_поисковый_термин%'
AND DATA_TYPE IN ('varchar', 'nvarchar', 'char', 'nchar');
Как объясняется на SQL Authority с Pinal Dave, метод INFORMATION_SCHEMA очень эффективен для этой цели и хорошо работает в разных системах баз данных.
Специфические для баз данных подходы
Хотя INFORMATION_SCHEMA работает универсально, некоторые системы баз данных предлагают альтернативные подходы, которые могут обеспечить лучшую производительность или дополнительный функционал.
Microsoft SQL Server (sys.columns)
В SQL Server можно напрямую запрашивать представления системного каталога:
SELECT
c.name AS ColumnName,
t.name AS TableName
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%ваш_поисковый_термин%'
ORDER BY TableName, ColumnName;
Согласно GeeksforGeeks, этот подход может быть более эффективным, чем использование INFORMATION_SCHEMA в средах SQL Server.
PostgreSQL
PostgreSQL поддерживает как INFORMATION_SCHEMA, так и собственный системный каталог:
SELECT
table_name,
column_name
FROM information_schema.columns
WHERE column_name ILIKE '%ваш_поисковый_термин%'; -- ILIKE для поиска без учета регистра
Или с использованием системных каталогов:
SELECT
c.relname AS TableName,
a.attname AS ColumnName
FROM pg_attribute a
JOIN pg_class c ON a.attrelid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE a.attname LIKE '%ваш_поисковый_термин%'
AND c.relkind = 'r'; -- 'r' для обычных таблиц
MySQL
В MySQL можно использовать:
SELECT
TABLE_NAME,
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'ваше_имя_базы_данных'
AND COLUMN_NAME LIKE '%ваш_поисковый_термин%';
Использование шаблонов с LIKE
Оператор LIKE поддерживает несколько шаблонов с подстановочными знаками, что делает его мощным инструментом для поиска имен столбцов:
%- Соответствует любой последовательности из нуля или более символов_- Соответствует любому одиночному символу[]- Соответствует любому одиночному символу в указанном диапазоне
Распространенные шаблоны
-- Поиск столбцов, заканчивающихся на 'id'
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%id';
-- Поиск столбцов, начинающихся с 'user'
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE 'user%';
-- Поиск столбцов со словом 'date' в середине
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%date%';
-- Поиск столбцов ровно из 7 символов, где 4-й символ - 'n'
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '___n___';
Как демонстрирует ApexSQL, эти шаблоны особенно полезны, когда у вас есть неполная информация о структуре имени столбца.
Особенности учета регистра
Поведение LIKE с учетом регистра различается в разных системах баз данных:
Системы с учетом регистра (по умолчанию)
- MySQL: Учитывает регистр по умолчанию в Linux/Unix, не учитывает в Windows
- PostgreSQL: Учитывает регистр по умолчанию
- Oracle: Учитывает регистр по умолчанию
-- Поиск с учетом регистра
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE 'UserName%';
Варианты без учета регистра
Большинство систем предлагают альтернативы без учета регистра:
- SQL Server: Используйте
COLLATEилиUPPER()/LOWER() - PostgreSQL: Используйте
ILIKEвместоLIKE - MySQL: Используйте
LOWER()или настройте сортировку (collation)
-- Подходы без учета регистра
-- SQL Server
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE LOWER(COLUMN_NAME) LIKE LOWER('%username%');
-- PostgreSQL (с использованием ILIKE)
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME ILIKE '%username%';
Как отмечает LearnSQL.com, понимание особенностей учета регистра важно для получения точных результатов поиска в разных системах баз данных.
Оптимизация производительности
При поиске по большим базам данных становятся важны соображения производительности:
Вопросы индексации
Представление INFORMATION_SCHEMA.COLUMNS обычно не поддерживает индексацию, поэтому могут потребоваться сканирования больших таблиц. Для часто выполняемых поисков рассмотрите:
-- Создание временной таблицы для повторяющихся поисков
CREATE TEMPORARY COLUMN_SEARCH_TABLES AS
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%user%';
-- Затем запрос к временной таблице
SELECT * FROM COLUMN_SEARCH_TABLES
WHERE COLUMN_NAME LIKE '%admin%';
Ограничение области поиска
Уменьшите пространство поиска, добавив дополнительные фильтры:
-- Поиск только по определенным типам данных
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%'
AND DATA_TYPE IN ('varchar', 'nvarchar', 'text');
-- Поиск только по определенным схемам
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA IN ('dbo', 'public', 'schema1')
AND COLUMN_NAME LIKE '%timestamp%';
Практические примеры
Поиск столбцов, связанных с пользователями
-- Найти все столбцы со словом 'user' в имени
SELECT
TABLE_CATALOG as DatabaseName,
TABLE_SCHEMA as SchemaName,
TABLE_NAME as TableName,
COLUMN_NAME as ColumnName,
DATA_TYPE as DataType
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%user%'
ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME;
Поиск столбцов с адресами электронной почты
-- Найти столбцы, связанные с электронной почтой
SELECT
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%email%'
AND DATA_TYPE LIKE '%char%'
ORDER BY TABLE_NAME, COLUMN_NAME;
Поиск столбцов с датами/временем
-- Найти столбцы, связанные с датами, во всех базах данных
SELECT
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%date%'
OR COLUMN_NAME LIKE '%time%'
OR COLUMN_NAME LIKE '%created%'
OR COLUMN_NAME LIKE '%modified%'
ORDER BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME;
Эти примеры показывают, как оператор LIKE можно комбинировать с другими условиями для создания целенаправленных поиска определенных типов столбцов в схеме вашей базы данных.
Заключение
-
Подход INFORMATION_SCHEMA.COLUMNS является наиболее универсальным методом для поиска таблиц, содержащих столбцы с определенными именами, поддерживается в большинстве систем баз данных, включая MySQL, PostgreSQL, SQL Server и Oracle.
-
Шаблоны с подстановочными знаками с LIKE (
%,_,[]) предоставляют мощные возможности поиска для частичных совпадений имен столбцов, позволяя находить столбцы даже при наличии лишь части их имен. -
Существуют специфичные для баз данных оптимизации -
sys.columnsв SQL Server, системные каталоги PostgreSQL и реализация INFORMATION_SCHEMA в MySQL могут обеспечивать преимущества производительности в своих соответствующих средах. -
Учет регистра различается в зависимости от системы баз данных, поэтому используйте соответствующие функции (
ILIKEв PostgreSQL,COLLATEв SQL Server или функцииUPPER()/LOWER()) при необходимости поиска без учета регистра. -
Соображения производительности важны для больших баз данных - ограничивайте поиск по схеме, типу данных или создавайте временные таблицы для повторяющихся поисков для улучшения времени выполнения запросов.
Эти методы необходимы для администраторов баз данных и разработчиков, которым нужно понимать структуру своей базы данных, выполнять анализ воздействия перед изменениями схемы или находить конкретные элементы данных в сложных схемах баз данных.
Источники
- SQL - Найти все таблицы, содержащие столбец с указанным именем - Stack Overflow
- Как найти все таблицы, содержащие столбец с указанным именем в MS SQL Server - Sentry
- Учебник по SQL: Идентификация таблиц в столбце - Atlassian
- SQL - Найти все таблицы, содержащие столбец с указанным именем - Intellipaat
- Найти все таблицы, содержащие определенное имя столбца в SQL Server - GeeksforGeeks
- Способ поиска по всем таблицам в базе данных для определенного имени столбца - Reddit
- SQL SERVER - Найти все таблицы, содержащие определенное имя столбца - SQL Authority с Pinal Dave
- Как написать запрос для поиска всех таблиц в базе данных, содержащих определенное имя столбца - Database Administrators Stack Exchange
- Поиск таблиц, содержащих определенный столбец в SQL Server - Chartio
- Как искать имена столбцов в SQL Server - ApexSQL
- Что делают операторы LIKE и NOT LIKE? - LearnSQL.com
- MySQL против PostgreSQL: Выбор правильной базы данных для вашего проекта - DataCamp
- SQL Server, PostgreSQL, MySQL: В чем разница? - DataCamp
- SQL против MySQL: Различия, сходства, использование и преимущества - Coursera
- Сравнение технологий SQL баз данных: MySQL, MSSQL, PostgreSQL, SQLite и Oracle SQL - Medium
- MYSQL против PostgreSQL против ORACLE - ByteScout
- Различия между MySQL и PostgreSQL - GeeksforGeeks