НейроАгент

Полное руководство: SQL LIKE-запросы для поиска таблиц с колонками

Узнайте, как использовать SQL LIKE-запросы для поиска всех таблиц базы данных, содержащих столбцы с определенными именами. Полное руководство с примерами для MySQL, PostgreSQL, SQL Server и Oracle.

Вопрос

Как найти все таблицы базы данных, содержащие столбцы с определенным именем с помощью SQL-запросов LIKE?

НейроАгент

Содержание


Основной запрос INFORMATION_SCHEMA

Наиболее универсальный метод для поиска таблиц, содержащих столбцы с определенными именами, использует представление INFORMATION_SCHEMA.COLUMNS, которое является частью стандарта SQL и доступно в большинстве систем баз данных. Этот подход позволяет искать по всей схеме вашей базы данных, не зная имен таблиц заранее.

sql
SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE column_name LIKE '%ваш_поисковый_термин%';

Для более точной фильтрации можно добавить дополнительные условия:

sql
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 можно напрямую запрашивать представления системного каталога:

sql
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, так и собственный системный каталог:

sql
SELECT 
    table_name, 
    column_name
FROM information_schema.columns
WHERE column_name ILIKE '%ваш_поисковый_термин%'; -- ILIKE для поиска без учета регистра

Или с использованием системных каталогов:

sql
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 можно использовать:

sql
SELECT 
    TABLE_NAME, 
    COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'ваше_имя_базы_данных'
  AND COLUMN_NAME LIKE '%ваш_поисковый_термин%';

Использование шаблонов с LIKE

Оператор LIKE поддерживает несколько шаблонов с подстановочными знаками, что делает его мощным инструментом для поиска имен столбцов:

  • % - Соответствует любой последовательности из нуля или более символов
  • _ - Соответствует любому одиночному символу
  • [] - Соответствует любому одиночному символу в указанном диапазоне

Распространенные шаблоны

sql
-- Поиск столбцов, заканчивающихся на '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: Учитывает регистр по умолчанию
sql
-- Поиск с учетом регистра
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
-- Подходы без учета регистра
-- 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 обычно не поддерживает индексацию, поэтому могут потребоваться сканирования больших таблиц. Для часто выполняемых поисков рассмотрите:

sql
-- Создание временной таблицы для повторяющихся поисков
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%';

Ограничение области поиска

Уменьшите пространство поиска, добавив дополнительные фильтры:

sql
-- Поиск только по определенным типам данных
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%';

Практические примеры

Поиск столбцов, связанных с пользователями

sql
-- Найти все столбцы со словом '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;

Поиск столбцов с адресами электронной почты

sql
-- Найти столбцы, связанные с электронной почтой
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;

Поиск столбцов с датами/временем

sql
-- Найти столбцы, связанные с датами, во всех базах данных
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()) при необходимости поиска без учета регистра.

  • Соображения производительности важны для больших баз данных - ограничивайте поиск по схеме, типу данных или создавайте временные таблицы для повторяющихся поисков для улучшения времени выполнения запросов.

Эти методы необходимы для администраторов баз данных и разработчиков, которым нужно понимать структуру своей базы данных, выполнять анализ воздействия перед изменениями схемы или находить конкретные элементы данных в сложных схемах баз данных.

Источники

  1. SQL - Найти все таблицы, содержащие столбец с указанным именем - Stack Overflow
  2. Как найти все таблицы, содержащие столбец с указанным именем в MS SQL Server - Sentry
  3. Учебник по SQL: Идентификация таблиц в столбце - Atlassian
  4. SQL - Найти все таблицы, содержащие столбец с указанным именем - Intellipaat
  5. Найти все таблицы, содержащие определенное имя столбца в SQL Server - GeeksforGeeks
  6. Способ поиска по всем таблицам в базе данных для определенного имени столбца - Reddit
  7. SQL SERVER - Найти все таблицы, содержащие определенное имя столбца - SQL Authority с Pinal Dave
  8. Как написать запрос для поиска всех таблиц в базе данных, содержащих определенное имя столбца - Database Administrators Stack Exchange
  9. Поиск таблиц, содержащих определенный столбец в SQL Server - Chartio
  10. Как искать имена столбцов в SQL Server - ApexSQL
  11. Что делают операторы LIKE и NOT LIKE? - LearnSQL.com
  12. MySQL против PostgreSQL: Выбор правильной базы данных для вашего проекта - DataCamp
  13. SQL Server, PostgreSQL, MySQL: В чем разница? - DataCamp
  14. SQL против MySQL: Различия, сходства, использование и преимущества - Coursera
  15. Сравнение технологий SQL баз данных: MySQL, MSSQL, PostgreSQL, SQLite и Oracle SQL - Medium
  16. MYSQL против PostgreSQL против ORACLE - ByteScout
  17. Различия между MySQL и PostgreSQL - GeeksforGeeks