Q:

SQL to match string value against multiple columns

I have a table called tblStudent having data as

I want to retrieve records having single value compared against multiple columns. For example -
find all students having Grade 'C' in any of the subjects.
One way could be -   
SELECT * FROM tblStudent
WHERE Grade_Maths = 'C' OR
Grade_Science = 'C' OR
Grade_English = 'C'

Another (cleaner/shorter) way of achieving same is 
SELECT * FROM tblStudent
WHERE 'C' IN (Grade_Maths, Grade_Science, Grade_English)

Because the table data can be considerably huge in real-time, I am not sure whether second method will always return correct result.
Can please suggest if there could be any potential issue with using second approach.
Thanks a lot!

A:

The queries are the same except potentially the second won't use index if any exists on grade_* columns. And this flipped approach Is rather uncommon (at least i see it for first time). Possibly because you wouldnt need such approach if you had a better tables structure.
What if suddently students can study history or biology? You Will need to create new columns And Alter all related queries.
Instead there should be a "subjects" table and an M:N relation table between subjects and students. Your query wont contain any ORs or INs the way it does now. And adding new subjects Is matter of  merely inserting new row to subjects table.

