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

При использовании в SELECT-запросах операторов OR и AND можно легко ошибиться в составлении логического выражения. И проблема таких ошибок в том, что запрос выполняется как будто ошибки нет, но данные выводятся неверные.

Если у вас мало опыта в написании таких SQL-запросов, то можно легко не заметить проблему. Давайте разберем несколько популярных ошибок.

Работать будем с таблицей team, которая содержит список разработчиков (Картинка 1).

Основные критерии оценки — это уровень владения технологией: junior, middle или senior, и базовый язык программирования, на котором пишет разработчик.

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

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

SELECT * FROM team WHERE level = 'middle' AND level = 'senior';

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

И тут мы столкнулись с первой ошибкой. В нашем запросе база данных по очереди берет строку и проверяет находится ли в колонке level значение "middle" И значение "senior". Оператор AND — это условие одновременности. То есть исходя из нашего запроса в поле level должно находится одновременно и "middle", и "senior", что невозможно, так разработчик может быть только одного уровня.

Почему мы допустили такую ошибку? И дело в формулировках, когда я озвучивал задание, то написал, что нас интересуют только мидлы И сеньоры. Это правильное выражение с точки зрения русского языка, но неверное с точки зрения логики. Чтобы получить верный результат надо чтобы поле level содержало ИЛИ "middle", ИЛИ "senior". Поэтому заменим AND на OR:

SELECT * FROM team WHERE level = 'middle' OR level = 'senior';

Теперь разработчики подобраны верно (Картинка 3).

Такую ошибку легко допустить, если в формулировке задачи стоит союз И. Но не стоит его напрямую переносить в SQL-запрос. Возможно здесь кроется ошибка, особенно если мы сравниваем с одним полем.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7 лет развития технологий

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой оператор в Java используется для прерывания выполнения цикла и перехода к следующему этапу цикла?
Anonymous Quiz
39%
break
4%
return
55%
continue
2%
switch
0%
Посмотреть ответ
SQL, базы данных. Часть 18.

Приоритет операторов AND, OR.

У нас есть таблица team с разработчиками. И на этот раз нам нужно разработать бэкенд для сайта. И для этого нам нужны все Python и PHP разработчики. Напишем:

SELECT * FROM team
WHERE language = 'python' OR language = 'php';

Обратите внимание, что нужны нам все Python И PHP разработчики, но пишем мы OR. После выполнения запроса мы получим такую таблицу как на Картинке 2.

В итоговую таблицу попали и те и другие программисты. Отлично. Но давайте расширим условие. Скажем, нам нужны только middle разработчики на этих языках. Добавим:

SELECT * FROM team
WHERE
language = 'python' OR
language = 'php' AND
level = 'middle';

После выполнения мы получим такую таблицу как на Картинке 3.
И результат довольно странный, в итоговой таблице присутствуют также джуниоры и сеньоры. И дело в том, что операторы OR и AND имеют приоритет выполнения и у AND он выше. Поэтому в первую очередь база данных находит всех мидлов, которые пишут на PHP. Такому условию соответствует только одна запись, а далее срабатывает оператор OR, который добавляет всех Python-разработчиков.

То есть мы ищем ИЛИ мидлов на PHP, ИЛИ Python-разработчиков без указания их уровня владения языком. Поэтому в таблицу также попали джуниоры и сеньоры.

Чтобы решить поставленную задачу, нужно четко расставить приоритет с помощью скобок. Как в математике. Поместим скобки справа и слева от OR:

SELECT * FROM team
WHERE
(language = 'python' OR
language = 'php') AND
level = 'middle';

Теперь в таблице остались только мидлы на Python и PHP (Картинка 4).

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

Вообще, даже не так, каждый раз когда у вас есть в запросе есть OR и AND применяйте скобки для расстановки приоритетов, даже если уверены в своём коде.

Такая практика позволит избежать неприятных логических ошибок.

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, базы данных. Часть 19.

Сортировка результатов.

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

В первом уроке мы написали SQL-запрос для получения данных о совершеннолетних пользователях (Картинка 1). Посмотрим на него еще раз:

SELECT last_name, first_name, birthday, age FROM users WHERE age >= 18;

Обратите внимание, что сейчас данные никак не упорядочены. Ни по фамилии, ни по имени, ни по дате рождения. Но давайте добавим после конструкции WHERE: ORDER BY last_name:

SELECT last_name, first_name, birthday, age
FROM users WHERE age >= 18 ORDER BY last_name;

Получим результат как на Картинке 2. После выполнение данного SQL запроса мы получим таблицу отсортированную по столбцу last_name (фамилия). Так как last_name хранит строки, то сортировка происходит в алфавитном порядке.

Разумеется, сортировать можно не только по текстовым полям. Например, можно написать ORDER BY birthday:

SELECT last_name, first_name, birthday, age
FROM users
WHERE age >= 18
ORDER BY birthday;

И получить данные упорядоченные по дате рождения в хронологическом порядке как на Картинке 3.

А если в конструкции ORDER BY после имени столбца написать DESC, то данные будут отсортированы в обратном порядке — свежие даты выше. Смотрим на Картинку 4.

SELECT last_name, first_name, birthday, age
FROM users
WHERE age >= 18
ORDER BY birthday DESC;

Про ключевое слово DESC часто спрашивают на собеседовании на позицию Junior разработчика или Trainee. Могут даже спросить и мидла. Данное ключевое слово очень часто применяется в повседневной практики на коммерческом проекте!

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько примитивных типов данных существует в Java?
Anonymous Quiz
32%
6
18%
7
43%
8
2%
9
6%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем отличаются Junior, Middle и Senior разработчики?

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

Знания

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

Работа с кодом

Коммерческая разработка — это не только общение с компьютером, но и общение с людьми. Код следует делать понятным для специалистов, которые обратятся к нему в будущем. Новая команда, ранее никогда не видевшая программу, должна суметь отредактировать или дополнить ее. Именно здесь особенно ярко проявляется разница между джуниорами и синьорами.

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

Как вычислить джуниора?

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

А что насчет синьора?

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

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

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

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

Джуниоры неопытны, и им необходим толчок в нужном направлении от мидла или синьора.

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какая из следующих коллекций в Java гарантирует порядок вставки элементов?
Anonymous Quiz
12%
HashSet
19%
TreeSet
46%
LinkedHashSet
20%
PriorityQueue
3%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Junior, Middle, Senior. Переход на следующий уровень.

От джуниора к мидлу:

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

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

От мидла к синьору:

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

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

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

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

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Что происходит, если метод equals() не переопределён, а сравниваются два разных объекта одного класса?
Anonymous Quiz
36%
Сравниваются их хэшкоды
14%
Возвращается false
37%
Используется оператор ==
8%
Происходит ошибка компиляции
5%
Посмотреть ответ