четверг, 23 февраля 2017 г.

Оператор SELECT

Оператор SELECT

Оператор SELECT осуществляет выборку из базы данных и имеет наиболее сложную структуру среди всех операторов языка SQL. Практически любой пользователь баз данных в состоянии написать простейший оператор SELECT типа
SELECT * FROM PC;
который осуществляет выборку всех записей из объекта БД табличного типа с именем PC. При этом столбцы и строки результирующего набора не упорядочены. Чтобы упорядочить поля результирующего набора, их следует перечислить через запятую в нужном порядке после слова SELECT:
SELECT price, speed, hd, ram, cd, model, code
FROM Pc;

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

pricespeedhdramcdmodelcode
600.050056412x12321
850.07501412840x11212
600.050056412x12333
850.06001412840x11214
850.0600812840x11215
950.07502012850x12336
400.0500103212x12327
350.045086424x12328
350.0450103224x12329
350.0500103212x126010
980.09004012840x123311
Вертикальную проекцию таблицы РC можно получить, если перечислить только необходимые поля. Например, чтобы получить информацию только о скорости процессора и объеме оперативной памяти компьютеров, следует выполнить запрос:
SELECT speed, ram FROM PC;

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

speedram
50064
750128
50064
600128
600128
750128
50032
45064
45032
50032
900128
Следует отметить, что вертикальная выборка может содержать дубликаты строк в том случае, если она не содержит потенциального ключа, однозначно определяющего запись. В таблице PC потенциальным ключом является поле code, которое выбрано в качестве первичного ключа таблицы. Поскольку это поле отсутствует в запросе, в приведенном выше результирующем наборе имеются дубликаты строк (например, строки 1 и 3). Если требуется получить уникальные строки (скажем, нас интересуют только различные комбинации скорости процессора и объема памяти, а не характеристики всех имеющихся компьютеров), то можно использовать ключевое слово DISTINCT:
SELECT DISTINCT speed, ram FROM Pc;

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

speedram
45032
45064
50032
50064
600128
750128
900128
Помимо DISTINCT может применяться также ключевое слово ALL (все строки), которое принимается по умолчанию.
Чтобы упорядочить строки результирующего набора, можно выполнить сортировку по любому количеству полей, указанных в предложении 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

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

speedram
600128
750128
900128
45064
50064
45032
50032
Сортировку можно проводить по возрастанию (параметр ASC принимается по умолчанию) или по убыванию (параметр DESC). Сортировка по двум полям
SELECT DISTINCT speed, ram
FROM Pc
ORDER BY ram DESC, speed DESC

даст следующий результат:
speedram
900128
750128
600128
50064
45064
50032
45032
Горизонтальную выборку реализует предложение WHERE <предикат>, которое записывается после предложения FROM. При этом в результирующий набор попадут только те строки из источника записей, для каждой из которых значение предиката равно TRUE. То есть предикат проверяется для каждой записи. Например, запрос "получить информацию о частоте процессора и объеме оперативной памяти для компьютеров с ценой ниже $500" можно сформулировать следующим образом:
SELECT DISTINCT speed, ram
FROM Pc
WHERE price<500
ORDER BY 2 DESC

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

price < 1000Цена меньше $1000.
type = 'laptop'Типом продукции является ПК-блокнот.
cd = '24x'24-скоростной CD-ROM.
color <>'y'Не цветной принтер.
ram - 128 >0Объем оперативной памяти свыше 128 Mb.
price <= speed*2Цена не превышает удвоенной частоты процессора.
Рекомендуемые упражнения: 23442.