SQLite 3 Manual
$Date$
$Revision$
Preface
Distinctive Features
This page highlights some of the characteristics of SQLite that
are unusual and which make SQLite different from many other SQL database
engines.
Zero-Configuration
SQLite does not need to be "installed" before it is used.
There is no "setup" procedure. There is no server process that needs
to be started, stopped, or configured. There is no need for an
administrator to create a new database instance or assign access
permissions to users. SQLite uses no configuration files. Nothing
needs to be done to tell the system that SQLite is running. No
actions are required to recover after a system crash or power
failure. There is nothing to troubleshoot.
SQLite just works.
Other more familiar database engines run great once you get
them going. But doing the initial installation and configuration can
be intimidatingly complex.
Serverless
Most SQL database engines are implemented as a separate server
process. Programs that want to access the database communicate with
the server using some kind of interprocess communcation (typically
TCP/IP) to send requests to the server and to receive back results.
SQLite does not work this way. With SQLite, the process that wants
to access the database reads and writes directly from the database
files on disk. There is no intermediary server process.
There are advantages and disadvantages to being serverless.
The main advantage is that there is no separate server process to
install, setup, configure, initialize, manage, and troubleshoot.
This is one reason why SQLite is a "zero-configuration" database
engine. Programs that use SQLite require no administrative support
for setting up the database engine before they are run. Any program
that is able to access the disk is able to use an SQLite
database.
On the other hand, a database engine that uses a server can
provide better protection from bugs in the client application -
stray pointers in a client cannot corrupt memory on the server. And
because a server is a single persistent process, it is able control
database access with more precision, allowing for finer grain
locking and better concurrancy.
Most SQL database engines are client/server based. Of those
that are serverless, SQLite is the only one that this author knows
of that allows multiple applications to access the same database at
the same time.
Single Database File
An SQLite database is a single ordinary disk file that can be
located anywhere in the directory hierarchy. If SQLite can read the
disk file then it can read anything in the database. If the disk
file and its directory are writable, then SQLite can change anything
in the database. Database files can easily be copied onto a USB
memory stick or emailed for sharing.
Other SQL database engines tend to store data as a large
collection of files. Often these files are in a standard location
that only the database engine itself can access. This makes the data
more secure, but also makes it harder to access. Some SQL database
engines provide the option of writing directly to disk and bypassing
the filesystem all together. This provides added performance, but at
the cost of considerable setup and maintenance complexity.
Compact
When optimized for size, the whole SQLite library with
everything enabled is less than 225KiB in size (as measured on an
ix86 using the "size" utility from the GNU compiler suite.) Unneeded
features can be disabled at compile-time to further reduce the size
of the library to under 170KiB if desired.
Most other SQL database engines are much larger than this. IBM
boasts that it's recently released CloudScape database engine is
"only" a 2MiB jar file - 10 times larger than SQLite even after it
is compressed! Firebird boasts that it's client-side library is only
350KiB. That's 50% larger than SQLite and does not even contain the
database engine. The Berkeley DB library from Sleepycat is 450KiB
and it omits SQL support, providing the programmer with only simple
key/value pairs.
Manifest typing
Most SQL database engines use static typing. A datatype is
associated with each column in a table and only values of that
particular datatype are allowed to be stored in that column. SQLite
relaxes this restriction by using manifest typing. In manifest
typing, the datatype is a property of the value itself, not of the
column in which the value is stored. SQLite thus allows the user to
store any value of any datatype into any column regardless of the
declared type of that column. (There are some exceptions to this
rule: An INTEGER PRIMARY KEY column may only store integers. And
SQLite attempts to coerce values into the declared datatype of the
column when it can.)
As far as we can tell, the SQL language specification allows
the use of manifest typing. Nevertheless, most other SQL database
engines are statically typed and so some people feel that the use of
manifest typing is a bug in SQLite. But the authors of SQLite feel
very strongly that this is a feature. The use of manifest typing in
SQLite is a deliberate design decision which has proven in practice
to make SQLite more reliable and easier to use, especially when used
in combination with dynamically typed programming languages such as
Tcl and Python.
Variable-length records
Most other SQL database engines allocated a fixed amount of
disk space for each row in most tables. They play special tricks for
handling BLOBs and CLOBs which can be of wildly varying length. But
for most tables, if you declare a column to be a VARCHAR(100) then
the database engine will allocate 100 bytes of disk space regardless
of how much information you actually store in that column.
SQLite, in contrast, use only the amount of disk space
actually needed to store the information in a row. If you store a
single character in a VARCHAR(100) column, then only a single byte
of disk space is consumed. (Actually two bytes - there is some
overhead at the beginning of each column to record its datatype and
length.)
The use of variable-length records by SQLite has a number of
advantages. It results in smaller database files, obviously. It also
makes the database run faster, since there is less information to
move to and from disk. And, the use of variable-length records makes
it possible for SQLite to employ manifest typing instead of static
typing.
Readable source code
The source code to SQLite is designed to be readable and
accessible to the average programmer. All procedures and data
structures and many automatic variables are carefully commented with
useful information about what they do. Boilerplate commenting is
omitted.
SQL statements compile into virtual machine code
Every SQL database engine compiles each SQL statement into
some kind of internal data structure which is then used to carry out
the work of the statement. But in most SQL engines that internal
data structure is a complex web of interlinked structures and
objects. In SQLite, the compiled form of statements is a short
program in a machine-language like representation. Users of the
database can view this virtual machine language by prepending the
EXPLAIN keyword to a query.
The use of a virtual machine in SQLite has been a great
benefit to library's development. The virtual machine provides a
crisp, well-defined junction between the front-end of SQLite (the
part that parses SQL statements and generates virtual machine code)
and the back-end (the part that executes the virtual machine code
and computes a result.) The virtual machine allows the developers to
see clearly and in an easily readable form what SQLite is trying to
do with each statement it compiles, which is a tremendous help in
debugging. Depending on how it is compiled, SQLite also has the
capability of tracing the execution of the virtual machine -
printing each virtual machine instruction and its result as it
executes.
Public domain
The source code for SQLite is in the public domain. No claim
of copyright is made on any part of the core source code. (The
documentation and test code is a different matter - some sections of
documentation and test logic are governed by open-sources licenses.)
All contributors to the SQLite core software have signed affidavits
specifically disavowing any copyright interest in the code. This
means that anybody is able to legally do anything they want with the
SQLite source code.
There are other SQL database engines with liberal licenses
that allow the code to be broadly and freely used. But those other
engines are still governed by copyright law. SQLite is different in
that copyright law simply does not apply.
The source code files for other SQL database engines typically
begin with a comment describing your license rights to view and copy
that file. The SQLite source code contains no license since it is
not governed by copyright. Instead of a license, the SQLite source
code offers a blessing:
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
SQL language extensions
SQLite provides a number of enhancements to the SQL language
not normally found in other database engines. The EXPLAIN keyword
and manifest typing have already been mentioned above. SQLite also
provides statements such as REPLACE and the ON CONFLICT clause that
allow for added control over the resolution of constraint conflicts.
SQLite supports ATTACH and DETACH commands that allow multiple
independent databases to be used together in the same query. And
SQLite defines APIs that allows the user to add new SQL functions
and collating sequences.
Appropriate Uses For SQLite
SQLite is different from most other SQL database engines in that
its primary design goal is to be simple:
Simple to administer
Simple to operate
Simple to embed in a larger program
Simple to maintain and customize
Many people like SQLite because it is small and fast. But those
qualities are just happy accidents. Users also find that SQLite is very
reliable. Reliability is a consequence of simplicity. With less
complication, there is less to go wrong. So, yes, SQLite is small, fast,
and reliable, but first and foremost, SQLite strives to be
simple.
Simplicity in a database engine can be either a strength or a
weakness, depending on what you are trying to do. In order to achieve
simplicity, SQLite has had to sacrifice other characteristics that some
people find useful, such as high concurrency, fine-grained access
control, a rich set of built-in functions, stored procedures, esoteric
SQL language features, XML and/or Java extensions, tera- or peta-byte
scalability, and so forth. If you need some of these features and do not
mind the added complexity that they bring, then SQLite is probably not
the database for you. SQLite is not intended to be an enterprise
database engine. It not designed to compete with Oracle or
PostgreSQL.
The basic rule of thumb for when it is appropriate to use SQLite
is this: Use SQLite in situations where simplicity of administration,
implementation, and maintenance are more important than the countless
complex features that enterprise database engines provide. As it turns
out, situations where simplicity is the better choice are more common
than many people realize.
Situations Where SQLite Works Well
Websites
SQLite usually will work great as the database engine for
low to medium traffic websites (which is to say, 99.9% of all
websites). The amount of web traffic that SQLite can handle
depends, of course, on how heavily the website uses its database.
Generally speaking, any site that gets fewer than a 100000
hits/day should work fine with SQLite. The 100000 hits/day figure
is a conservative estimate, not a hard upper bound. SQLite has
been demonstrated to work with 10 times that amount of
traffic.
Embedded devices and applications
Because an SQLite database requires little or no
administration, SQLite is a good choice for devices or services
that must work unattended and without human support. SQLite is a
good fit for use in cellphones, PDAs, set-top boxes, and/or
appliances. It also works well as an embedded database in
downloadable consumer applications.
Application File Format
SQLite has been used with great success as the on-disk file
format for desktop applications such as financial analysis tools,
CAD packages, record keeping programs, and so forth. The
traditional File/Open operation does an sqlite3_open() and
executes a BEGIN TRANSACTION to get exclusive access to the
content. File/Save does a COMMIT followed by another BEGIN
TRANSACTION. The use of transactions guarantees that updates to
the application file are atomic, durable, isolated, and
consistent.
Temporary triggers can be added to the database to record
all changes into a (temporary) undo/redo log table. These changes
can then be played back when the user presses the Undo and Redo
buttons. Using this technique, a unlimited depth undo/redo
implementation can be written in surprising little code.
Replacement for ad hoc disk files
Many programs use fopen(), fread(), and fwrite() to create
and manage files of data in home-grown formats. SQLite works
particularly well as a replacement for these ad hoc data
files.
Internal or temporary databases
For programs that have a lot of data that must be sifted and
sorted in diverse ways, it is often easier and quicker to load the
data into an in-memory SQLite database and use queries with joins
and ORDER BY clauses to extract the data in the form and order
needed rather than to try to code the same operations manually.
Using an SQL database internally in this way also gives the
program greater flexibility since new columns and indices can be
added without having to recode every query.
Command-line dataset analysis tool
Experienced SQL users can employ the command-line sqlite
program to analyze miscellaneous datasets. Raw data can be
imported from CSV files, then that data can be sliced and diced to
generate a myriad of summary reports. Possible uses include
website log analysis, sports statistics analysis, compilation of
programming metrics, and analysis of experimental results.
You can also do the same thing with a enterprise
client/server database, of course. The advantages to using SQLite
in this situation are that SQLite is much easier to set up and the
resulting database is a single file that you can store on a floppy
disk or flash-memory stick or email to a colleague.
Stand-in for an enterprise database during demos or
testing
If you are writing a client application for an enterprise
database engine, it makes sense to use a generic database backend
that allows you to connect to many different kinds of SQL database
engines. It makes even better sense to go ahead and include SQLite
in the mix of supported database and to statically link the SQLite
engine in with the client. That way the client program can be used
standalone with an SQLite data file for testing or for
demonstrations.
Database Pedagogy
Because it is simple to setup and use (installation is
trivial: just copy the sqlite or sqlite.exe executable to the
target machine and run it) SQLite makes a good database engine for
use in teaching SQL. Students can easily create as many databases
as they like and can email databases to the instructor for
comments or grading. For more advanced students who are interested
in studying how an RDBMS is implemented, the modular and
well-commented and documented SQLite code can serve as a good
basis. This is not to say that SQLite is an accurate model of how
other database engines are implemented, but rather a student who
understands how SQLite works can more quickly comprehend the
operational principles of other systems.
Experimental SQL language extensions
The simple, modular design of SQLite makes it a good
platform for prototyping new, experimental database language
features or ideas.
Situations Where Another RDBMS May Work Better
Client/Server Applications
If you have many client programs accessing a common database
over a network, you should consider using a client/server database
engine instead of SQLite. SQLite will work over a network
filesystem, but because of the latency associated with most
network filesystems, performance will not be great. Also, the file
locking logic of many network filesystems implementation contains
bugs (on both Unix and windows). If file locking does not work
like it should, it might be possible for two or more client
programs to modify the same part of the same database at the same
time, resulting in database corruption. Because this problem
results from bugs in the underlying filesystem implementation,
there is nothing SQLite can do to prevent it.
A good rule of thumb is that you should avoid using SQLite
in situations where the same database will be accessed
simultaneously from many computers over a network
filesystem.
High-volume Websites
SQLite will normally work fine as the database backend to a
website. But if you website is so busy that your are thinking of
splitting the database component off onto a separate machine, then
you should definitely consider using an enterprise-class
client/server database engine instead of SQLite.
Very large datasets
When you start a transaction in SQLite (which happens
automatically before any write operation that is not within an
explicit BEGIN...COMMIT) the engine has to allocate a bitmap of
dirty pages in the disk file to help it manage its rollback
journal. SQLite needs 256 bytes of RAM for every 1MiB of database
(assuming a 1024-byte page size: less memory is used with larger
page sizes, of course). For smaller databases, the amount of
memory required is not a problem, but when database begin to grow
into the multi-gigabyte range, the size of the bitmap can get
quite large. If you need to store and modify more than a few dozen
GB of data, you should consider using a different database
engine.
High Concurrency
SQLite uses reader/writer locks on the entire database file.
That means if any process is reading from any part of the
database, all other processes are prevented from writing any other
part of the database. Similarly, if any one process is writing to
the database, all other processes are prevented from reading any
other part of the database. For many situations, this is not a
problem. Each application does its database work quickly and moves
on, and no lock lasts for more than a few dozen milliseconds. But
there are some applications that require more concurrency, and
those applications may need to seek a different solution.
Getting Started
-
Installation and Configuration
Compiling From the Source
-
Features
-
File Locking And Concurrency
-
SQL Reference
[basic SQL knowledge required]
Data Definition
ALTER TABLE
sql-statement ::= ALTER TABLE [database-name .] table-name alteration
alteration ::= RENAME TO new-table-name
alteration ::= ADD [COLUMN] column-def
SQLite's version of the ALTER TABLE command allows the user to
rename or add a new column to an existing table. It is not possible to
remove a column from a table.
The RENAME TO syntax is used to rename the table identified by
[database-name.]table-name to new-table-name. This command cannot be
used to move a table between attached databases, only to rename a
table within the same database.
If the table being renamed has triggers or indices, then these
remain attached to the table after it has been renamed. However, if
there are any view definitions, or statements executed by triggers
that refer to the table being renamed, these are not automatically
modified to use the new table name. If this is required, the triggers
or view definitions must be dropped and recreated to use the new table
name by hand.
The ADD [COLUMN] syntax is used to add a new column to an
existing table. The new column is always appended to the end of the
list of existing columns. Column-def may take any of the forms
permissable in a CREATE TABLE statement, with the following
restrictions:
The column may not have a PRIMARY KEY or UNIQUE
constraint.
The column may not have a default value of CURRENT_TIME,
CURRENT_DATE or CURRENT_TIMESTAMP.
If a NOT NULL constraint is specified, then the column
must have a default value other than NULL.
The execution time of the ALTER TABLE command is independent of
the amount of data in the table. The ALTER TABLE command runs as
quickly on a table with 10 million rows as it does on a table with 1
row.
After ADD COLUMN has been run on a database, that database will
not be readable by SQLite version 3.1.3 and earlier until the database
is VACUUMed.
Example
ALTER TABLE cust_addr RENAME TO customer_address;
ALTER TABLE customer ADD COLUMN phone2 text;
CREATE INDEX
sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name
ON table-name ( column-name [, column-name]* )
column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]
The CREATE INDEX command consists of the keywords "CREATE INDEX"
followed by the name of the new index, the keyword "ON", the name of a
previously created table that is to be indexed, and a parenthesized
list of names of columns in the table that are used for the index key.
Each column name can be followed by one of the "ASC" or "DESC"
keywords to indicate sort order, but the sort order is ignored in the
current implementation. Sorting is always done in ascending
order.
The COLLATE clause following each column name defines a
collating sequence used for text entires in that column. The default
collating sequence is the collating sequence defined for that column
in the CREATE TABLE statement. Or if no collating sequence is
otherwise defined, the built-in BINARY collating sequence is
used.
There are no arbitrary limits on the number of indices that can
be attached to a single table, nor on the number of columns in an
index.
If the UNIQUE keyword appears between CREATE and INDEX then
duplicate index entries are not allowed. Any attempt to insert a
duplicate entry will result in an error.
The exact text of each CREATE INDEX statement is stored in the
sqlite_master or sqlite_temp_master table, depending on whether the
table being indexed is temporary. Every time the database is opened,
all CREATE INDEX statements are read from the sqlite_master table and
used to regenerate SQLite's internal representation of the index
layout.
If the optional IF NOT EXISTS clause is present and another
index with the same name aleady exists, then this command becomes a
no-op.
Indexes are removed with the DROP INDEX command.
CREATE TABLE
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name .] table-name (
column-def [, column-def]*
[, constraint]*
)
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
type ::= typename |
typename ( number ) |
typename ( number , number )
column-constraint ::= NOT NULL [ conflict-clause ] |
PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |
UNIQUE [ conflict-clause ] |
CHECK ( expr ) |
DEFAULT value |
COLLATE collation-name
constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |
UNIQUE ( column-list ) [ conflict-clause ] |
CHECK ( expr )
conflict-clause ::= ON CONFLICT conflict-algorithm
A CREATE TABLE statement is basically the keywords "CREATE
TABLE" followed by the name of a new table and a parenthesized list of
column definitions and constraints. The table name can be either an
identifier or a string. Tables names that begin with "sqlite_" are
reserved for use by the engine.
Each column definition is the name of the column followed by the
datatype for that column, then one or more optional column
constraints. The datatype for the column does not restrict what data
may be put in that column. See Datatypes In SQLite Version 3 for
additional information. The UNIQUE constraint causes an index to be
created on the specified columns. This index must contain unique keys.
The COLLATE clause specifies what text collating function to use when
comparing text entries for the column. The built-in BINARY collating
function is used by default.
The DEFAULT constraint specifies a default value to use when
doing an INSERT. The value may be NULL, a string constant or a number.
Starting with version 3.1.0, the default value may also be one of the
special case-independant keywords CURRENT_TIME, CURRENT_DATE or
CURRENT_TIMESTAMP. If the value is NULL, a string constant or number,
it is literally inserted into the column whenever an INSERT statement
that does not specify a value for the column is executed. If the value
is CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP, then the current
UTC date and/or time is inserted into the columns. For CURRENT_TIME,
the format is HH:MM:SS. For CURRENT_DATE, YYYY-MM-DD. The format for
CURRENT_TIMESTAMP is "YYYY-MM-DD HH:MM:SS".
Specifying a PRIMARY KEY normally just creates a UNIQUE index on
the corresponding columns. However, if primary key is on a single
column that has datatype INTEGER, then that column is used internally
as the actual key of the B-Tree for the table. This means that the
column may only hold unique integer values. (Except for this one case,
SQLite ignores the datatype specification of columns and allows any
kind of data to be put in a column regardless of its declared
datatype.) If a table does not have an INTEGER PRIMARY KEY column,
then the B-Tree key will be a automatically generated integer. The
B-Tree key for a row can always be accessed using one of the special
names "ROWID", "OID", or "_ROWID_". This is true regardless of whether
or not there is an INTEGER PRIMARY KEY. An INTEGER PRIMARY KEY column
can also include the keyword AUTOINCREMENT. The AUTOINCREMENT keyword
modified the way that B-Tree keys are automatically generated.
Additional detail on automatic B-Tree key generation is available
separately.
According to the SQL standard, PRIMARY KEY should imply NOT
NULL. Unfortunately, due to a long-standing coding oversight, this is
not the case in SQLite. SQLite allows NULL values in a PRIMARY KEY
column. We could change SQLite to conform to the standard (and we
might do so in the future), but by the time the oversight was
discovered, SQLite was in such wide use that we feared breaking legacy
code if we fixed the problem. So for now we have chosen to contain
allowing NULLs in PRIMARY KEY columns. Developers should be aware,
however, that we may change SQLite to conform to the SQL standard in
future and should design new programs accordingly.
If the "TEMP" or "TEMPORARY" keyword occurs in between "CREATE"
and "TABLE" then the table that is created is only visible within that
same database connection and is automatically deleted when the
database connection is closed. Any indices created on a temporary
table are also temporary. Temporary tables and indices are stored in a
separate file distinct from the main database file.
If a <database-name> is specified, then the table is
created in the named database. It is an error to specify both a
<database-name> and the TEMP keyword, unless the
<database-name> is "temp". If no database name is specified, and
the TEMP keyword is not present, the table is created in the main
database.
The optional conflict-clause following each constraint allows
the specification of an alternative default constraint conflict
resolution algorithm for that constraint. The default is abort ABORT.
Different constraints within the same table may have different default
conflict resolution algorithms. If an COPY, INSERT, or UPDATE command
specifies a different conflict resolution algorithm, then that
algorithm is used in place of the default algorithm specified in the
CREATE TABLE statement. See the section titled ON CONFLICT for
additional information.
CHECK constraints are supported as of version 3.3.0. Prior to
version 3.3.0, CHECK constraints were parsed but not enforced.
There are no arbitrary limits on the number of columns or on the
number of constraints in a table. The total amount of data in a single
row is limited to about 1 megabytes in version 2.8. In version 3.0
there is no arbitrary limit on the amount of data in a row.
The CREATE TABLE AS form defines the table to be the result set
of a query. The names of the table columns are the names of the
columns in the result.
The exact text of each CREATE TABLE statement is stored in the
sqlite_master table. Every time the database is opened, all CREATE
TABLE statements are read from the sqlite_master table and used to
regenerate SQLite's internal representation of the table layout. If
the original command was a CREATE TABLE AS then then an equivalent
CREATE TABLE statement is synthesized and store in sqlite_master in
place of the original command. The text of CREATE TEMPORARY TABLE
statements are stored in the sqlite_temp_master table.
If the optional IF NOT EXISTS clause is present and another
table with the same name aleady exists, then this command becomes a
no-op.
Tables are removed using the DROP TABLE statement.
CREATE VIEW
sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement
The CREATE VIEW command assigns a name to a pre-packaged SELECT
statement. Once the view is created, it can be used in the FROM clause
of another SELECT in place of a table name.
If the "TEMP" or "TEMPORARY" keyword occurs in between "CREATE"
and "VIEW" then the view that is created is only visible to the
process that opened the database and is automatically deleted when the
database is closed.
If a <database-name> is specified, then the view is
created in the named database. It is an error to specify both a
<database-name> and the TEMP keyword, unless the
<database-name> is "temp". If no database name is specified, and
the TEMP keyword is not present, the table is created in the main
database.
You cannot COPY, DELETE, INSERT or UPDATE a view. Views are
read-only in SQLite. However, in many cases you can use a TRIGGER on
the view to accomplish the same thing. Views are removed with the DROP
VIEW command.
CREATE VIRTUAL TABLE
sql-command ::= CREATE VIRTUAL TABLE [database-name.] table-name USING module-name [( arguments )]
A virtual table is an interface to an external storage or
computation engine that appears to be a table but does not actually
store information in the database file.
In general, you can do anything with a virtual table that can be
done with an ordinary table, except that you cannot create triggers on
a virtual table. Some virtual table implementations might impose
additional restrictions. For example, many virtual tables are
read-only.
The <module-name> is the name of an object that implements
the virtual table. The <module-name> must be registered with the
SQLite database connection using sqlite3_create_module prior to
issuing the CREATE VIRTUAL TABLE statement. The module takes zero or
more comma-separated arguments. The arguments can be just about any
text as long as it has balanced parentheses. The argument syntax is
sufficiently general that the arguments can be made to appear as
column definitions in a traditional CREATE TABLE statement. SQLite
passes the module arguments directly to the module without any
interpretation. It is the responsibility of the module implementation
to parse and interpret its own arguments.
A virtual table is destroyed using the ordinary DROP TABLE
statement. There is no DROP VIRTUAL TABLE statement.
Data Manipulation and Querying
Functions and Operators
Core Functions
The core functions shown below are available by default.
Additional functions may be written in C and added to the database
engine using the sqlite3_create_function()
API.
Core Functions
abs(X)
Return the absolute value of argument
X.
coalesce(X,Y,...)
Return a copy of the first non-NULL argument. If
all arguments are NULL then NULL is returned. There must be at
least 2 arguments.
glob(X,Y)
This function is used to implement the "X GLOB Y"
syntax of SQLite. The sqlite3_create_function() interface can
be used to override this function and thereby change the
operation of the GLOB operator.
ifnull(X,Y)
Return a copy of the first non-NULL argument. If
both arguments are NULL then NULL is returned. This behaves
the same as coalesce() above.
hex(X)
The argument is interpreted as a BLOB. The result
is a hexadecimal rendering of the content of that
blob.
last_insert_rowid()
Return the ROWID of the last row insert from this
connection to the database. This is the same value that would
be returned from the sqlite_last_insert_rowid() API
function.
length(X)
Return the string length of X in characters. If
SQLite is configured to support UTF-8, then the number of
UTF-8 characters is returned, not the number of
bytes.
like(X,Y),
like(X,Y,Z)
This function is used to implement the "X LIKE Y
[ESCAPE Z]" syntax of SQL. If the optional ESCAPE clause is
present, then the user-function is invoked with three
arguments. Otherwise, it is invoked with two arguments only.
The sqlite_create_function() interface can be used to override
this function and thereby change the operation of the LIKE
operator. When doing this, it may be important to override
both the two and three argument versions of the like()
function. Otherwise, different code may be called to implement
the LIKE operator depending on whether or not an ESCAPE clause
was specified.
load_extension(X),
load_extension(X,Y)
Load SQLite extensions out of the shared library
file named X using the entry point Y. The result is a NULL. If
Y is omitted then the default entry point of
sqlite3_extension_init is used. This function raises an
exception if the extension fails to load or initialize
correctly.
lower(X)
Return a copy of string X will all characters
converted to lower case. The C library tolower() routine is
used for the conversion, which means that this function might
not work correctly on UTF-8 characters.
ltrim(X),
ltrim(X,Y)
Return a string formed by removing any and all
characters that appear in Y from the left side of X. If the Y
argument is omitted, spaces are removed.
max(X,Y,...)
Return the argument with the maximum value.
Arguments may be strings in addition to numbers. The maximum
value is determined by the usual sort order. Note that max()
is a simple function when it has 2 or more arguments but
converts to an aggregate function if given only a single
argument.
min(X,Y,...)
Return the argument with the minimum value.
Arguments may be strings in addition to numbers. The minimum
value is determined by the usual sort order. Note that min()
is a simple function when it has 2 or more arguments but
converts to an aggregate function if given only a single
argument.
nullif(X,Y)
Return the first argument if the arguments are
different, otherwise return NULL.
quote(X)
This routine returns a string which is the value
of its argument suitable for inclusion into another SQL
statement. Strings are surrounded by single-quotes with
escapes on interior quotes as needed. BLOBs are encoded as
hexadecimal literals. The current implementation of VACUUM
uses this function. The function is also useful when writing
triggers to implement undo/redo functionality.
random(*)
Return a pseudo-random integer between
-9223372036854775808 and +9223372036854775807.
replace(X,Y,Z)
Return a string formed by substituting string Z
for every occurrance of string Y in string X. The BINARY
collating sequence is used for comparisons.
randomblob(N)
Return a N-byte blob containing pseudo-random
bytes. N should be a postive integer.
round(X),
round(X,Y)
Round off the number X to Y digits to the right
of the decimal point. If the Y argument is omitted, 0 is
assumed.
rtrim(X),
rtrim(X,Y)
Return a string formed by removing any and all
characters that appear in Y from the right side of X. If the Y
argument is omitted, spaces are removed.
soundex(X)
Compute the soundex encoding of the string X. The
string "?000" is returned if the argument is NULL. This
function is omitted from SQLite by default. It is only
available the -DSQLITE_SOUNDEX=1 compiler option is used when
SQLite is built.
sqlite_version(*)
Return the version string for the SQLite library
that is running. Example: "2.8.0"
substr(X,Y,Z)
Return a substring of input string X that begins
with the Y-th character and which is Z characters long. The
left-most character of X is number 1. If Y is negative the the
first character of the substring is found by counting from the
right rather than the left. If X is string then characters
indices refer to actual UTF-8 characters. If X is a BLOB then
the indices refer to bytes.
trim(X),
trim(X,Y)
Return a string formed by removing any and all
characters that appear in Y from both ends of X. If the Y
argument is omitted, spaces are removed.
typeof(X)
Return the type of the expression X. The only
return values are "null", "integer", "real", "text", and
"blob". SQLite's type handling is explained in Datatypes in
SQLite Version 3.
upper(X)
Return a copy of input string X converted to all
upper-case letters. The implementation of this function uses
the C library routine toupper() which means it may not work
correctly on UTF-8 strings.
zeroblob(N)
Return a BLOB consisting of N bytes of 0x00.
SQLite manages these zeroblobs very efficiently. Zeroblobs can
be used to reserve space for a BLOB that is later written
using incremental BLOB I/O.
Aggregate Functions
The aggregate functions shown below are available by default.
Additional aggregate functions written in C may be added using the
sqlite3_create_function() API.
In any aggregate function that takes a single argument, that
argument can be preceeded by the keyword DISTINCT. In such cases,
duplicate elements are filtered before being passed into the aggregate
function. For example, the function "count(distinct X)" will return
the number of distinct values of column X instead of the total number
of non-null values in column X.
Aggregate Functions
avg(X)
Return the average value of all non-NULL X within
a group. String and BLOB values that do not look like numbers
are interpreted as 0. The result of avg()
is always a floating point value even if all inputs are
integers.
count(X),
count(*)
The first form return a count of the number of
times that X is not NULL in a group. The second form (with no
argument) returns the total number of rows in the
group.
max(X)
Return the maximum value of all values in the
group. The usual sort order is used to determine the
maximum.
min(X)
Return the minimum non-NULL value of all values
in the group. The usual sort order is used to determine the
minimum. NULL is only returned if all values in the group are
NULL.
sum(X),
total(X)
Return the numeric sum of all non-NULL values in
the group. If there are no non-NULL input rows then
sum() returns NULL but
total() returns 0.0. NULL is not normally
a helpful result for the sum of no rows but the SQL standard
requires it and most other SQL database engines implement
sum() that way so SQLite does it in the same way in order to
be compatible. The non-standard total()
function is provided as a convenient way to work around this
design problem in the SQL language.The result of
total() is always a floating point value.
The result of sum() is an integer value
if all non-NULL inputs are integers. If any input to sum() is
neither an integer or a NULL then sum()
returns a floating point value which might be an approximation
to the true sum.Sum() will
throw an integer overflow exception if all inputs are integers
or NULL and an integer overflow occurs at any point during the
computation. Total() never throws an
exception.
Command-line Utility Reference
Usage:
sqlite3
OPTIONS
FILENAME
SQL/COMMAND
FILENAME is the name of an SQLite database. A new database is
created if the file does not previously exist.
OPTIONS include:
-init
filename read/process named file
-echo
print commands before execution
-[no]header
turn headers on or off
-bail
stop after hitting an error
-interactive
force interactive I/O
-batch
force batch I/O
-column
set output mode to 'column'
-csv
set output mode to 'csv'
-html
set output mode to HTML
-line
set output mode to 'line'
-list
set output mode to 'list'
-separator 'x
set output field separator (|)
-nullvalue 'text'
set text string for NULL values
-version
show SQLite version