Практика на две таблицы в Go
В этих задачах потренируем сборку строк из двух таблиц. Таблицы заданы текстом создания и вставки.
Даны таблицы:
CREATE TABLE authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id) REFERENCES authors (id)
);
INSERT INTO authors (name) VALUES ('ann');
INSERT INTO authors (name) VALUES ('bob');
INSERT INTO articles (author_id, title) VALUES (1, 'sql tips');
INSERT INTO articles (author_id, title) VALUES (1, 'go fmt');
Выведите имя автора и заголовок каждой статьи в одной строке результата, связав таблицы по номеру автора.
Даны таблицы:
CREATE TABLE authors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
author_id INTEGER NOT NULL,
title TEXT NOT NULL,
FOREIGN KEY (author_id) REFERENCES authors (id)
);
INSERT INTO authors (name) VALUES ('ann');
INSERT INTO authors (name) VALUES ('bob');
INSERT INTO articles (author_id, title) VALUES (1, 'sql tips');
Выведите всех авторов. Для "bob"
покажите "no article", если статьи
нет. Оставь строку слева, даже если
справа пусто. Название справа читайте
в sql.NullString.
Даны таблицы:
CREATE TABLE rooms (
id INTEGER PRIMARY KEY,
code TEXT NOT NULL
);
CREATE TABLE devices (
id INTEGER PRIMARY KEY,
room_id INTEGER NOT NULL,
label TEXT NOT NULL,
FOREIGN KEY (room_id) REFERENCES rooms (id)
);
INSERT INTO rooms (code) VALUES ('a1');
INSERT INTO rooms (code) VALUES ('b2');
INSERT INTO devices (room_id, label) VALUES (1, 'lamp');
INSERT INTO devices (room_id, label) VALUES (1, 'sensor');
INSERT INTO devices (room_id, label) VALUES (2, 'fan');
Выведите код комнаты и подпись каждого устройства, отсортировав по коду комнаты, затем по подписи.
Даны таблицы:
CREATE TABLE pilots (
id INTEGER PRIMARY KEY,
callsign TEXT NOT NULL
);
CREATE TABLE flights (
id INTEGER PRIMARY KEY,
pilot_id INTEGER NOT NULL,
route TEXT NOT NULL,
miles INTEGER NOT NULL,
FOREIGN KEY (pilot_id) REFERENCES pilots (id)
);
INSERT INTO pilots (callsign) VALUES ('red');
INSERT INTO pilots (callsign) VALUES ('blue');
INSERT INTO flights (pilot_id, route, miles) VALUES (1, 'north', 120);
INSERT INTO flights (pilot_id, route, miles) VALUES (1, 'west', 80);
INSERT INTO flights (pilot_id, route, miles) VALUES (2, 'east', 200);
Для каждого позывного выведите сумму
miles по его рейсам после
сборки строк из двух таблиц.
Даны таблицы:
CREATE TABLE clients (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL
);
CREATE TABLE tickets (
id INTEGER PRIMARY KEY,
client_id INTEGER NOT NULL,
subject TEXT NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients (id)
);
INSERT INTO clients (email) VALUES ('a@test');
INSERT INTO clients (email) VALUES ('b@test');
INSERT INTO tickets (client_id, subject) VALUES (1, 'login');
INSERT INTO tickets (client_id, subject) VALUES (2, 'pay');
INSERT INTO tickets (client_id, subject) VALUES (2, 'ship');
Выведите email и число заявок
для каждого клиента через группировку
после связи таблиц.
Даны таблицы:
CREATE TABLE stores (
id INTEGER PRIMARY KEY,
city TEXT NOT NULL
);
CREATE TABLE staff (
id INTEGER PRIMARY KEY,
store_id INTEGER NOT NULL,
name TEXT NOT NULL,
FOREIGN KEY (store_id) REFERENCES stores (id)
);
INSERT INTO stores (city) VALUES ('oslo');
INSERT INTO stores (city) VALUES ('bergen');
INSERT INTO staff (store_id, name) VALUES (1, 'ann');
INSERT INTO staff (store_id, name) VALUES (1, 'kim');
Выведите город и имя сотрудника для каждой пары. Строки без сотрудника справа не нужны.