fundamentals/database/notes/07-subqueries-functions-worksheet-answers.md

214 lines
3.4 KiB
Markdown
Raw Normal View History

2022-07-22 14:34:01 +01:00
# Queries
## Sub-queries
1. Get all the students whose IQ is greater than the average IQ.
```sql
SELECT
first_name, last_name, iq
FROM
students
WHERE
iq > (SELECT
AVG(iq)
FROM
students);
```
2. Get all the students whose IQ is greater than the highest IQ of the batch_id `2` students.
```sql
SELECT
*
FROM
students
WHERE
iq > (SELECT
MAX(iq)
FROM
students
WHERE
batch_id = 2);
```
3. Get all the students whose IQ is greater than `all` the IQs of the batch_id `2` students.
```sql
SELECT
*
FROM
students
WHERE
iq > ALL (SELECT
iq
FROM
students
WHERE
batch_id = 2);
```
4. Find all the students who are in batches that start with the word `Jedi` (Without JOIN)
```sql
SELECT
*
FROM
students
WHERE
batch_id IN (SELECT
id
FROM
batches
WHERE
name LIKE 'Jedi%');
```
5. Find all the students whose IQ is greater than the average IQ of their batch.
```sql
SELECT
*
FROM
students;
SELECT
first_name, last_name, batch_id, iq
FROM
students s
WHERE
s.iq > (SELECT
AVG(iq)
FROM
students e
WHERE
e.batch_id = s.batch_id);
```
6. Get all the instructors that have at least one batch (Without using joins)
```sql
SELECT
*
FROM
instructors i
WHERE
EXISTS( SELECT
id
FROM
batches
WHERE
instructor_id = i.id);
```
7. Print all the names, batch ID and average IQ of the batch for each student
```sql
SELECT
id,
first_name,
last_name,
iq,
batch_id,
(SELECT
AVG(iq)
FROM
students
WHERE batch_id = s.batch_id
)
FROM
students s;
```
## Built-in Functions
1. Get the average IQ of all the students rounded to the nearest integer.
```sql
SELECT
ROUND(AVG(iq))
FROM
students;
```
2. Find all batches whose name is longer than 10 characters.
```sql
SELECT
id, name
FROM
batches
WHERE
LENGTH(name) > 10;
```
3. Find all batches whose name's first 10 characters contains the string `sher`
```sql
SELECT
id, name
FROM
batches
WHERE
LOCATE('sher', SUBSTR(name, 1, 10)) > 0;
```
4. Get all batches that have started on a Sunday
```sql
SELECT
id, name
FROM
batches
WHERE
DAYNAME(start_date) = 'Sunday';
```
5. Get all batches that have been running for more than 10 years
```sql
SELECT
id, name, start_date
FROM
batches
WHERE
(DATEDIFF(NOW(), start_date) / 365) > 10;
```
6. Print the name and the instructor's id for each batch. If no instructor is assigned, print `NO INSTRUCTOR`.
```sql
SELECT
name, IFNULL(instructor_id, 'NO INSTRUCTOR')
FROM
batches;
```
7. Print the name and IQ of each student. If the IQ of the student is less than 100, print `LOW IQ` instead.
```sql
SELECT
first_name, last_name, IF(iq < 100, 'LOW IQ', iq)
FROM
students;
```
8. For each student print the name and their IQ category.
| IQ | Category |
| --------- | -------- |
| < 100 | LOW IQ |
| 100 - 150 | MEDIUM |
| > 150 | HIGH |
```sql
SELECT
first_name,
last_name,
CASE
WHEN iq > 150 THEN 'HIGH IQ'
WHEN iq BETWEEN 100 AND 150 THEN 'MEDIUM IQ'
ELSE 'LOW IQ'
END
FROM
students;
```