Читаем Справка по SQL онлайн бесплатно

<p>Справка по SQL</p><p>Извлечение данных. Оператор SELECT</p><p>Оператор SELECT</p>

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

SELECT * FROM PC;

который осуществляет выборку всех записей из объекта БД табличного типа с именем PC. При этом столбцы и строки результирующего набора не упорядочены. Чтобы упорядочить поля результирующего набора, их следует перечислить через запятую в нужном порядке после слова SELECT:

SELECT price, speed, hd, ram, cd, model, code

FROM Pc;

Ниже приводится результат выполнения этого запроса.

price

speed

hd

ram

cd

model

code

600.0

500

5

64

12x

1232

1

850.0

750

14

128

40x

1121

2

600.0

500

5

64

12x

1233

3

850.0

600

14

128

40x

1121

4

850.0

600

8

128

40x

1121

5

950.0

750

20

128

50x

1233

6

400.0

500

10

32

12x

1232

7

350.0

450

8

64

24x

1232

8

350.0

450

10

32

24x

1232

9

350.0

500

10

32

12x

1260

10

980.0

900

40

128

40x

1233

11

Вертикальную проекцию таблицы РC можно получить, если перечислить только необходимые поля. Например, чтобы получить информацию только о скорости процессора и объеме оперативной памяти компьютеров, следует выполнить запрос:

SELECT speed, ram FROM PC;

который вернет следующие данные:

speed

ram

500

64

750

128

500

64

600

128

600

128

750

128

500

32

450

64

450

32

500

32

900

128

<p>Устранение дубликатов. Предложение DISTINCT.</p>

Следует отметить, что вертикальная выборка может содержать дубликаты строк в том случае, если она не содержит потенциального ключа, однозначно определяющего запись. В таблице PC потенциальным ключом является поле code, которое выбрано в качестве первичного ключа таблицы. Поскольку это поле отсутствует в запросе, в приведенном выше результирующем наборе имеются дубликаты строк (например, строки 1 и 3). Если требуется получить уникальные строки (скажем, нас интересуют только различные комбинации скорости процессора и объема памяти, а не характеристики всех имеющихся компьютеров), то можно использовать ключевое слово DISTINCT:

SELECT DISTINCT speed, ram FROM Pc;

что даст такой результат:

speed

ram

450

32

450

64

500

32

500

64

600

128

750

128

900

128

Помимо DISTINCT может применяться также ключевое слово ALL (все строки), которое принимается по умолчанию.

<p>Сортировка результирующего набора. Предложение ORDER BY.</p>

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

SELECT DISTINCT speed, ram

FROM Pc

ORDER BY ram DESC

или

SELECT DISTINCT speed, ram

FROM Pc

ORDER BY 2 DESC

Результат, приведенный ниже, будет одним и тем же.

speed

ram

600

128

750

128

900

128

450

64

500

64

450

32

500

32

Сортировку можно проводить по возрастанию (параметр ASC принимается по умолчанию) или по убыванию (параметр DESC). Сортировка по двум полям

SELECT DISTINCT speed, ram

FROM Pc

ORDER BY ram DESC, speed DESC

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

speed

ram

900

128

750

128

600

128

500

64

450

64

500

32

450

32

<p>Выборка. Предложение WHERE.</p>

Горизонтальную выборку реализует предложение WHERE , которое записывается после предложения FROM. При этом в результирующий набор попадут только те строки из источника записей, для каждой из которых значение предиката равно TRUE. То есть предикат проверяется для каждой записи. Например, запрос "получить информацию о частоте процессора и объеме оперативной памяти для компьютеров с ценой ниже $500" можно сформулировать следующим образом:

SELECT DISTINCT speed, ram

FROM Pc

WHERE price<500

ORDER BY 2 DESC

speed

ram

450

64

450

32

500

32

В последнем запросе использовался предикат сравнения с использованием операции сравнения "<" (меньше чем). Кроме этой операции сравнения могут использоваться: "=" (равно), "" (больше), "=" (больше или равно), "<=" (меньше или равно) и "<>" (не равно). Выражения в предикатах сравнения могут содержать любые поля из таблиц, указанных в предложении FROM. Символьные строки и константы типа дата/время записываются в апострофах.

Примеры простых предикатов сравнения:

price < 1000

Цена меньше $1000.

type = 'laptop'

Типом продукции является ПК-блокнот.

cd = '24x'

24-скоростной CD-ROM.

color <>'y'

Не цветной принтер.

ram - 128 0

Объем оперативной памяти свыше 128 Mb.

price <= speed*2

Цена не превышает удвоенной частоты процессора.

<p>Булевы операторы AND, OR, NOT и трехзначная логика. Предикаты</p>

Предикаты представляют собой выражения, принимающие истинностное значение. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также круглые скобки для конкретизации порядка выполнения операций.

Предикат в языке SQL может принимать одно из трех значений TRUE (истина), FALSE (ложь) или UNKNOWN (неизвестно). Исключение составляют следующие предикаты: NULL (отсутствие значения), EXISTS (существование), UNIQUE (уникальность) и MATCH (совпадение), которые не могут принимать значение UNKNOWN.

Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 (где то между истинным и ложным).

* AND с двумя истинностными значениями дает минимум этих значений. Например, TRUE AND UNKNOWN будет равно UNKNOWN.

* OR с двумя истинностными значениями дает максимум этих значений. Например, FALSE OR UNKNOWN будет равно UNKNOWN.

* Отрицание истинностного значения равно 1 минус данное истинностное значение. Например, NOT UNKNOWN будет равно UNKNOWN.

<p>Предикаты сравнения</p>

Предикат сравнения представляет собой два выражения, соединяемых оператором сравнения. Имеется шесть традиционных операторов сравнения: =, >, <, >=, <=, <>.

Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением.

Данные типа CHARACTER STRING (символьные строки) сравниваются в соответствии с их алфавитной последовательностью. Если a1a2…an и b1b2…bn - две последовательности символов, то первая "меньше" второй, если а11, или а1=b1 и а22 и т.д. Считается также, что а1а2…аn1b2…bm, если n1а2…аn=b1b2…bn, т.е. если первая строка является префиксом второй. Например, 'folder'<'for', т.к. первые две буквы этих строк совпадают, а третья буква строки 'folder' предшествует третьей букве строки 'for'. Также справедливо неравенство 'bar' < 'barber', поскольку первая строка является префиксом второй.

Данные типа DATETIME (дата/время) сравниваются в хронологическом порядке.

Данные типа INTERVAL (временной интервал) преобразуются в соответствующие типы, а затем сравниваются как обычные числовые значения типа NUMERIC.

Пример. Получить информацию о компьютерах, имеющих частоту процессора не менее 500 Мгц и цену ниже $800:

SELECT * FROM Pc

WHERE speed = 500 AND price < 800;

Запрос возвращает следующие данные:

code

model

speed

ram

hd

cd

price

1

1232

500

64

5

12x

600.0

3

1233

500

64

5

12x

600.0

7

1232

500

32

10

12x

400.0

10

1260

500

32

10

12x

350.0

Пример. Получить информацию обо всех принтерах, которые не являются матричными и стоят меньше $300:

SELECT * FROM Printer

WHERE NOT (type = 'matrix') AND price < 300;

Результат выполнения запроса:

code

model

color

type

price

2

1433

y

Jet

270.0

3

1434

y

Jet

290.0

<p>Проверка попадания в диапазон. Предикат BETWEEN.</p>

Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND. Естественно, как и для предиката сравнения, выражения в предикате BETWEEN должны быть совместимы по типам.

Синтаксис BETWEEN::=

[NOT] BETWEEN

AND

Предикат

exp1 BETWEEN exp2 AND exp3

равносилен предикату

exp1=exp2 AND exp1<=exp3

А предикат

exp1 NOT BETWEEN exp2 AND exp3

равносилен предикату

NOT (exp1 BETWEEN exp2 AND exp3)

Если значение предиката exp1 BETWEEN exp2 AND exp3 равно TRUE, в общем случае это отнюдь не означает, что значение предиката exp1 BETWEEN exp3 AND exp2 тоже будет TRUE, так как первый можно интерпретировать как предикат

exp1=exp2 AND exp1<=exp3

а второй как

exp1=exp3 AND exp1<=exp2

Пример. Найти модель и частоту процессора компьютеров стоимостью от $400 до $600:

SELECT model, speed FROM Pc

WHERE price BETWEEN 400 AND 600;

model

speed

1232

500

1233

500

1232

500

<p>Проверка наличия значения в наборе. Предикат IN</p>

Предикат IN определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который либо явно определен, либо получен с помощью табличного подзапроса. Табличный подзапрос это обычный оператор SELECT, который создает одну или несколько строк для одного столбца, совместимого по типу данных со значением проверяемого выражения. Если целевой объект эквивалентен хотя бы одному из указанных в предложении IN значений, истинностное значение предиката IN будет равно TRUE. Если для каждого значения Х в предложении IN целевой объект<>X, истинностное значение будет равно FALSE. Если подзапрос выполняется, и результат не содержит ни одной строки (пустая таблица), предикат принимает значение FALSE. Когда не соблюдается ни одно из упомянутых выше условий, значение предиката равно UNKNOWN.

Синтаксис IN::=

[NOT] IN ()

| (,...)

Пример. Найти модель, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются накопителями 10 или 20 Мб:

SELECT model, speed, hd FROM Pc

WHERE hd IN (10, 20);

model

speed

hd

1233

750

20

1232

500

10

1232

450

10

1260

500

10

Пример. Найти модель, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются накопителями 10 или 20 Мб и выпускаются производителем А:

SELECT model, speed, hd

FROM Pc

WHERE hd IN (10, 20) AND

model IN (SELECT model FROM product

WHERE maker = 'A');

model

speed

hd

1233

750

20

1232

500

10

1232

450

10

<p>Переименование столбцов и вычисления в результирующем наборе</p>

Имена столбцов, указанные в предложении SELECT, можно переименовать. Это делает результаты более читабельными, поскольку имена полей в таблицах часто сокращают с целью упрощения набора. Ключевое слово AS, используемое для переименования, согласно стандарту можно и опустить, т.к. оно неявно подразумевается.

Например, запрос

SELECT ram AS Mb, hd Gb

FROM Pc

WHERE cd = '24x';

переименует столбец ram в Mb (мегабайты), а столбец hd в Gb (гигабайты). Этот запрос возвратит объемы оперативной памяти и жесткого диска для тех компьютеров, которые имеют 24-скоростной CD-ROM:

Mb

Gb

64

8

32

10

Переименование особенно желательно при использовании в предложении SELECT выражений для вычисления значения. Эти выражения позволяют получать данные, которые не находятся непосредственно в таблицах. Если выражение содержит имена столбцов таблицы, указанной в предложении FROM, то выражение подсчитывается для каждой строки выходных данных. Так, например, чтобы вывести объем оперативной памяти в килобайтах, можно написать:

SELECT ram * 1024 AS Kb, hd Gb

FROM Pc

WHERE cd = '24x';

Теперь будет получен следующий результат:

Kb

Gb

65536

8

32768

10

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

SELECT ram, 'Mb' AS ram_units, hd, 'Gb' AS hd_units

FROM Pc

WHERE cd = '24x';

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

ram

ram_units

hd

hd_units

64

Mb

8

Gb

32

Mb

10

Gb

Если же явно не указать имя для выражения, то будет использован способ именования по умолчанию, который зависит от используемой СУБД. Так в MS Access будут использованы имена типа выражение1 и т.д., а выходной столбец в MS SQL Server вообще не будет иметь заголовка.

<p>Проверка наличия подстроки. Предикат LIKE</p>

Синтаксис LIKE::=

[NOT] LIKE

[ESCAPE ]

Похожие книги