SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.03.2012 21:22:52

JEEN
Участник
Зарегистрирован: 10.03.2012
Сообщений: 4

Нужна помощь по созданию sql запроосов для лабы по БД

Есть 3 таблицы: KN – книги, KL – клиенты, VD – выдача книг

как-то так

Код:

CREATE TABLE KN (
KKN    integer(5) NOT NULL,
N    varchar(100) NOT NULL,
A    varchar(100) NOT NULL
PRIMARY KEY(KKN))

CREATE TABLE KL (
KK    integer(5) NOT NULL,
F    varchar(100) NOT NULL
PRIMARY KEY(KK))

CREATE TABLE VD (
K    integer(5) NOT NULL,
KKN    integer(5) NOT NULL,
KK    integer(5) NOT NULL,
DT    DATETIME,
SR    integer(3) NULL
PRIMARY KEY(K))

1. Список клиентов с полем KOL, содержащим количество выдач книг данному клиенту. Если клиенту книги не выдавались, значение этого поля должно быть не определено (использовать внешнее соединение)

я сделал так, но не уверен:

Код:

SELECT *, count(vd.k) as kol FROM kl FULL OUTER JOIN vd ON kl.kk = vd.kk

2. Список книг с указанием, сколько раз она выдавалась (поле KOL) и среднего срока выдачи (поле SR). Если книга не выдавалась, она должна присутствовать в списке, KOL=0, SR=0;

здесь, возможно, union надо использовать?

3. Список клиентов, бравших одну и ту же книгу более 1 раза. В списке отобразить название книги и сколько раз она бралась.
4. Список книг, которые брались более 10 раз на срок не менее 30 дней.
5. Удалить из БД информацию о клиентах, которые ни разу не брали книги

Неактивен

 

#2 10.03.2012 22:06:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь по созданию sql запроосов для лабы по БД

JEEN написал:

1. Список клиентов с полем KOL, содержащим количество выдач книг данному клиенту. Если клиенту книги не выдавались, значение этого поля должно быть не определено (использовать внешнее соединение)

я сделал так, но не уверен:

Код:

SELECT *, count(vd.k) as kol FROM kl FULL OUTER JOIN vd ON kl.kk = vd.kk

Практика - критерий истины.
Думаю вам стоит заполнить таблицы десятком тестовых записей и проверять работу своего запроса. Как только получиться правильно написать первый - остальные будет легче.
И если вы используете MySQL, то ориентируйтесь на её синтаксис http://dev.mysql.com/doc/refman/5.5/en/join.html

Неактивен

 

#3 11.03.2012 04:11:07

JEEN
Участник
Зарегистрирован: 10.03.2012
Сообщений: 4

Re: Нужна помощь по созданию sql запроосов для лабы по БД

я бы не писал сюда, если бы у меня было куча времени для практики. Это те запросы, которые остались, их естественно было куда больше, но похоже слоган сайта "Задавайте вопросы, мы ответим" ошибочный?

Синтаксис не обязательно MySQL, просто SQL. А этот запрос был полностью скопирован с какого-то сайта по sql, я не сомневаюсь в его правильном написании,я сомневаюсь в том, что он удовлетворяет условие задания.

Неактивен

 

#4 11.03.2012 09:33:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь по созданию sql запроосов для лабы по БД

JEEN написал:

я бы не писал сюда, если бы у меня было куча времени для практики. Это те запросы, которые остались, их естественно было куда больше, но похоже слоган сайта "Задавайте вопросы, мы ответим" ошибочный?

Слоган означает, что поможем разобраться, а не сделаем за вас лабу.

JEEN написал:

Синтаксис не обязательно MySQL, просто SQL. А этот запрос был полностью скопирован с какого-то сайта по sql, я не сомневаюсь в его правильном написании,я сомневаюсь в том, что он удовлетворяет условие задания.

А как вы вообще проверяете правильность запросов, если у вас нет тестовых данных?

Давайте так, вот вам ответ на первый вопрос, а дальше задавайте конкретные вопросы.

select kl.*, t.kol from kl left join (select kk, count(k) as kol from vd group by kk) t on kl.kk=t.kk;

Неактивен

 

#5 11.03.2012 09:53:29

JEEN
Участник
Зарегистрирован: 10.03.2012
Сообщений: 4

Re: Нужна помощь по созданию sql запроосов для лабы по БД

я и не просил сделать все за меня. Если есть желание - я не возражаю. Но мне нужна "помощь", любая. По первому я спросил проверить правильность, спасибо за ответ, кстати. А по второму и остальным я просто не знаю какие функции использовать, в какую сторону копать.

возьмем хотя бы это:

5. Удалить из БД информацию о клиентах, которые ни разу не брали книги

в одном источнике написано что JOIN в DELETE нельзя использовать, в другом написан пример по его использованию. Без JOIN'а я тут без понятия как делать. Подзапросом?

2. Список книг с указанием, сколько раз она выдавалась (поле KOL) и среднего срока выдачи (поле SR). Если книга не выдавалась, она должна присутствовать в списке, KOL=0, SR=0;

это задание сильно похоже на первое, но меня сильно смущает KOL=0, в предыдущем было NULL. Здесь разные функции разный результат дают или надо какую-то автозамену использовать?

Сейчас занимаюсь заполнением базы данных

Неактивен

 

#6 11.03.2012 10:15:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь по созданию sql запроосов для лабы по БД

JEEN написал:

я и не просил сделать все за меня. Если есть желание - я не возражаю. Но мне нужна "помощь", любая. По первому я спросил проверить правильность, спасибо за ответ, кстати. А по второму и остальным я просто не знаю какие функции использовать, в какую сторону копать.

Выбор богатый
http://dev.mysql.com/doc/refman/5.5/en/functions.html

JEEN написал:

возьмем хотя бы это:

5. Удалить из БД информацию о клиентах, которые ни разу не брали книги

в одном источнике написано что JOIN в DELETE нельзя использовать, в другом написан пример по его использованию. Без JOIN'а я тут без понятия как делать. Подзапросом?

http://dev.mysql.com/doc/refman/5.5/en/delete.html
Обратите внимание на примеры.


JEEN написал:

2. Список книг с указанием, сколько раз она выдавалась (поле KOL) и среднего срока выдачи (поле SR). Если книга не выдавалась, она должна присутствовать в списке, KOL=0, SR=0;

это задание сильно похоже на первое, но меня сильно смущает KOL=0, в предыдущем было NULL. Здесь разные функции разный результат дают или надо какую-то автозамену использовать?

http://dev.mysql.com/doc/refman/5.5/en/ … ion_ifnull

Неактивен

 

#7 11.03.2012 10:36:20

JEEN
Участник
Зарегистрирован: 10.03.2012
Сообщений: 4

Re: Нужна помощь по созданию sql запроосов для лабы по БД

Выбор богатый

зачем тогда форум, если вы всегда тыкаете на мануал? я и без того могу посмотреть в интернете список фунций sql. Буду благодарен, если укажите на конкретные функции (count, group, join, ...) в каждом примере.

Обратите внимание на примеры.

спасибо

Тут начал проверять остальные запросы, что по проще. Может пригодятся кому-то.

Список книг авторов «Иванов», «Петров» и «Андреев», упорядоченный сначала по убыванию по авторам, затем по возрастанию по названиям;

SELECT * FROM KN WHERE A = 'Иванов' OR A = 'Петров' OR A = 'Сидоров' ORDER BY A DESC, N ASC

Список клиентов, фамилии которых заканчиваются на «ов»;

SELECT F FROM KL WHERE F like '%ов'

Список кодов книг, которые выдавались (без повторов);

SELECT DISTINCT KKN FROM VD

Список клиентов, которым выдавались книги с указанием количества выдач;

SELECT * FROM KL LEFT JOIN VD ON KL.KK = VD.KK WHERE VD.SR IS NOT NULL

последний запрос работает, только без указания количества выдач. Пытаюсь сделать так:

SELECT *, count(VD.K) as count FROM KL LEFT JOIN VD ON KL.KK = VD.KK WHERE VD.SR IS NOT NULL GROUP BY VD.K

но всем книгам присваивается по одной выдаче. Почему так?

Неактивен

 

#8 11.03.2012 10:49:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь по созданию sql запроосов для лабы по БД

JEEN написал:

Выбор богатый

зачем тогда форум, если вы всегда тыкаете на мануал? я и без того могу посмотреть в интернете список фунций sql. Буду благодарен, если укажите на конкретные функции (count, group, join, ...) в каждом примере.

На общий вопрос можно лишь получить общий ответ. В случае вопросов по существу и ссылки давались на конкретные функции.

JEEN написал:

Список клиентов, которым выдавались книги с указанием количества выдач;

SELECT * FROM KL LEFT JOIN VD ON KL.KK = VD.KK WHERE VD.SR IS NOT NULL

последний запрос работает, только без указания количества выдач. Пытаюсь сделать так:

SELECT *, count(VD.K) as count FROM KL LEFT JOIN VD ON KL.KK = VD.KK WHERE VD.SR IS NOT NULL GROUP BY VD.K

но всем книгам присваивается по одной выдаче. Почему так?

Потому что делаете группировку по VD.K
И еще посмотрите http://sqlinfo.ru/forum/viewtopic.php?pid=30427#p30427

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson