Дэн Щербаков ⚛️
95 subscribers
20 photos
49 links
Канал для фронтенд-разработчиков о том, как развиваться и увеличивать зарплату.

Senior Frontend Developer с 6 годами опыта. За этот период увеличил зарплату почти в 7 раз.

Начинайте тут: https://yangx.top/code_lab/280
加入频道
SQL, манипуляция данными. Часть 4.

Сортировка выборки.

Для сортировки используют операторы: DISTINCT, GROUP BY, ORDER BY, LIMIT, OFFSET и некоторые другие. Рассмотрим их отдельно.

- DISTINCT:
полностью удаляет любые дубликаты. Используется после ключевого оператора SELECT.

- ORDER BY:
упорядочивает выборку по столбцу, принимая опциональные условия ASC/DESC (по-восходящему / по нисходящему). Пример: ORDER BY column DESC отсортирует строки от 4 к 1.

- LIMIT и OFFSET:
LIMIT задает лимит строк с совпадениями в выборке.
OFFSET устанавливает точку отсчета: например, OFFSET 5 значает "вывести совпадения, начиная с шестого". Почему с шестого? Пятый входит в ограничение.
Эта пара употребляется после всех прочих операторов.


#SQL
SQL, манипуляция данными. Часть 5: нормализация

Если грубо и вкратце, то нормализация БД - разбитие данных по разным таблицам, чтобы сократить дублирование информации. БД становится меньше, работать с данными - проще.

Допустим, есть данные об авторах и их книгах. Если хранить все в одной таблице, очевидно, что имена авторов будут дублироваться относительно их книг:

ПЛиО 1 | Мартин
ПЛиО 2 | Мартин
Подробное руководство по JS | Флэнеган

Вместо этого можно составить две таблицы - авторов и книг по жанрам.

При нормализации строки в разбитых таблицах объединяют ключом - например, числовым ID.

Чтобы работать с данными из нескольких таблиц, их нужно объединять. Для этого используют оператор JOIN. Джойнинг используется не только так, поэтому уместно перед JOIN использовать оператор INNER.

Чтобы указать, по каким столбцам с ключами определять совпадения, используют оператор ON.

Пример объединяющего запроса:

SELECT *
FROM authors
INNER JOIN fantasy
ON authors.id = fantasy.book_id

#SQL
ООП, утренние заметки.

Вчера посмотрел перед сном лекцию, которая уложила в моей голове непонятки про ООП. Делюсь тем, что получилось.

ООП - это про сложную промышленную разработку. Тысячи классов, распределенные на сотни разработчиков... Другие парадигмы не так удобны для этой цели. Хотя мое сердце принадлежит ФП, я признаю роль объектного проектирования.

Базовые концепции:

- Инкапсуляция. Это скрытие устройства класса от посторонних. Разработчик в команде не должен знать все классы - это контрпродуктивная трата времени. Каждый пишет свой модуль - остальные предоставляют интерфейсы и публичные методы.

- Абстракция. Суть почти та же, что у чистоты функций в ФП. Абстрактный класс описывает общие для наследников переменные и методы, но не определяет их все.

- Интерфейс. То же, что абстрактный класс, за одним "но": никаких определений. Интерфейс только описывает методы, но не содержит функциональности.

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

- Наследование. Оно связывает классы в иерархии. Конкретные классы наследуют абстрактным, еще более определенные - им, и так далее. В JS пользуются кейвордом externds.

Проблема ООП - избыточность. Цепочка наследования тянет данные и методы, которые не используются. ФП свободно от таких проблем, но преимущества ООП не дают светлым силам функциональщины победить до конца. :)

#ООП
SQL, манипуляция данными. Часть 6: тонкости JOIN-инга

Есть два типа джойнинга: INNER (внутренний) и OUTER (внешний). Для каждого есть одноименные операторы.

По умолчанию JOIN выполняется как INNER JOIN. Префикс INNER можно опускать, но обычно его добавляют для лучшего понимания запроса. Во внешние запросы можно добавлять OUTER, но это тоже не обязательно.

INNER JOIN выводит строки, если имеется совпадение по ключу. Если нужно вывести содержимое независимо от совпадений, используют операторы:

LEFT JOIN
RIGHT JOIN
FULL JOIN

В чем разница?

LEFT и RIGHT указывают, какую таблицу выводить целиком. Просто держи в уме, какая таблицу отмечена оператором FROM, а какая помещена в JOIN, и указывай соответствующий префикс.

FULL JOIN выводит полностью обе таблицы.

А вот общий алгоритм джойнинга:

1. Выполняется INNER JOIN
2. Добавляются данные по оператору LEFT или RIGHT
3. Если используется FULL JOIN, то LEFT и RIGHT используются последовательно.

Пустующие поля заполняются NULL-лями. По ним, кстати, тоже можно делать выборку.

Спасибо @Yura0217 за фидбек о типах джойнинга. Расширил пост. :)

#SQL
Как учиться эффективно

Программирование требует разностороннего самообразования. Алгоритмы, математика, ЯП, актуальные технологии, английский язык, софт-скиллз... Все это чертовски нужно.

Где найти время?

Все просто: покупайте мой курс всего за...

Ха-ха, шучу :)

Моё решение - это комбинаторика.

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

Учишь алгоритмы - пиши их на разных ЯП. Создавай маленькие проекты и лей на Github.

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

Вообще учишься - заливай конспекты в свой телеграм-канал. Обратная связь и объяснение изученного своими словами здорово укладывает информацию в голове. Поможешь и себе, и другим хорошим людям.

#мотивация #обучение
SQL, часть 7.

NULL

По умолчанию ячейки с отсутствующими значениями заполняются NULL. По NULL можно делать выборку оператором IS (NOT) NULL.

Также можно установить иное дефолное значение пустой ячейки - например, число 0 или любую строку.

Выражения и алиасы

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

SELECT col_name / 2 AS divided_col_name

Сразу после SELECT следует выражение. За ним можно увидеть новый оператор - AS - и новую строчку.

AS - это оператор присваивания алиаса. В свою очередь, алиас - сокращенное или, наоборот, более подробное название имени столбца или выражения.
Юзкейсы:
- сократить длинное неудобное название столбца;
- обозначить выражение коротким словом для построения дальнейшей логики.

#SQL
SQL, часть 8.

Тонкости.

- DISTINCT и GROUP BY работают идентично, если в запросе нет агрегатных функций. Однако с DISTINCT эти функции использовать не удастся. Впрочем, такой кейс - вырожденный пример и в реальной практике операторы не взаимозаменяемы.

- Агрегатные функции - это разновидность функций, встроенных в язык, вроде [].join(). Конкретно агрегатные функции - объединяют данные: aggregation значит «объединение».

- Как работают GROUP BY с агрегатными функциями? Представим таблицу заказов, где также есть колонка продавцов с уникальными ID.
Задача - посчитать сумму всех заказов для каждого продавца. Делаем запрос:

SELECT Seller_id, SUM(orders) AS «Summ per seller»
FROM order_table
GROUP BY Seller_id;

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

Спасибо @darkgenius за жесткие правки, дополнил пост 😉

#SQL
SQL. Оператор HAVING

Представим, что в запросе отфильтрована часть строк с помощью WHERE, а затем сгруппирована через GROUP BY. Как отфильтровать результат?

Для этого применяют оператор HAVING. Ему передается условие групповой сортировки.

SELECT group_by_column, AGG_FUNC(column_expression) AS aggregate_result_alias
FROM mytable
WHERE condition
GROUP BY column
HAVING group_condition;

Оператор фильтрации групп есть смысл применять, только если данные группируются, то есть, применен GROUP BY.

#SQL
SQL. Порядок выполнения

Представим строку JS-кода:

const mul = a + b * c

Код выполняется здесь не линейно, а по правилам языка и математики:

1) b * с
2) bc + a
3) const mul = bc + a

То же в SQL. Схема такая:

1) FROM и JOIN. Происходит первичная выборка данных, формируется временная таблица.

2) WHERE. Строки фильтруются по условию. На этом шаге недоступны алиасы из оператора SELECT - будут применены позже.

3) GROUP BY. Оставшиеся строки группируются.

4) HAVING. Сгруппированный результат дополнительно фильтруется.

5) SELECT. Применяются выражения и алиасы, указанные для самого первого оператора.

6) DISTINCT. Удаляются дубликаты в выбранной колонке.

7) ORDER BY. На этом шаге имеется готовая выборка. Теперь можно управлять её видом - в частности, порядком вывода...

8) LIMIT / OFFSET. ... и ограничением диапазона.

Оговорюсь, что порядок не обязателен: движки могут менять его на свое усмотрение.

#SQL
SQL. Изменение, вставка, удаление строк

Сразу оговорюсь. Здесь строки - не тип данных, а rows в БД.

Вставку делают оператором INSERT. Таблицы к нему присоединяет INTO.

После перечисляют значения - с помощью оператора VALUES.

Значений должно быть столько же, сколько и столбцов, иначе компилятор не пропустит операцию. Исключение - если присутствуют данные по умолчанию. Другие исключения и подробности - позже.

Пример:

INSERT INTO films
(id, raiting, title)
VALUES(5, 7, "Bruce Lee")

UPDATE делает именно то, о чем вы подумали. Используется так:

UPDATE table
SET column = new_value,
another_column = an_value
WHERE condition_of_row

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

DELETE удаляет значения. Используется с операторами FROM и WHERE.

UPDATE и DELETE - потенциально опасные операции. Не сделал бекапа - выполни перед ними SELECT, чтобы проверить, верно ли написал выборку!

#SQL
SQL. Создание таблиц. Типы данных.

Таблицы создают через оператор CREATE TABLE. Чтобы избежать дублирования, можно добавить IF NOT EXISTS.

Оператору передают параметры:

1. Название колонки.
2. Тип данных.
3. Ограничители (constraints).
4. Оператор DEFAULT
5. Параметр для предыдущего оператора, определяющий значение колонки по умолчанию.

Обязательны только первые два параметра.

Пример:

CREATE TABLE (
Id INTEGER PRIMARY KEY DEFAULT 0
Title TEXT NOT NULL
)

Типы данных:

INT - целые положительные числа.
BOOL - булевы значения, представленные в SQL числами 0 и 1.
FLOAT, DOUBLE, REAL - различные типы дробных чисел.
CHAR n - текст строго определенной длины n.
VARCHAR n - текст, ограниченный длиной n.
TEXT - текст, ограниченный встроенным ограничителем (например, 65535 символов).
DATE, DATETIME - данные о дате в формате, предусмотренном конкретной БД.
BLOB - бинарные данные.

Типов данных гораздо больше, здесь - наиболее часто используемые.

#SQL
SQL. Синтастические тонкости и table constraints

Спасибо неутомимому @darkgenius за деталь:

Колонка в БД называется поле. Применять слово "колонка" в приличном обществе - значит прослыть деревенщиной! :D

Table constraits - это дополнительные определения поля. То есть, полям можно задать определение или даже поведение, которые помогают избегать ошибок и систематизируют информацию.

Примеры table constrainnts:

PRIMARY KEY. Указывает, что значения в поле - уникальны и могут использоваться, например, как ID строки.

AUTOINCREMENT. Только для числовых значений. Задает автоматический инкремент (аналог ++ в JS) значения при создании новой строки.

UNIQE. Указывает, что каждое значение в поле должно быть уникальным: вставить строку с дублем не удастся. От PRIMARY KEY отличается тем, что такое поле нельзя использовать в качестве хранилища ключей.

NOT NULL. В поле не должно быть NULL.

CHECK (expression). Проверяет строку на соответствие выражению - математическому, соответствую массиву и т.д.

FOREIGN KEY REFERENCES field(name). Последовательно проверяет, чтобы PRIMARY KEY соответстволо указанное поле внешней таблицы. Значения в поле, указанном как FOREIGN KEY, не обязательно должны быть уникальными. Пример - соотношение таблиц авторов и книг по уникальному ID автора и повторяющимся ключам книг.

#SQL
SQL. ALTER TABLE

Оператор ALTER TABLE меняет существующие таблицы, а конкретно - добавлять или удалять новые поля, переименовывать таблицы и так далее.

Синтаксис похож на CREATE TABLE:

ALTER TABLE films
ADD new_column или...
DROP some_column или...
RENAME TO old_films

У разных БД - разные методы. Подробности в документации.

#SQL
SQL. Проектирование БД. Общие моменты.

- Cхема БД - это ее представление в виде взаимосвязи таблиц, в виде картинки или текста. По сути - проект. По схеме разработчик понимает структуру БД независимо от ее размера.

- Реляционные БД - значит, БД, построенные на отношениях (relation). Отношения - это просто таблицы.

- Домены. Это множества возможных значений атрибута. Например, домен атрибута пола состоит из множества {M, Ж}. Не следует путать домены с типами данных.

- Кортежи. То же, что и строки.

- Первичный ключ. Уникальный идентификатор кортежа. Может быть составным, потенциальным, несоставным. В третьей форме первичный ключ не может быть составным.

- Внешний ключ. Ключ к главной внешней таблице. Используется в дочерних таблицах.

- Аномалии. Возникают при неправильном проектировании после операций над таблицами.
Бывают аномалии вставки, модификации, удаления.
Пример: из главной таблицы удалена строка, на которую продолжает ссылаться внешний ключ в дочерней.
Решение: при проектировании закладывается либо каскадное удаление всех зависимых строк по внешнему ключу. Либо, если допустимо присутствие строки без связи с главной таблицей, задается дефолтное значение NULL.

- Теорема Хита:

R (A, B, C) = r1(A, B) join r2(A, C)

Что она означает:
Если в таблице с атрибутами A, B, C имеется зависимость A -> B, то декомпозиция этой таблицы обратима.

То есть, правильная нормализация проводится так, чтобы не потерять данные. Если после операции JOIN выполняется равенство по теореме, значит, декомпозиция проведена правильно.

#SQL
SQL. Пара слов о SQLite

Это легковесный движок реляционной БД. Он хранит БД в одном файле - что сводит миграцию базы до передачи этого файла. Его недостатки:
- Усеченная функциональность;
- Сложнее организовать разграничение доступа к таблицам;
- Только один пользователь может обновлять БД в определенный момент времени, а значит, высоконагруженные сервисы - в пролёте;
- Движок не чекает типы данных. Их можно указать в схеме - и все равно запихнуть неверные.

#SQL
SQL. Switch...case в SQL

В реляционных БД есть и эта знакомая всем логическая конструкция. Выражена она так:

SELECT column,
CASE
WHEN genre = 'romance'
OR genre = 'comedy'
THEN 'Chill'
ELSE 'Intense'
END AS 'Mood'
FROM movies;

Можно заметить, что CASE понимает операторы типа OR. Это полезно для построения логики.

#SQL
Java: тонкости языка и не только

- Цикл do ... while гарантированно выполнит одну итерацию.

- Массив чисел при инициализации по умолчанию заполняется нулями, булевых - false, остальных - null.

- Неявное преобразование типов идет по принципу: "от меньшего объема в памяти - к большему". Например, byte преобразуется в short, short - в int. Обратное преобразование ведет к усечению по тому же принципу.

Для примера - усечение int в byte. Усечем число 258.
В двоичном виде число складывается из двух разрядов. Тип byte состоит только из одного, поэтому результат усечется до 00000010, то есть, 2.

- Многомерные массивы объявляются так:
int arr[][] = new int[][].
Одна скобка - одна размерность.

- Синтаксис foreach по-джавистски:
for(int i : array).

- Передать несколько аргументов можно известным по JS оператором Spread.

#Java #тонкости
Как модифицировать системные переменные:

1. cmd
2. set проверка текущего значения
3. если нужна новая переменная:
setx var value
если нужно модифицировать, например, path:
setx var "%var%value;"

Через setx переменной присваивается строка. %...% возвращают текущее содержимое переменной. В Path необходимо разделять значения точкой с запятой, поэтому в конце аргумента добавлен этот знак.
Терминология ООП и Java

- Геттеры также называют аксессорами. Access - доступ.

- Сеттеры называют мутаторами. Mutation - изменение.

- Инициализатор - код, срабатывающий до корнструктора. В Java заключается в { }. Может быть статическим.

#ООП #Java
Подробно о статике

- Статическая сущность - принадлжедит самому классу, а не его экземплярам.

- Статическими бывают переменные, методы, инициализаторы и даже вложенные классы.

- Класс со статическими методами можно воспринимать библиотекой с готовыми функциями. Пример - класс Math. Методы класса используются без создания нового объекта.

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

- Статические инициализаторы выполняются только для самого первого объекта класса.

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

- Статические методы работают только с другими статическими сущностями.

#ООП #Java