Статья из серии о создании Java-проекта. Ее цель — разбор ключевых технологий, итог — написание телеграм-бота. Вводная часть — здесь.
Алоха, инженеры-программисты. Сегодня говорим о базах данных и языке SQL.
На кого рассчитана эта статья? Да на всех, кому интересно. Одни могут начать свой путь с этой статьи, другие смогут освежить в памяти интересные факты. Эта часть будет сугубо теоретической.
Прежде чем рассказывать, что такое базы данных и SQL-синтаксис, нужно понять и определить, для чего мы их будем изучать.
На данном этапе будем говорить ТОЛЬКО об SQL базах данных: NoSQL в этом цикле статей рассматривать не будем.
База данных (далее БД) — это место, где хранятся структурированные данные, которые можно получить при помощи языка запросов.
Базы данных умеют не только хранить, но и обрабатывать и изменять информацию в больших объемах.
Для ремарки: попробуйте быстро изменить в Excel набор значений по каким-то признакам. В принципе, ничего сложного.
Не то что в нашем не оцифрованном реальном мире. Например, переименование переулков, улиц, городов. Было бы все виртуально и занесено в БД, была бы она нормализована, это была бы пара пустяков. А так страдает множество носителей данных, которые не могут автоматически измениться.
В этом контексте SQL для баз данных — это язык, который БД понимает и реагирует соответственно.
Скажем, переименовать город не составило бы труда, переименование Днепропетровска в Днипро выглядело бы примерно так:
Пользователь отправляет SQL-запросы в СУБД, СУБД понимает, что нужно сделать, делает это, и если запрос был на получение данных, то возвращает их. Поэтому нам как разработчикам нужно освоить язык запросов SQL.
Вы можете подумать: «О, еще один язык. Я тут Java с божьей помощью еле-еле понимаю, а вы мне еще один язык сразу предлагаете».
Это не так: SQL был придуман как язык-спецификация для СУБД так, чтобы писать на этом языке могли бухгалтеры, которые очень далеки от баз данных и программирования в целом. Это значит, что выучить его будет не так уж и сложно. Главное — ПРАКТИКА-ПРАКТИКА-ПРАКТИКА.
Сегодня будет теория, но следующая статья будет о практике. Так как реляционная база данных — это набор двумерных-массивов-таблиц и отношения между ними, то и работа будет идти вокруг них.
Если говорить о примере, то можно показать две таблицы — «Страны» и «Города» и как они связаны.
Для нас на данном этапе важно понять, что записи в таблице — это данные о каком-то объекте из Java-мира. Например, эти две таблицы через Java можно описать так:
Таким образом получается, что каждый объект класса City — это запись в таблице в базе данных.
Часто бывает так, что поля в базах данных имеют одинаковые значения. Например, соцсети, где по имени, фамилии и даже отчеству может найтись более одного человека. А реляционные базы данных требуют наличия уникального поля, по которому можно было бы получить доступ к записи.
Вот это и называется первый ключ или Primary Key. Обычно в качестве такого ключа используют поле ID(id) — это сокращение от identifier. Именно поэтому в каждую таблицу нужно добавить поле ID.![“Java-проект от А до Я”: разбираем базы данных и язык SQL - 7]()
Здесь показан принцип внешнего ключа.
Как видно из картинки, это:
Здесь уже интереснее, здесь уже построен запрос. Что там делают? Все просто, там говорится: “Взять три поля (Name, Age и CreatedDate) из таблицы Clients, выбрать только те записи, где name равно Roman”.

База данных: что это

UPDATE city SET name = “Днипро” WHERE id = 1231;
Все последующие запросы в систему уже выдавали бы то имя, которое нам нужно.Зачем нужны базы данных
Как я уже говорил, при помощи баз данных можно хранить данные. Но что это за данные? Чтобы понять на жизненном примере, можно поговорить о каком-то приложении. Например, о том же телеграм-боте. Мы хотим знать, сколько человек пользуется ботом. Как это можно реализовать? В обычном Java-приложении можно создать множество уникальных элементов — Set, которое будет хранить nickname пользователя или ID-шник чата. Будет это работать? Будет. Ровно до тех пор, пока Java-приложение не остановят, а как только его запустят вновь, то множество уникальных элементов будет пустым. То есть данные, которые хранились в работающем приложении, просто пропали. Что можно с этим сделать? Можно вынести хранение состояния системы (данные) из Java-приложения куда-то в другое место. Можно хранить это в CSV-формате в обычном файле на компьютере. Можно вообще одной строкой в отдельном файле. Это можно сделать, и потом перезаписывать эти данные перед тем, как Java-приложение остановится. Хотя гарантия, что запись будет успешная, далеко не близка к 100%, потому что банально можно выдернуть шнур питания сервера, и запись не произойдет. В этом подходе есть существенный недостаток: нет никакой функциональности по получению, агрегированию и поиску информации на уровне файлов. Да, конечно, можно вычитать файл, создать под него объекты, но при этом придется КАЖДЫЙ раз выкачивать в приложение все данные. А их может быть много, например, пара гигабайт. Этого можно избежать, если хранить данные в БД. Каким образом? Через таблицы и отношения между ними. На этом все реляционные базы данных и стоят.SQL: язык, который понимают базы данных
Существуют Системы Управления Базами Данных (далее — СУБД) и язык, который они понимают — SQL. SQL — язык программирования для манипулирования и управления базами данных. Для понимания, как это работает, посмотрим на рисунок:

public class Country {
private Long id;
private String name;
}
public class City {
private Long id;
private String name;
private Country country;
private Integer population;
}
Ну не красота ли, а?
В базе данных может храниться сколько угодно таблиц. В нашем случае их две.Структура таблицы
Я думаю, что все так или иначе сталкивались с excel-таблицами, и вам понятны термины строка и столбец. В рамках баз данных мы больше говорим о записях и полях:
Первичный ключ


Внешний ключ
В нашем примере такое поле есть в таблице City, которая использует ключ от Country. И работает это так: каждый город знает уникальный идентификатор информации по своей стране, и если взять его и создать запрос в БД, мы получим исчерпывающую информацию о стране. Как видно на картинке, есть связь (relation) между двумя таблицами:
Какие разделы есть в SQL
На собеседованиях, кстати, часто спрашивают, какие операции есть в SQL:- DDL (Data Definition Language) — группа операторов, изменяющих/создающих таблицы, их структуру и другое. То есть создание таблицы, ее удаление, создание/удаление полей в таблицах; создание нового первичного ключа и так далее;
- DML (Data Manipulation Language) — группа операторов, управляющих изменением данных. Это все операции, которые изменяют данные в БД: добавление, получение, изменение и удаление;
- DCL (Data Control Language) — средства подтверждения прав пользователя на выполнение действий. Операции по предоставлению доступа и прав для конкретного пользователя, чтобы он мог выполнять DDL/DML операции.
Какие типы данных есть в SQL
Таблицы могут хранить и обрабатывать определенные типы данных. Здесь будет все похоже на то, что мы используем в Java. Поговорим об основных. Их всего три, другие уже будем добавлять по необходимости и/или по желанию:
- INT — целочисленные значения. Используются для уникального идентификатора и для просто целого числа;
- VARCHAR — это наш String;
- DATE — это наш LocalDate.
Кто такие SQL операторы
Оператор — это отдельная команда, которая производит какое-то действие. Операторы состоят из предложений, те, в свою очередь, из ключевых слов, которые используются в запросах. Посмотрим на пример:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ