**What does SQL stand for?**
SQL stands for *Structured Query Language.*
**What is SQL designed for?**
SQL is designed for *technical and non-technical users to query, manipulate, and transform data from a relational database.*
> **What is a relational database?**
> A relational database is *a collection of related tables.*
>
> **What makes up a table?**
> A table is made up of *a fixed number of named columns and any number of rows of data.*
# Queries
**What SQL statement do you use to retrieve data from a database?**
The SQL statement you use to retrieve data from a database is *the `SELECT` statement.*
> **What are `SELECT` statements also called?**
> SELECT statements are also called *queries.*
>
> **What are the three things a query declares?**
> The three things a query declares are:
> 1. The data we want.
> 2. Where to find it in the database.
> 3. How to transform it before it is returned (optional).
**How do you write a query to select a few columns of data from every row of a table?**
To select a few columns of data from every row of a table, write:
```sql
SELECT column_name, another_column_name, ...
FROM table_name;
```
**How do you write a query to select every column of data from every row of a table?**
To select every column of data from every row of a table, write:
```sql
SELECT *
FROM table_name;
```
**What clause can you add to a query to select rows from a table based on one or more conditions?**
The clause you can add to a query to filter what rows from a table are selected based on one or more conditions is *the `WHERE` clause*.
> **How do you write a query to select a few columns of data from rows from a table which satisfy one or more conditions?**
> To select a few columns of data from rows in a table which satisfy one or more conditions, write:
> ```sql
> SELECT column_name, another_column_name, ....
> FROM table_name
> WHERE condition
> AND another_condition
> OR ...;
> ```
> **What operators can you use for conditions on numerical values in a SQL query?**
> You can use these operators for conditions on numerical values in a SQL query:
> * `=`, `!=`, `<`, `<=`, `>`, `>=` - Standard numerical operators.
> * `BETWEEN ... AND ...` - Within a range of numbers (inclusive).
> * `NOT BETWEEN ... AND ...` - Not within a range of numbers (inclusive).
> * `IN (...)` - Exists in a list.
> * `NOT IN (...)` - Doesn't exist a list.
>
> **What operators can you use for conditions on text data in a SQL query?**
> You can use these operators for conditions on text data in a SQL query:
> * `=` - Matches case and value.
> * `!=` or `<>` - Doesn't match case and value.
> * `LIKE` - Matches value.
> * `NOT LIKE` - Doesn't match value.
> * `%` - Zero or more characters in a `LIKE` operation.
> * `_` - A single character in a `LIKE` operation.
> * `IN (...)` - Exists in a list.
> * `NOT IN (...)` - Doesn't exist in a list.
>
> **What effect does including conditions have on the speed of running a query?**
> The effect that including conditions has on the speed of running a query is *increasing the speed by reducing the data being returned.*
**What keyword can add to a query to blindly select rows in a table with unique values?**
The keyword you can add to a query to blindly select rows with unique values is *the `DISTINCT` keyword*.
> **How do you write a query to select a few columns of data from rows from a table which have unique values?**
> To select a few columns of data from rows which have unique values, write:
> ```sql
> SELECT DISTINCT column_name, another_column_name, ...
> FROM table_name;
> ```
**What clause can you add to a query to sort rows from a table alpha-numerically?**
The clause you can add to a query to sort rows from a table alpha-numerically is *the `ORDER BY` clause.*
> **How do you write a query to select a few columns of data from rows from a table and sort them alpha-numerically?**
> To select a few columns of data from rows from a table and sort them alpha-numerically, write:
> ```sql
> SELECT column_name, another_column_name, ...
> FROM table_name
> ORDER BY column_name ASC/DESC;
> ```
> **What two clauses are commonly used with `ORDER BY` to return only a subset of all the selected rows?**
> The two clauses that are commonly used with `ORDER BY` to return only a subset of all selected rows are:
> 1. `LIMIT`.
> 2. `OFFSET`.
>
> > **What does the `LIMIT` clause do to a query's results?**
> > The `LIMIT` clause *reduces the number of rows returned by a query.*
> >
> > **What does the `OFFSET` clause do to a query with the `LIMIT` clause?**
> > The `OFFSET` clause *changes where the count begins for the `LIMIT` clause.*
# Multi-table queries
**What is database normalization?**
Database normalization is *the process of breaking down data about a particular entity into pieces and storing it across multiple orthogonal tables.*
> **What is the benefit of database normalization?**
> The benefit of database normalization is that *data can grow independently of each other.*
>
> **What is the downside of database normalization?**
> The downside of database normalization is that *queries can be more complex and take longer to finish.*
**What do tables that share information about a single entity need?**
Tables that share information about a single entity need *a primary key.*
> **What is the most common primary key type?**
> The most common primary key type is *an auto-incrementing integer.*
>
> **What is the one requirement for a primary key?**
> The one requirement for a primary key is *it needs to be unique.*
**What clause can you add to a query to combine row data across two separate tables using primary keys?**
The clause you can add to a query to combine row data across two separate tables using primary keys is *the `JOIN` clause.*
> **What does the `INNER JOIN` clause do?**
> The `INNER JOIN` clause *combines rows from two tables which have the same primary key specified by the `ON` constraint.*
>
> **How do you write a query to combine rows from two tables using primary keys?**
> To combine rows from two tables which have the same primary key, write:
> ```sql
> SELECT column_name, another_column_name, ...
> FROM table_name
> INNER JOIN another_table_name
> ON table_name.id = another_table_name.id;
> ```
>
> **Is writing `JOIN` equivalent to writing `INNER JOIN`?**
> *Yes*, writing `JOIN` is equivalent to writing `INNER JOIN`.
>
> **What does the `LEFT JOIN` clause do?**
> The `LEFT JOIN` clause *includes rows in the original table regardless of if a matching row is found in the other table.*
>
> **What does the `RIGHT JOIN` clause do?**
> The `RIGHT JOIN` clause *includes rows in the other table regardless of if a matching row is found in the original table.*
>
> **What does a `FULL JOIN` clause do?**
> A `FULL JOIN` clause *includes rows from both tables regardless of if a matching row is found in either of them.*