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

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

В этом примере таблицы мы назовем «Собаки», первичный ключ (или уникальный идентификатор для каждой записи) — самый левый столбец. Здесь столбцы: «имя», «порода», «возраст» и «owner_id». Каждая строка этой таблицы может называться записью. Вы также заметите, что owner_id также является числом. Хотя мы сосредоточимся только на одной таблице Dogs, в случае реляционной базы данных с дополнительными таблицами внешний ключ — в данном случае owner_id — относится к первичному ключ в другой таблице (например, в гипотетической таблице Владельцы).

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

  • ( *) : этот символ обозначает «все».
  • FROM: указывает таблицу, из которой запрашиваются данные.
  • ГДЕ: указывает условный выбор данных.
  • ORDER BY:определяет любую условную сортировку, которую необходимо выполнить.

Читать // ВЫБРАТЬ

SELECT используется для чтения данных. Базовый шаблон выглядит так:

SELECT {column names or *}
FROM {table name}
WHERE {any conditionals}
ORDER BY {sorting conditionals}

Запросы SELECT для нашей таблицы Собаки:

SELECT * FROM Dogs; // returns all records within the Dogs table
SELECT name FROM Dogs WHERE breed="Golden" // returns one record, Dino

Создать // ВСТАВИТЬ

INSERT используется для вставки/добавления новых данных.

INSERT {table name} (column-names)
VALUES (column-values)

Что может выглядеть так:

INSERT Dogs (name, breed, age, owner_id)
VALUES ("Bruiser", "French Bulldog", 1, 1); 
// Create a new record with the name Bruiser, breed as french bulldog, age 1, and owner_id = 1

Обновление // ОБНОВЛЕНИЕ

Обновляет существующие данные. Общий синтаксис:

UPDATE {table name}
SET {column name} = {column value}
WHERE {condition}

В нашей таблице собак:

UPDATE Dogs
SET owner_id = 3
WHERE id = 10; // Update the Dogs table at primary key id 10, and set the owner_id to 3

Уничтожить // УДАЛИТЬ

Удаляет данные. Обычно пишут:

DELETE {table name}
WHERE {some condition}

Переводит на:

DELETE Dogs
WHERE age > 5; // Delete records in Dogs if the age specified is larger than 5

Введите ActiveRecord и Rails

Изучив основы SQL, мы можем посмотреть, как Rails и SQL работают вместе через Active Record. ActiveRecord — это класс в Ruby, который используется для сопоставления классов и их атрибутов с таблицами в базе данных. В стандартной базе данных у нас есть таблицы, столбцы и строки. В Rails у нас есть модели (классы) и объекты.

ActiveRecord выполняет те же SQL-запросы и абстрагирует методы в приятные простые методы класса. Если вы хотите освежить свои SQL-запросы или вам интересно узнать, что ActiveRecord запускает в фоновом режиме, воспользуйтесь ActiveRecord Logger!

Запросы на Rails

С абстрактным синтаксисом SQL ниже приведены некоторые типичные методы ActiveRecord:

.all — получить все объекты из определенной модели.

Dogs.all // returns all records from the Dogs table

В фоновом режиме выполняется тот же SQL-запрос SELECT & FROM dogs

.find — получить объект по его идентификатору / первичному ключу

Dogs.find(3) // returns the record from the Dog table with id=3

Который работает SELECT * FROM dogs WHERE id = 3

.where — получить объекты, удовлетворяющие условиям

Dogs.where(breed: "Pitbull") 

Это то же самое, что SELECT * FROM dogs WHERE breed = "Pitbull" в SQL.

Почему SQL?

Поскольку Rails и ActiveRecord заботятся о создании/манипулировании и запросе нашей базы данных, то почему мы должны заботиться о SQL? Хотя это здорово (и намного проще), что ActiveRecord абстрагируется от запросов, существует некоторый разрыв между фактическим пониманием запроса, который выполняется в фоновом режиме. В целях отладки, а также для общего понимания и освоения Rails рекомендуется сначала подойти к проблеме запроса в терминах SQL, а затем определить, какие методы ActiveRecord могут обеспечить решение.