Типы данных
После того как таблица заполнена, можно легко получить информацию об имеющихся в наличии книгах. Для этого используется запрос SELECT, приведенный в листинге 3.18.
Листинг 3.18. Выборка данных по логическому признаку.
booktown=# SELECT * FROM dailyjnventory WHERE in_stock='yes': isbn in_stock 0385121679 | t 039480001X | t 044100590X t 0441172717 I t (4 rows)
В PostgreSQL предусмотрена возможность неявной выборки по значению true в логическом поле; для этого имя поля указывается без операторов или ключевых слов-модификаторов. В хорошо спроектированных таблицах такой подход помогает создавать более наглядные запросы. Пример приведен в листинге 3.19.
Листинг 3.19. Неявная выборка по логическому значению.
true booktown=# SELECT * FROM dailyjnventory WHERE in_stock; isbn | in_stock 0385121679 | t 039480001X | t 044100590X | t 0441172717 | t (4 rows)
Хотя в этом запросе не указана конкретная логическая величина, при отсутствии оператора сравнения подразумевается значение true.
Для выборки по значению false можно либо сравнить значение поля с любой из логических констант, перечисленных в табл. 3.11, либо поставить перед именем поля ключевое слово SQL NOT. Оба способа продемонстрированы в листинге 3.20.
Листинг 3.20. Выборка по логическому значению false.
booktown=# SELECT * FROM dailyjnventory WHERE in_stock = 'no'; isbn | in_stock 0451198492 f 0394900014 f (2 rows) booktown=# SELECT * FROM dailyjnventory WHERE NOT in_stock: isbn | in_stock 0451198492 | f 0394900014 | f (2 rows)
Этот пример убедительно доказывает, что при проектировании языка SQL учитывался фактор наглядности и удобочитаемости программ. При грамотном выборе имен таблиц и полей запрос почти не отличается от обычной фразы на английском языке.
Сравнение значений логических полей с константами из табл. 3.11 может осуществляться при помощи оператора неравенства != (например, WHERE in_stock!='t'). Таким образом, следующие три синтаксические формы эквивалентны:
SELECT * FROM daily_iinventory WHERE NOT injtock: SELECT * FROM dailyjnventory WHERE in_stock = 'no1: SELECT * FROM dailyjnventory WHERE in_stock!= 't':
Возможно, вы обратили внимание на то, что в листинге 3.17 в таблицу вставляется семь записей, а суммарное количество записей при двух выборках (для поля i n_stock, равного true и false) только шесть. Дело в том, что в последней операции вставки в листинге 3.17 значение поля i n_stock не указано, поэтому в записи книги с кодом ISBN равным 0451160916 поле in_stock равно NULL.
Как упоминалось выше, величина NULL не интерпретируется как true или false, поэтому для выборки по значению NULL необходимо использовать условие IS NULL. Также можно воспользоваться оператором !=, но тогда возникают проблемы с адаптацией программы для других СУБД. Пример запроса SQL с условием IS NULL:
booktown=# SELECT * FROM dailyjnventory WHERE in_stock IS NULL: isbn | 1n_stock 0451160916 | (1 row)
Поскольку IS NULL является обычным условием SQL, для обновления всех случайных значений NULL в поле in_stock можно воспользоваться командой UPDATE, приведенной в листинге 3.21.
Листинг 3.21. Исправление случайных значений NULL.
booktown=# UPDATE dailyjnventory SET in_stock = Т WHERE in_stock IS NULL; UPDATE 1