Skip to content

Instantly share code, notes, and snippets.

@davetoxa
Last active October 25, 2019 08:02
Show Gist options
  • Save davetoxa/6583ea2f9b26deb27bde1a12ab807353 to your computer and use it in GitHub Desktop.
Save davetoxa/6583ea2f9b26deb27bde1a12ab807353 to your computer and use it in GitHub Desktop.

SQL И Rails

Предисловие

У вас должен быть установлен PostgreSQL версии не менее 9.6

Подготовка данных

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

Для создания базы, наберём в терминале:

createdb sql_learn;

Затем, войдём с помощью консольной утилиты psql в базу

psql sql_learn

Мы должны увидеть следующее:

psql (9.6.5)
Type "help" for help.

sql_learn=#

Наконец, создадим таблицу пользователей, которая будет иметь 5 полей, id, email, имя пользователя, инфо и дату создания:

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

character varying - это строковый тип данных, который может принимать параметр n - количество символов, иначе, если character varying используется без указания длины, то допускаются строки любой длины.

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email character varying NOT NULL,
  username character varying NOT NULL,
  age integer,
  created_at timestamp without time zone
);

TODO Узнать и расписать про timestamp without time zone

Для того чтобы это сделать в Rails мы должны создать миграцию и используя метод create_table описать структуру таблицы:

create_table "users", force: true do |t|
  t.string   "email",      null: false
  t.string   "username",   null: false
  t.integer  "age"
  t.datetime "created_at"
end

Проверим, что таблица была создана, выполнив к ней select запрос, если нет никаких ошибок и вы видите пустую структуру (скриншот сделать), значит всё идёт по плану :)

SELECT * from users;

INSERT

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

INSERT INTO users VALUES(1, '[email protected]', 'mkdev', '') RETURNING id;
INSERT INTO users ("id", "email", "username", "info") VALUES(2, '[email protected]', 'mkdev', '');

Вариант с использованием Serial
INSERT INTO users VALUES(DEFAULT, '[email protected]', 'bart', 16) RETURNING id;
INSERT INTO users VALUES(DEFAULT, '[email protected]', 'lize', 18) RETURNING id;
INSERT INTO users VALUES(DEFAULT, '[email protected]', 'mkdev', 22) RETURNING id;
INSERT INTO users VALUES(DEFAULT, '[email protected]', 'anton', 21) RETURNING id;
INSERT INTO users VALUES(DEFAULT, '[email protected]', 'artem', 30) RETURNING id;

Вы заметили, что в запросе мы используем оператор RETURNING, это оператор специфичный только для PostgreSQL, в SQL его нет, он возвращает значение добавленной записи. Rails активно его использует, указывает что необходимо возвратить id товара, для дальнейшего его использования.

SELECT

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

Достанем все записи из базы: * - означает достать все поля

SELECT * FROM users;

sql_learn=# SELECT * FROM users;
 id |     email       | username | info | created_at
----+-----------------+----------+------+------------
  1 | bart@gmail.com  | bart     |      |
  2 | liza@gmail.com  | liza     |      |
  3 | mkdev@gmail.com | mkdev    |      |
(3 rows)

Посчитаем количество записей в базе:

SELECT COUNT(*) FROM users;

count
-------
    3
(1 row)

Достанем только email из таблицы пользователей

SELECT id, email FROM users;
id |      email
----+-----------------
 1 | bart@gmail.com
 2 | lize@gmail.com
 3 | mkdev@gmail.com
(3 rows)

Что, если мы хотим как то отфильтровать наши значения? Нам в этом поможет оператор WHERE

Достанем всех совершеннолетних пользователей:

SELECT * FROM users WHERE age >= 18;
id |      email      | username | age | created_at
---+-----------------+----------+-----+------------
 2 | lize@gmail.com  | lize     |  18 |
 3 | mkdev@gmail.com | mkdev    |  22 |
(2 rows)

Комбинация условий:

Достанем всех пользователей с id > 2 и возврастом до 25 лет

SELECT * FROM users WHERE age <= 25 AND id > 2;
id |      email      | username | age | created_at
----+-----------------+----------+-----+------------
 3 | mkdev@gmail.com | mkdev    |  22 |
 4 | anton@gmail.com | anton    |  21 |
(2 rows)

Достанем всех пользователей с именем Антон или Артём

SELECT * FROM users WHERE username = 'anton' OR username = 'artem';
id |      email      | username | age | created_at
----+-----------------+----------+-----+------------
 4 | anton@gmail.com | anton    |  21 |
 5 | artem@gmail.com | artem    |  30 |
(2 rows)

TODO

Селект из 2х таблиц соединяющийся по id

Order by

Like оператор

Оператор AS

uniq

max

is not null

UPDATE

DELETE

Explain

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment