У вас должен быть установлен 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
);
Для того чтобы это сделать в 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 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 является базовым оператором в 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)