В операторе WHERE также могут применяться операторы сравнения: =, >, >=, <, <=, <>, [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF]. Далее приведен пример использования двух из этих операторов:
SELECT c
FROM Customer c
WHERE c.age > 18
SELECT c
FROM Customer c
WHERE c.age NOT BETWEEN 40 AND 50
SELECT c
FROM Customer c
WHERE c.address.country IN ('США', 'Португалия')
Выражение LIKE состоит из строки и опциональных знаков переключения кода, которые определяют условия соответствия: знак подчеркивания (_) для метасимволов, состоящих из одного знака, и знак процента (%), если речь идет о метасимволах, состоящих из множества знаков.
SELECT c
FROM Customer c
WHERE c.email LIKE '%mail.com'
Операторы WHERE, приводившиеся в этой книге до настоящего момента, задействовали только фиксированные значения. В приложениях запросы часто зависят от параметров. JPQL поддерживает синтаксис для привязки параметров двух типов, делая возможным внесение динамических изменений в ограничительный оператор запроса. Это позиционные и именованные параметры.
SELECT c
FROM Customer c
WHERE c.firstName =?1 AND c.address.country =?2
SELECT c
FROM Customer c
WHERE c.firstName =:fname AND c.address.country =:country
В разделе «Запросы», приведенном далее в этой главе, вы увидите, как приложение осуществляет привязку параметров.
Подзапрос — это запрос SELECT, который вложен в условное выражение WHERE или HAVING. Результаты подзапроса оцениваются и интерпретируются в условном выражении главного запроса. Для извлечения информации о самых молодых клиентах из базы данных сначала нужно выполнить подзапрос с использованием MIN(age), а затем его результаты будут оценены в главном запросе.
SELECT c
FROM Customer c
WHERE c.age = (SELECT MIN(cust. age) FROM Customer cust))
Оператор ORDER BY позволяет упорядочивать сущности или значения, возвращаемые в результате выполнения запроса SELECT. Упорядочение применяется для атрибута сущности, который указан в этом предложении и за которым следует ключевое слово ASC или DESC. Ключевое слово ASC определяет, что будет применяться упорядочение по возрастанию; ключевое слово DESC, которое является его противоположностью, определяет, что применяется упорядочение по убыванию. Сортировка по возрастанию задействуется по умолчанию, и ее можно не указывать.
SELECT c
FROM Customer c
WHERE c.age > 18
ORDER BY c.age DESC
Для уточнения порядка сортировки также можно использовать множественные выражения:
SELECT c
FROM Customer c
WHERE c.age > 18
ORDER BY c.age DESC, c.address.country ASC
Конструкция GROUP BY делает возможной агрегацию результирующих значений согласно набору свойств. Сущности делятся на группы в зависимости от значений связанных с ними полей, которые указаны в предложении GROUP BY. Чтобы сгруппировать клиентов в соответствии со страной их проживания и сосчитать их, используйте приведенный далее запрос:
SELECT c.address.country, count(c)
FROM Customer c
GROUP BY c.address.country
GROUP BY определяет выражения группировки (c.address.country), с использованием которых будет осуществляться агрегация и подсчет результатов (count(c)). Следует отметить, что выражения, присутствующие в операторе GROUP BY, также должны быть в операторе SELECT.
Оператор HAVING определяет соответствующий фильтр, который применяется после того, как будут сгруппированы результаты запроса, подобно вторичному оператору WHERE, обеспечивая фильтрацию результатов GROUP BY. Если воспользоваться предыдущим запросом, добавив HAVING, то могут быть возвращены результаты, в случае с которыми country будет иметь значение, отличное от Англия.
SELECT c.address.country, count(c)
FROM Customer c
GROUP BY c.address.country
HAVING c.address.country <> 'Англия'