Sql поиск по всем полям таблицы. Простые SQL запросы - короткая справка и примеры. Изменение и удаление полнотекстового индекса


Продолжаем изучать возможности SQL Server от компании Microsoft и на очереди у нас компонент Full-Text Search , в русском варианте — это «Полнотекстовый поиск », и сейчас мы узнаем, для чего он нужен, и как же реализовать этот самый полнотекстовый поиск в SQL сервере, используя этот компонент.

И начнем мы, конечно же, с рассмотрения основ полнотекстового поиска, т.е. что это такое и для чего он вообще нужен.

Что такое полнотекстовый поиск?

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

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

С помощью полнотекстового поиска можно реализовать своего рода поисковую систему документов (т.е. строк ), по словам или фразам в базе данных своего предприятия. Так как помимо своей быстрой работы он обладает еще и возможностью ранжировать найденные документы, т.е. выставлять ранг каждой найденной строке, другими словами, можно найти самые релевантные записи, т.е. самые подходящие под Ваш запрос.

Возможности полнотекстового поиска в MS SQL Server

  • В полнотекстовом поиске SQL сервера можно осуществлять поиск не только по отдельным словам или фразам, но и по префиксным выражениям , например, задать текст начала слова или фразы;
  • Также можно искать слова по словоформам, например, различные формы глаголов или существительные в единственном и во множественном числе, т.е. по производным выражениям ;
  • Можно построить запрос так, чтобы найти слова или фразы, находящиеся рядом с другими словами или фразами, т.е. выражения с учетом расположения ;
  • Есть возможность искать синонимические формы конкретного слова (тезаурус ), т.е. например, если в тезаурусе определено, что «Автомобиль » и «Машина » — это синонимы, то при поиске слова «Автомобиль » в результирующий набор войдут и строки содержащие слово «Машина »;
  • В запросе можно указывать слова или фразы с взвешенными значениями , например, если в запросе указано несколько слов или фраз, то им можно присвоить важность от 0,0 до 1,0 (1,0 означает что это самое важное слово или фраза );
  • Для того чтобы не учитывать в поиске некоторые слова можно использовать «список стоп-слов », т.е. по словам, включенным в этот список, поиск выполняться не будет.

Подготовка к реализации полнотекстового поиска в MS SQL Server

Перед тем как приступать к созданию полнотекстового поиска, необходимо знать несколько важных моментов:

  • Для реализации полнотекстового поиска компонент Full-Text Search (Полнотекстовый поиск ) должен быть установлен;
  • У таблицы может быть только один полнотекстовый индекс;
  • Чтобы создать полнотекстовый индекс, таблица должна содержать один уникальный индекс, который включает один столбец и не допускает значений NULL. Рекомендовано использовать уникальный кластеризованный индекс (или просто первичный ключ ), первый столбец которого должен иметь целочисленный тип данных;
  • Полнотекстовый индекс можно создавать на столбцах с типом данных: char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary или varbinary(max);
  • Для того чтобы создать полнотекстовый индекс сначала необходимо создать полнотекстовый каталог. Начиная с SQL Server 2008 полнотекстовый каталог это логическое понятие, обозначающее группу полнотекстовых индексов, т.е. является виртуальным объектом и не входит в файловую группу (есть способ создания полнотекстового индекса, используя «Мастер», при котором каталог можно создать одновременно с индексом, этот способ мы будем рассматривать чуть ниже ).

Примечание! Реализовывать полнотекстовый поиск я буду на примере версии SQL Server 2008 R2. Также подразумевается, что компонент Full-Text Search у Вас уже установлен, если нет, то установите его путем добавления соответствующего компонента через «Центр установки SQL Server», т.е. поставьте соответствующую галочку.

В примерах ниже в качестве инструмента создания и управления полнотекстовыми каталогами и индексами я буду использовать SQL Server Management Studio.

Исходные данные для создания полнотекстового поиска

Допустим, что у нас есть база данных TestBase, а в ней есть таблица TestTable, в которой всего два поля, первое (id) — это первичный ключ, а второе (textdata) — это текстовые данные, по которым мы и будем осуществлять полнотекстовый поиск.

CREATE TABLE TestTable(id int IDENTITY(1,1) NOT NULL, textdata varchar(500) NULL, CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED (id ASC))

Для примера она будет содержать следующие данные


Создание полнотекстового каталога в SQL Server

Для создания полнотекстового каталога как впрочем, и индекса можно использовать или графический интерфейс SSMS, или инструкций T-SQL , мы с Вами разберем оба способа.

Создание полнотекстового каталога на T-SQL

CREATE FULLTEXT CATALOG TestCatalog WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION dbo GO

  • CREATE FULLTEXT CATALOG – команда создания полнотекстового каталога;
  • TestCatalog – имя нашего полнотекстового каталога;
  • WITH ACCENT_SENSITIVITY {ON|OFF} – опция указывает, будет ли полнотекстовый каталог учитывать диакритические знаки для полнотекстового индексирования. По умолчанию ON;
  • AS DEFAULT – опция, для того чтобы указать, что каталог является каталогом по умолчанию. В случае создания полнотекстового индекса без явного указания каталога используется каталог по умолчанию;
  • AUTHORIZATION dbo — устанавливает владельца полнотекстового каталога, им может быть пользователь или роль базы данных. В данном случае мы указали роль dbo.

Создание полнотекстового каталога в графическом интерфейсе Management Studio

Точно такой же полнотекстовый каталог можно создать и в графическом интерфейсе Management Studio. Для этого открываем базу данных, переходим в папку Хранилище ->Полнотекстовые каталоги , щелкаем правой кнопкой мыши по данному пункту и выбираем «Создать полнотекстовый каталог ».


Откроется окно создания каталога, где мы указываем название каталога и его опции.


Изменение и удаление полнотекстового каталога в SQL Server

Для изменения опций каталога можно использовать инструкцию ALTER FULLTEXT CATALOG, например, давайте сделаем так, чтобы наш каталог перестал учитывать диакритические знаки, для этого пишем SQL инструкцию, которая перестроит наш каталог с новой опцией.

ALTER FULLTEXT CATALOG TestCatalog REBUILD WITH ACCENT_SENSITIVITY=OFF GO

Для того чтобы удалить каталог можно использовать инструкцию T-SQL, например

DROP FULLTEXT CATALOG TestCatalog

Все это можно было сделать и в графическом интерфейсе Management Studio (для изменения параметров каталога «Свойства», для удаления «Удалить» )

Создание полнотекстового индекса в SQL Server

После создания полнотекстового каталога можно начинать создавать в нем полнотекстовые индекса. В нашем случае мы хотим создать полнотекстовый индекс, в котором участвует поле textdata таблицы TestTable.

Создание полнотекстового индекса на T-SQL

Для того чтобы создать полнотекстовый индекс можно написать следующую SQL инструкцию

CREATE FULLTEXT INDEX ON TestTable(textdata) KEY INDEX PK_TestTable ON (TestCatalog) WITH (CHANGE_TRACKING AUTO) GO

  • CREATE FULLTEXT INDEX – команда создания полнотекстового индекса;
  • TestTable(textdata) – таблица и столбец, включенные в индекс;
  • KEY INDEX PK_TestTable – имя уникального индекса таблицы TestTable;
  • ON (TestCatalog) — указываем, что полнотекстовый индекс будет создан в полнотекстовом каталоге TestCatalog. Если не указать этот параметр, то индекс будет создан в полнотекстовом каталоге по умолчанию;
  • WITH (CHANGE_TRACKING AUTO) – это мы говорим, что все изменения, которые будут вноситься в базовую таблицу (TestTable), автоматически отобразятся и в нашем полнотекстовом индексе, т.е. автоматическое заполнение.

Создание полнотекстового индекса в графическом интерфейсе Management Studio

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


Изменение и удаление полнотекстового индекса

В случае необходимости можно изменить параметры полнотекстового индекса. Давайте в качестве примера, изменим способ отслеживания изменений с автоматического на ручной. Для изменения в графическом интерфейсе можно использовать окно «Свойства полнотекстового каталога -> Таблицы или представления », которое мы использовали при создании полнотекстового индекса.

Или можно написать следующий код

ALTER FULLTEXT INDEX ON TestTable SET CHANGE_TRACKING = MANUAL

Для того чтобы удалить полнотекстовый индекс достаточно просто удалить таблицу из списка объектов связанных с полнотекстовым каталогом в том же окне «Свойства полнотекстового каталога -> Таблицы или представления »


Или написать код T-SQL

DROP FULLTEXT INDEX ON TestTable

Создание полнотекстового каталога и индекса с помощью мастера

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

Примечание! Перед этим я удалил и каталог, и индекс, которые мы создавали в предыдущих примерах.


В итоге запустится мастер полнотекстового индексирования SQL Server.



Затем столбец, который будет включен в полнотекстовый индекс.


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


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


Здесь мы можем настроить расписание заполнения полнотекстового каталога.


Для создания каталога и индекса осталось нажать «Готово ».


В следующем окне мы увидим результат выполнения операций по созданию полнотекстового каталога и индекса. В моем случае все прошло успешно.


Таким образом, мы выполнили создание полнотекстового каталога и индекса одновременно с помощью мастера.

Примеры полнотекстовых запросов

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

Если помните, наша таблица TestTable содержит определения технологий, языков программирования, в общем, определений связанных со сферой IT. Допустим, что мы хотим получить все записи, где есть упоминание о компании Microsoft, для этого мы пишем полнотекстовый запрос с ключевым словом CONTAINS, например:

SELECT * FROM TestTable WHERE CONTAINS (textdata, ""Microsoft"")


Мы получили результат, но допустим, нам также необходимо отсортировать его по релевантности, другими словами, какие строки больше соответствуют нашему запросу. Для этого мы будем использовать функцию CONTAINSTABLE, которая проставляет ранг для каждой найденной записи.

SELECT Table1.id AS ID, RowRank.Rank as , Table1.textdata as FROM TestTable Table1 INNER JOIN CONTAINSTABLE(TestTable, textdata, ""Microsoft"") as RowRank on Table1.id=RowRank. ORDER BY RowRank.RANK DESC


Как видим, ранг проставлен и по нему отсортированы строки. Сам алгоритм ранжирования, как и более подробную информацию о полнотекстовом поиске можно найти в электронной документации по SQL Server.

На этом предлагаю заканчивать, надеюсь, все было понятно, удачи!

Запросы написаны без экранирующих кавычек, так как у MySQL , MS SQL и PostGree они разные.

SQL запрос: получение указанных (нужных) полей из таблицы

SELECT id, country_title, count_people FROM table_name

Получаем список записей: ВСЕ страны и их население. Название нужных полей указываются через запятую.

SELECT * FROM table_name

* обозначает все поля. То есть, будут показы АБСОЛЮТНО ВСЕ поля данных.

SQL запрос: вывод записей из таблицы исключая дубликаты

SELECT DISTINCT country_title FROM table_name

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

SQL запрос: вывод записей из таблицы по заданному условию

SELECT id, country_title, city_title FROM table_name WHERE count_people>100000000

Получаем список записей: страны, где количество людей больше 100 000 000.

SQL запрос: вывод записей из таблицы с упорядочиванием

SELECT id, city_title FROM table_name ORDER BY city_title

Получаем список записей: города в алфавитном порядке. В начале А, в конце Я.

SELECT id, city_title FROM table_name ORDER BY city_title DESC

Получаем список записей: города в обратном (DESC ) порядке. В начале Я, в конце А.

SQL запрос: подсчет количества записей

SELECT COUNT(*) FROM table_name

Получаем число (количество) записей в таблице. В данном случае НЕТ списка записей.

SQL запрос: вывод нужного диапазона записей

SELECT * FROM table_name LIMIT 2, 3

Получаем 2 (вторую) и 3 (третью) запись из таблицы. Запрос полезен при создании навигации на WEB страницах.

SQL запросы с условиями

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

SQL запрос: конструкция AND (И)

SELECT id, city_title FROM table_name WHERE country="Россия" AND oil=1

Получаем список записей: города из России И имеют доступ к нефти. Когда используется оператор AND , то должны совпадать оба условия.

SQL запрос: конструкция OR (ИЛИ)

SELECT id, city_title FROM table_name WHERE country="Россия" OR country="США"

Получаем список записей: все города из России ИЛИ США. Когда используется оператор OR , то должно совпадать ХОТЯ БЫ одно условие.

SQL запрос: конструкция AND NOT (И НЕ)

SELECT id, user_login FROM table_name WHERE country="Россия" AND NOT count_comments<7

Получаем список записей: все пользователи из России И сделавших НЕ МЕНЬШЕ 7 комментариев.

SQL запрос: конструкция IN (В)

SELECT id, user_login FROM table_name WHERE country IN ("Россия", "Болгария", "Китай")

Получаем список записей: все пользователи, которые проживают в (IN ) (России, или Болгарии, или Китая)

SQL запрос: конструкция NOT IN (НЕ В)

SELECT id, user_login FROM table_name WHERE country NOT IN ("Россия","Китай")

Получаем список записей: все пользователи, которые проживают не в (NOT IN ) (России или Китае).

SQL запрос: конструкция IS NULL (пустые или НЕ пустые значения)

SELECT id, user_login FROM table_name WHERE status IS NULL

Получаем список записей: все пользователи, где status не определен. NULL это отдельная тема и поэтому она проверяется отдельно.

SELECT id, user_login FROM table_name WHERE state IS NOT NULL

Получаем список записей: все пользователи, где status определен (НЕ НОЛЬ).

SQL запрос: конструкция LIKE

SELECT id, user_login FROM table_name WHERE surname LIKE "Иван%"

Получаем список записей: пользователи, у которых фамилия начинается с комбинации «Иван». Знак % означает ЛЮБОЕ количество ЛЮБЫХ символов. Чтобы найти знак % требуется использовать экранирование «Иван\%».

SQL запрос: конструкция BETWEEN

SELECT id, user_login FROM table_name WHERE salary BETWEEN 25000 AND 50000

Получаем список записей: пользователи, которые получает зарплату от 25000 до 50000 включительно.

Логических операторов ОЧЕНЬ много, поэтому детально изучите документацию по SQL серверу.

Сложные SQL запросы

SQL запрос: объединение нескольких запросов

(SELECT id, user_login FROM table_name1) UNION (SELECT id, user_login FROM table_name2)

Получаем список записей: пользователи, которые зарегистрированы в системе, а также те пользователи, которые зарегистрированы на форуме отдельно. Оператором UNION можно объединить несколько запросов. UNION действует как SELECT DISTINCT, то есть отбрасывает повторяющиеся значения. Чтобы получить абсолютно все записи, нужно использовать оператор UNION ALL.

SQL запрос: подсчеты значений поля MAX, MIN, SUM, AVG, COUNT

Вывод одного, максимального значения счетчика в таблице:

SELECT MAX(counter) FROM table_name

Вывод одного, минимальный значения счетчика в таблице:

SELECT MIN(counter) FROM table_name

Вывод суммы всех значений счетчиков в таблице:

SELECT SUM(counter) FROM table_name

Вывод среднего значения счетчика в таблице:

SELECT AVG(counter) FROM table_name

Вывод количества счетчиков в таблице:

SELECT COUNT(counter) FROM table_name

Вывод количества счетчиков в цехе №1, в таблице:

SELECT COUNT(counter) FROM table_name WHERE office="Цех №1"

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

SQL запрос: группировка записей

SELECT continent, SUM(country_area) FROM country GROUP BY continent

Получаем список записей: с названием континента и с суммой площадей всех их стран. То есть, если есть справочник стран, где у каждой страны записана ее площадь, то с помощью конструкции GROUP BY можно узнать размер каждого континента (на основе группировки по континентам).

SQL запрос: использование нескольких таблиц через алиас (alias)

SELECT o.order_no, o.amount_paid, c.company FROM orders AS o, customer AS с WHERE o.custno=c.custno AND c.city="Тюмень"

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

На самом деле, при правильном запроектированной базе данных данного вида запрос является самым частым, поэтому в MySQL был введен специальный оператор, который работает в разы быстрее, чем выше написанный код.

SELECT o.order_no, o.amount_paid, z.company FROM orders AS o LEFT JOIN customer AS z ON (z.custno=o.custno)

Вложенные подзапросы

SELECT * FROM table_name WHERE salary=(SELECT MAX(salary) FROM employee)

Получаем одну запись: информацию о пользователе с максимальным окладом.

Внимание! Вложенные подзапросы являются одним из самых узких мест в SQL серверах. Совместно со своей гибкостью и мощностью, они также существенно увеличивают нагрузку на сервер. Что приводит к катастрофическому замедлению работы других пользователей. Очень часты случаи рекурсивных вызовов при вложенных запросах. Поэтому настоятельно рекомендую НЕ использовать вложенные запросы, а разбивать их на более мелкие. Либо использовать вышеописанную комбинацию LEFT JOIN. Помимо этого данного вида запросы являются повышенным очагом нарушения безопасности. Если решили использовать вложенные подзапросы, то проектировать их нужно очень внимательно и первоначальные запуски сделать на копиях баз (тестовые базы).

SQL запросы изменяющие данные

SQL запрос: INSERT

Инструкция INSERT позволяют вставлять записи в таблицу. Простыми словами, создать строчку с данными в таблице.

Вариант №1. Часто используется инструкция:

INSERT INTO table_name (id, user_login) VALUES (1, "ivanov"), (2, "petrov")

В таблицу «table_name » будет вставлено 2 (два) пользователя сразу.

Вариант №2. Удобнее использовать стиль:

INSERT table_name SET id=1, user_login="ivanov"; INSERT table_name SET id=2, user_login="petrov";

В этом есть свои преимущества и недостатки.

Основные недостатки:

  • Множество мелких SQL запросов выполняются чуть медленнее, чем один большой SQL запрос, но при этом другие запросы будут стоять в очереди на обслуживание. То есть, если большой SQL запрос будет выполняться 30 минут, то в все это время остальные запросы будут курить бамбук и ждать своей очереди.
  • Запрос получается массивнее, чем предыдущий вариант.

Основные преимущества:

  • Во время мелких SQL запросов, другие SQL запросы не блокируются.
  • Удобство в чтении.
  • Гибкость. В этом варианте, можно не соблюдать структуру, а добавлять только необходимые данные.
  • При формировании подобным образом архивов, можно легко скопировать одну строчку и запустить ее через командную строку (консоль), тем самым не восстанавливая АРХИВ целиком.
  • Стиль записи схож с инструкцией UPDATE, что легче запоминается.

SQL запрос: UPDATE

UPDATE table_name SET user_login="ivanov", user_surname="Иванов" WHERE id=1

В таблице «table_name » в записи с номером id=1, будет изменены значения полей user_login и user_surname на указанные значения.

SQL запрос: DELETE

DELETE FROM table_name WHERE id=3

В таблице table_name будет удалена запись с id номером 3.

  1. Все названия полей рекомендуются писать маленькими буквами и если надо, разделять их через принудительный пробел «_» для совместимости с разными языками программирования, таких как Delphi, Perl, Python и Ruby.
  2. SQL команды писать БОЛЬШИМИ буквами для удобочитаемости. Помните всегда, что после вас могут читать код и другие люди, а скорее всего вы сами через N количество времени.
  3. Называть поля с начала существительное, а потом действие. Например: city_status, user_login, user_name.
  4. Стараться избегать слов резервных в разных языках которые могут вызывать проблемы в языках SQL, PHP или Perl, типа (name, count, link). Например: link можно использовать в MS SQL, но в MySQL зарезервировано.

Данный материал является короткой справкой для повседневной работы и не претендует на супер мега авторитетный источник, коим является первоисточник SQL запросов той или иной базы данных.

Начнем с элементарных запросов. А как же без них? Самая лаконичная форма SQL запроса переводится как "Хочу получить все данные из этой таблицы". Результат следующего запроса – все записи со всеми полями из таблицы D_STAFF.

SELECT * FROM D_STAFF

Ввод SQL запроса в обучающей программе.

Выбираем [раздел SQL] в проводнике слева, нажимаем [кнопку SQL] над списком справа, вводим запрос и снова нажимаем [кнопку SQL]. После подтверждения выполнения запроса список справа будет выглядеть следующим образом. В случае все проще: просто вводите SQL запрос в соответствующем поле и жмите [Выполнить].


Результат выполнения простейшего SQL запроса.

Использовать (*) после оператора SELECT, безусловно, удобно, особенно если неизвестно, какие поля в таблице вообще есть, но и затратно – структуры, хранящие результат запроса расходуют достаточно много “лишней” памяти, да и время на выполнение самого запроса от этого только увеличивается. Следующий вариант куда как предпочтительней, если вам нужна информация только о Ф.И.О. сотрудника и его стаже. Перевод примерно такой: "Хочу знать только это и это обо всех из таблицы..."

SELECT S_NAME, S_EXPERIENCE FROM D_STAFF

Результат последнего SQL запроса занимает заметно меньше места "по ширине".


Выбор значений конкретных полей таблицы.

Шаг 2. SQL запрос с простым критерием отбора

Простейшие запросы практически не применимы на практике, поскольку “вытаскивают” абсолютно все записи из указанной таблицы, а таковых может быть сотни тысяч. СУБД может просто отказаться выполнять такой запрос, да и оперативной памяти на машине клиента может элементарно не хватить. Что делать с результатами таких запросов, даже если они выполняются корректно, не всегда понятно, хотя, для некоторых пойдет. Для того чтобы наложить ограничения на отбор нужных вам записей, в SQL используется ключевое слово WHERE. Приведенный ниже запрос отбирает только сотрудников со стажем работы менее 5 лет.

SELECT S_NAME, S_EXPERIENCE FROM D_STAFF WHERE S_EXPERIENCE


Использование простого критерия отбора записей.

Шаг 3. SQL запрос с составным критерием отбора

Для чего нужны составные критерии отбора записей, объяснять, я думаю, не нужно. Для того же, для чего и запросы с простыми критериями. Условия объединяются с использованием логических операций конъюнкции и дизъюнкции (операторы “И” (AND) и “ИЛИ” (OR)), а группируются с помощью скобок. Следующий запрос вернет записи о сотрудниках со стажем менее 5 лет и с дополнительным ограничением на занимаемую ими должность.

SELECT S_NAME, S_EXPERIENCE, S_POSITION FROM D_STAFF WHERE (D_STAFF.S_POSITION 20) AND D_STAFF.S_EXPERIENCE


Использование сложного критерия отбора записей.

Шаг 4. Оператор BETWEEN

Оператор BETWEEN упрощает синтаксис описания критериев, задающих интервал допустимых значений. Вместо приведенного ниже BETWEEN 3 AND 7 можно было бы написать D_STAFF.S_EXPERIENCE >=3 AND D_STAFF.S_EXPERIENCE <=7 . Первый вариант способствует наглядности запроса – это раз, поиск на стороне СУБД может выполняться по отдельному алгоритму, специально оптимизированному для подобного вида ограничений – это два.

SELECT S_NAME, S_EXPERIENCE, S_POSITION FROM D_STAFF WHERE (D_STAFF.S_POSITION 20) AND D_STAFF.S_EXPERIENCE BETWEEN 3 AND 7


Использование оператора BETWEEN.

Шаг 5. Оператор LIKE

Этот замечательный оператор позволяет накладывать ограничения на значения текстовых полей с использованием шаблонов. Синтаксис пояснять не буду, думаю, что из примера и так все ясно. Осуществляем поиск сотрудников, с Ф.И.О. начинающегося на “С” , в середине должно встречаться “Вал” и заканчиваться все должно на “ич” . В некоторых СУБД ключевое слово LIKE можно также использовать со значениями даты и времени.

SELECT S_NAME FROM D_STAFF WHERE S_NAME LIKE "С%" AND S_NAME LIKE "%Вал%" AND S_NAME LIKE "%ич"

SELECT S_NAME FROM D_STAFF WHERE S_NAME LIKE "С%Вал%ич"


Использование оператора LIKE.

Шаг 6. Псевдонимы таблиц и полей

Используемым в запросе именам таблиц и полей можно определить псевдонимы . Как это делается - продемонстрировано ниже. Зачем это делается – будет показано на следующих шагах, в том числе и на шаге 7, а этот пример иллюстрирует самое очевидно использование псевдонимов в SQL – оформление результата запроса в соответствии с требованиями к удобству восприятия его человеком. Для определения псевдонима таблицы или поля в SQL используется ключевое слово AS. Результат запроса (заголовок таблицы) в данном варианте выглядит более пригодно для того, чтобы на его основе сделать отчет.

SELECT S_NAME AS Сотрудник, S_EXPERIENCE AS [Опыт работы], S_POSITION AS Должность FROM D_STAFF AS STAFF


Применение псевдонимов таблиц и полей.

Шаг 7. Отношение “Начальник - подчиненный”

Этот пример завершает “первые шаги” изучения SQL запросов наиболее сложным из них. Здесь мы "программируем" выдачу списка сотрудников вместе с их непосредственным руководством. Сложность в том, что записи и о тех и других хранятся в одной и той же таблице, и здесь без псевдонимов не обойтись. СУБД, в ходе обработки запроса, будет обращаться к таблице D_STAFF, как будто к двум разным таблицам (под псевдонимами STAFF и CHIEF), с тем, чтобы объединить записи в единый кортеж на основе отношения “начальник - подчиненный”. Отношение моделируется следующим образом: значение поля S_CHIEF_ID у подчиненного соответствует значению поля XD_IID его начальника.

SELECT STAFF.S_NAME AS Подчиненный, STAFF.S_POSITION AS [Должность подчиненного], CHIEF.S_NAME AS Начальник, CHIEF.S_POSITION AS [Должность начальника] FROM D_STAFF AS STAFF, D_STAFF AS CHIEF WHERE STAFF.S_CHIEF_ID=CHIEF.XD_IID


Получение иерархии "начальник - подчиненный" с использованием в SQL запросе псевдонима таблицы.