Оператор SELECT осуществляет выборку из базы данных и имеет наиболее сложную структуру среди всех операторов языка SQL. Практически любой пользователь баз данных в состоянии написать простейший оператор SELECT типа
который осуществляет выборку всех записей из объекта БД табличного типа с именем 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 |
Следует отметить, что вертикальная выборка может содержать
дубликаты строк в том случае, если она не содержит
потенциального ключа, однозначно определяющего запись. В таблице 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 (все строки), которое принимается по умолчанию.
Чтобы упорядочить строки результирующего набора, можно выполнить сортировку по любому количеству полей, указанных в предложении 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 |
Горизонтальную выборку реализует
предложение 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 | Цена не превышает удвоенной частоты процессора. |
Рекомендуемые упражнения:
2,
3,
4,
42.