LIKE (Transact-SQL)
Определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Символы-шаблоны могут совпадать с произвольными элементами символьной строки. Использование wild карта символов делает LIKE оператор более гибким, чем с помощью = операторов сравнения строк и != строк. Если один из аргументов не является типом данных строки символов, SQL Server ядро СУБД преобразует его в тип данных строки символов, если это возможно.
Синтаксис
Синтаксис для SQL Server и Базы данных SQL Azure:
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
Синтаксис для Azure Synapse Analytics и Parallel Data Warehouse:
match_expression [ NOT ] LIKE pattern
ESCAPE и STRING_ESCAPE не поддерживаются в Azure Synapse Analytics или analytics Platform System (PDW).
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
match_expression
Любое допустимое выражение типа данных символов.
pattern
Определенная строка символов для поиска в match_expression и может содержать допустимые дикие карта символы в следующей таблице. Длина значения pattern не может превышать 8000 байт.
Если match_expression является более высоким приоритетом типа данных, чем шаблон, и длина шаблона больше match_expression, при неявном преобразовании значения шаблона в тип match_expression будет возникать ошибка усечения.
Символ-шаблон | Description | Пример |
---|---|---|
% | Любая строка, содержащая ноль или более символов. | WHERE title LIKE ‘%computer%’ находит все названия книги со словом computer в любом месте в названии книги. |
и символ подчеркивания ( _ ). | Любой одиночный символ. | WHERE au_fname LIKE ‘_ean’ находит все четыре буквы первых имен, которые заканчиваются ean ( Dean , Sean и т. д.). |
[ ] | Любой отдельный символ в указанном диапазоне [a-f] или наборе [abcdef] . | WHERE au_lname LIKE ‘[C-P]arsen’ находит фамилии автора, заканчивающиеся и начиная с arsen любого отдельного символа между C и P , например Carsen , Larsen и Karsen т. д. При выполнении операции поиска в диапазоне символы, включенные в диапазон, могут изменяться в зависимости от правил сортировки параметров сортировки. |
[^] | Любой отдельный символ, не в пределах указанного диапазона [^a-f] или набора [^abcdef] . | WHERE au_lname LIKE ‘de[^l]%’ находит все фамилии автора, начиная с de и где не указано l следующее письмо. |
escape_character
Символ, помещенный перед диким карта символом, чтобы указать, что дикий карта интерпретируется как обычный символ, а не как дикий карта. Аргумент escape_character является символьным выражением, не имеющим значения по умолчанию и возвращающим результат в виде одного символа.
Тип результата
Boolean
Значение результата
LIKE возвращает значение TRUE, если match_expression соответствует указанному шаблону.
Замечания
При сравнении строк с помощью LIKE все символы в строке шаблона являются значительными. К значимым символам также относятся начальные и конечные пробелы. Если сравнение в запросе заключается в возврате всех строк со строкой LIKE ‘abc ‘ ( abc за которым следует одно пробел), строка, в которой значение этого столбца ( abc abc без пробела) не возвращается. Однако завершающие пробелы в выражении, с которым сравнивается шаблон, не учитываются. Если сравнение в запросе заключается в возврате всех строк со строкой LIKE ‘abc’ ( abc без пробела), возвращаются все строки, начинающиеся с abc нуля или более конечных пустых.
Сравнение строк с использованием шаблона, содержащего данные char и varchar , может не передавать LIKE сравнение из-за того, как данные хранятся для каждого типа данных. В следующем примере передается локальная переменная char в хранимую процедуру, а затем используется сопоставление шаблонов для поиска всех сотрудников, фамилии которых начинаются с указанного набора символов.
-- Uses AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName CHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
Выполнение процедуры FindEmployee не дает результатов, так как переменная типа char ( @EmpLName ) всегда имеет длину в 20 символов, до которой дополняется завершающими знаками пробела. Переменные, содержащиеся в столбце LastName , имеют тип varchar. Поэтому завершающие пробелы в них не дописываются. Данная процедура завершается неудачей, так как завершающие пробелы учитываются.
Процедура из следующего примера выполняется успешно, так как завершающие пробелы к переменной типа varchar не добавляются.
-- Uses AdventureWorks CREATE PROCEDURE FindEmployee @EmpLName VARCHAR(20) AS SELECT @EmpLName = RTRIM(@EmpLName) + '%'; SELECT p.FirstName, p.LastName, a.City FROM Person.Person p INNER JOIN Person.Address a ON p.BusinessEntityID = a.AddressID WHERE p.LastName LIKE @EmpLName; GO EXEC FindEmployee @EmpLName = 'Barb'; GO
FirstName LastName City ---------- -------------------- --------------- Angela Barbariol Snohomish David Barber Snohomish (2 row(s) affected)
Сопоставление шаблонов с помощью LIKE
LIKE поддерживает сопоставление шаблонов ASCII и сопоставление шаблонов Юникода. Если все аргументы (match_expression, pattern и escape_character, если он указан) имеют символьный тип ASCII, то применяется шаблон ASCII. Если один из аргументов имеет тип данных Юникода, все аргументы преобразуются в Юникод и выполняется сопоставление шаблонов Юникода. При использовании данных Юникода (nchar или nvarchar ) с LIKE конечными пустыми являются значительными, однако для данных, отличных от Юникода, конечные пробелы не являются значительными. Юникод LIKE совместим со стандартом ISO. ASCII LIKE совместим с более ранними версиями SQL Server.
В следующем ряде примеров показаны различия в строках, возвращаемых между ASCII и сопоставлением шаблонов Юникода LIKE .
-- ASCII pattern matching with char column CREATE TABLE t (col1 CHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1 LIKE '% King'; -- returns 1 row -- Unicode pattern matching with nchar column CREATE TABLE t (col1 NCHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE col1 LIKE '% King'; -- no rows returned -- Unicode pattern matching with nchar column and RTRIM CREATE TABLE t (col1 NCHAR(30)); INSERT INTO t VALUES ('Robert King'); SELECT * FROM t WHERE RTRIM(col1) LIKE '% King'; -- returns 1 row
LIKE сравнения влияют на параметры сортировки. Дополнительные сведения см. в статье COLLATE (Transact-SQL).
Использование дикого карта символа %
LIKE ‘5%’ Если задан символ, ядро СУБД ищет число 5 , за которым следует любая строка нулевых или более символов.
Например, при выполнении следующего примера отображаются все динамические административные представления базы данных AdventureWorks2022 , так как все они начинаются символами dm .
-- Uses AdventureWorks SELECT Name FROM sys.system_views WHERE Name LIKE 'dm%'; GO
Чтобы отобразить все объекты, не являющиеся динамическими административными представлениями, используется синтаксис NOT LIKE ‘dm%’ . Если у вас есть 32 объекта и LIKE найдено 13 имен, которые соответствуют шаблону, NOT LIKE находит 19 объектов, которые не соответствуют шаблону LIKE .
По такому шаблону, как LIKE ‘[^d][^m]%’ , не всегда будут возвращаться одни и те же имена. Вместо 19 имен можно найти только 14, так как имена, которые начинаются с буквы d или у которых второй буквой является m , будут исключены из результата, как и имена динамических административных представлений. Причиной такой реакции на событие является поэтапный поиск отрицательных символов-шаблонов: за один шаг обрабатывается один символ-шаблон. Процесс поиска совпадений прекращается при возникновении сбоя на любой стадии выполнения.
Используйте дикие карта символы в качестве литерала
Символы-шаблоны могут быть использованы в качестве литералов. Чтобы использовать символ-шаблон в качестве литерала, его необходимо заключать в скобки. В следующей таблице показаны несколько примеров использования LIKE ключевое слово и [ ] диких символов карта.
Символ | Значение |
---|---|
LIKE ‘5[%]’ | 5% |
LIKE ‘[_]n’ | _n |
LIKE ‘[a-cdf]’ | a , b , c , d или f |
LIKE ‘[-acdf]’ | — , a , c , d или f |
LIKE ‘[ [ ]’ | [ |
LIKE ‘]’ | ] |
LIKE ‘abc[_]d%’ | abc_d и abc_de . |
LIKE ‘abc[def]’ | abcd , abce и abcf |
Сопоставление шаблонов с предложением ESCAPE
Можно искать символьные строки, в состав которых входит один или более специальных символов-шаблонов. Например, таблица discounts базы данных customers может содержать значения скидок, включающих знак процента (%). Чтобы выполнить поиск знака процента в качестве символа-шаблона, необходимо ввести ключевое слово ESCAPE и escape-символ. Например, образец базы данных содержит столбец с именем comment, в котором хранится значение «30%». Чтобы найти строки, содержащие последовательность символов «30%» в столбце comment, необходимо указать предложение WHERE, например WHERE comment LIKE ‘%30!%%’ ESCAPE ‘!’ . Если escape-код и escape-символ не указаны, ядро СУБД возвращает строки со строкой 30! .
Если в шаблоне LIKE после escape-символа нет никакого символа, то шаблон является недопустимым и оператор LIKE возвращает значение FALSE. Если символ после escape-символа не является символом-шаблоном, то escape-символ игнорируется, а следующий символ рассматривается как обычный символ в шаблоне. К этим символам-шаблонам относятся: подчеркивание (_), процент (%) и левая квадратная скобка ([), в том случае, если они заключены в квадратные скобки. Escape-символы могут использоваться в квадратных скобках ([ ]), включая: знак вставки (^), дефис (-) и правую квадратную скобку (]).
0x0000 (char(0)) является неопределенным символом в параметрах сортировки Windows и не может быть включен в LIKE.
Примеры
А. Использование LIKE с диким символом % карта
В следующем примере в таблице 415 выполняется поиск всех телефонных номеров с кодом города PersonPhone .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, ph.PhoneNumber FROM Person.PersonPhone AS ph INNER JOIN Person.Person AS p ON ph.BusinessEntityID = p.BusinessEntityID WHERE ph.PhoneNumber LIKE '415%' ORDER BY p.LastName; GO
FirstName LastName Phone ----------------- ------------------- ------------ Ruben Alonso 415-555-124 Shelby Cook 415-555-0121 Karen Hu 415-555-0114 John Long 415-555-0147 David Long 415-555-0123 Gilbert Ma 415-555-0138 Meredith Moreno 415-555-0131 Alexandra Nelson 415-555-0174 Taylor Patterson 415-555-0170 Gabrielle Russell 415-555-0197 Dalton Simmons 415-555-0115 (11 row(s) affected)
B. Использование NOT LIKE с диким символом % карта
В следующем примере в таблице PersonPhone выполняется поиск всех телефонных номеров с региональным кодом, отличным от 415 .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, ph.PhoneNumber FROM Person.PersonPhone AS ph INNER JOIN Person.Person AS p ON ph.BusinessEntityID = p.BusinessEntityID WHERE ph.PhoneNumber NOT LIKE '415%' AND p.FirstName = 'Gail' ORDER BY p.LastName; GO
FirstName LastName Phone ---------------------- -------------------- ------------------- Gail Alexander 1 (11) 500 555-0120 Gail Butler 1 (11) 500 555-0191 Gail Erickson 834-555-0132 Gail Erickson 849-555-0139 Gail Griffin 450-555-0171 Gail Moore 155-555-0169 Gail Russell 334-555-0170 Gail Westover 305-555-0100 (8 row(s) affected)
C. Использование предложения ESCAPE
В следующем примере предложение ESCAPE и escape-символ используются для поиска символьной строки 10-15% в столбце c1 таблицы mytbl2 .
USE tempdb; GO IF EXISTS ( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mytbl2' ) DROP TABLE mytbl2; GO USE tempdb; GO CREATE TABLE mytbl2 (c1 SYSNAME); GO INSERT mytbl2 VALUES ('Discount is 10-15% off'), ('Discount is .10-.15 off'); GO SELECT c1 FROM mytbl2 WHERE c1 LIKE '%10-15!% off%' ESCAPE '!'; GO
D. Используйте дикие [ ] карта символы
В следующем примере выполняется поиск в таблице Person сотрудников с именем Cheryl или Sheryl .
-- Uses AdventureWorks SELECT BusinessEntityID, FirstName, LastName FROM Person.Person WHERE FirstName LIKE '[CS]heryl'; GO
В следующем примере выполняется поиск строк в таблице Person для сотрудников с фамилией Zheng или Zhang .
-- Uses AdventureWorks SELECT LastName, FirstName FROM Person.Person WHERE LastName LIKE 'Zh[ae]ng' ORDER BY LastName ASC, FirstName ASC; GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
Д. Использование LIKE с диким символом % карта
В следующем примере в таблице DimEmployee выполняется поиск всех сотрудников, телефонные номера которых начинаются с 612 .
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone LIKE '612%' ORDER BY LastName;
F. Использование NOT LIKE с диким символом % карта
В следующем примере в таблице DimEmployee выполняется поиск всех телефонных номеров, которые не начинаются с 612 .
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone NOT LIKE '612%' ORDER BY LastName;
G. Использование LIKE с диким символом _ карта
В следующем примере в таблице DimEmployee выполняется поиск всех телефонных номеров, начинающихся с 2 и заканчивающихся на 6 . Подстановочный знак «%» добавлен в конце шаблона поиска, что соответствует любым следующим символам в значениях столбца с телефонными номерами.
-- Uses AdventureWorks SELECT FirstName, LastName, Phone FROM DimEmployee WHERE phone LIKE '6_2%' ORDER BY LastName;
См. также
- PATINDEX (Transact-SQL)
- Выражения (Transact-SQL)
- Что такое функции базы данных SQL?
- SELECT (Transact-SQL)
- SELECT (Transact-SQL)
- WHERE (Transact-SQL)
SQL ACADEMY ответы и решения заданий (часть 1, задания 1-22)
SQL Academy (ответы и решения заданий 1-22)
ВКонтакте WhatsApp Pinterest Facebook Email
Ниже представлены наши варианты решения заданий из онлайн тренажера на сайте SQL ACADEMY (sql-academy.org). Ответы на 66 заданий представленные в онлайн тренажере разбиты на 3 части. Здесь, в первой части, представлены ответы на первые 22 задания.
Задание 1. Вывести имена всех когда-либо обслуживаемых пассажиров авиакомпаний.
SELECT name FROM Passenger;
Задание 2. Вывести названия всеx авиакомпаний.
SELECT name FROM Company;
Задание 3. Вывести все рейсы, совершенные из Москвы
SELECT * FROM Trip WHERE town_from = 'Moscow';
Задание 4. Вывести имена людей, которые заканчиваются на “man”
SELECT name FROM Passenger WHERE name LIKE '%man';
Задание 5. Вывести количество рейсов, совершенных на TU-134
SELECT COUNT(*) AS count FROM Trip WHERE plane = 'TU-134';
Задание 6. Какие компании совершали перелеты на Boeing
SELECT DISTINCT name FROM Company JOIN Trip ON Company.id=Trip.company WHERE plane = 'Boeing';
Задание 7. Вывести все названия самолётов, на которых можно улететь в Москву (Moscow)
SELECT DISTINCT plane FROM Trip WHERE town_to = 'Moscow';
Задание 8. В какие города можно улететь из Парижа (Paris) и сколько времени это займёт?
SELECT town_to, TIMEDIFF(time_in, time_out) AS flight_time FROM Trip WHERE town_from = 'Paris';
Задание 9. Какие компании организуют перелеты с Владивостока (Vladivostok)?
SELECT DISTINCT name FROM Company JOIN Trip ON Company.id=Trip.company WHERE town_from = 'Vladivostok';
Задание 10. Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г.
SELECT * FROM Trip WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';
Задание 11. Вывести пассажиров с самым длинным именем
SELECT name FROM Passenger WHERE LENGTH(name) = (SELECT MAX(LENGTH(name)) FROM Passenger);
Задание 12. Вывести id и количество пассажиров для всех прошедших полётов
SELECT trip, COUNT(passenger) as count FROM Pass_in_trip GROUP BY trip;
Задание 13. Вывести имена людей, у которых есть полный тёзка среди пассажиров
SELECT name FROM Passenger GROUP BY name HAVING COUNT(name) > 1;
Задание 14. В какие города летал Bruce Willis?
SELECT DISTINCT town_to FROM Trip JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip JOIN Passenger ON Pass_in_trip.passenger=Passenger.id WHERE name = 'Bruce Willis';
Задание 15. Во сколько Стив Мартин (Steve Martin) прилетел в Лондон (London)?
SELECT time_in FROM Trip JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip JOIN Passenger ON Pass_in_trip.passenger=Passenger.id WHERE name='Steve Martin' AND town_to='London';
Задание 16. Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет.
SELECT name, COUNT(*) AS count FROM Passenger JOIN Pass_in_trip ON Passenger.id=Pass_in_trip.passenger GROUP BY passenger HAVING COUNT(trip) > 0 ORDER BY COUNT(trip) DESC, name;
Задание 17. Определить, сколько потратил в 2005 году каждый из членов семьи
SELECT member_name, status, SUM(amount*unit_price) AS costs FROM FamilyMembers JOIN Payments ON FamilyMembers.member_id=Payments.family_member WHERE YEAR(date) = 2005 GROUP BY member_name, status;
Задание 18. Узнать, кто старше всех в семьe
SELECT member_name FROM FamilyMembers WHERE birthday = (SELECT MIN(birthday) FROM FamilyMembers);
Задание 19. Определить, кто из членов семьи покупал картошку (potato)
SELECT DISTINCT status FROM FamilyMembers JOIN Payments ON FamilyMembers.member_id=Payments.family_member JOIN Goods ON Payments.good=Goods.good_id WHERE good_name = 'potato';
Задание 20. Сколько и кто из семьи потратил на развлечения (entertainment). Вывести статус в семье, имя, сумму
SELECT fm.status, fm.member_name, SUM(p.amount*p.unit_price) AS costs FROM FamilyMembers AS fm JOIN Payments AS p ON fm.member_id=p.family_member JOIN Goods AS g ON p.good=g.good_id JOIN GoodTypes AS gt ON g.type=gt.good_type_id WHERE good_type_name = 'entertainment' GROUP BY fm.status, fm.member_name;
Задание 21. Определить товары, которые покупали более 1 раза
SELECT good_name FROM Goods JOIN Payments ON Goods.good_id=Payments.good GROUP BY good HAVING COUNT(good) > 1;
Задание 22. Найти имена всех матерей (mother)
SELECT member_name FROM FamilyMembers WHERE status = 'mother';
Вывести имена людей которые заканчиваются на man
Rendering an article
Статья (Стандартизация образования в РФ). Раджабова А.Ф.
Добавить этот документ в коллекции
Вы можете добавить этот документ в свои учебные коллекции
Войти Доступно только авторизованным пользователям
Добавить этот документ в сохраненные
Вы можете добавить этот документ в свой список с сохраненными документами
Войти Доступно только авторизованным пользователям
Разделы
Поддержка
© 2013 — 2024 studylib.net — Все товарные знаки и авторские материалы, находящиеся в документах, принадлежат их владельцам.
Предложить улучшение
Нашли ошибку в текстах или интерфейсе? Или знаете, как улучшить наши инструменты? Смело отправляте нам свои предложения! Это очень важно для нас!
Как вывести имена всех людей, которые покупали морские продукты? Пример на SQL тренажере
Пытаюсь разобраться в sql с помощью задачек на этом онлайн-тренажере https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all
Исходя из базы на этом сайте есть задание:
Вывести только имена всех людей, которые покупали морские продукты
Насколько я поняла, для этого надо связать друг с другом 4 таблицы. Структура
Customers: CustomerID, CustomerName
Orders: OrderID, CustomerID
OrderDetails: OrderID, ProductID
Products: ProductID, CategoryID У меня получилась данная каша, в верности результата не уверена:
SELECT CustomerName FROM Customers where CustomerID in (SELECT CustomerID FROM Orders where OrderID in (SELECT OrderID FROM OrderDetails where ProductID in (SELECT ProductID FROM Products where CategoryID=8 )))
Подскажите, как можно решить данный пример?
Отслеживать
задан 9 авг 2021 в 12:49
1 1 1 бронзовый знак
WHERE IN — это не только каша, но ещё и весьма качественные тормоза. Прочитайте ещё раз мануалы по JOIN, да повнимательнее. И прекратите мыслить итерациями — небось, не Бэйсик. В SQL мыслят так — сперва взять всё, потом отбросить ненужное. Т.е. множествами.
9 авг 2021 в 13:26
PS. Вывести только имена всех людей — это зачёт!
9 авг 2021 в 13:27
@Akina, после слова «всех» идет уточнение «которые . »
9 авг 2021 в 13:28
@MaxU Вот именно поэтому здесь и не должно быть слова «всех». Либо наоборот, не должно быть слова «только». Масло масляное — это бред, но и масло немасляное — бред не меньший.