Перейти к содержимому

Как сделать поиск по базе данных

  • автор:

Поиск записей в базе данных Access

По мере роста базы данных Access на компьютере для поиска записей вам придется не только быстро взглянуть на таблицу. В этой статье описаны несколько способов поиска записей.

Примечание: Статья неприменима к веб-приложениям Access — новому типу баз данных, которые создаются в Access и публикуются в Интернете. Дополнительные сведения см. в теме «Создание приложения Access»

В этой статье

  • Просмотр всех записей
  • Переход к определенной записи
  • Поиск записи
  • Фильтрация для отображения определенных записей

Просмотр всех записей

Для просмотра записей с Режим таблицы можно использовать кнопки навигации по записям в нижней части таблицы или формы.

1. Перейти к первой записи

2. Перейти к предыдущей записи

3. Поле текущей записи

4. Перейти к следующей записи

5. Перейти к последней записи

6. Открытие новой (пустой) записи

7. Индикатор фильтра

Для перемещения по одной записи можно также использовать клавишу TAB.

Переход к определенной записи

Когда вы знаете, какую запись нужно найти, выберите ее в списке с помощью окна «Перейти». Поле «Перейти» обычно используется в формах.

    Чтобы перейти к записи, щелкните стрелку справа от кнопки «Перейти», а затем выберите запись из списка.

Примечание: Если вы знаете первые несколько символов записи, по которой нужно перейти, можно ввести их в поле «Перейти».

В поле «Перейти» отображается достаточно данных для уникальной идентификации каждой записи. При выборе записи из списка Access отображает остальные данные в основной области формы.

Поиск записи

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

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

Это эффективное решение для поиска определенной записи, если она соответствует определенным условиям, таким как условия поиска и операторы сравнения, такие как «равно» или «содержит».

Примечание: Диалоговое окно «Поиск и замена» можно использовать только в том случае, если в таблице или форме отображаются данные. Это справедливо даже в том случае, если видимых записей нет, поскольку был применен фильтр.

  1. Откройте таблицу или форму, а затем щелкните поле, в которое нужно в поиске.
  2. На вкладке «Главная» в группе «Найти» нажмите кнопку «Найти». Появится диалоговое окно «Поиск и замена» с выбранной вкладке «Найти».
  3. В поле «Найти что» введите значение, по которому нужно искать.
  4. Чтобы изменить поле для поиска или поиска по всей таблице, выберите соответствующий вариант в списке «Поиск в».

Совет: Список «Совпадение» представляет оператор сравнения (например, «равно» или «содержит»). Чтобы расширить область поиска, в списке «Совпадение» выберите «С любой частью поля».

Фильтрация для отображения определенных записей

Вы можете отфильтровать записи, чтобы отфильтровать записи, которые соответствуют определенным условиям, и операторы сравнения. Например, чтобы быстро сузить отображаемую запись, щелкните правой кнопкой мыши поле, значение которого вы хотите найти, и выберите «Равно», «Не равно», «Содержит» или «Не содержит» в нижней части меню. Фильтр можно включить или отключить, что упрощает переключение между отфильтрованным и неотфильтрованным представлениями одинаковых данных. В отличие от поиска, фильтр ограничивает только отображаемую запись.

  1. Чтобы применить фильтр, основанный на выборе, откройте таблицу или форму.
  2. Чтобы убедиться в том, что таблица или форма еще не отфильтровына, на вкладке «Главная» в группе «Фильтр сортировки &» нажмите кнопку «Дополнительные фильтры» и выберите команду «Очистить все фильтры», если эта команда доступна.
  3. Перейдите к записи, которая содержит значение, которое вы хотите использовать в фильтре, а затем щелкните внутри столбца (в представлении таблицы) или управления (в представлении формы, отчета или макета). Для фильтрации по частично выбранному символу выберите только нужные символы.
  4. На вкладке Главная в группе Сортировка и фильтр нажмите кнопку Выделение и щелкните нужный фильтр.
  5. Чтобы отфильтровать другие поля по выделенному фрагменту, повторите шаги 3 и 4.

Быстрый поиск объектов и данных в БД SQL Server

Очень часто разработчики и администраторы БД сталкиваются с задачей поиска в базе данных всех упоминаний какого-либо объекта, столбца, переменной или поиск всех таблиц, где встречается искомое значение. Если вам приходилось решать подобную проблему, то вы знаете, что это ни самая тривиальная задача и Ctrl+F здесь не поможет.

Готового решения нет ни в SQL Server Management Studio ни в Visual Studio, вот несколько сценариев, которые вы можете использовать:

Поиск данных в таблицах и представлениях

Есть много реализаций на T-SQL поиска данных по всем таблицам с просмотром всех столбцов и это не самая оптимальная реализация, так как везде используется перебор в курсоре системных представлений.

DECLARE @SearchText varchar(200), @Table varchar(100), @TableID int, @ColumnName varchar(100), @String varchar(1000); --modify the variable, specify the text to search for SET @SearchText = 'John'; DECLARE CursorSearch CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'; --list of tables in the current database. Type = 'U' = tables(user-defined) OPEN CursorSearch; FETCH NEXT FROM CursorSearch INTO @Table, @TableID; WHILE @@FETCH_STATUS = 0 BEGIN DECLARE CursorColumns CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @TableID AND system_type_id IN(167, 175, 231, 239); -- the columns that can contain textual data --167 = varchar; 175 = char; 231 = nvarchar; 239 = nchar OPEN CursorColumns; FETCH NEXT FROM CursorColumns INTO @ColumnName; WHILE @@FETCH_STATUS = 0 BEGIN SET @String = 'IF EXISTS (SELECT * FROM ' + @Table + ' WHERE ' + @ColumnName + ' LIKE ''%' + @SearchText + '%'') PRINT ''' + @Table + ', ' + @ColumnName + ''''; EXECUTE (@String); FETCH NEXT FROM CursorColumns INTO @ColumnName; END; CLOSE CursorColumns; DEALLOCATE CursorColumns; FETCH NEXT FROM CursorSearch INTO @Table, @TableID; END; CLOSE CursorSearch; DEALLOCATE CursorSearch; 

У этого решения есть много недостатков:

  • Использование курсоров, а это, как правило неэффективный код
  • Сложный запрос, который медленно работает даже на небольших базах данных
  • Поиск работает только по текстовым данным, поэтому для поиска, например, даты потребуется доработка

Поиск объектов

Поиск объектов в БД по имени или их упоминание в других объектах немного проще, чем поиск определённого текста. Есть так же несколько разных сценариев поиска, но все их объединяет одно: обращение к системным объектам.

Во всех следующих сценариях осуществляется поиск переменной @StartProductID в хранимых процедурах. Но скрипты можно использовать и для поиска в других объектах – в триггерах, функциях, столбцах и т.д.

INFORMATION_SCHEMA.ROUTINES

Системное представление INFORMATION_SCHEMA.ROUTINES позволяет найти любой параметр, встречающийся в процедурах или функциях. Колонка ROUTINE_DEFINITION содержит полный текст объекта, который был указан при его создании.

SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%@StartproductID%' AND ROUTINE_TYPE='PROCEDURE' 

Результат работы запроса:

Не используйте представления INFORMATION_SCHEMA, чтобы определить схему объекта. Единственный надежный способ найти схему объекта — выполнить запрос к представлению каталога sys.objects.

Представление sys.syscomments

Содержит записи для всех представлений, правил, значений по умолчанию, триггеров, ограничений CHECK и DEFAULT, а также для всех хранимых процедур в базе данных. Столбец text содержит инструкции исходных определений SQL.

SELECT OBJECT_NAME( id ) FROM SYSCOMMENTS WHERE text LIKE '%@StartProductID%' AND OBJECTPROPERTY(id , 'IsProcedure') = 1 GROUP BY OBJECT_NAME( id ); 

Этот метод не желательно использовать, так как в будущих версиях SQL Server представление sys.syscomments будет удалено.

Представление sys.sql_modules

Содержит по одной строке для каждого объекта, являющегося модулем, определенным на языке SQL в SQL Server.

SELECT OBJECT_NAME( object_id ) FROM sys.sql_modules WHERE OBJECTPROPERTY(object_id , 'IsProcedure') = 1 AND definition LIKE '%@StartProductID%'; 

Результат такой же, как в предыдущем способе:

Другие представления информационной схемы

Запрос к представлениям sys.syscomments, sys.schemas и sys.objects. Представление sys.schemas содержит информацию обо всех схемах внутри базы данных. В представление sys.objects содержится информация обо всех объектах базы данных. Обратите внимание, что для поиска информации о триггерах необходимо просматривать отдельное представление sys.triggers.

DECLARE @searchString nvarchar( 50 ); SET@searchString = '@StartProductID'; SELECT DISTINCT s.name AS Schema_Name , O.name AS Object_Name , C.text AS Object_Definition FROM syscomments C INNER JOIN sys.objects O ON C.id = O.object_id INNER JOIN sys.schemas S ON O.schema_id = S.schema_id WHERE C.text LIKE '%' + @searchString + '%' OR O.name LIKE '%' + @searchString + '%' ORDER BY Schema_name , Object_name;

Основным недостатком данных методов поиска является то, что для поиска каждого нового типа объектов необходимо вносить в скрипты изменения. Чтобы сделать это вы должны хорошо понимать внутреннюю организацию и структуру системных объектов SQL Server. Кроме того, нужно позаботиться об обработке различных ошибок и исключений, например, связанных с поиском строк, содержащих экранирующие символы.

Если вы не являетесь опытным разработчиком, не знакомы с внутренним устройством хранения DDL информации объектов БД или предпочитаете использовать проверенное и безошибочное решение, то начните использовать ApexSQL Search.

ApexSQL Search – это надстройка (ADD-IN) для SSMS и Visual Studio, которая позволяет искать любой текст в объектах базы данных (в том числе имена объектов), данные, хранящиеся в таблицах и представлениях (даже если они зашифрованы), осуществлять повторные поиски по истории в один клик.

Для поиска данных в таблицах и представлениях:

  1. В меню SQL Server Management Studio или Visual Studio найдите ApexSQL Search
  2. Выберите вариант Database text search…:
  3. В текстовом поле поиска Search text укажите искомый текст.
  4. В раскрывающемся меню Database выберите базу данных для поиска
  5. В дереве поиска Select objects to search укажите таблицы и представления для поиска или оставьте их все выделенными
  6. С помощью флажков укажите в каких типах данных необходимо осуществить поиск (numeric, text type, uniqueidentifier, date columns), искать ли в представлениях, необходимо ли строгое совпадение и, при поиске даты, укажите её формат.
    ApexSQL Search - Database text search
  7. После нажатия кнопки Find now, вы получите сводную таблицу со списком таблиц и представлений, которые содержат искомое значение: ApexSQL Search - Database text search
  8. Нажмите кнопку с многоточием в колонке Column value, чтобы получить детали:
    ApexSQL Search - Database search details

Для поиска объектов:

  1. В меню SQL Server Management Studio или Visual Studio найдите ApexSQL Search
  2. Выберите вариант Database object search…: ApexSQL Search - Database search details
  3. В поле поиска Search text укажите искомый объект, например, имя переменной.
  4. В раскрывающемся меню Database выберите базу данных для поиска
  5. В дереве поиска Objects укажите типы объектов для поиска или оставьте их все выделенными
  6. Флажками укажите детали поиска: искать ли в именах объектов, колонок, индексов или только в самих описания объектов. Просматривать ли системные объекты, нужно ли точное совпадение, а также можно указать экранирующий символ.
  7. После этого начинаем поиск Find now:
    ApexSQL Search - Database object search В таблице будет полный список объектов, которые содержат искомое значение.
  8. При двойном щелчке по объекту в таблице Database object search, можно увидеть его ссылку в Object Explorer
    ApexSQL Search - Database object search

SQL Server Management Studio и Visual Studio не имеют встроенной возможности поиска объектов и данных в БД. Запросы, которые решают эту задачу неэффективны, медленные в работе и требуют глубоких знаний системных объектов SQL Server. Но зато с этой задачей прекрасно справляется ApexSQL Search

Related posts:

Поиск по всей базе данных MySQL

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

Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 5 ноя 2013 в 12:21
1,269 3 3 золотых знака 17 17 серебряных знаков 35 35 бронзовых знаков

хм, можно выбрать все таблицы, по каждой из таблице можно получить все столбцы, и уже дальше искать по ним 🙂 только это приходит на ум )

5 ноя 2013 в 12:54

а есть запрос, который получает все столбцы в таблице ? и можно ли его использовать в связке запросов ? Типа WHERE запрос на все столбцы

5 ноя 2013 в 13:36
делай полный дамп базы и дальше grep.
5 ноя 2013 в 13:51

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Нужно будет учесть, что некоторые колонки допустим varchar другие text и поиск должен осуществляться разными методами, где просто по маске, где полнотекстовый поиск. Выборку всех колонок всех таблиц сделать несложно

SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN ( SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'название базы') 

далее AND и можно реализовывать алгоритм поиска подстроки ‘eval’

Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
ответ дан 5 ноя 2013 в 15:17
1,596 8 8 серебряных знаков 15 15 бронзовых знаков
не парился, сделал дамп базы и законтрлэфил eval и тп. К сожалению ничего не нашел
5 ноя 2013 в 15:27

Почему к сожалению? Если есть проблема с выполнением какого-то стороннего кода, то поищите не только в базе данных но и в самих файлах, недавно так нашел в одном старом проекте несколько файлов с добавленном редиректе вначале. Советую глянуть на счет присутствия не только строки «eval», но также и «base64»

5 ноя 2013 в 20:48

та в том то и дело: нашел 200 мб вирусни на сайте, и она как-то стабильно раз в неделю попадает. Проверил базу, на систем, экзес и тп.. пусто, фсе файлы сайта антивирусником, ручным поиском, пусто. Пароли фтп меняю каждую неделю. В картинках искал вредоносный код, тоже все пусто. Не могу понять где дырка

5 ноя 2013 в 21:15

пиши хостерам, пусть у себя еще проверят, вполне возможно их ломают а там уже и до тебя добираются, пусть логи смотрят, кто файл вредоносных положил, когда, под каким пользователем и тд. Так же разумеется, свой комп проверь. И глянь на всякий случай в cron на хосте — вполне возможно что туда закинут функционал загрузки вредоносного кода раз в неделю скажем и тогда никакая смена паролей конечно уже будет неважна.

5 ноя 2013 в 21:32

@zippp, у меня похожая задача, только не ищу вредоносный код, а обычную строку, например, АБВГД. Не подскажите, как дополнить Ваш запрос ? Я попробовал, дописать в самый конец and column_name like ‘%АБВГД%’ , но мне кажется, что я ошибся

Как сделать поиск по базе данных

Рассмотрим, как мы можем создать в приложении на Android динамический поиск по базе данных SQLite.

Итак, создадим новый проект с пустой MainActivity. Для этого проекта возьмем базу данных из прошлой темы (или создадим новую). Данная база данных называется cityinfo и имеет одну таблицу users с тремя полями _id, name, age:

CREATE TABLE `users` ( `_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `name` TEXT NOT NULL, `year` INTEGER NOT NULL );

Existing SQLite database in Android

И также добавим в проект в Android Studio папку assets , а в папку assets — только что созданную базу данных:

База данных SQLite в Android Studio

В моем случае база данных называется «cityinfo.db».

Как показано выше на скриншоте, добавив в проект в одну папку с MainActivity новый класс DatabaseHelper :

package com.example.livesearchapp; import android.database.SQLException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase; import android.content.Context; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; class DatabaseHelper extends SQLiteOpenHelper < private static String DB_PATH; // полный путь к базе данных private static String DB_NAME = "cityinfo.db"; private static final int SCHEMA = 1; // версия базы данных static final String TABLE = "users"; // название таблицы в бд // названия столбцов static final String COLUMN_ID = "_id"; static final String COLUMN_NAME = "name"; static final String COLUMN_YEAR = "year"; private Context myContext; DatabaseHelper(Context context) < super(context, DB_NAME, null, SCHEMA); this.myContext=context; DB_PATH =context.getFilesDir().getPath() + DB_NAME; >@Override public void onCreate(SQLiteDatabase db) < >@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) < >void create_db() < File file = new File(DB_PATH); if (!file.exists()) < //получаем локальную бд как поток try(InputStream myInput = myContext.getAssets().open(DB_NAME); // Открываем пустую бд OutputStream myOutput = new FileOutputStream(DB_PATH)) < // побайтово копируем данные byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) >0) < myOutput.write(buffer, 0, length); >myOutput.flush(); > catch(IOException ex) < Log.d("DatabaseHelper", ex.getMessage()); >> > public SQLiteDatabase open()throws SQLException < return SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); >>

Перейдем к файлу activity_main.xml , который определяет визуальный интерфейс, и изменим его следующим образом:

Итак, у нас будет элемент ListView для отображения списка и текстовое поле для фильтрации.

Теперь изменим код MainActivity :

package com.example.livesearchapp; import androidx.appcompat.app.AppCompatActivity; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.FilterQueryProvider; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class MainActivity extends AppCompatActivity < DatabaseHelper sqlHelper; SQLiteDatabase db; Cursor userCursor; SimpleCursorAdapter userAdapter; ListView userList; EditText userFilter; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); userList = (ListView)findViewById(R.id.userList); userFilter = (EditText)findViewById(R.id.userFilter); sqlHelper = new DatabaseHelper(getApplicationContext()); // создаем базу данных sqlHelper.create_db(); >@Override public void onResume() < super.onResume(); try < db = sqlHelper.open(); userCursor = db.rawQuery("select * from " + DatabaseHelper.TABLE, null); String[] headers = new String[]; userAdapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, userCursor, headers, new int[], 0); // если в текстовом поле есть текст, выполняем фильтрацию // данная проверка нужна при переходе от одной ориентации экрана к другой if(!userFilter.getText().toString().isEmpty()) userAdapter.getFilter().filter(userFilter.getText().toString()); // установка слушателя изменения текста userFilter.addTextChangedListener(new TextWatcher() < public void afterTextChanged(Editable s) < >public void beforeTextChanged(CharSequence s, int start, int count, int after) < >// при изменении текста выполняем фильтрацию public void onTextChanged(CharSequence s, int start, int before, int count) < userAdapter.getFilter().filter(s.toString()); >>); // устанавливаем провайдер фильтрации userAdapter.setFilterQueryProvider(new FilterQueryProvider() < @Override public Cursor runQuery(CharSequence constraint) < if (constraint == null || constraint.length() == 0) < return db.rawQuery("select * from " + DatabaseHelper.TABLE, null); >else < return db.rawQuery("select * from " + DatabaseHelper.TABLE + " where " + DatabaseHelper.COLUMN_NAME + " like ?", new String[]); > > >); userList.setAdapter(userAdapter); > catch (SQLException ex)<> > @Override public void onDestroy() < super.onDestroy(); // Закрываем подключение и курсор db.close(); userCursor.close(); >>

Прежде всего надо отметить, что для фильтрации данных в адаптере, нам надо получить фильтр адаптера, а у этого фильтра выполнить метод filter() :

userAdapter.getFilter().filter(s.toString());

В этот метод filter() передается ключ поиска.

Для текстового поля мы можем отслеживать изменения содержимого с помощью слушателя:

userFilter.addTextChangedListener(new TextWatcher() < public void afterTextChanged(Editable s) < >public void beforeTextChanged(CharSequence s, int start, int count, int after) < >// при изменении текста выполняем фильтрацию public void onTextChanged(CharSequence s, int start, int before, int count) < userAdapter.getFilter().filter(s.toString()); >>);

В слушателе TextWatcher в методе onTextChanged как раз и вызывается метод filter() , в который передется введенная пользователем в текстовое поле последовательность символов.

Сам вызызов метода filter() мало на что влияет. Нам нало еще определить провайдер фильтрации адаптера, которые и будет инкапсулировать реальную логику фильтрации:

userAdapter.setFilterQueryProvider(new FilterQueryProvider() < @Override public Cursor runQuery(CharSequence constraint) < if (constraint == null || constraint.length() == 0) < return db.rawQuery("select * from " + DatabaseHelper.TABLE, null); >else < return db.rawQuery("select * from " + DatabaseHelper.TABLE + " where " + DatabaseHelper.COLUMN_NAME + " like ?", new String[]); > > >);

Сущность этого провайдера заключается в выполнении SQL-выражений к бд, а именно конструкций «select from» и «select from where like». Данные простейшие выражения выполняют регистрозависимую фильтрацию. В результате адаптаре получает отфильтрованные данные.

Следует также отметить следующий код:

if(!userFilter.getText().toString().isEmpty()) userAdapter.getFilter().filter(userFilter.getText().toString());

Данный код нам нужен при смене ориентации (например, с портретной на альбомную). И если ориентация устройства изменена, но в текстовом поле все же есть некоторые текст-фильтр, то выполняется фильтрация. Иначе бы она не выполнялась.

И после запуска мы сможем насладиться фильтрацией данных:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *