Geek Notes

заметки/статьи/переводы на темы программирования, алгоритмов и etc.

Выборка данных SQL. Операторы SELECT, in, BETWEEN, LIKE, GROUP by и HAVING

В данном конспекте рассмотрим как производится выборка данных из базы с помощью оператора SELECT. Использование DISTINCT. Операторы сравнения и логические операторы применяемые в предложении WHERE. А также операторы IN, BETWEEN и LIKE. Агрегатные функции типа COUNT(), AVG() и т.д. И рассмотрим применение операторов GROUP BY и HAVING.

И так простейшая выборка данных осуществляется оператором SELECT:

1
SELECT * FROM  table_name;

Для выбора не повторяющихся значений в столбцах применяется ключевое слово DISTINCT:

1
SELECT DISTINCT * FROM  table_name;

DISTINCT применяется ко всем столбцам указанным в операторе SELECT

Для фильтрования выборки используется предложение WHERE, после которого описывается предикат.

В предложении WHERE могут использоваться следующие операторы:

  • Операторы сравнения: =, >, <, >=, <=, <>. Если в в выражении будет вычислен NULL, то результатом будет UNKNOWN.

  • Логические операторы: - OR, AND, NOT могут принимать три значения: TRUE, FALSE и UNKNOWN.

  • IN — оператор перечисления:

1
2
SELECT * FROM Salespeople
WHERE  city IN ('Barcelona', 'London');
  • BETWEEN — выбор из диапазона:
1
2
SELECT * FROM Salespeople
WHERE  comm BETWEEN .10 AND .20;
  • LIKE — оператор поиска подстрок в текстах. В шаблонах используются два символа: ‘_’ (соответствует одному символу) и ‘%’ (соответствует любому символу, даже его отсутствие).

  • IS NULL и IS NOT NULL — проверка на NULL.

Агрегатные функции.

Агрегатные функции применяются сразу для всей группы столбцов, которые были выбраны, и вычисляет для них единственное значение.

Список всех агрегатных функций:

  • COUNT — количество строк или не пустых значений (не NULL):
  • SUM — сумма значений
  • AVG — среднее арифметическое:
  • MAX — максимально значений
  • MIN — минимально значений

Применение GROUP BY и HAVING.

GROUP BY позволяет выделить из отдельного столбца группы значений этого столбца и применить у ним агрегатную функцию. Допустим, есть у нас такая таблица:

При выполнении следующего запроса, сначала все выбранные строки группируются по одинаковому значению в поле City, затем к каждой группе применяется агрегатная функция MAX():

1
2
3
SELECT Cnum, Cname, City, MAX( Rating )
FROM Customers
GROUP BY City

Результат:

Так как предложение WHERE фильтрует строки до того как они попадут в группы, т.е. до применения GROUP BY, то его использовать не возможно, если нам надо задать условие для всей группы. Для этого есть оператор HAVING, который похож на WHERE только задает фильтр сразу к группе.

Допустим, есть следующая таблица:

При выполнении следующего запроса, сначала все строки группируются по одинаковым сочетаиням значений в полях Snum и Odate, а затем, к каждой группе применяет опертор MAX():

1
2
3
4
SELECT Snum, Odate, MAX( Amt )
FROM Orders
GROUP BY Snum, Odate
HAVING MAX( Amt ) > 3000.00

Результат: