JavaStart
942 subscribers
876 photos
26 videos
587 links
Учи Java вместе с нами!
Наша платформа с курсом - https://javastart.tech
Ютуб с обучающими видео - https://www.youtube.com/@javastart_tech
Download Telegram
SQL, базы данных. Часть 13.

Чтобы выбрать совершеннолетних пользователей из данных таблиц, можно воспользоваться простым SQL запросом:

SELECT last_name, first_name, birthday FROM users WHERE age >= 18;
(не забываем точку с запятой в конце запроса, иначе будет синтаксическая ошибка 🤓)

Теперь попробуем немного уточнить запрос. Например, выберем всех совершеннолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин (Картинка 1).

После выполнения такого SQL запроса получиться такая таблица как на Картинке 2.

Посмотрим на SQL запрос. Сейчас блок WHERE содержит составное условие: возраст больше или равен 18 годам и пол равен m. Это простое логическое выражение, которому соответствуют все записи для которых оба условия верны. То есть у которых одновременно и возраст от 18 лет и sex = "m".

Кстати, о sex = "m". Так как мы используем равенство, в результирующей таблице в колонке sex для всех записей у нас выводится m. Это не логично, ведь мы и так знаем, что выбираем мужчин, поэтому смысла в том, что мы эту информацию выводим в таблице нет. А значит можно удалить sex из запроса. Удалим и посмотрим на результат выполнения SQL-запроса (Картинка 3). Строки выводятся те же, однако столбца sex больше нет.

SELECT last_name, first_name, birthday
FROM users
WHERE age >= 18 AND sex = 'm';

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
SQL, базы данных. Часть 14.

Кроме операции AND (И), в условии можно применять OR (ИЛИ). Давайте заменим AND на OR, а также вернем колонки sex и age.

Был запрос (Картинка 2):

SELECT last_name, first_name, birthday, sex
FROM users
WHERE age >= 18 AND sex = 'm';

Стал:

SELECT last_name, first_name, birthday, sex, age
FROM users
WHERE age >= 18 OR sex = 'm';

Если посмотрим на результат (на Картинке 3), то увидим, что получили всех мужчин, а также женщин, которым исполнилось 18 лет. В частности в SQL-таблице одна женщина старше 18 лет и все мужчины, даже те, которым меньше 18. Всё это соответствует условию ИЛИ: ИЛИ возраст от 18 лет, ИЛИ мужской пол.

Все достаточно просто и логично!

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой метод Stream API используется для преобразования элементов стрима в другие значения?
Anonymous Quiz
8%
collect()
17%
reduce()
3%
filter()
65%
map()
4%
get()
3%
Посмотреть ответ
SQL, базы данных. Часть 15.

Давайте создадим новую таблицу products и переключим наше внимание на нее.
В ней есть поля id, name, count (количество), price (цена) и поле country, которое содержит данные о стране производителе (Картинка 1).

Давайте выберем товары, произведенные в России, Белоруссии и Украине. Напишем SQL-запрос:

SELECT * FROM products
WHERE country = "RU" OR country = "UA" OR country = "BL";

После выполнения запроса мы получим следующую таблицу (Картинка 2).

Разберем запрос: в блоке WHERE мы используем три условия, разделенные OR (или). Во всех трех условиях мы с помощью символа равенства сравниваем значение в столбце country с одной из стран: ИЛИ Россия, ИЛИ Украина, ИЛИ Белоруссия.

Если мы хотим получить товары еще каких-то стран, то нужно добавить еще условия OR. Это не очень удобно, так как запрос становится громоздиким.

Но его можно упростить. Кроме стандартных условий сравнения AND и OR в языке SQL есть условие принадлежности IN, которое в данном случае подходит лучше. Напишем после WHERE:

SELECT * FROM products
WHERE country IN ("RU", "UA", "BL");

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

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
SQL, базы данных. Часть 16.

Давайте добавим к нашему запросу по таблице products (Картинка 1) еще одно условие. Например, нам нужны не просто товары, а товары стоимостью до 10 000 рублей.

Был запрос:

SELECT * FROM products
WHERE country IN ("RU", "UA", "BL");

Стал запрос:

SELECT * FROM products
WHERE country IN ("RU", "UK", "BL") AND price < 10000;

Посмотрим на результат на Картинке 2.

Получили новую таблицу с тремя записями, которые удовлетовряют новому условию. И в этом условии мы совместили AND и IN. То есть в SQL-запросах можно совмещать логические операции AND и OR с оператором IN. Что делает их очень гибкими.

Теперь давайте попробуем выбрать товары, стоимостью от 10000 до 20000.

Условие с country уберем и напишем:

SELECT * FROM products
WHERE price >= 10000 AND price <= 20000;

В результате получается такая таблица как на Картинке 3.

Рассмотрим запрос. Как видите в этой конструкции мы снова написали двойное условие по одному полю — price. И с одной стороны всё логично и понятно, а с другой стороны эту конструкцию также можно упростить.

Напишем:

SELECT * FROM products
WHERE price BETWEEN 10000 AND 20000;

Теперь запрос звучит так: ВЫБРАТЬ все столбцы из таблицы products, в которых цена между 10000 и 20000. Звучит более чем понятно.

После запуска мы получим всё тот же один товар.

Вообще AND, OR, IN и BETWEEN — это основные конструкции для построения условий в SQL запросах и используются они в блоке WHERE. Вы можете применять их как поодиночке, так комбинируя в самых различных вариантах.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какое ключевое слово в Java используется для создания анонимного внутреннего класса?
Anonymous Quiz
10%
extends
11%
implements
56%
new
17%
instanceof
6%
Посмотреть ответ