!CHAPTER AQL Syntax !SUBSECTION Query types An AQL query must either return a result (indicated by usage of the *RETURN* keyword) or execute a data-modification operation (indicated by usage of one of the keywords *INSERT*, *UPDATE*, *REPLACE*, *REMOVE* or *UPSERT*). The AQL parser will return an error if it detects more than one data-modification operation in the same query or if it cannot figure out if the query is meant to be a data retrieval or a modification operation. AQL only allows *one* query in a single query string; thus semicolons to indicate the end of one query and separate multiple queries (as seen in SQL) are not allowed. !SUBSECTION Whitespace Whitespaces (blanks, carriage returns, line feeds, and tab stops) can be used in the query text to increase its readability. Tokens have to be separated by any number of whitespaces. Whitespace within strings or names must be enclosed in quotes in order to be preserved. !SUBSECTION Comments Comments can be embedded at any position in a query. The text contained in the comment is ignored by the AQL parser. Multi-line comments cannot be nested, which means subsequent comment starts within comments are ignored, comment ends will end the comment. AQL supports two types of comments: - Single line comments: These start with a double forward slash and end at the end of the line, or the end of the query string (whichever is first). - Multi line comments: These start with a forward slash and asterisk, and end with an asterisk and a following forward slash. They can span as many lines as necessary. /* this is a comment */ RETURN 1 /* these */ RETURN /* are */ 1 /* multiple */ + /* comments */ 1 /* this is a multi line comment */ // a single line comment !SUBSECTION Keywords On the top level, AQL offers the following operations: - `FOR`: array iteration - `RETURN`: results projection - `FILTER`: results filtering - `SORT`: result sorting - `LIMIT`: result slicing - `LET`: variable assignment - `COLLECT`: result grouping - `INSERT`: insertion of new documents - `UPDATE`: (partial) update of existing documents - `REPLACE`: replacement of existing documents - `REMOVE`: removal of existing documents - `UPSERT`: insertion or update of existing documents Each of the above operations can be initiated in a query by using a keyword of the same name. An AQL query can (and typically does) consist of multiple of the above operations. An example AQL query may look like this: FOR u IN users FILTER u.type == "newbie" && u.active == true RETURN u.name In this example query, the terms *FOR*, *FILTER*, and *RETURN* initiate the higher-level operation according to their name. These terms are also keywords, meaning that they have a special meaning in the language. For example, the query parser will use the keywords to find out which high-level operations to execute. That also means keywords can only be used at certain locations in a query. This also makes all keywords reserved words that must not be used for other purposes than they are intended for. For example, it is not possible to use a keyword as a collection or attribute name. If a collection or attribute need to have the same name as a keyword, the collection or attribute name needs to be quoted. Keywords are case-insensitive, meaning they can be specified in lower, upper, or mixed case in queries. In this documentation, all keywords are written in upper case to make them distinguishable from other query parts. There are a few more keywords in addition to the higher-level operation keywords. Additional keywords may be added in future versions of ArangoDB. The complete list of keywords is currently: