Below is the list of tables from the database along with their columns and datatype. Need to generate an accurate SQL query for the question.
Only use the columns present in the respective table. Only use the columns which are required to generate the SQL query. Only use table joins if required and not otherwise.

### Tables ###
TABLE: CREATE TABLE has_pet (stuid VARCHAR, petid VARCHAR)
TABLE: CREATE TABLE student (fname VARCHAR, age VARCHAR, stuid VARCHAR)
TABLE: CREATE TABLE pets (petid VARCHAR, pettype VARCHAR)

### Question ###
Find the first name and age of students who have a dog but do not have a cat as a pet.

### Accurate SQL ###

SELECT T1.fname, T1.age FROM student AS T1 JOIN has_pet AS T2 ON T1.stuid = T2.stuid JOIN pets AS T3 ON T3.petid = T2.petid WHERE T3.pettype = 'dog' AND NOT T1.stuid IN (SELECT T1.stuid FROM student AS T1 JOIN has_pet AS T2 ON T1.stuid = T2.stuid JOIN pets AS T3 ON T3.petid = T2.petid WHERE T3.pettype = 'cat')