Сложные выражения со значением
Выражения со значением, типа записи
В SQL-86 и SQL-89 большинство операций выполнялось с одиночным значением или с одиночным столбцом из табличной строки. Чтобы работать с множеством значений, необходимо с помощью логических связок создать сложные выражения. (О логических связках вы узнаете в главе 9.)
С появлением SQL-92 в языке SQL появились выражения со значением типа записи, которые работают не с одиночными значениями или столбцами, а со списками значений или столбцов. Такое выражение является списком выражений со значением, заключенных в апострофы и отделяемых друг от друга запятыми. Можно работать сразу со всем значением типа записи или только с нужным его подмножеством.
В главе 6 рассказывалось, как с помощью оператора INSERT добавлять в таблицу новую строку. Чтобы это сделать, используется выражение со значением типа записи. Рассмотрите следующий пример. Данные сыра чеддер вводятся в поля FOODNAME (название продукта питания), CALORIES (калории), PROTEIN (белки), FAT (жиры), CARBOHYDRATE (углеводы) из таблицы FOODS (продукты питания).
INSERT INTO FOODS (FOODNAME, CALORIES, PROTEIN, FAT, CARBOHYDRATE) VALUES ('Сыр чеддер', 398, 25, 32.2, 2.1);
В этом примере выражением со значением типа записи является ('Сыр чеддер', 398, 25, 32.2, 2.1). Если таким образом в операторе INSERT использовать выражение со значением типа записи, в этом выражении могут быть значения NULL и значения по умолчанию. (Значением по умолчанию называется то, которое должно быть в табличном столбце, если явно не указано другое значение.) Вот, например, вполне соответствующее правилам выражение со значением типа записи:
('Сыр чеддер', 398, NULL, 32.2, DEFAULT).
Можно добавить в таблицу сразу множество строк, вставив в предложение VALUES множество выражений со значением типа записи. Например, так выглядит ввод в таблицу FOODS данных о таких продуктах: салат-латук, маргарин, горчица и спагетти:
INSERT INTO FOODS (FOODNAME, CALORIES, PROTEIN, FAT, CARBOHYDRATE) VALUES ('Салат-латук', 14, 1.2, 0.2, 2.5), ('Маргарин', 720, 0.6, 81.0, 0.4), ('Горчица', 75, 4.7, 4.4, 6.4), ('Спагетти', 148, 5.0, 0.5, 30.1);
Выражения со значением типа записи можно использовать, чтобы сэкономить место при вводе кода, предназначенного для сравнения. Предположим, у вас имеются две таблицы сданными о продуктах питания, одна из которых составлена на английском языке, а другая– на испанском. Требуется найти те строки первой таблицы, которые точно соответствуют строкам второй. Если не использовать выражения со значением типа записи, то, возможно, придется создавать такой код:
SELECT * FROM FOODS WHERE FOODS.CALORIES = COMIDA.CALORIA AND FOODS.PROTEIN = COMIDA.PROTEINA AND FOODS.FAT = COMIDA.GORDO AND FOODS.CARBOHYDRATE = COMIDA.CARBOHIDRATO;
А вот код, выполняющий те же действия, но составленный с помощью выражения со значением типа записи:
SELECT * FROM FOODS WHERE (FOODS.CALORIES, FOODS.PROTEIN, FOODS.FAT, FOODS.CARBOHYDRATE) = (COMIDA.CALORIA, COMIDA.PROTEINA, COMIDA.GORDO, COMIDA.CARBOHIDRATO);
В этом примере при вводе кода было сэкономлено не слишком много места. Больший выигрыш будет, если число сравниваемых столбцов будет больше. В крайнем случае (как, в частности, в этом примере), видимо, лучше придерживаться старого синтаксиса, так как он более понятен.
Впрочем, использование выражения со значением типа записи имеет дополнительное преимущество перед его аналогом с развернутым синтаксисом. Дело в том, что это выражение работает намного быстрее. В принципе, какая-либо очень умная реализация может анализировать развернутый синтаксис и выполнять его как выражение со значением типа записи. Однако на практике на такую хитроумную оптимизацию пока что не способна ни одна из имеющихся СУБД.