Материал: Базы данных и их безопасность. Плотников Д.Г

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Результатом служит копия полной таблицы S.

Здесь звезда или звездочка служит кратким обозначением списка всех имен полей в таблице (таблицах), указанной(ых) во фразе FROM (из) в том порядке, в котором эти поля определяются в соответствующем(их) предложении(ях) CREATE TABLE. Таким образом, записанное выше предложение SELECT эквивалентно следующему:

SELECT НОМЕР_ПОСТАВЩИКА, ФАМИЛИЯ, СОСТОЯНИЕ, ГОРОД

FROM S;

Обозначение в виде звездочки удобно для интерактивных запросов, поскольку оно уменьшает число ударов по клавишам. Однако оно таит потенциальную опасность при использовании во встроенном SQL (т. е. в предложениях SQL в прикладной программе), поскольку смысл знака «*» может измениться, если для этой программы перегенерируется план прикладной задачи, а в данном промежутке времени к рассматриваемой таблице был добавлен другой столбец. В этом пособии «SELECT *» будет использоваться только в таких контекстах, где так делать безопасно (в основном только в интерактивных контекстах), и фактическим пользователям рекомендуется поступать подобным образом.

Отметим, наконец, что «*» может уточняться именем соответствующей таблицы. Допустима, например, следующая форма записи:

SELECT S.*

FROM S;

Ограниченная выборка

Выдать номера поставщиков, которые находятся в Париже и имеют состояние большее, чем 20:

241

SELECT НОМЕР_ПОСТАВЩИКА

FROM S

WHERE ГОРОД = ’Париж’

AND СОСТОЯНИЕ > 20;

Результат:

НОМЕР_ПОСТАВЩИКА

S3

Условие, или предикат, следующий за ключевым словом WHERE, может включать операторы сравнения =, != (неравно), >, > =, <, и <=, булевские операторы AND (и), OR (или) и NOT (нет), а скобки указывают требуемый порядок вычислений. В таком предикате числа сравниваются алгебраически — отрицательные числа считаются меньшими, чем положительные, независимо от их абсолютной величины. Строки литер сравниваются в соответствии с их представлением в коде ASCII. Если нужно сравнить две строки литер, имеющих разные длины, более короткая строка концептуально дополняется справа пробелами для того, чтобы обе строки имели одинаковую длину перед тем, как будет осуществляться их сравнение.

Выборка с упорядочением

Выдать номера и состояния поставщиков, находящихся в Париже, в порядке убывания их состояния:

SELECT НОМЕР_ПОСТАВЩИКА, СОСТОЯНИЕ

FROM S

WHERE ГОРОД = ’Париж’

ORDER BY СОСТОЯНИЕ DESC;

Результат:

 

НОМЕР_ПОСТАВЩИКА

СОСТОЯНИЕ

S3

30

S2

10

242

В общем случае не гарантируется, что результирующая таблица будет упорядочена каким-либо определенным образом. Здесь, однако, пользователь специфицировал, что результат перед тем, как он будет показан, должен быть организован в определенной последовательности. Упорядочение может быть специфицировано таким же образом, как в предложении

CREATE INDEX:

имя—столбца [упорядочение] [, имя—столбца [упорядочение]] ...,

где «упорядочение», как и ранее, это ASC (возрастание) или DECS (убывание), и по умолчанию принимается ASC. Каждое «имя—столбца» должно идентифицировать некоторый столбец результирующей таблицы. Поэтому, например, следующее предложение недопустимо:

SELECT НОМЕР_ПОСТАВЩИКА

FROM S

ORDER BY ГОРОД;

Разрешается также идентифицировать столбцы во фразе ORDER BY (упорядочить по) «номерами—столбцов» вместо «имен—столбцов», где «номер—столбца» указывает порядковую позицию (слева направо) данного столбца в результирующей таблице запроса. Благодаря этому возможно упорядочение результата на основе «вычисляемых столбцов», которые не обладают именем. Например, упорядочить результат по возрастанию номера детали в рамках возрастания веса в граммах:

SELECT НОМЕР_ДЕТАЛИ, ВЕС*454

FROM P

ORDER BY 2, НОМЕР_ДЕТАЛИ; [или ORDER BY 2,1;]

Здесь «2» ссылается на второй столбец результирующей таблицы.

243

Получаем:

НОМЕР_ДЕТАЛИ

P1

5448

P5

5448

P4

6356

P2

7718

P3

7718

P6

8626

Выборка с использованием between (между)

Выдать сведения о деталях, вес которых находится в диапазоне от 16 до 19 включительно:

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM P

WHERE ВЕС BETWEEN 16 AND 19;

Имеем следующий результат:

 

 

НОМЕР_

НАЗВАНИЕ

ЦВЕТ

ВЕС

ГОРОД

ДЕТАЛИ

 

 

 

 

P2

Болт

З

17

Париж

 

 

еленый

 

 

P3

Винт

Голубой

17

Рим

P6

Блюм

Красный

19

Лондон

Может быть также специфицировано NOT BETWEEN (не принадлежит диапазону между), например:

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM P

WHERE ВЕС NOT BETWEEN 16 AND 19;

244

Получаем тогда:

 

 

 

НОМЕР_

НАЗВАНИЕ

ЦВЕТ

ВЕС

ГОРОД

ДЕТАЛИ

 

 

 

 

P1

Гайка

Красный

12

Лондон

P4

Винт

Красный

14

Лондон

P5

Кулачок

Голубой

12

Париж

Выборка с использованием in (принадлежит)

Выдать детали, вес которых равен 12, 16 или 17:

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM Р

WHERE ВЕС IN (12, 16, 17);

Результат:

 

 

 

НОМЕР_

НАЗВАНИЕ

ЦВЕТ

ВЕС

ГОРОД

ДЕТАЛИ

 

 

 

 

P1

Гайка

Красный

12

Лондон

P2

Болт

Зеленый

17

Париж

P3

Винт

Голубой

17

Рим

P5

Кулачок

Голубой

12

Париж

Предикат IN является в действительности просто краткой записью предиката, представляющего собой последовательность отдельных сравнений, соединенных операторами OR (или). Предыдущее предложение SELECT эквивалентно следующему:

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM Р WHERE ВЕС = 12 OR ВЕС = 16

OR ВЕС = 17;

245

Источник: https://studfile.net/preview/16563653/