Interesting question. IMHO, you are in the position I was with regard to Magento some time ago. To write and use mySql queries against the Magento database requires nothing from the MVC model. In our world, I call these voodoo files. I create tools for my staff with very specific purpose and non-published URLs. You can put them anywhere in the file system, just make sure that the directory name and file name do not have any magic meaning within Magento or you might inadvertently disable some function. My sales tax reporting tool is exactly like yours, where you open a connection to the mySql database and make direct, manual queries against it.
RS's answer is a great primer for getting into the MVC. I have started using it for my voodoo tools as well. Making queries the "Magento way" via their controllers can make getting information out of the EAV much easier than trying to put together the info via manual queries because the infrastructure is already coded for you. An example is customer information! I figured out sales tax queries (which was no minor undertaking), but getting a complete name, address, and email was absurd.
I created an export tool which outputs JSON data. I then CURL it from the server at work to store the sales into a mysql database. From there, they get imported into quickbooks. This order export tool is 100% Magento objects like from the example below.
Here is the code I used in my voodoo customer info tool:
// this limits access to the page to this IP address, perhaps your office?
$remote_host_ip='198.75.43.24';
if( $_SERVER['REMOTE_ADDR'] != $remote_host_ip ){
$error[ date("Y-m-d_H:i:s") ]="\$_SERVER['REMOTE_ADDR'] is ".$_SERVER['REMOTE_ADDR']." which is not the office ip! $remote_host_ip\n";
}
// from: http://fishpig.co.uk/blog/direct-sql-queries-magento.html
require_once '/home/(your host username)/public_html/app/Mage.php';
// from: http://stackoverflow.com/questions/7145373/magento-fatal-error-call-to-a-member-function-getmodelinstance-on-a-non-obje/7145570#7145570
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$userModel = Mage::getModel('admin/user');
$userModel->setUserId(0);
// from: http://www.magentocommerce.com/boards/viewthread/297092/
$_dealers = Mage::getModel('customer/customer')
->getCollection()
->addFieldToFilter('group_id', array(6,5,3))
// ->addFieldToFilter('group_id', 6)
;
// print_r($_dealers);
$dealers=Array();
foreach( $_dealers as $id => $obj){
// $info=$obj->load();
// print_r($info);
// from: http://www.42droids.co.uk/magento-get-customer-and-address-details
$customerAddressId=$obj->getDefaultBilling();
$address = Mage::getModel('customer/address')->load($customerAddressId);
$_addr=$address->format();
$addr.=",".$address->telephone;
$addr.=",".$obj->email;
echo "$addr\n"; //var_dump($addr);
}
I do most of my learning by google, trial, and error; so please consider that "my way" is simply one that works for me and probably still isn't the best or easiest way. Also, I still don't completely understand how some of the objects work, hence debug output that's commented out.
My advice would be to not try too hard to make something for the "frontend" facing the customer. Getting pages to display and work correctly in Magento is a miserable experience. If you're able to do sneaky hidden voodoo tools, try to do that. If you're forced to make a module, there are a couple dozen step by step how-to's on the net that can guide you.