Postgresql видалення дублікатів і ключове слово distinct

Видалення дублікатів і ключове слово 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. Як видно з результатів першої команди, при перерахуванні всіх трьох умов без круглих дужок команда інтерпретується неправильно. Додавання круглих дужок призводить до того, що обчислення в дужках виробляються до перевірки зовнішніх умов.

Схожі статті