mirror of https://gitee.com/bigwinds/arangodb
137 lines
3.5 KiB
Markdown
137 lines
3.5 KiB
Markdown
Coming from SQL
|
|
===============
|
|
|
|
If you worked with a relational database management system (RDBMS) such as MySQL,
|
|
MariaDB or PostgreSQL, you will be familiar with its query language, a dialect
|
|
of SQL (Structured Query Language).
|
|
|
|
ArangoDB's query language is called AQL. There are some similarities between both
|
|
languages despite the different data models of the database systems. The most
|
|
notable difference is probably the concept of loops in AQL, which makes it feel
|
|
more like a programming language. It suits the schema-less model more natural
|
|
and makes the query language very powerful while remaining easy to read and write.
|
|
|
|
To get started with AQL, have a look at our detailed
|
|
[comparison of SQL and AQL](https://arangodb.com/why-arangodb/sql-aql-comparison/).
|
|
It will also help you to translate SQL queries to AQL when migrating to ArangoDB.
|
|
|
|
Basic queries
|
|
-------------
|
|
|
|
**How do select lists translate to AQL queries?**
|
|
|
|
In traditional SQL you may either fetch all columns of a table row by row, using
|
|
`SELECT * FROM table`, or select a subset of the columns. The list of table
|
|
columns to fetch is commonly called *select list*:
|
|
|
|
```sql
|
|
SELECT columnA, columnB, columnZ FROM table
|
|
```
|
|
|
|
Since documents aren't two-dimensional, and neither do you want to be limited to
|
|
returning two-dimensional lists, the requirements for a query language are higher.
|
|
AQL is thus a little bit more complex than plain SQL at first, but offers much
|
|
more flexibility in the long run. It lets you handle arbitrarily structured
|
|
documents in convenient ways, mostly leaned on the syntax used in JavaScript.
|
|
|
|
**Composing the documents to be returned**
|
|
|
|
The AQL `RETURN` statement returns one item per document it is handed. You can
|
|
return the whole document, or just parts of it. Given that *oneDocument* is
|
|
a document (retrieved like `LET oneDocument = DOCUMENT("myusers/3456789")`
|
|
for instance), it can be returned as-is like this:
|
|
|
|
```js
|
|
RETURN oneDocument
|
|
```
|
|
|
|
```json
|
|
[
|
|
{
|
|
"_id": "myusers/3456789",
|
|
"_key": "3456789",
|
|
"_rev": "14253647",
|
|
"firstName": "John",
|
|
"lastName": "Doe",
|
|
"address": {
|
|
"city": "Gotham",
|
|
"street": "Road To Nowhere 1"
|
|
},
|
|
"hobbies": [
|
|
{ "name": "swimming", "howFavorite": 10 },
|
|
{ "name": "biking", "howFavorite": 6 },
|
|
{ "name": "programming", "howFavorite": 4 }
|
|
]
|
|
}
|
|
]
|
|
```
|
|
|
|
Return the hobbies sub-structure only:
|
|
|
|
```js
|
|
RETURN oneDocument.hobbies
|
|
```
|
|
|
|
```json
|
|
[
|
|
[
|
|
{ "name": "swimming", "howFavorite": 10 },
|
|
{ "name": "biking", "howFavorite": 6 },
|
|
{ "name": "programming", "howFavorite": 4 }
|
|
]
|
|
]
|
|
```
|
|
|
|
Return the hobbies and the address:
|
|
|
|
```js
|
|
RETURN {
|
|
hobbies: oneDocument.hobbies,
|
|
address: oneDocument.address
|
|
}
|
|
```
|
|
|
|
```json
|
|
[
|
|
{
|
|
"hobbies": [
|
|
{ "name": "swimming", "howFavorite": 10 },
|
|
{ "name": "biking", "howFavorite": 6 },
|
|
{ "name": "programming", "howFavorite": 4 }
|
|
],
|
|
"address": {
|
|
"city": "Gotham",
|
|
"street": "Road To Nowhere 1"
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
Return the first hobby only:
|
|
|
|
```js
|
|
RETURN oneDocument.hobbies[0].name
|
|
```
|
|
|
|
```json
|
|
[
|
|
"swimming"
|
|
]
|
|
```
|
|
|
|
Return a list of all hobby strings:
|
|
|
|
```js
|
|
RETURN { hobbies: oneDocument.hobbies[*].name }
|
|
```
|
|
|
|
```json
|
|
[
|
|
{ "hobbies": ["swimming", "biking", "porgramming"] }
|
|
]
|
|
```
|
|
|
|
More complex [array](../../AQL/Functions/Array.html) and
|
|
[object manipulations](../../AQL/Functions/Document.html) can be done using
|
|
AQL functions and [operators](../../AQL/Operators.html).
|