Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
Добрый день.
Я новичок, совсем недавно начал изучать SQL.
В качестве тренировки имею популярную учебную базу "pubs" - книги, издательства, авторы и т.д.
Вроде бы настолько же популярна, как "Борей" в MS Access.

Подскажите, как решить? Желательно показать рабочее решение.
Итак, задача - "Определить издательство, в котором опубликовано меньше всего книг".

Схема данных такая:
Картинка с другого сайта.
Издательства - таблица Publishers, Книги - таблица Titles.

Я лишь смог сделать запрос, который просто выводит названия Издательств и количество опубликованный в них Книг

SELECT publishers.pub_name, COUNT(titles.title_id) AS 'Number of books'
FROM publishers, titles
WHERE
 publishers.pub_id=titles.pub_id
GROUP BY publishers.pub_name


Получилось так:
Картинка с другого сайта.

Но задание не решено. Можно ли на основе этого запроса что-то сделать? Например сделать его подзапросом, а между внешним запросом и подзапросом поставить квантор ALL?
Вроде такого:

SELECT Издательство
FROM Издательства
WHERE число книг в издательстве <= ALL (
SELECT Число книг
FROM Книги
Where Издателства.Книга_id = Книги.Книга_id
)
26 апр 13, 14:57    [14235439]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT TOP(1) WITH TIES publishers.pub_name, COUNT(*) AS [Number of books]
FROM publishers
JOIN titles ON publishers.pub_id=titles.pub_id
GROUP BY publishers.pub_name
ORDER BY [Number of books] DESC;
26 апр 13, 15:05    [14235506]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
SELECT TOP(1) WITH TIES publishers.pub_name, COUNT(*) AS [Number of books]
FROM publishers
JOIN titles ON publishers.pub_id=titles.pub_id
GROUP BY publishers.pub_name
ORDER BY [Number of books] DESC;
Это больше всего книг!
Вот меньше всего:
SELECT TOP(1) WITH TIES p.pub_name, COUNT(t.pub_id) AS [Number of books]
FROM publishers p
LEFT JOIN titles t ON p.pub_id=t.pub_id
GROUP BY p.pub_name
ORDER BY [Number of books];
26 апр 13, 15:10    [14235545]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
iap,

Благодарю. Как я понял, главное - нужно использовать JOIN.
Ваш код вывод Издательство, у которого БОЛЬШЕ всего книг, а не МЕНЬШЕ, но это легко исправляется удалением слова DESC из ORDER BY.

Правда встречаются незнакомые TOP и ON, попробую исключить эти слова из кода, сохранив работоспособность :)
26 апр 13, 15:11    [14235557]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
Не обновил комментарий перед отправкой своего :)
26 апр 13, 15:13    [14235571]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SuperMasterProfessionalSQL
Не обновил комментарий перед отправкой своего :)
Мне страшно читать Ваши посты!
Убрать ON и TOP, говорите?! Типа я их шутки ради написал?

А WITH TIES Вам понятны, стало быть?
Чем отличается COUNT(*) от COUNT(pub_id) знаете?
LEFT JOIN я написал зачем?

Ответьте на эти вопросы хотя бы.
26 апр 13, 15:17    [14235603]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69037
SuperMasterProfessionalSQL
iap,

Благодарю. Как я понял, главное - нужно использовать JOIN.
Ваш код вывод Издательство, у которого БОЛЬШЕ всего книг, а не МЕНЬШЕ, но это легко исправляется удалением слова DESC из ORDER BY.

Правда встречаются незнакомые TOP и ON, попробую исключить эти слова из кода, сохранив работоспособность :)

Приколол
26 апр 13, 15:18    [14235625]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Мне страшно читать Ваши посты!
возьмите себя в руки,вы же мужчина
тем более ник -SuperMasterProfessionalSQL ,говорит сам за себя
26 апр 13, 15:31    [14235711]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
iap,

Просто ON и TOP ещё не изучались и это задание подразумевает выполнение без ON и TOP :)

автор
Чем отличается COUNT(*) от COUNT(pub_id) знаете?

COUNT(*) возвращает число записей в таблице, а COUNT(pub_id) - число значений столбца pub_id, вроде так?

LEFT JOIN - левое соединение, возвращает все строки из левой таблицы, даже если нет совпадений с таблицей справа

WITH TIES - не знакомо. Судя по англ-рус переводчику - означает "с галстуками" или "в связи". Тоже ещё не изучалось.
26 апр 13, 15:40    [14235760]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
Glory
Member

Откуда:
Сообщений: 104751
SuperMasterProfessionalSQL
WITH TIES - не знакомо. Судя по англ-рус переводчику - означает "с галстуками" или "в связи".

А по англо-китайсткому ?
26 апр 13, 15:42    [14235773]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SuperMasterProfessionalSQL
автор
Чем отличается COUNT(*) от COUNT(pub_id) знаете?

COUNT(*) возвращает число записей в таблице, а COUNT(pub_id) - число значений столбца pub_id, вроде так?
Нет. COUNT всегда подсчитывает количество строк. Но каких?

В документацию смотреть не пробовали?
Например: http://msdn.microsoft.com/ru-ru/library/bb510741(v=sql.100).aspx
26 апр 13, 15:45    [14235795]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
Ну вот кстати, поубирал всё лишнее, вроде всё работает. Избавился от "ON" и "LEFT JOIN".
Оставил только TOP(1) с галстуками.

SELECT TOP(1) WITH TIES publishers.pub_name, COUNT(*) AS [Number of books]
FROM publishers, titles
WHERE
 publishers.pub_id=titles.pub_id
GROUP BY publishers.pub_name
ORDER BY [Number of books];

Результат:
Картинка с другого сайта.
Так можно делать или это "совсем неправильно" ? результат одинаков вроде.

А ник - это задел на будущее :)
26 апр 13, 15:47    [14235809]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
SuperMasterProfessionalSQL,

в итоге слова "ON" и "LEFT JOIN". вы заменили на INNER JOIN +ON
26 апр 13, 15:49    [14235822]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SuperMasterProfessionalSQL,

А если есть такие "издательства", которые не опубликовали ни одной книги?
Только не ссылайтесь на реальную жизнь. Это же учебный пример по SQL, насколько я понимаю
26 апр 13, 15:51    [14235832]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
SuperMasterProfessionalSQL,

отставить писать через запятую во FROM! Пишите единственно верным стилем с JOIN ON и привыкайте к хорошему с молоду.
26 апр 13, 15:53    [14235845]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69037
SuperMasterProfessionalSQL
Ну вот кстати, поубирал всё лишнее, вроде всё работает. Избавился от "ON" и "LEFT JOIN".
Оставил только TOP(1) с галстуками.

А как же так?
автор SuperMasterProfessionalSQL
Как я понял, главное - нужно использовать JOIN.


"ON" как раз таки работает в связке с join.
Поэтому:
SuperMasterProfessionalSQL
Правда встречаются незнакомые TOP и ON, попробую исключить эти слова из кода, сохранив работоспособность :)
Вряд ли получилось бы без ошибки.
26 апр 13, 15:54    [14235854]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на "наименьшее" значение  [new]
SuperMasterProfessionalSQL
Member

Откуда:
Сообщений: 10
iap,

  • Функция COUNT(*) возвращает количество элементов в группе. Сюда входят значения NULL и повторяющиеся значения.
  • Функция COUNT(ALL expression) оценивает expression для каждой строки в группе и возвращает количество значений, не равных NULL.

  • Ну почти также. COUNT(*) возвращает кол-во всех элементов, а COUNT(pub_id) - количество тех, где в столбце pub_id есть значение, не равное NULL

    Документацию смотрел в справочнике SQL Reference.


    Maxx,

    Т.е. у меня там INNER JOIN , даже если я их не пишу это в явном виде? Всм я не пишу слова "INNER JOIN", но оно всё равно там есть по умолчанию, так?
    26 апр 13, 15:55    [14235860]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    Прогер_самоучка
    Member

    Откуда:
    Сообщений: 69037
    PaulYoung
    отставить писать через запятую во FROM! Пишите единственно верным стилем с JOIN ON и привыкайте к хорошему с молоду.
    А можно узнать в чём "тонкость"? Мне будет весьма пользительно ваше разъяснение. Спасибо.
    26 апр 13, 15:58    [14235886]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    PaulYoung
    Member

    Откуда: Москва
    Сообщений: 2567
    Прогер_самоучка,

    тонкость в разделении условий соединения таблиц и фильтров. Во FROM они визуально смешиваются в одну кучу и порой так, что трудно идентифицировать весь этот винегрет.
    26 апр 13, 16:04    [14235912]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    Maxx
    Member [скрыт]

    Откуда:
    Сообщений: 24290
    Прогер_самоучка
    А можно узнать в чём "тонкость"?

    помоему в 2012 уже нельзя будет написать
    where поле*=поле вместо left join
    26 апр 13, 16:05    [14235919]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    Прогер_самоучка
    PaulYoung
    отставить писать через запятую во FROM! Пишите единственно верным стилем с JOIN ON и привыкайте к хорошему с молоду.
    А можно узнать в чём "тонкость"? Мне будет весьма пользительно ваше разъяснение. Спасибо.
    Напишите LEFT/RIGHT/FULL JOIN, используя запятую,
    с произвольным условием связывания таблиц (не по равенству).

    Попробуйте смешать два синтаксиса - старый (запятая) и более новый (JOIN) - во FROMе.
    Очень быстро нарвётесь на интересные эффекты, связанные с тем, что запятую надо сопровождать
    условием в WHERE, а условие JOIN пишется во FROM. Логически эти части SELECTа выполняются
    в разные моменты времени.
    26 апр 13, 16:05    [14235922]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    SuperMasterProfessionalSQL
    Member

    Откуда:
    Сообщений: 10
    iap,

    Благодарю! Т.е. если бы у меня было издательство, не опубликовавшее ни одной книги, то мой COUNT(pub_id) его пропустил бы и не учёл и задача была бы решена неверно. А если использовать COUNT(*), то это "издательство" попадёт в результат со своим NULL книг и будет на 1 месте по наименьшему числу книг и всё будет хорошо и правильно. Так ведь?

    PaulYoung
    автор
    отставить писать через запятую во FROM! Пишите единственно верным стилем с JOIN ON и привыкайте к хорошему с молоду.

    Понял! Т.е. записи
    FROM publishers, titles WHERE publishers.pub_id=titles.pub_id
    

    и
    FROM publishers RIGHT JOIN titles ON publishers.pub_id=titles.pub_id
    

    эквивалентны и равны по результату, но вторая "правильнее", и запятая равна "RIGHT JOIN" ?
    26 апр 13, 16:05    [14235924]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47142
    Maxx
    Прогер_самоучка
    А можно узнать в чём "тонкость"?

    помоему в 2012 уже нельзя будет написать
    where поле*=поле вместо left join
    В 2005-м запрещено
    26 апр 13, 16:06    [14235925]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    Maxx
    Member [скрыт]

    Откуда:
    Сообщений: 24290
    SuperMasterProfessionalSQL,
    нет запятая ничему не равна ,у вас обе конструкции ето INNER JOIN
    RIGHT JOIN будет выглядеть так
    FROM publishers, titles WHERE publishers.pub_id=* titles.pub_id
    
    26 апр 13, 16:07    [14235934]     Ответить | Цитировать Сообщить модератору
     Re: Запрос на "наименьшее" значение  [new]
    Maxx
    Member [скрыт]

    Откуда:
    Сообщений: 24290
    iap
    В 2005-м запрещено

    о как ,просто 100 лет назад перешел из *= в джойны
    26 апр 13, 16:08    [14235940]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить