Если вам действительно нужно использовать Zend_Db_Select, вы можете сделать это:
$select = $db->select()
->from(array("a"=>"AUTHOR"), array("author_name"=>"name"))
->join(array("b"=>"BOOK"), "a.id = b.`author.id`", array("book_name"=>"name"))
->where("a.name = ?", $authorName);
$stmt = $select->query();
Однако это идет с обычным предостережением: нет необходимости использовать Zend_Db_Select для каждого запроса. Zend_Db_Select лучше всего использовать, когда ваш запрос должен быть построен динамически в зависимости от условий приложения. В этом случае нет причин использовать Zend_Db_Select.
Так что я бы сделал это более просто, просто используя буквальный SQL:
$sql = "
SELECT a.name AS author_name, b.name AS book_name
FROM AUTHOR AS a JOIN BOOK AS b ON a.id = b.`author.id`
WHERE a.name = ?";
$books = $db->fetchAll($sql, $authorName);
Ваш комментарий: Zend_Db_Select не предоставляет ничего с точки зрения безопасности или производительности, которую вы не можете получить так же легко другими способами. Независимо от того, используете ли вы Zend_Db_Select или просто одну литеральную строку для вашего SQL, конечный результат - это одно и то же: строка, которую вы впоследствии подготовите как запрос SQL. База данных не имеет представления о различных способах создания этой строки.
Обычно приложения добавляют условные столбцы, таблицы или выражения к запросу SQL в зависимости от логики приложения. В этих сценариях удобно иметь такой класс, как Zend_Db_Select, который поможет вам добавлять предложения в запрос SQL.
Но если у вас есть запрос, который не не требует каких-либо динамических предложений, он проще, более читабелен, проще в отладке и проще в обслуживании для выражения запроса SQL в виде одного строкового литерала, как мой второй пример выше.
Что касается безопасности, вы можете использовать параметр-заполнитель для имени автора и указать это значение в качестве аргумента после подготовки запроса. Вы можете сделать это так же легко с помощью буквального SQL-запроса, как и с Zend_Db_Select.