SQL Flashcards
Проверьте, что последовательность команд указана верно (она отличается от последовательности выполнения команд в запрос
SELECT ‘столбцы или * для выбора всех столбцов; обязательно’
FROM ‘таблица; обязательно’
WHERE ‘условие/фильтрация, например, city = ‘Moscow’; необязательно’
GROUP BY ‘столбец, по которому хотим сгруппировать данные; необязательно’
HAVING ‘условие/фильтрация на уровне сгруппированных данных; необязательно’
ORDER BY ‘столбец, по которому хотим отсортировать вывод; необязательно’
отношение
это структура данных целиком, набор записей (в обычном понимании – таблица)
кортеж
это каждая строка , содержащая данные (более распространенный термин – запись ), например, <001, Борин С.А, 234-01-23, программист>, все кортежи в отношении должны быть различны;
мощность
число кортежей в таблице (проще говоря, число записей), в данном случае 3, мощность отношения может быть любой (от 0 до бесконечности), порядок следования кортежей - неважен;
атрибут
это столбец в таблице (более распространенный термин – поле ), в примере – Табельный номер, Фамилия И.О., Телефон, Должность)
размерность
это число атрибутов в таблице
домен атрибута
то допустимые значения (неповторяющиеся), которые можно занести в поле , например для атрибута Должность домен – {инженер, программист}.
Создание таблицы
ключевые слова : CREATE TABLE имя создаваемой таблицы; открывающая круглая скобка «(»; название поля и его описание, которое включает тип поля и другие необязательные характеристики; запятая; название поля и его описание; ... закрывающая скобка «)». CREATE TABLE genre( genre_id INT PRIMARY KEY AUTO_INCREMENT, name_genre VARCHAR(30) );
Для занесения новой записи в таблицу используется SQL запрос, в котором указывается в какую таблицу, в какие поля заносить новые значения. Структура запроса:
ключевые слова INSERT INTO (ключевое слово INTO можно пропустить);
имя таблицы, в которую добавляется запись;
открывающая круглая скобка «(»;
список полей через запятую, в которые следует занести новые данные;
закрывающая скобка «)»;
ключевое слово VALUES;
открывающая круглая скобка «(»;
список значений через запятую, которые заносятся в соответствующие поля, при этом текстовые значения заключаются в кавычки, числовые значения записываются без кавычек, в качестве разделителя целой и дробной части используется точка;
закрывающая скобка «)».
При составлении списка полей и списка значений необходимо учитывать следующее:
- количество полей и количество значений в списках должны совпадать;
- должно существовать прямое соответствие между позицией одного и того же элемента в обоих списках, поэтому первый элемент списка значений должен относиться к первому столбцу в списке столбцов, второй – ко второму столбцу и т.д.;
- типы данных элементов в списке значений должны быть совместимы с типами данных соответствующих столбцов таблицы ( целое число можно занести в поле типа DECIMAL, обратная операция - недопустима);
- новые значения нельзя добавлять в поля, описанные как PRIMARY KEY AUTO_INCREMENT;
- рекомендуется заполнять все поля записи, если же поле пропущено, значение этого поля зависит от установленных по умолчанию значений, если значения не установлены - на данной платформе вставляется пустое значение (NULL).
Что такое первичный ключ?
Первичный ключ или PRIMARY KEY предназначен для однозначной идентификации каждой записи в таблице и является строго уникальным (UNIQUE): две записи таблицы не могут иметь одинаковые значения первичного ключа. Нулевые значения (NULL) в PRIMARY KEY не допускаются. Если в качестве PRIMARY KEY используется несколько полей, их называют составным ключом.
Пример:
CREATE TABLE USERS ( id INT NOT NULL, name VARCHAR (20) NOT NULL, PRIMARY KEY (id) ); Здесь в качестве первичного ключа используется поле id.
Когда используется PRIMARY KEY?
PRIMARY KEY — это первичный ключ, который используется в качестве основного ключа и может быть использован для связи с дочерней таблицей, содержащей внешний ключ.
А что такое внешний ключ?
Внешний ключ или 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, и именно по этим полям происходит связывание двух таблиц.
WHERE и HAVING могут использоваться в одном запросе. При этом необходимо учитывать порядок выполнения SQL запроса на выборку на СЕРВЕРЕ:
FROM WHERE GROUP BY HAVING SELECT ORDER BY Сначала определяется таблица, из которой выбираются данные (FROM), затем из этой таблицы отбираются записи в соответствии с условием WHERE, выбранные данные агрегируются (GROUP BY), из агрегированных записей выбираются те, которые удовлетворяют условию после HAVING. Потом формируются данные результирующей выборки, как это указано после SELECT ( вычисляются выражения, присваиваются имена и пр. ). Результирующая выборка сортируется, как указано после ORDER BY.
Важно! Порядок ВЫПОЛНЕНИЯ запросов - это не порядок ЗАПИСИ ключевых слов в запросе на выборку. Порядок записи (синтаксис запроса) остается таким же, как рассматривался ранее в курсе. Порядок ВЫПОЛНЕНИЯ нужен для того, чтобы понять, почему, например, в WHERE нельзя использовать имена выражений из SELECT. Просто SELECT выполняется компилятором позже, чем WHERE, поэтому ему неизвестно, какое там выражение написано.
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 | \+----+--------+
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)