Hassan Majid Ответов: 2

Помощь в написании некоторых SQL-запросов


Я просто был немного сбит с толку следующими вопросами SQL. Я не уверен, следует ли мне использовать какие-либо соединения или просто использовать операторы select, count или avg. Я придумал свой собственный вопрос, чтобы помочь мне попытаться понять, как лучше писать SQL-операторы.

Рассмотрим две таблицы:

Чемпионы с колонками год, страна, имя, роль

Перечисление всех игроков и менеджеров в команде-победителе чемпионата мира. Вы можете предположить, что любой человек с одинаковым именем для одной и той же страны в разные годы является одним и тем же человеком.

Цели с колонками год, страна, название, NUM_GOALS

Перечисление всех забитых мячей из любой команды (то есть не только Чемпионов). Не забитые голы не включены.

Так, например, записи могут выглядеть следующим образом (конечно, есть еще много строк)

Чемпионы (~500 строк)

YEAR    COUNTRY NAME    ROLE

2018    France  Didier Deschamps    Manager

2018    France  Hugo Lloris Goalkeeper

2018    France  Paul Pogba  Midfielder

2014    Germany Joachim Loew    Manager

2014    Germany Mesut Ozil  Midfielder

2014    Germany Miroslav Klose  Forward

2002    Brazil  Da Silva    Midfielder

1994    Brazil  Da Silva    Midfielder

1998    France  Didier Deschamps    Midfielder


Цели (~1700 строк)

YEAR    COUNTRY NAME    NUM_GOALS

2018    England Harry Kane  6

2018    France  Antoine Griezmann   4

2014    Argentina   Lionel Messi    4

2014    Brazil  Fred    1

2010    Germany Thomas Muller   5

2010    Japan   Shinji Okazaki  1

1992    England Gary Linekar    6



Вопросы 1. напишите запрос, чтобы показать, сколько людей выиграли как игрок и менеджер? (например, Дидье Дешам)

Q2. напишите запрос, показывающий, сколько раз каждая страна выигрывала чемпионат мира для стран, выигравших чемпионат мира по крайней мере дважды.

Q3. напишите запрос, показывающий всех игроков, выигравших чемпионат мира, которые никогда не забивали гол.

Q4. напишите запрос, чтобы определить победителя Золотой бутсы (самого высокого бомбардира) на каждом чемпионате мира.

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

Что я уже пробовал:

Для вопроса 1 я придумал вот что:

SELECT COUNT(*) AS CHAMPIONS_ROLE FROM CHAMPIONS WHERE ROLE = 'Manager'AND 'Midfielder';

[no name]

Для вопроса 3 я придумал следующее, хотя и не уверен в том, что часть просто игроков-победителей чемпионата мира. Я могу получить всех игроков, которые не забили, но игроки, выигравшие чемпионат мира, немного беспокоят меня.

3. напишите запрос, показывающий всех игроков-победителей чемпионата мира, которые никогда не забивали голов.

ВЫБРАННОЕ ИМЯ
ОТ ГОЛОВ
ГДЕ NUM_GOALS = 0;

2 Ответов

Рейтинг:
1

Patrice T

Этот запрос:

SELECT COUNT(*) AS CHAMPIONS_ROLE FROM CHAMPIONS WHERE ROLE = 'Manager' AND 'Midfielder';

Это не то, что вы думаете, вы должны быть написаны так:
SELECT COUNT(*) AS CHAMPIONS_ROLE FROM CHAMPIONS WHERE ROLE = 'Manager' AND ROLE = 'Midfielder';

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

[Обновление]
Цитата:
Большое спасибо за вашу помощь. Я просто хотел узнать, не могли бы вы подробнее рассказать о своем объяснении.

Я знаю языки достаточно, чтобы заметить эту ошибку начинающих, но я не пользователь SQL.
Взгляните на SELF JOINS: SQL соединение самостоятельно [^]


[no name]

Привет Патрис,

Большое спасибо за вашу помощь. Я просто хотел узнать, не могли бы вы подробнее рассказать о своем объяснении.

Рейтинг:
0

OriginalGriff

Цитата:
Для вопроса 1 я придумал ...


Так что попробуйте и посмотрите, что получится. Это работает? А если нет, то что он делает?

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Просто разместите свои домашние вопросы и надеетесь, что мы сделаем их за вас, это не сработает.


OriginalGriff

Это совсем не так - мы все добровольцы.
И у нас есть много людей, таких как вы, которые выкладывают свои домашние задания и надеются на что-то, что они могут сдать как свою собственную работу.
Мы не делаем этого для вас: это никому не поможет. Это несправедливо по отношению к вашим сокурсникам, которые прилагают некоторые усилия; это несправедливо по отношению к вам, если вы не научитесь на самом деле делать работу самостоятельно.
Если вы не знаете, как это сделать, прочитайте свои заметки о курсе. Как правило, домашнее задание основано на последних уроках, поскольку именно для этого оно и предназначено: для усиления обучения и проверки вашего понимания.

Вы не проявили никакого интереса к тому, чтобы сделать это самостоятельно: тривиальный запрос, написанный, но без признаков фактического тестирования, плюс три других вопроса, на которые вы даже не пытались ответить...