If you are using MySQL its default is to cache queries.
What you are probably saying is not that you want to cache queries, but to run a query every 2 hours, and then store and access the results of that query.
What you are describing is a "reporting table".
Use of reporting tables is when you wish to store the results of a long, complex query, where it doesn't matter too much if the report table results don't need to reflect the total, realtime state of the database.
For example, if you were displaying a summary of daily orders other than today's orders.
To manage a reporting table, you typically create a cron job which populates the table on a scheduled basis. The SQL for that table might be very complex. Often the script might be made up of multiple statements. The statements might include complex (slow) calculations. You'd run the script every two hours, then point all queries to the reporting table, where the results will display quickly.
To access the reporting table, the SQL is very simple, typically
SELECT * FROM myReportTable
or something similar.
You can also easily cross reference real time data to the reporting table.
For example in the order summary table example above, your reporting table might include customer name, address, phone number etc.
OR you could simply include a customer ID to cross reference to the transaction database.
SELECT * FROM myReportingTable
INNER JOIN customerTable
ON myReportingTable.customerID=customerTable.ID