diff --git includes/database/query.inc includes/database/query.inc
index 7c590c2..77de96b 100644
--- includes/database/query.inc
+++ includes/database/query.inc
@@ -77,6 +77,28 @@ interface QueryConditionInterface {
   public function isNotNull($field);
 
   /**
+   * Sets a condition that the specified subquery returns values.
+   * 
+   * @param SelectQueryInterface $select
+   *   The subquery that must contain results.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function exists(SelectQueryInterface $select);
+  
+  /**
+   * Sets a condition that the specified subquery returns no values.
+   * 
+   * @param SelectQueryInterface $select
+   *   The subquery that must not contain results.
+   *
+   * @return QueryConditionInterface
+   *   The called object.
+   */
+  public function notExists(SelectQueryInterface $select);
+  
+  /**
    * Gets a complete list of all conditions in this conditional clause.
    *
    * This method returns by reference. That allows alter hooks to access the
@@ -727,6 +749,22 @@ class DeleteQuery extends Query implements QueryConditionInterface {
   }
 
   /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+  
+  /**
    * Implements QueryConditionInterface::conditions().
    */
   public function &conditions() {
@@ -947,6 +985,22 @@ class UpdateQuery extends Query implements QueryConditionInterface {
   }
 
   /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+  
+  /**
    * Implements QueryConditionInterface::conditions().
    */
   public function &conditions() {
@@ -1417,6 +1471,22 @@ class MergeQuery extends Query implements QueryConditionInterface {
   }
 
   /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    $this->condition->exists($select);
+    return $this;
+  }
+
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    $this->condition->notExists($select);
+    return $this;
+  }
+  
+  /**
    * Implements QueryConditionInterface::conditions().
    */
   public function &conditions() {
@@ -1615,6 +1685,20 @@ class DatabaseCondition implements QueryConditionInterface, Countable {
   }
 
   /**
+   * Implements QueryConditionInterface::exists().
+   */
+  public function exists(SelectQueryInterface $select) {
+    return $this->condition('', $select, 'EXISTS');
+  }
+  
+  /**
+   * Implements QueryConditionInterface::notExists().
+   */
+  public function notExists(SelectQueryInterface $select) {
+    return $this->condition('', $select, 'NOT EXISTS');
+  }
+  
+  /**
    * Implements QueryConditionInterface::conditions().
    */
   public function &conditions() {
@@ -1756,6 +1840,8 @@ class DatabaseCondition implements QueryConditionInterface, Countable {
       'BETWEEN' => array('delimiter' => ' AND '),
       'IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
       'NOT IN' => array('delimiter' => ', ', 'prefix' => ' (', 'postfix' => ')'),
+      'EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
+      'NOT EXISTS' => array('prefix' => ' (', 'postfix' => ')'),
       'IS NULL' => array('use_value' => FALSE),
       'IS NOT NULL' => array('use_value' => FALSE),
       // Use backslash for escaping wildcard characters.
diff --git includes/database/select.inc includes/database/select.inc
index 9046afb..269080b 100644
--- includes/database/select.inc
+++ includes/database/select.inc
@@ -810,6 +810,16 @@ class SelectQueryExtender implements SelectQueryInterface {
     return $this;
   }
 
+  public function exists(SelectQueryInterface $select) {
+    $this->query->exists($select);
+    return $this;
+  }
+
+  public function notExists(SelectQueryInterface $select) {
+    $this->query->notExists($select);
+    return $this;
+  }
+  
   public function __toString() {
     return (string) $this->query;
   }
@@ -1022,6 +1032,16 @@ class SelectQuery extends Query implements SelectQueryInterface {
     return $this;
   }
 
+  public function exists(SelectQueryInterface $select) {
+    $this->where->exists($select);
+    return $this;
+  }
+
+  public function notExists(SelectQueryInterface $select) {
+    $this->where->notExists($select);
+    return $this;
+  }
+  
   public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder = NULL) {
     return $this->where->compile($connection, isset($queryPlaceholder) ? $queryPlaceholder : $this);
   }
@@ -1069,7 +1089,17 @@ class SelectQuery extends Query implements SelectQueryInterface {
     $this->having->isNotNull($field);
     return $this;
   }
-
+  
+  public function havingExists(SelectQueryInterface $select) {
+    $this->having->exists($select);
+    return $this;
+  }
+  
+  public function havingNotExists(SelectQueryInterface $select) {
+    $this->having->notExists($select);
+    return $this;
+  }
+  
   public function forUpdate($set = TRUE) {
     if (isset($set)) {
       $this->forUpdate = $set;
diff --git modules/simpletest/tests/database_test.test modules/simpletest/tests/database_test.test
index 32742e0..5092b21 100644
--- modules/simpletest/tests/database_test.test
+++ modules/simpletest/tests/database_test.test
@@ -1684,6 +1684,61 @@ class DatabaseSelectSubqueryTestCase extends DatabaseTestCase {
 
     $this->assertEqual(count($people), 2, t('Returned the correct number of rows.'));
   }
+
+  /**
+   * Test EXISTS subquery conditionals on SELECT statements.
+   */
+  function testExistsSubquerySelect() {
+    // Put George into {test_people}.
+    db_insert('test_people')
+      ->fields(array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+      ))
+      ->execute();
+    // Base query to {test}.
+    $query = db_select('test', 't')
+      ->fields('t', array('name'));
+    // Subquery to {test_people}.
+    $subquery = db_select('test_people', 'tp')
+      ->fields('tp', array('name'))
+      ->condition('name', 'George');
+    $query->exists($subquery);
+    $result = $query->execute();
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertEqual($record->name, 'George', t('Fetched name is correct using EXISTS query.'));
+  }
+
+  /**
+   * Test NOT EXISTS subquery conditionals on SELECT statements.
+   */
+  function testNotExistsSubquerySelect() {
+    // Put George into {test_people}.
+    db_insert('test_people')
+      ->fields(array(
+        'name' => 'George',
+        'age' => 27,
+        'job' => 'Singer',
+      ))
+      ->execute();
+
+    // Base query to {test}.
+    $query = db_select('test', 't')
+      ->fields('t', array('name'));
+    // Subquery to {test_people}.
+    $subquery = db_select('test_people', 'tp')
+      ->fields('tp', array('name'))
+      ->condition('name', 'George');
+    $query->notExists($subquery);
+    $result = $query->execute();
+
+    // Ensure that we got the right record.
+    $record = $result->fetch();
+    $this->assertFalse($record, t('NOT EXISTS query returned no results.'));
+  }
 }
 
 /**
