Для чего нужен SQL?

SQL - это язык программирования для написания запросов к реляционным базам данных. Аббревиатура происходит от английского Structured Query Language (язык стуктурированных запросов).

Команды, написанные на SQL, позволяют создавать и изменять базы данных, записывать информацию в таблицы (называемые также "отношениями"), извлекать из баз данных записи по установленным критериям, а также группировать, сортировать, соединять выходные данные и производить многие другие манипуляции с ними перед возвращением результата.

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

Самые популярные базы данных

Как было сказано выше, SQL работает с хранилищами данных. Вот список наиболее популярных из них:

База
Oracle
MySQL
MS SQL Server
PostgreSQL

А как же MongoDB, могут спросить те, кто уже начал знакомство с вопросами хранения информации и слышали о других популярных решениях.
Отвечаем: MongoDB работает с документоориентированной моделью данных, а SQL используется с реляционной моделью.
О том, чем они отличаются, поговорим позже в другой статье.

Клиенты для работы с базами данных

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

База Клиент
Oracle Oracle Client
MySQL MySQL Workbench
MS SQL Server MS SQL Server Management Studio
PostgreSQL pgAdmin

Как написать SQL запрос?

Давайте попробуем создать первые скрипты, чтобы проверить SQL в действии. Использовать будем базу данных PostgreSQL и клиент pgAdmin.
В качестве предметной области выберем кинопроизводство, а первой таблицей будет таблица с должностями съемочной группы. Назовем ее titles.

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

    
    -- СОЗДАНИЕ ТАБЛИЦЫ
    CREATE TABLE titles
    (
        id int PRIMARY KEY,
        name text NOT NULL
    );
    

Также есть команда DROP TABLE для удаления таблиц и ALTER TABLE для изменения. С ними вы легко сможете ознакомиться в документации по языку SQL.

Сохранение данных

Перейдем к следующему шагу - добавлению записей в нашу таблицу. Для этого используется команда INSERT. Давайте выполним следующий код:

    
    -- ЗАПИСЬ ДАННЫХ В ТАБЛИЦУ
    INSERT INTO titles (id, name)
    VALUES
            (1, 'Актер'),
            (2, 'Композитор'),
            (3, 'Режисер'),
            (4, 'Космонавт');
    

В приведенном выше примере мы сознательно допустили ошибку. Слово 'Режиссер' написано с 1 буквой 'с'. В следующем подразделе будет показано, как это исправить.

Изменение данных

Итак, давайте исправим ошибку, допущенную ранее. Для этого нам понадобится инструкция UPDATE.

    
    -- ИЗМЕНЕНИЕ ДАННЫХ В ТАБЛИЦЕ
    UPDATE titles
    SET name = 'Режиссер'
    WHERE id = 3;
    

Удаление данных

Мы допустили еще одну ошибку - добавили должность 'Космонавт'.
Каждый должен профессионально заниматься своим делом, поэтому давайте удалим эту должность из нашего списка.
Для этого нам понадобится инструкция DELETE.

    
    -- УДАЛЕНИЕ ДАННЫХ ИЗ ТАБЛИЦЫ
    DELETE FROM titles
    WHERE name = 'Космонавт';
    

Чтение данных

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

    
    -- ИЗВЛЕЧЕНИЕ ДАННЫХ
    SELECT id, name
    FROM titles;
    

Результатом последовательного выполнения всех приведенных выше операций должно быть следующее:

select * from titles;

Реляционная модель данных

Немного усложним задачу и создадим еще несколько таблиц, чтобы получить следующую реляционную модель:

film_crews model

Добавим таблицу фильмов films:

    
    -- СОЗДАНИЕ ТАБЛИЦЫ ФИЛЬМОВ
    CREATE TABLE films
    (
        id int PRIMARY KEY,
        name text NOT NULL,
        release_year int NOT NULL
    );
    
    -- ЗАПИСЬ ДАННЫХ В ТАБЛИЦУ
    INSERT INTO films (id, name, release_year)
    VALUES
            (1, 'Приключения Шерлока Холмса и доктора Ватсона', 1979),
            (2, 'Двадцать шесть дней из жизни Достоевского', 1980);
    

и таблицу съемочных групп "film_crews":

    
    -- СОЗДАНИЕ ТАБЛИЦЫ ДЛЯ СЪЕМОЧНЫХ ГРУПП
    CREATE TABLE film_crews
    (
        id serial PRIMARY KEY,
        first_name text NOT NULL,
        last_name text NOT NULL,
        film_id int REFERENCES films(id),
        title_id int REFERENCES titles(id)
    );
    
    -- ЗАПИСЬ ДАННЫХ В ТАБЛИЦУ
    INSERT INTO film_crews (first_name, last_name, film_id, title_id)
    VALUES
            ('Василий', 'Ливанов', 1, 1),
            ('Виталий', 'Соломин', 1, 1),
            ('Владимир', 'Дашкевич', 1, 2),
            ('Игорь', 'Масленников', 1, 3),
            ('Евгения', 'Симонова', 2, 1),
            ('Анатолий', 'Солоницин', 2, 1),
            ('Ираклий', 'Габели', 2, 2),
            ('Александр', 'Зархи', 2, 3);

    -- ИЗВЛЕЧЕНИЕ ДАННЫХ
    SELECT first_name, last_name, film_id, title_id
    FROM film_crews
    

Результатом последовательного выполнения данных операций будет следующее:

SELECT first_name, last_name, film_id, title_id FROM film_crews;

Cоединение таблиц при помощи инструкии JOIN

Как видите, все работает. Но, здесь есть два существенных недостатка:

Давайте попробуем исправить это.
На помощь нам и приходит реляционная модель и способность SQL работать с ней. Чтобы "подтащить" данные из связных таблиц воспользуемся инструкцией языка INNER JOIN.

    
    -- ИЗВЛЕЧЕНИЕ ДАННЫХ С ПРИСОЕДИНЕНИЕМ
    SELECT f.name as film, fc.first_name, fc.last_name, t.name as title
    FROM film_crews fc
        INNER JOIN films f on f.id = fc.film_id
        INNER JOIN titles t on t.id = fc.title_id
    

Обратите внимание на такие новшества в нашем запросе, как f, fc, t, as film и as title. Это псевдонимы и используются они в тех случаях, когда нам нужно явно указать, из каких таблиц мы производим выборку конкретных столбцов. Можно было бы обойтись и названиями самих таблиц, но они слишком длинные, поэтому обычно и прибегают к использованию псевдонимов.
Стоит также отметить, что псевдонимы можно вводить как с использованием as (as title), так и без него, что и показано в примере выше.

Теперь результат намного лучше, так как мы видим название фильмов и должности участников:

film_crews with join

В языке SQL дополнительно присутствуют еще несколько вариантов соединений таких, как LEFT JOIN, RIGHT JOIN, FULL JOIN и CROSS JOIN. Попробуйте самостоятельно поэкспериментировать с этими видами соединений, чтобы понять, в каких случаях их стоит применять.

Инструкция WHERE

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

    
    -- ИЗВЛЕЧЕНИЕ ДАННЫХ С УСЛОВИЕМ WHERE
    SELECT f.name as film, fc.first_name, fc.last_name, t.name as title
    FROM film_crews fc
        INNER JOIN films f on f.id = fc.film_id
        INNER JOIN titles t on t.id = fc.title_id
    WHERE film_id = 1
    

Обратите внимание на то, что в WHERE film_id = 1 мы не использовали псевдоним f. Все дело в том, что кроме таблицы film_crews такой колонки больше нигде нет. А следовательно, транслятору языка не придется "ломать голову" с неоднозначностью. Если бы в таблице titles вместо id мы использовали title_id тогда нужно было бы указать, о какой таблице идет речь через имя или псевдоним.
Возможно, в каких-то базах данных допустимо указание имени без псевдонима или таблицы, но PostgreSQL, в которой тестируются данные примеры, ругается на неоднозначность инструкции.

film_crews with join and where

Представления (VIEW)

Предположим, что написанный запрос мы используем достаточно часто в других своих запросах, и не хотели бы каждый раз включать такой большой объем кода в них. Для этого можно использовать представления (VIEW).
Создадим одно:

    
    -- СОЗДАНИЕ ПРЕДСТАВЛЕНИЯ
    CREATE VIEW sherlok_crew AS
        SELECT f.name as film, fc.first_name, fc.last_name, t.name as title
        FROM film_crews fc
            INNER JOIN films f on f.id = fc.film_id
            INNER JOIN titles t on t.id = fc.title_id
        WHERE film_id = 1
    

Выполним запрос с условием к нашему вновь-созданному представлению 'sherlok_crew':

    
    -- ИЗВЛЕЧЕНИЕ ДАННЫХ ИЗ ПРЕДСТАВЛЕНИЯ С УСЛОВНИЕМ WHERE
    SELECT * 
    FROM sherlok_crew
    WHERE TITLE = 'Актер'
    

Посмотрим на результат:

sherlok_crew with where

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

Агрегирование

Довольно часто при работе с базами данных появляется требование посчитать количество записей с определенным условием. Для этого в SQL предусмотрена агрегатная функция COUNT. Проверим ее в деле:

    
    -- ПОДСЧЕТ КОЛИЧЕСТВА АКТЕРОВ В ФИЛЬМЕ
    SELECT film, COUNT(*) as actors
    FROM sherlok_crew
    WHERE TITLE = 'Актер'
    GROUP BY film
    

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

Ожидаемый результат - 2 актера:

sherlok_crew with where, count and group by

Рекомендуем самостоятельно ознакомиться с расширенным списком агрегатных функций SQL: MIN, MAX, AVG, SUM и др.

Оператор LIKE

Бывает, что мы не знаем точно критерии, по которым необходимо провести выборку, но помним только часть слова. Например, мы знаем, что фамилия актера начинается на "Сол". В SQL для этого предусмотрен специальных оператор - LIKE. Продемонстрируем его на примере:

    
    -- ВЫБОРКА ПО ЧАСТИ СЛОВА
    SELECT first_name, last_name
    FROM film_crews
    WHERE last_name LIKE 'Сол%';
    

В результате получим двух актеров с фамилией, начинающейся на 'Сол':

actors taken with LIKE 'Сол%'

Знак процента (%) нужно ставить вначале - '%ин', если требуется найти записи, заканчивающиеся на определенную последовательность символов. Если требуется провести выборку по некоторой последовательности символов внутри строки, то нужно обернуть их с двух сторон: %ло%.

Итоги

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

Желаем вам достичь вершин в поставленных целях.

Дата публикации: 01.08.2024
Автор: Вальчук Александр

Нужна команда программистов?

Профессионалы компании АЭРОЛОГОС оказывают услуги разработки программного обеспечения. Мы предоставляем сервис по созданию программных решений любого уровня сложности под требования клиента. Более подробно о нашем подходе к разработке и накопленном опыте можно ознакомиться по следующей ссылке: Разработка программного обеспечения на заказ

Контактная информация

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

Авторские права (c) 2024 ООО АЭРОЛОГОС