Do you in fact have a STUDENT table? You refer to both STUDENT and LSTUDENT in your SELECT, but only use STUDENT in the FROM clause. Which one is it?
Also, at a minimum, you need to quote the content of your WHERE condition.
ADOQuery1.SQL.Add ('WHERE SEKSYEN = ' + QuotedStr(ComboBox2.Text));
Much better though would be to stop concatenating SQL in your code, and use parameterized queries instead. It's not only much safer against SQL injection, but it allows the database engine to compile and cache the query content, making it execute much more quickly if you're using the same statement more than one time with different parameter values.
procedure TForm9.Button1Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT DAT20303.NUM, DAT20303.NAMA, DAT20303.MATRIC_ID,');
ADOQuery1.SQL.Add('DAT20303.SUBJEK, DAT20303.M1, DAT20303.M2, DAT20303.M3,');
ADOQuery1.SQL.Add('DAT20303.M4, DAT20303.M5, DAT20303.M6,');
ADOQuery1.SQL.Add('DAT20303.M7, STUDENT.SEKSYEN, LSTUDENT.MATRIC_ID');
ADOQuery1.SQL.Add ('FROM STUDENT');
ADOQuery1.SQL.Add ('JOIN DAT20303');
ADOQuery1.SQL.Add ('ON DAT20303.MATRIC_ID = STUDENT.MATRIC_ID');
ADOQuery1.SQL.Add ('WHERE SEKSYEN = :SekSyen');
ADOQuery1.Parameters.ParamByName('SekSyen').AsString := ComboBox1.Text;
ADOQuery1.Open; {open query + display data}
end;
And please don't be afraid to use whitespace (spaces and line breaks) to make your SQL more readable! I've cleaned it up somewhat in my answer to do so. When it's easier to read, it's easier to understand (and maintain later).
FROMafter the last column in the list ofSELECTcolumns ....ADOQuery1.SQL.Add ('WHERE SEKSYEN = ''' + ComboBox2.Text + '''');but best to use parameters as mentioned earlier.