ざっくりと、メインループとサブループは以下のように理解しています。
・メインループ:URLをもとにワードプレスのコアファイルが回すループのこと。
・サブループ:URLに関係なくワードプレスのデータベースからデータを取得して回すループのこと。
メインループを回すためにwordpressでは query_posts() が使用されていますが、 get_posts() と WP_Query()の3つの違いを整理してみます。
query_posts() は使用が推奨されていません。 has_posts() の記述のある親テーマを引き継いで編集するために、この関数でループを回したかったのですが、良くない方法だそうです。動作も重いとのこと。
$wpdbを利用してデータベースにアクセスする方法もあるのですが、ループを回したいのであれば$wpdbよりもget_posts() か new WP_Query() を利用したほうが少ないコードで済みそうです。
なお、functions.php の中で使用する場合は global $wpdb
の宣言が必要です。