# Core Concepts

## The Schema Definition Language (SDL)

GraphQL có hệ thống  riêng của mình nó được dùng để định nghĩa các schema trong API, cú pháp để viết schema được gọi là **Schema Definition Language (SDL)**&#x20;

Ví dụ này sẽ giúp chúng ta cách sử dụng SDL để định nghĩa type `Person`&#x20;

```graphql
type Person {
  name: String!
  age: Int!
}
```

trong type Person có 2 trường `name` và `age` được define kiểu dữ liệu tương ứng  `string` và `Int` cú pháp `!` biểu diễn trường này là bắt buộc&#x20;

các `type` có thể được relationship với nhau bằng cách

```graphql
type Post {
  title: String!
  author: Person!
}
```

ngược lại thì `Person` sẽ được xây dựng như sau

```graphql
type Person {
  name: String!
  age: Int!
  posts: [Post!]!
}
```

`Note` chúng ta chỉ tạo one to many relationship giữa `Person` và `Post`&#x20;

## Fetching Data with Queries

Trong GraphQL muốn lấy dữ liệu ta chỉ cần gửi query tới GraphQL server và nó sẽ trả về cho ta dữ liệu cần

&#x20;**Query**&#x20;

```graphql
{
  allPersons {
    name
  }
}
```

`allPersons` field được gọi là field gốc của truy vấn

&#x20;**Kết quả**&#x20;

```javascript
{
  "data": {
    "allPersons": [
      {
        "name": "Johnny"
      },
      {
        "name": "Sarah"
      },
      {
        "name": "Alice"
      }
    ]
  }
}
```

Bây giờ ta muốn lấy thêm thông tin về tuổi&#x20;

```graphql
{
  allPersons {
    name
    age
  }
}
```

&#x20;**Kết quả**&#x20;

```graphql
{
  "data": {
    "allPersons": [
      {
        "name": "Johnny",
        "age": 23
      },
      {
        "name": "Sarah",
        "age": 20
      },
      {
        "name": "Alice",
        "age": 20
      }
    ]
  }
}
```
