Как правильно связать таблицы SQLite?
Создаю интернет-магазин. Есть таблица с размерами, где указана подробная информация о размере и есть таблица с футболками. У каждой футболки должны быть все размеры и их наличие. Если просто для таблицы Футболки создать столбец размеры, то придется каждый раз создавать новую футболку и заново прописывать характеристики размера. Не понимаю как сделать так, чтобы к одной конкретной футболке присваивались все размеры, к каждому из которых можно присваивать наличие. Образно это должно выглядить вот так:
ID | Наименование | Цена | Размеры | Номер размера (Европа) | Номер размера (Китай) | Наличие |
---|---|---|---|---|---|---|
1 | Футболка1 | 1000 | XXS | 40 | 30 | 10 |
1 | Футболка1 | 1000 | XS | 42 | 35 | 11 |
1 | Футболка1 | 1000 | S | 44 | 40 | 24 |
1 | Футболка1 | 1000 | M | 46 | 45 | 55 |
1 | Футболка1 | 1000 | L | 48 | 50 | 67 |
2 | Футболка2 | 1200 | XXS | 40 | 30 | 88 |
2 | Футболка2 | 1200 | XS | 42 | 35 | 1 |
2 | Футболка2 | 1200 | S | 44 | 40 | 0 |
2 | Футболка2 | 1200 | M | 46 | 45 | 0 |
2 | Футболка2 | 1200 | L | 48 | 50 | 15 |
Отслеживать
2,558 1 1 золотой знак 5 5 серебряных знаков 22 22 бронзовых знака
задан 9 дек 2022 в 18:24
rusyska5011 rusyska5011
3 2 2 бронзовых знака
Похоже, нужно отношение многие-ко-многим (many-to-many). Три таблицы: Товары, Размеры, ТоварыРазмеры.
9 дек 2022 в 19:08
@alexander-petrov, как тогда я смогу отмечать наличие для каждого размера?
Sqlite установка связи между таблицами
Нужно чтоб при выводе содержимого таблицы Cartridge, выводились значения в столбик Cart_ID из таблицы Printer(Print_ID).
Как это сделать? Задача элементарная, знаю. Просто второй день только изучаю БД.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Связи между таблицами
Приветствую. Хотел бы, что бы Вы, дорогие форумчане, помогли мне найти ошибку. Решил поиграться с.
Связи между таблицами
Здравствуйте. У меня есть продукты с определенными статическими свойствами которые будут.
Связи между таблицами для БД сети кинотеатров
Ребята, делаю курсач "БД сети кинотеатров". Помогите правильно связать таблицы, пожалуйста) Буду.
Связи между таблицами в простой базе данных
Всем привет! Пытаюсь создать простенькую БД на базе excel. В результате excel выдает ошибку.
1630 / 1131 / 171
Регистрация: 23.07.2010
Сообщений: 6,691
Ну так введи таблицу «Применимость картриджей» и всего делов
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
Kaberungula, какая-то странная реализация и требуемый запрос. Cart_id ссылается на print_id, где тут смысл? Если это попытка связать картридж с принтером, то надо было это делать через промежуточную таблицу, ведь, насколько я помню, серия картриджей подходит к нескольким принтерам, значит связь «многие-к-многим».
Даже если оставить такую реализацию, то что нужно получить то??
Сообщение от Kaberungula
Нужно чтоб при выводе содержимого таблицы Cartridge, выводились значения в столбик Cart_ID из таблицы Printer(Print_ID)
Какой ожидаемый вывод?
Можно предположить, что нужен простой join.
SELECT * FROM Cartridge q JOIN Printer w ON q.Cart_ID=w.Print_ID
Регистрация: 24.05.2016
Сообщений: 48
А как примерно может выглядеть промежуточная таблица?
Я вообще расчитывал, на вывод таблицы cartridge в виде (имя картриджа / номер картриджа, который загружается из ид принтера).
267 / 231 / 78
Регистрация: 16.12.2015
Сообщений: 943
Записей в блоге: 4
Сообщение от Kaberungula
Я вообще расчитывал, на вывод таблицы cartridge в виде (имя картриджа / номер картриджа, который загружается из ид принтера).
Вот это сейчас вообще не понятная фраза.
Смотри. У тебя есть 2 сущности. 1 — Принтер, 2 — Картридж. У каждой сущности есть свои атрибуты:
Принтер — фирма, модель, тип (лазерный, струйный и т.д), форм-фактор, тип печати и т.д.
Картридж — фирма, серийный номер и т.д.
И вот эти сущности имеют связь многие-к-многим, т.к. один картридж может подходить к нескольким принтерам. Почитай как реализуется связь многие-к-многим и поймешь как составить 3-ю таблицу.
Как связать 2 таблицы в sqlite
В прошлой теме было рассмотрено неявное соединение таблиц с помощью простой выборки путем сведения данных. Однако более распространенным подходом свдения данных из разных таблиц является применение оператора JOIN . SQLite поддерживает несколько вариантов оператора JOIN . В этой статье рассмотрим INNER JOIN . Общий формальный синтаксис этой версии оператора :
SELECT столбцы FROM таблица1 [INNER] JOIN таблица2 ON условие1 [[INNER] JOIN таблица3 ON условие2]
После оператора JOIN идет название второй таблицы, из которой надо добавить данные в выборку. Перед JOIN может использоваться необязательное ключевое слово INNER . Его наличие или отсутствие ни на что не влияет. Затем после ключевого слова ON указывается условие соединения. Это условие устанавливает, как две таблицы будут сравниваться. В большинстве случаев для соединения применяется первичный ключ главной таблицы и внешний ключ зависимой таблицы.
Возьмем таблицы с данными из прошлой темы:
DROP TABLE IF EXISTS orders; DROP TABLE IF EXISTS products; DROP TABLE IF EXISTS customers; CREATE TABLE products ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, company TEXT NOT NULL, items_count INTEGER DEFAULT 0, price INTEGER ); CREATE TABLE customers ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL ); CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, product_id INTEGER NOT NULL, customer_id INTEGER NOT NULL, created_at TEXT NOT NULL, items_count INTEGER DEFAULT 1, price INTEGER NOT NULL, FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE );
Пусть эти таблицы будут содержать следующие данные:
INSERT INTO products (name, company, items_count, price) VALUES ('iPhone 13', 'Apple', 3, 76000), ('iPhone 12', 'Apple', 2, 51000), ('Galaxy S21', 'Samsung', 2, 56000), ('Galaxy S20', 'Samsung', 1, 41000), ('P40 Pro', 'Huawei', 5, 36000); INSERT INTO customers(name) VALUES ('Tom'), ('Bob'),('Sam'); INSERT INTO orders (product_id, customer_id, created_at, items_count, price) VALUES ( (SELECT id FROM products WHERE name='Galaxy S21'), (SELECT id FROM customers WHERE name='Tom'), '2021-11-30', 2, (SELECT price FROM products WHERE name='Galaxy S21') ), ( (SELECT id FROM products WHERE name='iPhone 12'), (SELECT id FROM customers WHERE name='Tom'), '2021-11-29', 1, (SELECT price FROM products WHERE name='iPhone 12') ), ( (SELECT id FROM products WHERE name='iPhone 12'), (SELECT id FROM customers WHERE name='Bob'), '2021-11-29', 1, (SELECT price FROM products WHERE name='iPhone 12') );
Используя JOIN, выберем все заказы и добавим к ним информацию о товарах:
SELECT orders.created_at, orders.items_count, products.name FROM orders JOIN products ON products.id = orders.product_id;
Поскольку таблицы могут содержать столбцы с одинаковыми названиями, то при указании столбцов для выборки указывается их полное имя вместе с именем таблицы, например, «orders.items_count».
Используя псевдонимы для таблиц, можно сократить код:
SELECT O.created_at, O.items_count, P.name FROM orders AS O JOIN products AS P ON P.id = O.product_id;
Также можно присоединять данные сразу из нескольких таблиц. Например, добавим к заказу информацию о покупателе из таблицы customers:
SELECT orders.created_at, customers.name, products.name FROM orders JOIN products ON products.id = orders.product_id JOIN customers ON customers.id=orders.customer_id;
Благодаря соединению таблиц мы можем использовать их столбцы для фильтрации выборки или ее сортировки:
SELECT orders.created_at, customers.name, products.name FROM orders JOIN products ON products.id = orders.product_id JOIN customers ON customers.id=orders.customer_id WHERE products.price > 45000 ORDER BY customers.name;
Условия после ключевого слова ON могут быть более сложными по составу:
SELECT orders.created_at, customers.name, products.name FROM orders JOIN products ON products.id = orders.product_id AND products.company='Apple' JOIN customers ON customers.id=orders.customer_id ORDER BY customers.name;
В данном случае выбираем все заказы на товары, производителем которых является Apple.
Оператор UNION объединения нескольких таблиц
На предыдущем занятии мы видели как можно объединять таблицы между собой, создавая сводный отчет. На этом занятии продолжим эту тему и поговорим о работе оператора UNION, которая объединяет таблицы построчно.
Предположим, у нас имеются две таблицы с одинаковой структурой:
Все эти записи можно объединить в один сводный отчет с помощью оператора UNION:
SELECT score, `from` FROM tab1 UNION SELECT val, type FROM tab2
Мы здесь записали поле `from` в обратных одинарных кавычках, чтобы указать, что это не оператор FROM, а поле с именем from.
После выполнения этого запроса, получим следующее:
Имеем таблицу с шестью записями, причем, строки из исходных таблиц tab1 и tab2 объединялись по значениям первого поля: сначала 100, потом 200 для tab1 и 200 для tab2 и так далее.
Но, если указать только первые столбцы из наших таблиц в SQL-запросе:
SELECT score FROM tab1 UNION SELECT val FROM tab2
То результат уже будет таким:
Здесь остались только уникальные (неповторяющиеся) значения. Вообще, оператор UNION оставляет только уникальные значения записей.
Даже если в первую таблицу добавить еще одну строку со значением 100:
то результат работы SQL-запроса останется прежним. Но, оставляя только первую строку запроса:
SELECT score FROM tab1
увидим все записи первой таблицы.
Если же у первой таблицы во всех полях from укажем имя tab2:
UPDATE tab1 SET `from` = 'tab2'
то исходный запрос:
SELECT score, `from` FROM tab1 UNION SELECT val, type FROM tab2
Приведет к результату:
Смотрите, здесь тоже были оставлены только уникальные записи.
Вернем записям первой таблицы значения tab1:
UPDATE tab1 SET `from` = 'tab1'
И сформируем вот такой запрос:
SELECT score, 'table 1' as tbl FROM tab1 UNION SELECT val, 'table 2' FROM tab2
Смотрите, мы здесь явно указали значение второго поля как ‘table 1’ для первой таблицы и ‘table 2’ – для второй. И чтобы СУБД «знала» какое имя присвоить второму столбцу, оно указано в виде алиаса tbl. На выходе получим следующий результат:
Также можно добавить сортировку сводной таблицы, например, по полю score:
SELECT score, 'table 1' as tbl FROM tab1 UNION SELECT val, 'table 2' FROM tab2 ORDER BY score DESC
Или, добавить фильтр и ограничение максимального числа записей:
SELECT score, 'table 1' as tbl FROM tab1 WHERE score IN(300, 400) UNION SELECT val, 'table 2' FROM tab2 ORDER BY score DESC LIMIT 3
То есть, здесь можно использовать все операторы, о которых мы говорили на предыдущих занятиях.
Видео по теме
Python SQLite #1: что такое СУБД и реляционные БД
Python SQLite #2: подключение к БД, создание и удаление таблиц
Python SQLite #3: команды SELECT и INSERT при работе с таблицами БД
Python SQLite #4: команды UPDATE и DELETE при работе с таблицами
Python SQLite #5: агрегирование и группировка GROUP BY
Python SQLite #6: оператор JOIN для формирования сводного отчета
Python SQLite #7: оператор UNION объединения нескольких таблиц
Python SQLite #8: вложенные SQL-запросы
Python SQLite #9: методы execute, executemany, executescript, commit, rollback и свойство lastrowid
Python SQLite #10: методы fetchall, fetchmany, fetchone, Binary, iterdump
© 2023 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта