Skip to content

Instantly share code, notes, and snippets.

@shilovk
Last active December 15, 2019 09:56
Show Gist options
  • Save shilovk/ecef8f144e9b255612d2d7061f08727b to your computer and use it in GitHub Desktop.
Save shilovk/ecef8f144e9b255612d2d7061f08727b to your computer and use it in GitHub Desktop.
Задание по основам баз данных и SQL
homework 3.7
gist.github.com
1.
CREATE DATABASE test_guru;
\c test_guru
CREATE TABLE categories (
id serial PRIMARY KEY,
title varchar(25) NOT NULL
);
CREATE TABLE tests (
id serial PRIMARY KEY,
title varchar(50),
level int NOT NULL,
category_id int NOT NULL,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
CREATE TABLE questions (
id serial PRIMARY KEY,
body varchar(250) NOT NULL,
test_id int NOT NULL,
FOREIGN KEY (test_id) REFERENCES tests(id)
);
2.
INSERT INTO categories(title) VALUES
('Frontend'),
('Backend'),
('Machine Learning');
INSERT INTO tests(title, level, category_id) VALUES
('HTML', 1, 1),
('Go', 2, 2),
('Ruby', 3, 2),
('React', 4, 3),
('Rails', 5, 2);
INSERT INTO questions(body, test_id) VALUES
('header', 1),
('class', 3),
('array', 3),
('migrate', 5),
('rake', 5);
SELECT *
FROM tests
WHERE level IN (2, 3);
SELECT *
FROM questions
WHERE test_id = 5;
UPDATE tests
SET title = 'Ruby Language',
level = 4
WHERE title = 'Ruby';
DELETE FROM questions
WHERE test_id = 5;
SELECT
tests.title AS test_title,
categories.title AS category_title
FROM tests
JOIN categories
ON tests.category_id = categories.id;
SELECT questions.body, tests.title
FROM questions
JOIN tests
ON questions.test_id = tests.id;
@max-underthesun
Copy link

  1. создание таблиц
    ТЗ: "tests в которой должны быть ... внешний ключ к таблице categories"
    у тебя создается просто числовое поле, а не внешний ключ
    рекомендуется всегда обозначать для полей-связей, что это ссылка на внешний ключ
    база данных в этом случае применяет к этому полю FOREIGN KEY constraint для контроля целостности данных (Data integrity)
    (обрати внимание - для первичного ключа ты не просто поле используешь, а именно создаешь первичный ключ с помощью специальной команды, с внешним ключом тоже нужно использовать специальную команду)

  2. селекты с джойнами
    ТЗ: "С помощью JOIN выберите названия всех тестов и названия их категорий"
    нужны только названия, а у тебя все колонки запрашиваются
    ТЗ: "С помощью JOIN выберите содержание всех вопросов (атрибут body) и названия связанных с ними тестов"
    твой запрос не возвращает ничего из содержимого таблицы "тестс"

@shilovk
Copy link
Author

shilovk commented Dec 14, 2019

Спасибо, обновил

@max-underthesun
Copy link

предпоследний запрос вернет две колонки title, пользоваться результатом такого запроса может оказаться затруднительно (может возникнуть путаница)
нужно как-то различать эти колонки, они же принадлежат к разным таблицам

открой для себя SQL алиасы

@shilovk
Copy link
Author

shilovk commented Dec 15, 2019

Спасибо!, сделал

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