Update tech_docs/database/sql_guide.md
This commit is contained in:
@@ -1,3 +1,257 @@
|
||||
### SQL Basics
|
||||
|
||||
#### 1. **Database and Table Structure**
|
||||
- **Database:** A collection of related data organized for easy access and management.
|
||||
- **Table:** A structured set of data organized in rows and columns within a database.
|
||||
|
||||
#### 2. **Basic SQL Commands**
|
||||
- **SELECT:** Used to fetch data from a database.
|
||||
- **INSERT:** Used to add new data into a table.
|
||||
- **UPDATE:** Used to modify existing data in a table.
|
||||
- **DELETE:** Used to remove data from a table.
|
||||
|
||||
### Writing SQL Queries
|
||||
|
||||
#### 1. **SELECT Statement**
|
||||
The `SELECT` statement is used to retrieve data from a database.
|
||||
|
||||
```sql
|
||||
SELECT column1, column2, ...
|
||||
FROM table_name;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT Name, Composer
|
||||
FROM Track;
|
||||
```
|
||||
|
||||
This query retrieves the `Name` and `Composer` columns from the `Track` table.
|
||||
|
||||
#### 2. **WHERE Clause**
|
||||
The `WHERE` clause is used to filter records.
|
||||
|
||||
```sql
|
||||
SELECT column1, column2, ...
|
||||
FROM table_name
|
||||
WHERE condition;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT Name, Composer
|
||||
FROM Track
|
||||
WHERE GenreId = 1;
|
||||
```
|
||||
|
||||
This query retrieves the names and composers of tracks in the genre with `GenreId` 1.
|
||||
|
||||
#### 3. **INSERT INTO Statement**
|
||||
The `INSERT INTO` statement is used to add new records to a table.
|
||||
|
||||
```sql
|
||||
INSERT INTO table_name (column1, column2, ...)
|
||||
VALUES (value1, value2, ...);
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
INSERT INTO Artist (Name)
|
||||
VALUES ('New Artist');
|
||||
```
|
||||
|
||||
This query adds a new artist named 'New Artist' to the `Artist` table.
|
||||
|
||||
#### 4. **UPDATE Statement**
|
||||
The `UPDATE` statement is used to modify existing records.
|
||||
|
||||
```sql
|
||||
UPDATE table_name
|
||||
SET column1 = value1, column2 = value2, ...
|
||||
WHERE condition;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
UPDATE Track
|
||||
SET Composer = 'New Composer'
|
||||
WHERE TrackId = 1;
|
||||
```
|
||||
|
||||
This query updates the composer of the track with `TrackId` 1 to 'New Composer'.
|
||||
|
||||
#### 5. **DELETE Statement**
|
||||
The `DELETE` statement is used to remove existing records from a table.
|
||||
|
||||
```sql
|
||||
DELETE FROM table_name
|
||||
WHERE condition;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
DELETE FROM Artist
|
||||
WHERE ArtistId = 1;
|
||||
```
|
||||
|
||||
This query removes the artist with `ArtistId` 1.
|
||||
|
||||
### Advanced SQL Concepts
|
||||
|
||||
#### 1. **JOINs**
|
||||
JOINs are used to combine rows from two or more tables based on a related column.
|
||||
|
||||
- **INNER JOIN:** Returns records with matching values in both tables.
|
||||
|
||||
```sql
|
||||
SELECT columns
|
||||
FROM table1
|
||||
INNER JOIN table2
|
||||
ON table1.common_column = table2.common_column;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT a.Name, t.Title
|
||||
FROM Album a
|
||||
INNER JOIN Artist ar ON a.ArtistId = ar.ArtistId
|
||||
WHERE ar.Name = 'AC/DC';
|
||||
```
|
||||
|
||||
This query returns the names of albums by the artist 'AC/DC'.
|
||||
|
||||
- **LEFT JOIN:** Returns all records from the left table and the matched records from the right table.
|
||||
|
||||
```sql
|
||||
SELECT columns
|
||||
FROM table1
|
||||
LEFT JOIN table2
|
||||
ON table1.common_column = table2.common_column;
|
||||
```
|
||||
|
||||
- **RIGHT JOIN:** Returns all records from the right table and the matched records from the left table.
|
||||
|
||||
```sql
|
||||
SELECT columns
|
||||
FROM table1
|
||||
RIGHT JOIN table2
|
||||
ON table1.common_column = table2.common_column;
|
||||
```
|
||||
|
||||
- **FULL OUTER JOIN:** Returns all records when there is a match in either left or right table.
|
||||
|
||||
```sql
|
||||
SELECT columns
|
||||
FROM table1
|
||||
FULL OUTER JOIN table2
|
||||
ON table1.common_column = table2.common_column;
|
||||
```
|
||||
|
||||
#### 2. **GROUP BY and HAVING**
|
||||
- **GROUP BY:** Used to arrange identical data into groups.
|
||||
|
||||
```sql
|
||||
SELECT column1, COUNT(*)
|
||||
FROM table_name
|
||||
GROUP BY column1;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT GenreId, COUNT(*)
|
||||
FROM Track
|
||||
GROUP BY GenreId;
|
||||
```
|
||||
|
||||
This query counts the number of tracks in each genre.
|
||||
|
||||
- **HAVING:** Used to filter groups.
|
||||
|
||||
```sql
|
||||
SELECT column1, COUNT(*)
|
||||
FROM table_name
|
||||
GROUP BY column1
|
||||
HAVING COUNT(*) > 1;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT GenreId, COUNT(*)
|
||||
FROM Track
|
||||
GROUP BY GenreId
|
||||
HAVING COUNT(*) > 10;
|
||||
```
|
||||
|
||||
This query returns genres with more than 10 tracks.
|
||||
|
||||
#### 3. **ORDER BY**
|
||||
The `ORDER BY` statement is used to sort the result set.
|
||||
|
||||
```sql
|
||||
SELECT column1, column2, ...
|
||||
FROM table_name
|
||||
ORDER BY column1 ASC|DESC;
|
||||
```
|
||||
|
||||
- **Example:**
|
||||
|
||||
```sql
|
||||
SELECT Name, Composer
|
||||
FROM Track
|
||||
ORDER BY Name ASC;
|
||||
```
|
||||
|
||||
This query retrieves track names and composers sorted by the track name in ascending order.
|
||||
|
||||
### Practical Example
|
||||
|
||||
Consider the following database schema in the Chinook database:
|
||||
|
||||
- **Artist Table:**
|
||||
|
||||
| ArtistId | Name |
|
||||
| -------- | ---------- |
|
||||
| 1 | AC/DC |
|
||||
| 2 | Accept |
|
||||
|
||||
- **Album Table:**
|
||||
|
||||
| AlbumId | Title | ArtistId |
|
||||
| ------- | ------------- | -------- |
|
||||
| 1 | For Those... | 1 |
|
||||
| 2 | Balls to... | 2 |
|
||||
|
||||
#### Query Examples
|
||||
|
||||
- **Fetch all tracks in the 'Rock' genre:**
|
||||
|
||||
```sql
|
||||
SELECT Name, Composer
|
||||
FROM Track
|
||||
WHERE GenreId = 1;
|
||||
```
|
||||
|
||||
- **Fetch all artists and the number of albums they have:**
|
||||
|
||||
```sql
|
||||
SELECT ar.Name, COUNT(al.AlbumId) AS album_count
|
||||
FROM Artist ar
|
||||
LEFT JOIN Album al ON ar.ArtistId = al.ArtistId
|
||||
GROUP BY ar.Name;
|
||||
```
|
||||
|
||||
This should give you a solid foundation to start with SQL using the Chinook database.
|
||||
|
||||
---
|
||||
|
||||
# Complete Guide to Getting Started with SQL and SQLite3
|
||||
|
||||
## Introduction to SQL
|
||||
|
||||
Reference in New Issue
Block a user