Простые SQL запросы
Запросы написаны без экранирующих кавычек, так как у MySQL, MSSQL и PostGree они разные.
Вывод нужны полей
Выводим только указанные поля из указанной таблицы
SELECT name_last, name_first, salary FROM table_name
Вывод всех полей из таблицы
* обозначает все поля
SELECT * FROM table_name
Задание псевдонима таблице
Таблице table_name в качестве псевдонима задано t. Выводим всех служащих с окладом свыше 35000
SELECT * FROM table_name AS t WHERE t.salary>35000
Исключение дубликатов
Хотим знать из каких стран поставляют продукцию продавцы
SELECT DISTINCT country FROM vendors
Постановка условия
Выводим поставщиком из России
SELECT * FROM vendors WHERE country="Россия"
Использование логических операторов
Хотим знать из каких стран поставляют продукцию продавцы выводим только предпочитаемых поставщиков из России. Когда используется оператор AND, то должны удовлетворяться оба условия
SELECT * FROM vendors WHERE country="Россия" AND preferred="true"
Использование логических операторов
Хотим видеть только тех животных, которые обитают в Тюменской области или в Московской области. Когда используем оператор OR, то должно удовлетворяться хотя бы одно условие
SELECT * FROM animals WHERE area="Тюменская область" OR area="Московская область"
Использование логических операторов
Выводим животных, обитающих в Тюменской области с весом не менее 7 кг. Когда используется оператор AND NOT должно удовлетворять первое условие и не должно второе
SELECT * FROM animals WHERE area="Тюменская область" AND NOT massa<7
Упорядочивание записей по возрастанию
Выводим животных в порядке увеличения веса: с начала самые легкие, в конце самые тяжелые.
SELECT * FROM animals ORDER BY massa
Упорядочивание записей по убыванию
Выводим животных в порядке уменьшения веса: с начала самые тяжелые, в конце самые легкие.
SELECT * FROM animals ORDER BY massa DESC
Упорядочивание записей по возрастанию
Упорядочить по третьему столбцу (отсчет начинается с 1)
SELECT * FROM animals ORDER BY 3
Вывести ограниченное количество записей
Выводим записи с первой, всего 10 записей. Остальные отсекаются
SELECT * FROM animals LIMIT 0,10
Сложные SQL запросы
Объединение нескольких запросов
SELECT * FROM animals WHERE area="Тюменская область"
UNION
SELECT * FROM animals WHERE area="Московская область"
Выводим тех животных, которые обитают в Тюменской области, а также тех, которые обитают в Московской области. Оператором UNION можем объединить несколько запросов.
Внимание! Данная структура уже используется редко. Оставлена для поддержания старых версий. Запрос работает гораздо быстрее, чем UNION. Сам запрос для многих может показаться бредовым, но лично мне встречаются такие конструкции довольно часто, поэтому я его и огласил. Сам оператор UNION куда эффективнее используется, чем можно себе представить, но от этого менее трудоемкий он не становится.
SELECT * FROM animals WHERE area="Тюменская область" AND area="Московская область"
Подсчеты значений поля
// Выводим максимальный оклад из таблицы служащих
SELECT MAX(salary) FROM employee
// Выводим минимальный оклад из таблицы служащих
SELECT MIN(salary) FROM employee
// Выводим сумма всех окладов
SELECT SUM(salary) FROM employee
// Выводим среднею сумма всех окладов
SELECT AVG(salary) FROM employee
// Выводим количество сотрудников имеющих оклад
SELECT COUNT(*) FROM employee
// Выводим количество сотрудников в 310а кабинете
SELECT COUNT(*) FROM employee WHERE office="310а"
Это важные команды. Рекомендуется, где это возможно, использовать для подсчета именно SQL запросы такого рода, так как ни одна среда программирования не сравнится в скорости обработки данных, чем SQL сервер при обработке своих же данных.
Группировка записей
C помощью конструкции ORDER BY можем узнать какая страна занимает самую большую площадь для каждого континента
SELECT continent, MAX(area) FROM country GROUP BY continent
Конструкция IN
Выводим покупателей из России, Болгарии и Китая
SELECT * FROM customer WHERE country IN ("Россия", "Болгария", "Китай")
Конструкция NOT IN
Выводим всех покупателей за исключением тех, кто проживает в России и Китае
SELECT * FROM customer WHERE country NOT IN ("Россия","Кита")
Вывод пустых / не пустых значений
// Выводим те записи, где НЕ введено значение state
SELECT * FROM customer WHERE state IS NULL
// Выводим те записи, где введено значение state
SELECT * FROM customer WHERE state IS NOT NULL
Вывод значений приблизительно соответствующих нужным
Выводим только тех служащих, у которых фамилия начинается на букву А. Знак % означает любые символы
SELECT * FROM employee WHERE name_last LIKE "А%"
Вывод значений приблизительно соответствующих нужным
Например, мы не помним как правильно пишется «Кабанов» или «Кобанов», тогда нужно будет воспользоваться знаком подчеркивания, который означает любой символ
SELECT * FROM employee WHERE name_last LIKE "К_банов"
Диапазон значений
Можем вывести только тех, кто получает от 25000 до 50000 включительно
SELECT * FROM salary BETWEEN 25000 AND 50000
Использование нескольких таблиц
SELECT o.order_no, o.amount_paid, c.company
FROM orders AS o, customer AS с
WHERE o.custno=c.custno AND c.city="Тюмень"
Выводим номер и сумму заказа из таблицы заказов и компанию сделавшую заказ из таблицы покупателей.
На самом деле, при правильном запроектированной базе данных данного вида запрос является самым частым, поэтому в MySQL был введен специальный оператор, который работает в разы быстрее, чем выше написанный код.
SELECT o.order_no, o.amount_paid, с.company
FROM orders AS o
LEFT JOIN customer AS с ON (с.custno=o.custno)
Настоятельно рекомендую использовать в своих запросах именно этот код
Вложенные подзапросы
SELECT * FROM employee WHERE salary=(SELECT MAX(salary) FROM employee)
Мы научились выводить максимальное значение, например, можем узнать максимальный оклад у служащих, но куда было бы интереснее узнать, кто тот счастливчик. Именно здесь используется механизм вложенных подзапросов
Внимание! Вложенные подзапросы являются одним из самых узких мест в SQL серверах. Совместно со своей гибкостью и мощностью, они также существенно увеличивают нагрузку на сервер. Что приводит к катастрофическому замедлению работы других пользователей. Очень часты случаи рекурсивных вызовов при вложенных запросах. Поэтому настоятельно рекомендую НЕ использовать вложенные запросы, а разбивать их на более мелкие. Либо использовать вышеописанную комбинацию LEFT JOIN. Помимо этого данного вида запросы являются повышенным очагом нарушения безопасности.. Если все таки вы решили использовать вложенные подзапросы, то проектируйте их очень внимательно и первоначальные запуски сделать на копиях баз.