SQL Flashcards

1
Q

Проверьте, что последовательность команд указана верно (она отличается от последовательности выполнения команд в запрос

A

SELECT ‘столбцы или * для выбора всех столбцов; обязательно’

FROM ‘таблица; обязательно’

WHERE ‘условие/фильтрация, например, city = ‘Moscow’; необязательно’

GROUP BY ‘столбец, по которому хотим сгруппировать данные; необязательно’

HAVING ‘условие/фильтрация на уровне сгруппированных данных; необязательно’

ORDER BY ‘столбец, по которому хотим отсортировать вывод; необязательно’

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

отношение

A

это структура данных целиком, набор записей (в обычном понимании – таблица)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

кортеж

A

это каждая строка , содержащая данные (более распространенный термин – запись ), например, <001, Борин С.А, 234-01-23, программист>, все кортежи в отношении должны быть различны;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

мощность

A

число кортежей в таблице (проще говоря, число записей), в данном случае 3, мощность отношения может быть любой (от 0 до бесконечности), порядок следования кортежей - неважен;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

атрибут

A

это столбец в таблице (более распространенный термин – поле ), в примере – Табельный номер, Фамилия И.О., Телефон, Должность)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

размерность

A

это число атрибутов в таблице

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

домен атрибута

A

то допустимые значения (неповторяющиеся), которые можно занести в поле , например для атрибута Должность домен – {инженер, программист}.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Создание таблицы

A
ключевые слова : CREATE TABLE
имя создаваемой таблицы;
открывающая круглая скобка «(»;
название поля и его описание, которое включает тип поля и другие необязательные характеристики;
запятая;
название поля и его описание;
...
закрывающая скобка «)».
CREATE TABLE genre(
    genre_id INT PRIMARY KEY AUTO_INCREMENT, 
    name_genre VARCHAR(30)
);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Для занесения новой записи в таблицу используется SQL запрос, в котором указывается в какую таблицу, в какие поля заносить новые значения. Структура запроса:

A

ключевые слова INSERT INTO (ключевое слово INTO можно пропустить);
имя таблицы, в которую добавляется запись;
открывающая круглая скобка «(»;
список полей через запятую, в которые следует занести новые данные;
закрывающая скобка «)»;
ключевое слово VALUES;
открывающая круглая скобка «(»;
список значений через запятую, которые заносятся в соответствующие поля, при этом текстовые значения заключаются в кавычки, числовые значения записываются без кавычек, в качестве разделителя целой и дробной части используется точка;
закрывающая скобка «)».

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

При составлении списка полей и списка значений необходимо учитывать следующее:

A
  1. количество полей и количество значений в списках должны совпадать;
  2. должно существовать прямое соответствие между позицией одного и того же элемента в обоих списках, поэтому первый элемент списка значений должен относиться к первому столбцу в списке столбцов, второй – ко второму столбцу и т.д.;
  3. типы данных элементов в списке значений должны быть совместимы с типами данных соответствующих столбцов таблицы ( целое число можно занести в поле типа DECIMAL, обратная операция - недопустима);
  4. новые значения нельзя добавлять в поля, описанные как PRIMARY KEY AUTO_INCREMENT;
  5. рекомендуется заполнять все поля записи, если же поле пропущено, значение этого поля зависит от установленных по умолчанию значений, если значения не установлены - на данной платформе вставляется пустое значение (NULL).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое первичный ключ?

A

Первичный ключ или PRIMARY KEY предназначен для однозначной идентификации каждой записи в таблице и является строго уникальным (UNIQUE): две записи таблицы не могут иметь одинаковые значения первичного ключа. Нулевые значения (NULL) в PRIMARY KEY не допускаются. Если в качестве PRIMARY KEY используется несколько полей, их называют составным ключом.

Пример:

CREATE TABLE USERS (
  id INT NOT NULL,
  name VARCHAR (20) NOT NULL,
  PRIMARY KEY (id)
);
Здесь в качестве первичного ключа используется поле id.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Когда используется PRIMARY KEY?

A

PRIMARY KEY — это первичный ключ, который используется в качестве основного ключа и может быть использован для связи с дочерней таблицей, содержащей внешний ключ.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

А что такое внешний ключ?

A

Внешний ключ или FOREIGN KEY также является атрибутом ограничения и обеспечивает связь двух таблиц. По сути, это поле или несколько полей, которые ссылаются на PRIMARY KEY в родительской таблице.

Пример использования:

CREATE TABLE order (
order_id INT NOT NULL,
user_id INT,
PRIMARY KEY (order_id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
В данном случае внешний ключ, привязанный к полю user_id в таблице order, ссылается на первичный ключ id в таблице users, и именно по этим полям происходит связывание двух таблиц.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

WHERE и HAVING могут использоваться в одном запросе. При этом необходимо учитывать порядок выполнения SQL запроса на выборку на СЕРВЕРЕ:

A
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
Сначала определяется таблица, из которой выбираются данные (FROM), затем из этой таблицы отбираются записи в соответствии с условием  WHERE, выбранные данные агрегируются (GROUP BY),  из агрегированных записей выбираются те, которые удовлетворяют условию после HAVING. Потом формируются данные результирующей выборки, как это указано после SELECT ( вычисляются выражения, присваиваются имена и пр. ). Результирующая выборка сортируется, как указано после ORDER BY.

Важно! Порядок ВЫПОЛНЕНИЯ запросов - это не порядок ЗАПИСИ ключевых слов в запросе на выборку. Порядок записи (синтаксис запроса) остается таким же, как рассматривался ранее в курсе. Порядок ВЫПОЛНЕНИЯ нужен для того, чтобы понять, почему, например, в WHERE нельзя использовать имена выражений из SELECT. Просто SELECT выполняется компилятором позже, чем WHERE, поэтому ему неизвестно, какое там выражение написано.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

PROBLEM #1: Second Highest Salary
Write a SQL query to get the second highest salary from the Employee table. For example, given the Employee table below, the query should return 200 as the second highest salary. If there is no second highest salary, then the query should return null.

\+----+--------+
| Id | Salary |
\+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
\+----+--------+
A

SOLUTION B: Using MAX()
This query says to choose the MAX salary that isn’t equal to the MAX salary, which is equivalent to saying to choose the second-highest salary!

SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

PROBLEM #2: Duplicate Emails
Write a SQL query to find all duplicate emails in a table named Person.

\+----+---------+
| Id | Email   |
\+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
\+----+---------+
A
SOLUTION B: HAVING Clause
HAVING is a clause that essentially allows you to use a WHERE statement in conjunction with aggregates (GROUP BY).
SELECT Email
FROM Person
GROUP BY Email
HAVING count(Email) > 1
17
Q

PROBLEM #3: Rising Temperature
Given a Weather table, write a SQL query to find all dates’ Ids with higher temperature compared to its previous (yesterday’s) dates.

+———+——————+——————+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+———+——————+——————+
| 1 | 2015-01-01 | 10 |
| 2 | 2015-01-02 | 25 |
| 3 | 2015-01-03 | 20 |
| 4 | 2015-01-04 | 30 |
+———+——————+——————+

A

SOLUTION: DATEDIFF()
DATEDIFF calculates the difference between two dates and is used to make sure we’re comparing today’s temperature to yesterday’s temperature.
In plain English, the query is saying, Select the Ids where the temperature on a given day is greater than the temperature yesterday.

SELECT DISTINCT a.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND DATEDIFF(a.Recorddate, b.Recorddate) = 1

18
Q

PROBLEM #4: Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id.

\+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
\+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
\+----+-------+--------+--------------+

The Department table holds all departments of the company.

\+----+----------+
| Id | Name     |
\+----+----------+
| 1  | IT       |
| 2  | Sales    |
\+----+----------+

Write a SQL query to find employees who have the highest salary in each of the departments. For the above tables, your SQL query should return the following rows (order of rows does not matter).

\+------------+----------+--------+
| Department | Employee | Salary |
\+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
\+------------+----------+--------+
A
SOLUTION: IN Clause
The IN clause allows you to use multiple OR clauses in a WHERE statement. For example WHERE country = ‘Canada’ or country = ‘USA’ is the same as WHERE country IN (‘Canada’, ’USA’).
In this case, we want to filter the Department table to only show the highest Salary per Department (i.e. DepartmentId). Then we can join the two tables WHERE the DepartmentId and Salary is in the filtered Department table.
SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary) 
    IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
 )
19
Q

PROBLEM #5: Exchange Seats
Mary is a teacher in a middle school and she has a table seat storing students’ names and their corresponding seat ids. The column id is a continuous increment. Mary wants to change seats for the adjacent students.

Can you write a SQL query to output the result for Mary?

\+---------+---------+
|    id   | student |
\+---------+---------+
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
\+---------+---------+

For the sample input, the output is:

\+---------+---------+
|    id   | student |
\+---------+---------+
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
\+---------+---------+

Note:
If the number of students is odd, there is no need to change the last one’s seat.

A

SOLUTION: CASE WHEN
Think of a CASE WHEN THEN statement like an IF statement in coding.
The first WHEN statement checks to see if there’s an odd number of rows, and if there is, ensure that the id number does not change.
The second WHEN statement adds 1 to each id (eg. 1,3,5 becomes 2,4,6)
Similarly, the third WHEN statement subtracts 1 to each id (2,4,6 becomes 1,3,5)
SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id