Афоризм
Как жаль, я Вам теперь не по карману.
Наталья Резник
Последние статьи

 • RawContacts
Необработанные контакты в Android
 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
 • Random, Math.random
Генерация случайных чисел
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
 • Grid с навигатором
Описание и пример Gridp с навигатором
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
 • Оператор SELECT
Использование SQL-оператора SELECT

Оператор чтения SELECT

Оператор SELECT позволяет делать выборки записей из базы данных и имеет наиболее сложную структуру среди всех операторов языка SQL. Для выборки записей можно использовать как отдельную таблицу или представление View, так и совокупность таблиц и представлений. Ниже представлены SQL-запросы с оператором select для выборки всех записей таблицы (table_name) и представления (view_name).

select * from <table_name>;
select * from <view_name>; 

Столбцы и строки результирующего набора не упорядочены. Чтобы упорядочить поля результирующего набора, их следует перечислить через запятую в нужном порядке после оператора SELECT. Например :

select id, name, price, quantity, photo 
    from <table_name>;

1. SELECT DISTINCT

Записи таблицы могут хранить в столбцах (полях) повторяющиеся значения. Для чтения неповторяющихся значений следует использовать выражение SELECT DISTINCT.

select distinct <col_name1>, <col_name2>, …
  from <table_name>; 

2. Условие WHERE

Условие where следует использовать для получения определенного результирующего набор записей :

select <col_name1>, <col_name2>, …
  from <table_name>
    where <condition>; 

В условии condition можно использовать :

  • сравнение текста с использованием операндов 'like', 'in', '=', '<>';
  • сравнение численных значений с использованием операндов 'between', '=', '<>', '>=', '<=' и т.д.;
  • логические операции объединения выражений AND, OR и NOT.

2.1. Текстовые условия

Оператор LIKE
используется в условии WHERE для определения шаблона выборки текстовых значений. В шаблоне разрешается использовать два трафаретных символа :

  • символ подчеркивания '_', который можно применять вместо любого единичного символа;
  • символ процента '%' заменяет последовательность любых символов; число символов может быть от 0 и более.

Если проверяемое значение соответствует образцу с учетом символов, то условие истинно TRUE. В таблице приводится несколько примеров определения шаблонов выборки текстовых записей.

like 'abc%' Любые строки, начинающиеся с «abc»;
like 'abc_' Строки, начинающиеся с «abc» и длиной строго 4 символа;
like '%q' Любая последовательность символов, обязательно заканчивающаяся символом «q»;
like '%Post%' Любая последовательность символов, содержащая слово «Post» в любой позиции строки;
like '% % %' Текст, содержащий не менее 2-х пробелов, например, "World Wide Web"

Примеры SQL-скриптов использования оператора like :

select * from cities
   where name like '%Rostov%'; 
   
select * from users
   where last_name like 'Golub%'; 

Если в шаблоне необходимо указать трафаретный символ, то условие следует расширить экранирующим символом с оператором ESCAPE. Этот экранирующий символ будет использоваться в образце перед трафаретным символом, сообщая о том, что последний следует трактовать как обычный символ. Например, если необходимо выбрать все значения, содержащие символ «_», то шаблон '%_%' приведет к тому, что будут возвращены все записи. Или, как выбрать оператором like записи, имеющие значения «75%». Для этих случаев шаблоны условий следует записать следующим образом :

-- шаблон чтения записей с символом '_'
like '%#_%' ESCAPE '#'

-- шаблон чтения записей со значением '75%'
like '75|%' ESCAPE '|'

В данных примерах оператор LIKE идентифицирует символы '#' и '|' как экранирующие, после которых в шаблоне выборки символ не относится к трафаретным.

В конце страницы приводится несколько примеров использования LIKE.

Оператор IN
позволяет включить в шаблон условий несколько значений. Например в следующем запросе выберем всех пользователей только из трех отделов :

select * from users
  where department IN ('programmer', 'manager', 'saler'); 

2.2. Оператор BETWEEN

Оператор BETWEEN используется для выбора записей из определённого диапазона. Синтаксис использования BETWEEN определяет необходимость вставки оператора AND между двумя граничными значениями :

select <col_name1>, <col_name2>, …
  from <table_name>
     where <col_name2> BETWEEN <value1> AND <value2>;

В условии могут быть использованы как числовые значения, так и даты. Например, для выборки автомобилей стоимостью в пределах от 800000 до 1200000 запрос будет иметь следующий вид :

select * from autos
   where price between 800000 and 1200000;

Если необходимо выбрать значения, которые не попадают в заданный диапазон, то перед BETWEEN следует установить NOT :

select *
  from <table_name>
     where <col_name> NOT BETWEEN <value1> AND <value2>;

Чтобы выбрать события в период 01.05.2019 по 11.05.2019 условие WHERE в Oracle выглядело бы следующим образом :

where <col_date> 
       BETWEEN TO_DATE ('2019-05-01', 'YYYY-MM-DD') AND
               TO_DATE ('2019-05-11', 'YYYY-MM-DD');

Примечание : каждый провайдер БД использует собственные функции работы с датами. Функция TO_DATE сервера БД Oracle конвертирует текстовое представление даты в значение DATE. В MySQL данное преобразование выполняет функция STR_TO_DATE.

3. Оператор GROUP BY

Оператор GROUP BY, как правило, используется с агрегатными функциями (COUNT, MAX, MIN, SUM и AVG) для группировки выходных значений. Если в выражении SELECT имеются агрегатные функции и не вошедшие в них наименования столбцов, то все столбцы списка SELECT, не вошедшие в агрегатные функции, должны быть указаны в предложении GROUP BY. В результате такой выборки все выходные строки запроса разбиваются на группы, характеризуемые одинаковыми комбинациями значений в этих столбцах. После чего к каждой группе будут применены агрегатные функции. Необходимо иметь в виду, что все значения NULL трактуются оператором GROUP BY как равные, Т.е при группировке по полю, содержащему NULL-значения, все такие записи попадут в одну группу.

Если в предложении SELECT отсутствуют агрегатные функции, но SQL-запрос включает GROUP BY, то сервер вернет по одной строке из каждой группы. Эту возможность, как с ключевым словом DISTINCT, можно использовать для исключения дубликатов значений в результирующем наборе.

В следующем запросе для каждой модели авто определяется их количество и средняя стоимость. Все строки с одинаковыми значениями model образуют группу; на выходе SELECT вычисляются количество значений и средняя цена для каждой группы :

SELECT model, 
       COUNT(model) AS Cnt_model, 
       AVG(price) AS Avg_price
  FROM autos
    GROUP BY model;

4. Оператор HAVING

Оператор HAVING не является обязательным и применяется исключительно в связке с GROUP BY. Если условие WHERE с оператором GROUP BY позволяет определить условия выборки и группировки данных, то HAVING содержит условия, касающиеся выбранных данных уже непосредственно в самих группах. Т.е. команда HAVING позволяет фильтровать результат выбранной группировки. В следующем примере представлены 2 запроса. Первый запрос вернет суммы зарплат по подразделениям. А второй запрос вернет подразделения, в которых сумма зарплат выше 500000.

-- сумма зарплат по подразделениям
SELECT department, SUM(salary) as summa
   FROM employees 
      GROUP BY department;

-- сумма зарплат по подразделениям
SELECT department, SUM(salary) as summa
   FROM employees 
      GROUP BY department
        HAVING summa > 500000;

5. Оператор ORDER BY

При выборке записей часто бывает важно получить их в определенном упорядоченном виде. Сортировка записей может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она также является сортировкой по возрастанию или убыванию. Сортировка символьных полей также может быть выполнена в любых направлениях – от А до Яа..я (A..Za..z) и наоборот.

Для выполнения сортировки используется оператор ORDER BY, после которого указывается одно или несколько полей. По умолчанию ORDER BY выполняет сортировку по возрастанию. Чтобы определить направление сортировки необходимо после имени столбца указать ключевое слово ASC (сортировка по возрастанию) или DESC (по убыванию).

SELECT <col_name1>, <col_name2>, …
  FROM <table_name>
  ORDER BY <col_name1>, <col_name2>, … ASC|DESC; 

6. Операторы JOIN, UNION

Часто бывает необходимо выполнить операции соединения данных из двух наборов в один результирующий набор. Для этого следует использовать рассмотренный на отдельной странице оператор соединения JOIN. Т.е. оператор JOIN позволяет из одного или нескольких наборов данных сделать выборку записей с общими значениями полей.

Для объединения результатов двух и более SQL-запросов в единую выборку применяется оператор UNION. Т.е. оператор UNION к одной выборке данных добавляет другие выборки.

Формирование результата выборки

Иногда «лень» создавать таблицу и «загонять» в неё данные, чтобы получить какие-либо тестовые выборки. Ниже представлен SQL-запрос в БД Oracle, позволяющий без таблицы получить набор записей. После этого можно с данным набором записей выполнять какие-либо манипуляции, связанные с фильтрацией, группированием, сортировкой и т.д. В представленном коде выполняются проверки использования различных условий с оператором LIKE.

SELECT * FROM 
(
SELECT '3%' name from dual
  UNION ALL 
SELECT '3%%' from dual
  UNION ALL 
SELECT '33' from dual
  UNION ALL
SELECT '4%%' from dual
  UNION ALL 
SELECT 'a3%%' from dual
  UNION ALL 
SELECT 'xyz' from dual
  UNION ALL 
SELECT 'xyz 3% abc' from dual
  UNION ALL
SELECT '3a2b' from dual
  UNION ALL 
SELECT 'C23OH' from dual
  UNION ALL 
SELECT 'C32OH' from dual
) tbl
-- WHERE name LIKE '3%'
-- WHERE name LIKE '3#%' ESCAPE '#'
 WHERE name LIKE '%3|%%' ESCAPE '|'
  Рейтинг@Mail.ru