-
-
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; |
https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L159 нужно выбрать именно названия. Неплохо будет если в итоговом отношении будет ясно где чьё название.
https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L168 нужно выбрать только определённые атрибуты.
https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L172 похоже что здесь перепутан внешний ключ. Будет проще если в отношении внешний ключ будет называться примерно так: user_id, test_id, question_id, а первичный ключ просто id.
в таблицах первичный ключ лучше называть просто id. так автоматически в рельсах будет работать
а внешний ключ лучше называть ассоциация_id. как пример user_id, test_id. Евгений выше это указал, но ты не поправил
почему тут фильтрация идет по категориям, а не по уровню теста?
тут ты выбираешь все столбцы, а надо только два.
и здесь ты тоже выбираешь все, а надо только тайтлы, и задай им alias сразу, чтоб путаницы не было
тут единственное число используй
тут alias не задал для результата
тут id_tests у тебя нет поля в таблице questions и можно использовать просто 3 без кавычек, у тебя ведь int поле в id хранится
здесь странное условие джойна. ты не id двух таблиц должен сравнивать. у тебя в тесте есть колонка categories_id, по ней должен быть джойн.
https://gist.github.com/spartakusQ/820afe70e9c01e5b8212e5fb21a2d61a#file-sql-L22 зачем второй внешний ключ если выше уже есть один?