<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/delete.sgml,v 1.24 2005/04/08 00:59:58 neilc Exp $
PostgreSQL documentation
-->

<refentry id="SQL-DELETE">
 <refmeta>
  <refentrytitle id="SQL-DELETE-TITLE">DELETE</refentrytitle>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>

 <refnamediv>
  <refname>DELETE</refname>
  <refpurpose>delete rows of a table</refpurpose>
 </refnamediv>

 <indexterm zone="sql-delete">
  <primary>DELETE</primary>
 </indexterm>

 <refsynopsisdiv>
<synopsis>
DELETE FROM [ ONLY ] <replaceable class="PARAMETER">table</replaceable>
    [ USING <replaceable class="PARAMETER">usinglist</replaceable> ]
    [ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   <command>DELETE</command> deletes rows that satisfy the
   <literal>WHERE</literal> clause from the specified table.  If the
   <literal>WHERE</literal> clause is absent, the effect is to delete
   all rows in the table.  The result is a valid, but empty table.
  </para>

   <tip>
    <para>
     <xref linkend="sql-truncate" endterm="sql-truncate-title"> is a
     <productname>PostgreSQL</productname> extension that provides a
     faster mechanism to remove all rows from a table.
    </para>
   </tip>

  <para>
   By default, <command>DELETE</command> will delete rows in the
   specified table and all its subtables. If you wish to delete only
   from the specific table mentioned, you must use the
   <literal>ONLY</literal> clause.
  </para>

  <para>
   There are two ways to delete rows in a table using information
   contained in other tables in the database: using sub-selects, or
   specifying additional tables in the <literal>USING</literal> clause.
   Which technique is more appropriate depends on the specific
   circumstances.
  </para>

  <para>
   You must have the <literal>DELETE</literal> privilege on the table
   to delete from it, as well as the <literal>SELECT</literal>
   privilege for any table in the <literal>USING</literal> clause or
   whose values are read in the <replaceable
   class="parameter">condition</replaceable>.
  </para>
 </refsect1>

 <refsect1>
  <title>Parameters</title>

  <variablelist>
   <varlistentry>
    <term><replaceable class="parameter">table</replaceable></term>
    <listitem>
     <para>
      The name (optionally schema-qualified) of an existing table.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="PARAMETER">usinglist</replaceable></term>
    <listitem>
     <para>
      A list of table expressions, allowing columns from other tables
      to appear in the <literal>WHERE</> condition.  This is similar
      to the list of tables that can be specified in the <xref
      linkend="sql-from" endterm="sql-from-title"> of a
      <command>SELECT</command> statement; for example, an alias for
      the table name can be specified.
     </para>
    </listitem>
   </varlistentry>

   <varlistentry>
    <term><replaceable class="parameter">condition</replaceable></term>
    <listitem>
     <para>
      A value expression that returns a value of type
      <type>boolean</type> that determines the rows which are to be
      deleted.
     </para>
    </listitem>
   </varlistentry>
  </variablelist>
 </refsect1>

 <refsect1>
  <title>Outputs</title>

  <para>
   On successful completion, a <command>DELETE</> command returns a command
   tag of the form
<screen>
DELETE <replaceable class="parameter">count</replaceable>
</screen>
   The <replaceable class="parameter">count</replaceable> is the number
   of rows deleted.  If <replaceable class="parameter">count</replaceable> is
   0, no rows matched the <replaceable
   class="parameter">condition</replaceable> (this is not considered
   an error).
  </para>
 </refsect1>

 <refsect1>
  <title>Notes</title>

  <para>
   <productname>PostgreSQL</productname> lets you reference columns of
   other tables in the <literal>WHERE</> condition by specifying the
   other tables in the <literal>USING</literal> clause.  For example,
   to delete all films produced by a given producer, one might do
<programlisting>
DELETE FROM films USING producers
  WHERE producer_id = producers.id AND producers.name = 'foo';
</programlisting>
   What is essentially happening here is a join between <structname>films</>
   and <structname>producers</>, with all successfully joined
   <structname>films</> rows being marked for deletion.
   This syntax is not standard.  A more standard way to do it is
<programlisting>
DELETE FROM films
  WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
</programlisting>
   In some cases the join style is easier to write or faster to
   execute than the sub-select style.
  </para>
 </refsect1>

 <refsect1>
  <title>Examples</title>

  <para>
   Delete all films but musicals:
<programlisting>
DELETE FROM films WHERE kind &lt;&gt; 'Musical';
</programlisting>
  </para>

  <para>
   Clear the table <literal>films</literal>:
<programlisting>
DELETE FROM films;
</programlisting>      
  </para>
 </refsect1>

 <refsect1>
  <title>Compatibility</title>

  <para>
   This command conforms to the SQL standard, except that the
   <literal>USING</> clause and the ability to reference other tables
   in the <literal>WHERE</> clause are <productname>PostgreSQL</>
   extensions.
  </para>
 </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
