# GraphQL Cheatsheet

## Overview of unique features

- Query language for APIs
- Allows clients to specify exactly what data they need
- Supports introspection and self-documentation
- Can be used for building efficient and flexible APIs

## Querying

```graphql
# Query for a specific field
{
 user(id: "123") {
   name
   email
 }
}

# Query for a specific field with an alias
{
 john: user(id: "123") {
   name
 }
 jane: user(id: "456") {
   name
 }
}

# Query for a field with arguments
{
 users(role: "admin") {
   name
 }
}

# Query for a field with nested objects
{
 user(id: "123") {
   name
   posts {
     title
     content
   }
 }
}
```

## Mutations

```graphql
# Create a new user
mutation {
 createUser(input: {name: "John", email: "[email protected]"}) {
   id
   name
   email
 }
}

# Update an existing user
mutation {
 updateUser(id: "123", input: {name: "John Doe"}) {
   id
   name
   email
 }
}

# Delete a user
mutation {
 deleteUser(id: "123") {
   id
   name
   email
 }
}
```

## Fragments

```graphql
# Define a fragment
fragment UserInfo on User {
 name
 email
}

# Use a fragment in a query
{
 user(id: "123") {
   ...UserInfo
 }
}

# Define a fragment with variables
```graphql
# Define a fragment with variables
fragment UserInfo on User {
 name
 email
 posts(first: $count) {
   title
   content
 }
}

# Use a fragment with variables
query($count: Int!) {
 user(id: "123") {
   ...UserInfo
 }
}
```

## Directives

```graphql
# Use a directive to conditionally include a field
{
 user(id: "123") {
   name
   email
   posts @include(if: $withPosts) {
     title
     content
   }
 }
}
```

## Schema

```graphql
# Define a schema
type User {
 id: ID!
 name: String!
 email: String!
 posts: [Post!]!
}

type Post {
 id: ID!
 title: String!
 content: String!
 author: User!
}

type Query {
 user(id: ID!): User
 posts: [Post!]!
}

type Mutation {
 createUser(input: CreateUserInput!): User!
 updateUser(id: ID!, input: UpdateUserInput!): User!
 deleteUser(id: ID!): User!
}

input CreateUserInput {
 name: String!
 email: String!
}

input UpdateUserInput {
 name: String
 email: String
}
```

## Resources

- [GraphQL documentation](https://graphql.org/learn/)
- [GraphQL tutorial](https://www.tutorialspoint.com/graphql/index.htm)
- [GraphQL forum](https://stackoverflow.com/questions/tagged/graphql) for community support and troubleshooting.