Видалення дублікатів і ключове слово DISTINCT
Необов'язкове ключове слово DISTINCT виключає дублікати з підсумкового набору. Якщо ключове слово ON відсутня, з результатів запиту з ключовим словом DISTINCT виключаються записи з повторюваними значеннями цільових полів. Перевіряються лише поля, що входять до цільової список SELECT.
Лістинг 4.31. Ключове слово DISTINCT
booktown = # SELECT DISTINCT author_id
booktown- # FROM books;
booktown = # SELECT DISTINCT ON (author_id)
booktown- # author_id. title
booktown- # FROM books;
16 | Little Women
115 | The Tell-Tale Heart
1212 | Practical PostgreSQL
тисяча шістсот сорок чотири | Dynamic Anatomy
1809 | The Cat in the Hat
2031 | Goodnight Moon
4156 | The Shining
7805 | Programming Python
7806 | Perl Cookbook
15990 | Franklin in the Dark
25041 | The Velveteen Rabbit
У другому запиті використана інша форма DISTINCT з явним перерахуванням полів (або виразів), що перевіряються на наявність дублікатів. У цьому випадку запит також повертає 13 записів, оскільки секція ON вказує, що дублікати перевіряються за значенням поля author_i d. Без секції ON запит верн) і б всі 15 записів, оскільки за замовчуванням PostgreSQL перевіряє повний збіг всіх полів.
У загальному випадку PostgreSQL вибирає записи, що виключаються з підсумкового набору при наявності секції ON, на свій розсуд. Якщо в запит разом з DISTINCT входить секція ORDER BY, ви можете самостійно задати порядок вибірки полів так, щоб потрібні записи виявилися на початку. Сортування записів розглядається в підрозділі «Сортування записів».
Якщо замість виключення всіх дублікатів досить згрупувати записи з повторюваними значеннями деякого критерію, скористайтеся секцією GROUP BY, описаної в підрозділі «Угруповання записів».
У секції WHERE задається логічне умова, якому повинні задовольняти записи підсумкового набору. На практиці команда SELECT майже завжди містить як мінімум одну уточнюючу секцію WHERE.
Припустимо, ви хочете отримати список всіх книг про комп'ютерні технології в базі даних booktown. У цих книг поле subject_id одно 4. Відповідно до секції WHERE включається оператор =, який перевіряє цю умову. Приклад приведений в лістингу 4.32.
Лістинг 4.32. Проста секція WHERE
booktown = # SELECT * FROM books
booktown- # WHERE subject_id = 4;
id | title | author_id | subject_id
41472 | Practical PostgreSQL | 1212 | 4
41473 | Programming Python | 7805 | 4
41477 | Learning PostgreSQ L | 7805 | 4
41478 | Perl Cookbook | 7806 | 4
Запит з лістингу 4.32 повертає тільки ті записи, у яких поле subject_id збігається з целочисленной константою 4. Підсумковий набір містить всього 4 записи книг про комп'ютери замість 15 записів, наведених в лістингу 4.23.
Секція WHERE може містити кілька умов, об'єднаних логічними операторами (наприклад, AND або OR) і повертають одне логічне значення. Припустимо, вас цікавлять всі записи для книг про комп'ютери, які, крім того, що вони про комп'ютери, написані Марком Лутцем. Запит уточнюється об'єднанням двох умов за допомогою логічного оператора AND. Можливий і інший варіант - наприклад, пошук всіх книг, присвячених комп'ютерним технологіям або мистецтву; в цьому випадку дві умови об'єднуються логічним оператором OR. У лістингу 4.33 продемонстровані обидва сценарії з ключовими словами AND і OR.
Лістинг 4.33. Об'єднання умов в секції WHERE
booktown = # SELECT title FROM books
booktown- # WHERE subject_id = 4
booktown- # AND author_id = 7805;
booktown = # SELECT title FROM books
booktown- # WHERE subject_id = 4
booktown- # AND author_id = 0;
У другій команді SELECT в лістингу 4.33 колишнє перша умова (книги з комп'ютерної тематики) об'єднується з другим умовою: книги з мистецтва (поле subject_id дорівнює 0). В результаті обсяг підсумкового набору збільшується до п'яти записів, кожна з яких задовольняє хоча б одному з цих умов.
Кількість умов, що об'єднуються в секції WHERE, не обмежена, хоча при наявності двох і більше умов зазвичай виконується угруповання за допомогою круглих дужок, що наочно демонструє логічний зв'язок між умовами. Лістинг 4.34 показує, як просте додавання круглих дужок впливає на результат виконання команди.
Лістинг 4.34. Угруповання умов за допомогою круглих дужок
booktown = # SELECT * FROM books
booktown- # WHERE author_id = +1866
booktown- # AND subject_id = 15
booktown- # OR subject_id = 3;
id | title | autho_id | subject_id
4513 | Dune | 1 866 | 15
1234 | The Velveteen Rabbit | 25041 | 3
booktown = # SELECT * FROM books
booktown- # WHERE author_id = +1866
booktown- # AND (subject_id = 15
booktown- # OR subject_id = 3);
id | title | author_id | subject_id
4513 | Dune | 1 866 | 15
У цьому прикладі продемонстровані дві спроби вибірки з бази даних booktown записів, у яких поле author_id одно 1866. Крім того, поле subject_id має дорівнювати або 15, або 3. Як видно з результатів першої команди, при перерахуванні всіх трьох умов без круглих дужок команда інтерпретується неправильно. Додавання круглих дужок призводить до того, що обчислення в дужках виробляються до перевірки зовнішніх умов.