2014-12-14 4 views
2

Я новичок в SQL и искал ответ на этот вопрос, но еще не нашел его. Скажем, я хочу запросить всех студентов, получивших оценку 80 из таблицы с именами учеников. Как я могу это сделать? Я пробовал это до сих пор, но похоже, что оператор IN похож на OR, так как он дает мне результаты всех, кто получил 80 баллов по любому из тестов.SQL - Как запросить несколько значений WHERE с оператором AND

SELECT * FROM students 
WHERE test_name IN ('Quiz','Midterm','Final') 
AND test_scores='80'; 

Благодарим вас за помощь!

Образец данных:

Test Name | Student ID | Student Name | Test Score 
Quiz  | 10   | Tom   | 80 
Midterm | 50   | Sally  | 70 

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

+2

Ваш запрос вернет всех студентов, которые получили 80 баллов за все эти 3 теста. Какой результат вы хотите? Пожалуйста, разместите небольшую выборку строк из своей таблицы вместе с результатами, которые вы ожидаете, что ваш запрос вернется из этого набора строк. –

+0

Вы ищете студентов, которые получили ровно 80 на всех этих трех тестах? Это немного сложнее и требует некоторой агрегации. –

+0

Показаны некоторые примеры данных и то, что вы надеялись получить в результате этого и будущих вопросов. Использовать пробелы для выравнивания, так как вкладки не работают хорошо при форматировании. Просто отредактируйте существующий вопрос с образцами данных. – DRapp

ответ

0

Один из способов свести на нет смысл теста, а затем исключить те студенты:

SELECT * 
FROM students 
WHERE student_id NOT IN (
    SELECT student_id 
    FROM students 
    WHERE test_name IN ('Quiz','Midterm','Final') 
    AND test_scores != '80'; 
) 
AND test_name IN ('Quiz','Midterm','Final') 
+0

Хотя это и привело к тому, что студенты, получившие 80-е годы на всех трех тестах, также включили дополнительных студентов, которые получили 80-е годы на любом из тестов. Я собираюсь продолжить это завтра. Еще раз спасибо за то, что помогли мне на шаг ближе! – Albert

+0

Он также вернет учеников, которые не взяли все 3 теста, но получили 80-е годы на те, что они сделали. – Barmar

0

Вы можете использовать агрегацию с пунктом having, при условии, что вы хотите счет 80 по всем трем тестам:

SELECT student_id 
FROM students 
WHERE test_name IN ('Quiz','Midterm','Final') 
GROUP BY student_id 
HAVING SUM(test_score = 80 and test_name = 'Quiz') > 0 AND 
     SUM(test_score = 80 and test_name = 'Midterm') > 0 AND 
     SUM(test_score = 80 and test_name = 'Final') > 0; 
Смежные вопросы