Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a to your computer and use it in GitHub Desktop.

Select an option

Save spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a to your computer and use it in GitHub Desktop.
psql slq@slq-home
psql (9.6.10)
Введите "help", чтобы получить справку.
Создайте базу данных test_guru
CREATE DATABASE test_guru;
CREATE DATABASE
===================================================
Таблицу categories с атрибутом title
CREATE TABLE categories (
id integer PRIMARY KEY,
title varchar(60)
);
CREATE TABLE
===================================================
Таблицу tests в которой должны быть атрибуты title, level, внешний ключ к таблице categories
CREATE TABLE tests (
id integer PRIMARY KEY,
category_id integer REFERENCES categories,
title varchar(60),
level int
);
CREATE TABLE
===================================================
Таблицу questions в которой должен быть атрибут body и внешний ключ к таблице tests
CREATE TABLE questions (
id integer PRIMARY KEY,
test_id integer REFERENCES tests,
body varchar(60)
);
CREATE TABLE
===================================================
Создайте 3 строки в таблице categories
INSERT INTO categories(id, title) VALUES
('1', 'Front'),
('2', 'Back'),
('3', 'Mobile Dev');
INSERT 0 3
=======================================================
Создайте 5 строк в таблице tests (хотя бы 3 из них должны иметь отличное от
NULL значение в атрибуте внешнего ключа к таблице categories)
INSERT INTO tests(id, title, level, category_id) VALUES
('1', 'PHP', '0', '1'),
('2', 'Go', '3', '2'),
('3', 'RoR', '0', '1'),
('4', 'Ruby', '0', '2'),
('5', 'Clojure', '0', '2');
INSERT 0 5
===========================================================
Создайте 5 строк в таблице questions
INSERT INTO questions(id, test_id, body) VALUES
('1', '1', 'Where used?'),
('2', '1', 'How old is the language?'),
('3', '4', 'Where used?'),
('4', '3', 'Where used?'),
('5', '5', 'Where used?');
INSERT 0 5
======================================================================
Выберите все тесты с уровнем 2 и 3
SELECT *
FROM tests
WHERE level in (2, 3);
================================================
Выберите все вопросы для определённого теста
SELECT *
FROM questions
WHERE test_id = 1;
===============================
Обновите атрибуты title и level для строки из таблицы tests с помощью одного запроса
UPDATE tests SET title = 'RubyOnRails', level = 2
WHERE id = 3;
UPDATE 1
===============================
Удалите все вопросы для конкретного теста с помощью одного запроса
DELETE FROM questions
WHERE id IN (SELECT id FROM tests WHERE title = 'PHP');
DELETE 2
====================================================
С помощью JOIN выберите названия всех тестов и названия их категорий
SELECT
tests.title AS "Lang",
categories.title AS "Use"
FROM tests
JOIN categories
ON tests.category_id = categories.id;
=====================================================
С помощью JOIN выберите содержание всех вопросов (атрибут body) и названия связанных с ними тестов
SELECT
questions.body AS "Question",
tests.title AS "Language"
FROM questions
INNER JOIN tests
ON questions.test_id = tests.id;
@psylone
Copy link

psylone commented Oct 12, 2018

https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L22 зачем второй внешний ключ если выше уже есть один?

@psylone
Copy link

psylone commented Oct 12, 2018

https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L159 нужно выбрать именно названия. Неплохо будет если в итоговом отношении будет ясно где чьё название.

@psylone
Copy link

psylone commented Oct 12, 2018

https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L168 нужно выбрать только определённые атрибуты.

@psylone
Copy link

psylone commented Oct 12, 2018

https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L172 похоже что здесь перепутан внешний ключ. Будет проще если в отношении внешний ключ будет называться примерно так: user_id, test_id, question_id, а первичный ключ просто id.

@BubuntuClu
Copy link

BubuntuClu commented Oct 12, 2018

в таблицах первичный ключ лучше называть просто id. так автоматически в рельсах будет работать
а внешний ключ лучше называть ассоциация_id. как пример user_id, test_id. Евгений выше это указал, но ты не поправил

@BubuntuClu
Copy link

почему тут фильтрация идет по категориям, а не по уровню теста?

@BubuntuClu
Copy link

тут ты выбираешь все столбцы, а надо только два.

@BubuntuClu
Copy link

и здесь ты тоже выбираешь все, а надо только тайтлы, и задай им alias сразу, чтоб путаницы не было

@BubuntuClu
Copy link

тут единственное число используй
тут alias не задал для результата
тут id_tests у тебя нет поля в таблице questions и можно использовать просто 3 без кавычек, у тебя ведь int поле в id хранится
здесь странное условие джойна. ты не id двух таблиц должен сравнивать. у тебя в тесте есть колонка categories_id, по ней должен быть джойн.

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