SQL и флаги / Хабр
Конечно же речь пойдёт не о режиме игры Capture The Flag на сервере SQL, а об использования bit флагов. Битовые операции знакомы, наверное, всем, кто занимается панорамированием, независимо от среды и языка разработки. Однако использование флагов, на мой взгляд, для многих является экзотикой нежели повседневным инструментом. На Хабре не раз упоминали возможность удобную возможность .NET работать с флагами через enum, но ведь и SQL даёт нам отличные возможности для использования флагов!И так, рассмотрим простой пример — в некой аппликации должна быть некая система оповещения пользователей. Допустим вы строите форум и хотите дать возможность пользователю получать оповещения по почте: новый ответ в избранной теме, новое личное сообщение, новости форума.Беглый взгляд на задачу даст тривиальный дизайн таблиц:
tblUsers {userID (PK) as int, name as nvarchar(50), password as nvarchar(50)}
tblUserAlerts {userID (FK) as int, alertID (FK) as int}
То есть существует таблица пользователей, таблица оповещений и связь между ними реализуется через вспомогательную таблицу дабы дать возможность каждому пользователю выбрать больше чем одно оповещение. Данные будут выглядеть примерно так:
tblUsers
1, «Вася», «хитрыйп4р0ль»
tblUserAlerts
1, 1
tblAlerts
1, «Вам пришло новое личное сообщение»
А теперь рассмотрим пример с пользованием флага:
tblUsers {userID (PK) as int, name as nvarchar(50), password as nvarchar(50), alerts as int},
tblAlerts{alertID (PK) as int, message as nvarchar(50)}
В данном варианте мы получаем ту же функциональность и при этом обходимся без дополнительной таблицы. В таблице tblAlerts мы задаём alertID как бит флаг с помощью то го же int (размер зависит от количества вариантов оповещений), а в таблице tblUsers поле alerts отображает бит маску оповещений. Допустим мы создаём 3 вида оповещений, значит в таблице tblAlerts будет 4 (нет оповещений + упомянутые 3 вида) строки флагами в поле alertID. Первым ID будет 0 — в битах будет выглядеть как 0000, значение, соответственно — нет оповещений. Затем мы добавляем наши оповещения зажигая каждый раз другой бит (каждый идентификатор будет степенью двойки ): 0001 = 1, 0010 = 2, 0100 = 4:
0, NULL
1, «Новый ответ в избранной теме»
2, «Вам пришло новое личное сообщение»
4, «У нас новость!»
Теперь нам надо подписать пользователя, допустим, на новости и на оповещения о личных сообщения. Для этого мы суммируем идентификаторы этих оповещений и получаем 0110 = 6:
tblUsers
1, «Вася», «хитрыйп4р0ль», 6
Теперь построим запрос в таблицу tblUsers, чтобы узнать кто из пользователей подписан на новости:
SELECT * FROM tblUsers WHERE (tblUsers.alert & 4) > 0
Смысл данной операции прост:
0110 — наша маска
0100 — флаг новостей
0100 — результат ( то есть есть есть пересечение маски и флага, то результат будет больше нуля )
Приятный аспект — можно сравнивать и маски. Допустим мы хотим получить список пользователей подписанных на все виды оповещений 1+2+4 = 7:SELECT * FROM tblUsers WHERE (tblUsers.alert & 7) = 7
Заметьте, что между маской 6 и 7 есть пересечение, но результат будет отличным от 7
0110 — маска пользователя
0111 — маска проверки
0110 — результат (пересечение или минимум из 7 и 6 = 6)
С той же лёгкостью можно сделать запрос на список пользователей подписанных либо на оповещение об ответах либо на уведомление о личных сообщениях 1+2 = 3:
SELECT * FROM tblUsers WHERE (tblUsers.
alert & 3) > 0
Положительным результатом будет считаться проверка маски пользователя со значениями и 1, и 2, и 3 (то есть либо одно из двух оповещений, либо оба).
Вот таким нехитрым образом можно избавиться от связующей таблицы и даже упростить запросы. Однако минусом может стать не возможность сделать некоторые действия ( допустим JOIN ) через стандартный визуальный редактор запросов, так как стандарт будет сравнивать идентификаторы. Надо будет в ручную заменять сравнение на битовую операцию:SELECT tblUsers.*, tblAlerts.*
FROM tblUsers INNER JOIN tblAlerts ON (tblUsers.alerts & tblAlerts.alertID) = tblAlerts.alertID
Язык sql FoxPro 5.0
СУБД
FoxPro, за многие годы своей эволюции,
накопила колоссальное количество
стандартных операций, функций и условий
(предикатов), с которыми программист
знакомится по мере освоения системы.
В принципе, все эти возможности можно
использовать во вложенном SQL (при
соблюдении некоторых мер осторожности,
что особенно относится к использованию
пользовательских функций).
С другой стороны, SQL образует вполне изолированный подъязык FoxPro, отличный от него по духу и синтаксису: в отличие от «базового» FoxPro, SQL является декларативным языком преобразований таблиц в целом, а не процедурным языком обработки их записей; синтаксис команд SQL замкнут и не содержит ссылок на текущее состояние окружение, столь многочисленных в командах FoxPro.
Щадя читателя и следуя принципу «разумной достаточности», мы далее немного упрощаем синтаксис — в основном, за счет исключения синонимии и редко используемых опций. Наиболее полный синтаксис FoxPro SQL, как всегда, можно найти в справочной системе FoxPro, на которую мы в дальнейшем будем ссылаться как на “документацию”. Расширения языка, отсутствующие в стандарте (и, возможно — в используемой читателем версии) SQL отмечены символом *
Очевидно,
что, если программист использует SQL
FoxPro
«по
прямому назначению» — именно, в качестве
средства связи с другими СУБД в рамках
технологии «клиент-сервер», то он
должен отказаться от многочисленных
дополнительных возможностей FoxPro
и обязан
использовать исключительно описываем
ниже набор функций, предикатов
и команд стандартного SQL.
SQL FoxPro образуют замкнутый язык СУБД, достаточный для выполнения основных задач обработки локальных данных, а также обработки удаленных данных в рамках технологии удаленных представлений. Главное достоинство последней — простота; от программиста скрыты все детали реализации обработки данных на удаленном источнике (сервере) в терминах его собственной версии SQL.
Поддерживаемый также FoxPro аппарат «сквозного SQL» , или технологии SPT (SQL-pass-through) более эффективен, но и более изощрен — кроме знания достаточно обширного дополнительного набора функций SQL, он предполагает и знание версии SQL, «работающей» на сервере. Любознательный читатель, как всегда, может найти отсутствующую в настоящем пособии информацию о “сквозном SQL”в справочной системе FoxPro.
Выражения и предикаты в SQL.
Итак, в рамках данного пособия достаточно знания лишь «классического набора” выражений SQL, а именно — ариметических выражений и предикатов следующего вида:
а) Сравнения
Аргумент1 Знак_сравнения Аргумент2
где знак сравнения — один из символов отношений = (равенство), <>, !=, # (неравенство) и >, >=,<,<=, а также, для символьных строк, == (точное равенство) и [NOT] LIKE (сравнение по маске),
Заметьте,
что, если для числовых типов и типа
«дата» такие сравнения имеют обычный
смысл, то для символьных строк имеется
ввиду лексикографическое (словарное)
сравнение, а равенство = несимметрично
и понимается в FoxPro как вхождение второго
аргумента в первый как начального
подслова (см. документацию о зависимости
такого сравнения от установок системных
переменных ANSI и EXACT).
Предикат сравнения по маске имеет вид
Аргумент [NOT] LIKE Маска
где Маска — произвольная символьная строка, (возможно) содержащая специальные символы кратной замены % и одиночной замены _. Предикат [NOT] LIKE считается истинным, если маску можно превратить в стоящий слева аргумент подстановкой некоторых слов вместо символа % и одиночных символов — вместо символов _.
б) Булевские формулы, как обычно, образуются с помощью операций конъюнкции AND, дизъюнкции OR и отрицания NOT
в) «Синтаксический сахар» — группа предикатов, выразимых через булевские комбинации сравнений, но более кратких и привычных по форме (для англоязычного пользователя)
Аргумент1 [NOT] BETWEEN Аргумент2 AND Аргумент3
— краткая форма записи предиката
[NOT] (Аргумент2 Аргумент1 AND Аргумент1Аргумент3)
Аргумент [NOT] IN (список_значений)
— краткая форма записи предиката
[NOT] (Аргумент=Аргумент1 OR АргументАргумент2 OR … Аргумент=АргументN)
г) Предикаты, использующие выборку
Имя_поля Знак_сравнения ALL (команда SELECT)
истинно,
если сравнение выполняется для стоящего
слева значения поля и всех значений,
выбранных командой SELECT — при этом
предполагается,
что последняя выдает список значений
— таблицу с единственным полем, совместиммым
по типу со значением поля, стояшим слева.
Имя_поля Знак_сравнения ANY | SOME (команда SELECT)
истинно, если сравнение выполняется для стоящего слева значения поля и хотя бы одного из значений, выбранных командой SELECT — снова предполагается, что последняя выдает список значений, соместимых по типу со значением поля. Если подвыборка пуста, условие считается ложным.
[NOT] EXISTS (команда_SELECT)
истинно, если подвыборка (не) пуста, т.е. (не) содержит по крайней мере одну строку.
Имя_поля [NOT] IN (команда_SELECT)
[ ] Подстановочный знак для соответствия символам — SQL Server (Transact-SQL)
Редактировать Твиттер LinkedIn Фейсбук Электронная почта- Статья
Применяется к: SQL Server База данных SQL Azure Azure SQL Управляемый экземпляр Azure Synapse Analytics Analytics Platform System (PDW) Конечная точка SQL в Microsoft Fabric Warehouse в Microsoft Fabric
Соответствует любому одиночному символу в указанном диапазоне или наборе, указанном в квадратных скобках [ ]
. Эти подстановочные знаки можно использовать при сравнении строк, включающем сопоставление с образцом, например LIKE
и PATINDEX
.
Примеры
A: Простой пример
В следующем примере возвращаются имена, начинающиеся с буквы m
. [n-z]
указывает, что вторая буква должна быть где-то в диапазоне от n
до z
. Подстановочный знак процента %
допускает использование любых символов или их отсутствие, начиная с символа 3. Базы данных model
и msdb
соответствуют этому критерию. База данных
master
не соответствует критериям и исключена из набора результатов.
ВЫБЕРИТЕ имя ИЗ sys.databases ГДЕ имя LIKE 'm[n-z]%';
Вот набор результатов.
имя ----- модель msdb
Возможно, у вас установлены дополнительные подходящие базы данных.
B: Более сложный пример
В следующем примере используется оператор [] для поиска идентификаторов и имен всех сотрудников Adventure Works, чьи адреса имеют четырехзначный почтовый индекс.
-- Использует AdventureWorks ВЫБЕРИТЕ e.BusinessEntityID, p.FirstName, p.LastName, a.PostalCode ОТ HumanResources.Employee AS e ВНУТРЕННЕЕ СОЕДИНЕНИЕ Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ВНУТРЕННЕЕ СОЕДИНЕНИЕ Person.BusinessEntityAddress AS ea ON e.BusinessEntityID = ea.BusinessEntityID ВНУТРЕННЕЕ СОЕДИНЕНИЕ Person.Address AS a.AddressID = ea.AddressID ГДЕ a.PostalCode LIKE '[0-9][0-9][0-9][0-9]';
Вот набор результатов.
ID сотрудника Имя Фамилия Почтовый индекс ---------- --------- --------- ---------- 290 Линн Цофлиас 3000
C: Использование набора, объединяющего диапазоны и отдельные символы
Набор подстановочных знаков может включать как отдельные символы, так и диапазоны. В следующем примере оператор [] используется для поиска строки, начинающейся с числа или набора специальных символов.
ВЫБРАТЬ [object_id], OBJECT_NAME(object_id) AS [object_name], name, column_id ИЗ sys.columns ГДЕ имя LIKE '[0-9!@#$.,;_]%';
Вот набор результатов.
object_id object_name имя column_id --------- ----------- ---- --------- 615673241 vSalesPersonSalesByFiscalYears 2002 5 615673241 vSalesPersonSalesByFiscalYears 2003 6 615673241 vSalesPersonSalesByFiscalYears 2004 7 15718 JunkTable _xyz 1 9] (Подстановочный знак — несоответствие символов) (Transact-SQL)
_ (Подстановочный знак — соответствие одному символу) (Transact-SQL)подстановочных знаков SQL
❮ Предыдущий Далее ❯
Подстановочные знаки SQL
Подстановочный знак используется для замены одного или нескольких символов в строке.
Символы подстановки используются с
НРАВИТСЯ
оператор. ОператорLIKE
используется вПредложение WHERE
для поиска указанного шаблона в столбце.Подстановочные знаки в MS Access
Символ | Описание | Пример |
---|---|---|
* | Представляет ноль или более символов | bl* находит bl, black, blue и blob |
? | Представляет один символ | h?t находит горячее, шляпу и хит |
[] | Представляет любой одиночный символ в квадратных скобках | h[o]t находит горячее и шляпу, но не попадает |
! | Представляет любой символ, не указанный в квадратных скобках | h[!oa]t находит попадание, но не горячее и шляпу |
- | Представляет любой одиночный символ в указанном диапазоне | c[a-b]t находит кошку и cbt |
# | Представляет любой одиночный цифровой символ | 2#5 находит 205, 215, 225, 235, 245, 255, 265, 275, 285 и 295 |
Подстановочные знаки в SQL Server
9oa]t находит хит, но не горячий и шляпаСимвол | Описание | Пример |
---|---|---|
% | Представляет ноль или более символов | bl% находит bl, black, blue и blob |
_ | Представляет один символ | h_t находит горячее, шляпу и нажимает |
- | Представляет любой одиночный символ в указанном диапазоне | c[a-b]t находит кошку и cbt |
Все подстановочные знаки также можно использовать в комбинациях!
Вот несколько примеров, показывающих различные операторы LIKE
с подстановочными знаками «%» и «_»:
Оператор LIKE | Описание |
---|---|
ГДЕ CustomerName LIKE 'a%' | Находит все значения, начинающиеся с "а" |
ГДЕ CustomerName LIKE '%a' | Находит все значения, оканчивающиеся на "а" |
ГДЕ CustomerName LIKE '%or%' | Находит все значения, которые имеют "или" в любой позиции |
ГДЕ CustomerName LIKE '_r%' | Находит любые значения, которые содержат "r" во второй позиции |
ГДЕ CustomerName LIKE 'a__%' | Находит любые значения, начинающиеся с "а" и имеющие длину не менее 3 символов |
ГДЕ ContactName LIKE 'a%o' | Находит все значения, начинающиеся с "а" и заканчивающиеся на "о" |
Демонстрационная база данных
В таблице ниже показана полная таблица «Клиенты» из демонстрационной базы данных «Борей»:
90 115 ГерманияCustomerID | CustomerName | ContactName 901 08 | Адрес | Город | Почтовый индекс | Страна |
---|---|---|---|---|---|---|
1 | Альфред Футтеркисте | Мария Андерс | ул.![]() | Берлин | 12209 | Германия |
2 | Ана Трухильо Emparedados y helados | Ана Трухильо | Avda. de la Constitución 2222 | México D.F. | 05021 | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Матадерос 2312 | Мексика Д.Ф. | 05023 | Мексика |
4 | Вокруг Рога | Томас Харди | 120 Hanover Sq. | Лондон | WA1 1DP | Великобритания |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Швеция |
6 | Blauer See Delikatessen | Hanna Moos | Forsterstr. 57 | Мангейм | 68306 | Германия |
7 | Блондель отец и сын | Фредерик Сито | 24, площадь Клебер | Страсбург | 67000 9 0116 | Франция |
8 | Bólido Comidas preparadas | Martin Sommer | C/ Araquil, 67 | Madrid | 28023 | Испания |
9 | Bon app' | Laurence Lebihans | 12, rue des Bouchers | Марсель | 13008 | Франция |
10 | Нижний рынок доллара | Элизабет Линкольн | 23 Tsawassen Blvd.![]() | Тсавассен | T2F 8M4 | Канада |
11 | B's Beverages | Victoria Ashworth | Цирк Фаунтлерой | Лондон | EC2 5NT | Великобритания |
12 | Cactus Comidas para llevar | Patricio Simpson | Cerrito 333 | Buenos Aires | 1010 | Аргентина |
13 | Торговый центр Моктесума | Франсиско Чанг | Сьеррас-де-Гранада 9993 | Мексика Д.Ф. | 05022 | Мексика |
14 | Чоп-суэй Китайский | Ян Ван | Hauptstr. 29 | Берн | 3012 | Швейцария |
15 | Comércio Mineiro | Pedro Afonso | Av. dos Lusíadas, 23 | Сан-Паулу | 05432-043 | Бразилия |
16 | Consolidated Holdings | Элизабет Браун | Berkeley Gardens 12 Brewery | Лондон | WX1 6LT | Великобритания |
17 | Драхенблют Деликатессенд | Свен Отлиб | Вальзервег 21 | Ахен | 52066 | |
18 | Du monde entier | Жанин Лабрюн | 67, rue des Cinquante Otages | Нант | 44000 901 16 | Франция |
19 | Eastern Connection | Энн Девон | 35 Кинг Джордж | Лондон | WX3 6FW | Великобритания |
20 | Эрнст Гендель | Роланд Мендель | Кирхгассе 6 | Грац | 8010 | Австрия |
21 | Семья Аркибальдо | Ария Круз | Руа Орос, 92 | Сан-Паулу | 05442-030 | Бразилия |
22 | FISSA Fabrica Inter.![]() | Диего Роэль | С/ Моралзарзал, 86 | Мадрид | 28034 | Испания |
23 | Фоли для гурманов | Мартин Рансе | 184, шоссе де Турне | Лилль | 59000 | Франция |
24 | Фольклорная и фольклорная HB | Мария Ларссон | Окергатан 24 | Браке | С-844 67 | Швеция |
25 | Франкенверсанд | Питер Франкен | Берлинер Платц 43 | Мюнхен | 80805 | Германия |
26 | Франция реставрация | Карин Шмитт | 54, улица Рояль | Нант | 44000 | Франция |
27 | Франки С.п.А. | Паоло Аккорти | Виа Монте Бьянко 34 | Турин | 10100 | Италия |
28 | Furia Bacalhau e Frutos do Mar | Лино Родригес | Jardim das rosas n.![]() | Лиссабон | 1675 | Португалия |
29 | Галерея гастрономии | Эдуардо Сааведра | Rambla de Cataluña, 23 | Барселона | 08022 | Испания |
30 | Godos Cocina Типика | Хосе Педро Фрейре | С/ Ромеро, 33 | Севилья | 41101 | Испания |
31 | Ланчонетес для гурманов | Андре Фонсека | пр. Бразилия, 442 | Кампинас | 04876-786 | Бразилия |
32 | Продовольственный рынок Великих озер | Говард Снайдер | 2732 Бейкер бул. | Юджин | 97403 | США |
33 | GROSELLA-Ресторан | Мануэль Перейра | 5ª Авеню Лос Палос Грандес | Каракас | 1081 | Венесуэла |
34 | Ханари Карнес | Марио Понтес | Руа-ду-Пасу, 67 | Рио-де-Жанейро | 05454-876 | Бразилия |
35 | ИЛАРИОН-Абастос | Карлос Эрнандес | Carrera 22 con Ave.![]() | Сан-Кристобаль | 5022 | Венесуэла |
36 | Магазин импорта голодных койотов | Йоши Латимер | City Center Plaza 516 Main St. | Элгин | 97827 | США |
37 | Ночные бакалейщики Hungry Owl | Патрисия МакКенна | 8 Джонстаун Роуд | Пробка | Ирландия | |
38 | Островная торговля | Хелен Беннет | Садовый домик Кроутер Уэй | Коус | ПО31 7ПЖ | Великобритания |
39 | Кениглих Эссен | Филип Крамер | Мобельштрассе. 90 | Бранденбург | 14776 | Германия |
40 | Улица изобилия | Даниэль Тонини | 67, проспект Европы | Версаль | 78000 | Франция |
41 | Дом Азии | Аннет Руле | 1 улица Эльзас-Лотарингия | Тулуза | 31000 | Франция |
42 | Винные погреба Смеющегося Вакха | Йоши Таннамури | 1900 Дубовая ул.![]() | Ванкувер | В3Ф 2К1 | Канада |
43 | Загородный магазин Lazy K | Джон Стил | 12 Оркестровая терраса | Уолла Уолла | 99362 | США |
44 | Рыночная площадь Леманнс | Ренате Месснер | Магазинвег 7 | Франкфурт-на-Майне | 60528 | Германия |
45 | Давайте остановимся в магазине | Хайме Йоррес | 87 Полк Стрит Люкс 5 | Сан-Франциско | 94117 | США |
46 | ЛИЛА-Супермаркет | Карлос Гонсалес | Carrera 52 con Ave. Bolívar #65-98 Llano Largo | Баркизимето | 3508 | Венесуэла |
47 | ЛИНО-Деликатесы | Фелипе Искьердо | Авеню 5 де Майо Порламар | И.![]() | 4980 | Венесуэла |
48 | Ресторан «Одинокая сосна» | Фрэн Уилсон | 89 Chiaroscuro Rd. | Портленд | 97219 | США |
49 | Магазин Алиментари Риунити | Джованни Ровелли | Виа Людовико иль Моро 22 | Бергамо | 24100 | Италия |
50 | Дом Дьюи | Кэтрин Дьюи | Рю Жозеф-Бенс 532 | Брюссель | Б-1180 | Бельгия |
51 | Мама Пайярд | Жан Френьер | 43 улица Сен-Лоран | Монреаль | h2J 1C3 | Канада |
52 | Моргенштерн Гезундкость | Александр Фойер | Херстр. 22 | Лейпциг | 04179 | Германия |
53 | Север/Юг | Саймон Кроутер | Южный дом 300 Квинсбридж | Лондон | СВ7 1РЗ | Великобритания |
54 | Океано Атлантико Лтд.![]() | Ивонн Монкада | Инж. Густаво Монкада 8585 Писо 20-А | Буэнос-Айрес | 1010 | Аргентина |
55 | Деликатесы Старого Света | Рене Филлипс | 2743 ул. Беринга | Анкоридж | 99508 | США |
56 | Оттилис Каселаден | Генриетта Пфальцхайм | Мерхаймерштрассе. 369 | Кёльн | 50739 | Германия |
57 | Специальные предложения Парижа | Мари Бертран | 265, бульвар Шарон | Париж | 75012 | Франция |
58 | Перикл Классические товарищи | Гильермо Фернандес | Calle Dr. Jorge Cash 321 | Мексика Д.Ф. | 05033 | Мексика |
59 | Пикколо и больше | Георг Пиппс | Гейсльвег 14 | Зальцбург | 5020 | Австрия |
60 | Принцесса Изабель Винхос | Изабель де Кастро | Estrada da saúde n.![]() | Лиссабон | 1756 | Португалия |
61 | Кве Делисия | Бернардо Батиста | Руа да Панификадора, 12 | Рио-де-Жанейро | 02389-673 | Бразилия |
62 | Королева Козинья | Лусия Карвалью | Аламеда-дус-Канариос, 891 | Сан-Паулу | 05487-020 | Бразилия |
63 | БЫСТРАЯ ОСТАНОВКА | Хорст Клосс | Таухерштрассе 10 | Куневальде | 01307 | Германия |
64 | Ранчо Гранде | Серхио Гутьеррес | пр. дель Либертадор 900 | Буэнос-Айрес | 1010 | Аргентина |
65 | Продуктовый магазин «Каньон гремучей змеи» | Пола Уилсон | 2817 Милтон Доктор | Альбукерке | 87110 | США |
66 | Реджани Казеичи | Маурицио Морони | Страда Провинциале 124 | Реджо-Эмилия | 42100 | Италия |
67 | Рикардо Адосикадос | Джанет Лимейра | пр.![]() | Рио-де-Жанейро | 02389-890 | Бразилия |
68 | Рихтер Супермаркет | Майкл Хольц | Гренцахервег 237 | Женева | 1203 | Швейцария |
69 | Ромеро и Томилло | Алехандра Камино | Гран Виа, 1 | Мадрид | 28001 | Испания |
70 | Санте Гурмэ | Йонас Бергульфсен | Ворота Эрлинг Скаккес 78 | Ставерн | 4110 | Норвегия |
71 | Рынки, где можно сэкономить | Хосе Паваротти | 187 Саффолк Лн. | Бойсе | 83720 | США |
72 | Импорт семи морей | Хари Кумар | 90 Уодхерст Роуд. | Лондон | ОХ15 4НБ | Великобритания |
73 | Саймонс бистро | Джитте Петерсен | Винбелтет 34 | Копенгаген | 1734 | Дания |
74 | Особые заведения мира | Доминик Перрье | 25, улица Лористон | Париж | 75016 | Франция |
75 | Пиво и эль Split Rail | Арт Брауншвайгер | Почтовый индекс Ящик 555 | Посадочный модуль | 82520 | США |
76 | Высшие деликатесы | Тележка Паскаля | Бульвар Тиру, 255 | Шарлеруа | Б-6000 | Бельгия |
77 | Большой сыр | Лиз Никсон | 89 Джефферсон Уэй Люкс 2 | Портленд | 97201 | США |
78 | Коробка с крекерами | Лю Вонг | 55 Гризли Пик Роуд.![]() | Бьютт | 59801 | США |
79 | Toms Spezialitäten | Карин Джозефс | Луизенштрассе. 48 | Мюнстер | 44087 | Германия |
80 | Ресторан Тортуга | Мигель Анхель Паолино | Авда. Ацтека 123 | Мексика Д.Ф. | 05033 | Мексика |
81 | Традиционный гипермаркет | Анабела Домингес | пр. Инес де Кастро, 414 | Сан-Паулу | 05634-030 | Бразилия |
82 | Припасы для гурманов Trail's Head | Гельвеций Надь | Бульвар Да Винчи, 722 | Киркланд | 98034 | США |
83 | Ваффельджернет | Палле Ибсен | Смагслёгет 45 | Орхус | 8200 | Дания |
84 | Виктуаль на складе | Мэри Савели | 2, улица Коммерс | Лион | 69004 | Франция |
85 | Винные и спиртные напитки Chevalier | Поль Энрио | 59 улица де л'Аббай | Реймс | 51100 | Франция |
86 | Die Wandernde Kuh | Рита Мюллер | Аденауэралле 900 | Штутгарт | 70563 | Германия |
87 | Вартиан Херкку | Пиркко Коскитало | Торикату 38 | Оулу | Финляндия | |
88 | Веллингтон Импортадора | Паула Паренте | Руа-ду-Меркадо, 12 | Резенде | 08737-363 | Бразилия |
89 | Рынки белого клевера | Карл Яблонски | 305 - 14-я авеню С.![]() | Сиэтл | 98128 | США |
90 | Уилман Кала | Матти Карттунен | Кескускату 45 | Хельсинки | 21240 | Финляндия |
91 | Вольский | Збышек | ул. Фильтрова 68 | Валла | 01-012 | Польша |
Использование подстановочного знака %
Следующая инструкция SQL выбирает всех клиентов с городом, начинающимся с "ber":
Пример
SELECT * FROM Customers
WHERE City LIKE 'ber%';
Следующая инструкция SQL выбирает всех клиентов с городом, содержащим шаблон "es":
Пример
SELECT * FROM Customers
WHERE City LIKE '%es%';
Использование подстановочного знака _
Следующий оператор SQL выбирает всех клиентов с городом, начинающимся с любой символ, за которым следует "ondon":
Пример
SELECT * FROM Customers
WHERE City LIKE '_ondon';
Следующая инструкция SQL выбирает всех клиентов с городом, начинающимся с "L", за которым следует любой символ, за которым следует "n", за которым следует любой символ, затем "on":
Пример
SELECT * FROM Customers
WHERE City LIKE 'L_n_on';
Использование подстановочного знака [charlist]
Следующая инструкция SQL выбирает всех клиентов с городом, начинающимся с "b", "s" или "p":
Пример
SELECT * FROM Customers
WHERE City LIKE '[bsp]%';
Следующая инструкция SQL выбирает всех клиентов с городом, начинающимся с "a", "b" или "c":
Пример
SELECT * FROM Customers
WHERE City LIKE '[a-c]%';
Использование подстановочного знака [!charlist]
Два следующих SQL-оператора выбирают всех клиентов, у которых город НЕ начинается.