После того как мы создали таблицу нам необходимо с ней работать. Чтобы получить данные из таблицы используются SQL — запросы.
SQL — запрос SELECT — предназначен для выборки строк из таблицы.
Рассмотрим примеры:
Простая выборка из таблицы
1 |
SELECT * FROM Users; |
SELECT — команда выборки.
* — указывает на то, что нам необходимо получить все данные из таблицы.
FROM — указывает откуда мы будем брать данные.
Users — имя таблицы из которой мы возьмем данные.
Что получим на выходе:
id | Name | Login | uPassword | specialty | salary |
---|---|---|---|---|---|
1 | Alice | a | 1 | 500 | |
2 | Jon | b | 2 | teacher | 10000 |
3 | Jonh | c | 3 | teacher | 100000 |
4 | Kate | d | 4 | student | 100000 |
5 | Max | r | 5 | doctor | 100000 |
6 | Sara | t | 6 | programmer | 100000 |
Ограничение по выборки данных
1 |
SELECT * FROM Users LIMIT 2,3; |
LIMIT 2,3 — устанавливает лимит; указывает что из таблицы будут взяты только 3 строки, начиная с 3.
id | Name | Login | uPassword | specialty | salary |
---|---|---|---|---|---|
1 | Alice | a | 1 | 500 | |
2 | Jon | b | 2 | teacher | 10000 |
3 | Jonh | c | 3 | teacher | 100000 |
4 | Kate | d | 4 | student | 100000 |
5 | Max | r | 5 | doctor | 100000 |
6 | Sara | t | 6 | programmer | 100000 |
Выборка определенных столбцов из таблицы
1 |
SELECT Login, uPassword FROM Users; |
На выходе мы получим из таблицы только данные из столбцов Login и uPassword. Т.е. при выборке определенных столбцов таблицы их необходимо указать через запятую.
Столбцы будут выведены на экран в том порядке, в котором перечислены в запросе.
Login | uPassword |
---|---|
a | 1 |
b | 2 |
c | 3 |
d | 4 |
r | 5 |
t | 6 |
Сортировка полей из таблицы
1 2 |
SELECT Name, Login, uPassword FROM Users ORDER BY Name; |
По этому запросу будут выбраны данные из полей Name, Login и uPassword, далее они будут отсортированы по полю Name(по алфавиту).
Сортировку можно выполнять по любому количеству полей.
Name | Login | uPassword |
---|---|---|
Aice | a | 1 |
Jon | b | 2 |
Jonh | c | 3 |
Kate | d | 4 |
Max | r | 5 |
Peter | t | 6 |
1 2 |
SELECT Name, Login, uPassword FROM Users ORDER BY Name ASC; |
Параметр ASC означает, что сортировка выполнится по возрастанию (устанавливается по умолчанию).
1 2 |
SELECT Name, Login, uPassword FROM Users ORDER BY Name DESC; |
DESC означает, что сортировка выполнится по убыванию.
Удаление повторяющихся значений
При выборке возможен вариант, когда требуется получить лишь уникальные строки (не повторяющиеся). В этом случаи нам поможет команда DISTINCT, которая удалит все повторяющиеся значения.
1 2 |
SELECT DISTINCT Name, Login, uPassword FROM Users; |
Создадим две одинаковые строки(копируем 2 строку) и посмотрим что получится:
Name | Login | uPassword |
---|---|---|
Aice | a | 1 |
Jon | b | 2 |
Jonh | c | 3 |
Kate | d | 4 |
Max | r | 5 |
Peter | t | 6 |
Условие WHERE
При выборке данных из таблицы в результатирующие поля попадут только те значения, которые будут соответствовать условию WHERE.
1 2 |
SELECT * FROM Users WHERE Name ='Alice' ; |
В итоге мы получим все строки у которых поле Name имеет значение ‘Alice’.
id | Name | Login | uPassword | specialty | salary |
---|---|---|---|---|---|
1 | Alice | a | 1 | 500 |
Условий может быть несколько в этом случаи используются операторы: AND, OR или NOT. Так же в условии можно использовать операторы: ‘=’(равно), ‘<>’(неравно), ‘<‘(меньше), ‘>’(больше), ‘<=’(меньше равно),’>=’(больше равно).Например:
1 2 |
SELECT * FROM Users WHERE Name ='Alice' AND Login='a'; |
BETWEEN(Между)
BETWEEN проверяет попадают ли значения проверяемого выражения в диапазон значений, связанных служебным оператором AND.
1 2 |
SELECT * FROM Users WHERE salary BETWEEN 500 AND 10000; |
В итоге мы получим все строки из таблицы, значения поля salary которых будет входить в диапазон от 500 до 10000.
id | Name | Login | uPasword | specialty | salary |
---|---|---|---|---|---|
1 | Alicce | a | 1 | 500 | |
2 | Jon | b | 2 | teacher | 10000 |
IN
Предикат IN определяет будет ли значение выражения соответствовать набору значений, которые явно определены.
1 2 |
SELECT * FROM Users WHERE (salary IN(10000,100000)); |
В нашем случаи на выход получим только тех людей, зарплата которых соответствует значению 10000 и 100000.
id | Name | Login | uPassword | specialty | salary |
---|---|---|---|---|---|
2 | Jon | b | 2 | teacher | 10000 |
3 | Jonh | c | 3 | teacher | 100000 |
4 | Kate | d | 4 | student | 100000 |
5 | Max | r | 5 | doctor | 100000 |
6 | Peter | t | 6 | programmer | 100000 |
1 2 |
SELECT * FROM People WHERE weight IN(50,60, 70) AND growth IN(SELECT * FROM People WHERE age=18); |
IN так же может содержать в себе подзапрос. Тогда на выходе получим только тех людей, чей вес равняется 50,60 или 70 кг и вес равен значению, которому равны поля тех людей, чей возраст 18.
LIKE
LIKE сравнивает проверяемое значение с шаблоном в выражении.
1 2 |
SELECT * FROM Users WHERE (Name LIKE "A%"); |
На выходе мы получим все данные из таблицы Users, где значение поля Name будут начинаться с A.
id | Name | Login | uPassword | specialty | salary |
---|---|---|---|---|---|
1 | Alice | a | 1 | 500 |
«%» — означает, любые символы.
Если мы поставим «а%», то получим все значения где встречен символ «а».
Если мы поставим «%а%», то получим все значения полей Name , в которых будет встречен символ «а».
Переименование полей
Иногда, нам необходимо переименовать поле. За эту операцию отвечает команда AS.
1 2 |
SELECT Name, salary AS MinSalary FROM Users WHERE salary<15000; |
В итоге мы получим:
Name | MinSalary |
---|---|
Alice | 500 |
Jon | 10000 |
Агрегатные функции в SQL
Для получения итоговых значений и вычисления выражений используются агрегатные функции в sql:
Название | Описание |
---|---|
COUNT(*) | Вернет количество строк в таблице. Учитывает NULL - значения. Применима к любым типам данных. |
COUNT(имя поля) | Вернет количество значений в указанном столбце. Не учитывает NULL - значения. Применима к любым типам данных. |
MIN(имя поля) | Вернет минимальное значение из указанного столбца. Применима к любым типам данных. |
MAX(имя поля) | Вернет максимальное значение из указанного столбца. Применима к любым типам данных. |
SUM(имя поля) | Вернет сумму значений из указанного столбца. Применима лишь к числовому типу данных. |
AVG(имя поля) | Вернет среднее арифметическое значение из указанного столбца. Применима лишь к числовому типу данных. |
Все агрегатные функции возвращают единственное значение.
Например, используем функцию SUM() и посчитаем зарплату пользователей:
1 |
SELECT SUM(salary) AS Salary FROM Users; |
Salary |
---|
1220500 |
GROUP BY
Обычно GROUP BY относят к агрегатным функциям, но мы разберём его отдельно.
Когда запрос содержащий оператор GROUP BY, каждый набор строк, заданных в предложении GROUP BY, составляет группу, и агрегатные функции выполняются для каждой группы отдельно.
Рассмотрим пример. Существует некая таблица Job:
id | Name | specialty | hour | salary |
---|---|---|---|---|
1 | Alice | teacher | 2 | 500 |
2 | Max | teacher | 6 | 4200 |
3 | Alice | doctor | 4 | 1000 |
4 | Alice | teacher | 3 | 750 |
5 | Max | doctor | 2 | 1400 |
И мы хотим вывести количество отработанных(т.е. сумму) часов у каждого работника. Для этого используем функцию GROUP BY:
1 2 |
SELECT Name, speciality, SUM(hour) AS hour FROM Job GROUP BY Name; |
И в итоге получаем:
Name | specialty | hour |
---|---|---|
Alice | teacher | 9 |
Max | doctor | 8 |
HAVING
С помощью оператора HAVING проверяется значение, полученное с помощью агрегатных функций с использованием GROUP BY. В такой проверке не может быть оператора WHERE.
Рассмотрим пример. Необходимо вывести пользователей, чья суммарная зарплата выше 2500.
1 2 3 |
SELECT Name, speciality, SUM(salary)AS Salary FROM Job GROUP BY Name HAVING SUM(salary)>2500 |
Name | specialty | Salary |
---|---|---|
Max | doctor | 5600 |
Неявная операция соединения
При выборке из нескольких таблиц(неявное соединение) возможно в предложении FROM . Перечисление таблиц, как правило, сопровождается условием соединения записей из разных таблиц.
1 2 3 4 |
SELECT DISTINCT Users.`Name` , Users.`speciality` , Job.`salary` FROM Users, Job WHERE Users.`Name` = Job.`Name` ORDER BY Name |
Представим, что у нас есть две таблицы: Users(хранит информацию о пользователях(id, имя и специальность)) и Job(хранит информацию о работе(id, имя работника, его специальность, отработанные часы и зарплата)). Предположим, что мы хотим вывести имя, специальность и зарплату. Первые два пункта возьмем из таблицы Users, последний из таблицы Job. Это будет возможно с помощью строки «Users.Name
= Job.Name
«. Здесь, таблицы соединяются через поля Name. В итоге получим:
Name | specialty | hour |
---|---|---|
Alice | teacher | 500 |
Alice | teacher | 1000 |
Alice | teacher | 750 |
Max | doctor | 1400 |
Max | doctor | 4200 |
Явное соединение
INNER JOIN
INNER JOIN — (внутреннее объединение) — выбираются только совпадающие данные из объединяемых таблиц.
Воспользуемся таблицами из примера выше. Предположим, что нам надо вывести имя, специальность и сумму выплаченной зарплаты. Воспользуемся INNER JOIN:
1 2 3 |
SELECT Users.Name , Users.speciality , SUM(Job.salary) AS Salary FROM Users INNER JOIN Job ON Users.Name = Job.Name GROUP By Name; |
INNER JOIN — показывает какие таблицы мы хотим связать.
ON — указывает на то, через какие поля связывать таблицы.
На выходе получим:
Name | specialty | Salary |
---|---|---|
Alice | teacher | 2250 |
Max | doctor | 5600 |
OUTER JOIN
OUTER JOIN — (внешнее соединение) — выбираются совпадающие данные из объединяемых таблиц, плюс данные из внешней таблицы, которые не подходят по условию, заполнив недостающие значения NULL.
-
- LEFT OUTER JOIN — (левое внешнее соединение) — внешней таблицей будет та, которая находится слева.
123SELECT Users.Name , Users.speciality , SUM(Job.salary) AS SalaryFROM Users LEFT OUTER JOIN Job ON Users.Name = Job.NameGROUP By Name;d
На выходе получим:Name specialty Salary Alice teacher 2250 Max doctor 5600 Sara doctor null
В нашем случаи из «левой» таблицы (Users) были взяты данные, не соответствующие условию(т.е. последняя строка). - RIGHT OUTER JOIN — (внешнее правое соединение) — внешней таблицей будет та, которая находится справа.
123SELECT Users.Name , Users.speciality , SUM(Job.salary) AS SalaryFROM Users RIGHT OUTER JOIN Job ON Users.Name = Job.NameGROUP By Name;
На выходе получим:
Name specialty Salary Alice teacher 2250 Kim student null Mark student null Max doctor 5600 В нашем случаи из «правой» таблицы (Job) были взяты данные, не соответствующие условию (т.е. вторая и третья строка).
- LEFT OUTER JOIN — (левое внешнее соединение) — внешней таблицей будет та, которая находится слева.
UNION
UNION — объединяет несколько запросов (выходные строки из разных запросов объединятся в одну результирующую).
Для использования оператора UNION необходимо соблюдать следующие условия:
- Выходные столбцы в каждом запросе должны быть сравнимы между собой по типам данных.
- Количество выходных столбцов должно быть одинаковым.
- ORDER BY можно использовать только после объединенных запросов.
- В итоговом наборе используются те имена, которые указаны в первом запросе.
1 2 3 4 5 6 |
SELECT Name , speciality FROM Users UNION SELECT Name, speciality FROM Job GROUP By Name; |
На выходе получим:
Name | specialty |
---|---|
Alice | teacher |
Max | doctor |
Sara | doctor |
Kim | student |
Mark | student |
В этой статье мы разобрали основные возможности оператора SELECT.