Программирование в Microsoft SQL Server 2000

Избирательная выборка данных

Разбить на страницы
Показывать лекцию целиком

Вы научитесь:

  • использовать ключевое слово DISTINCT для возвращения запросом только уникальных строк;
  • использовать фразу GROUP BY для создания запроса, возвращающего сводную информацию;
  • использовать фразу HAVING для ограничения строк, возвращаемых запросом GROUP BY.
  • Оператор SELECT DISTINCT

    Хотя одной из целей применения реляционной модели базы данных является устранение повторяющихся данных, большинство баз данных неизбежно будут содержать одинаковые значения в нескольких строках. Например, таблица, содержащая информацию об адресах клиентов, будет, вероятно, включать одни и те же значения страны и штата для многих строк. Это не создает повторы строк и вполне допустимо, поскольку каждое значение штата является атрибутом отдельного клиента. Аналогично, таблица на стороне многих в отношении один-ко-многим может иметь любое заданное значение внешнего ключа, повторяющееся многократно. Это не только не является неправильным, но и необходимо для реляционной целостности базы данных.

    Однако это повторение может дать двусмысленные результаты после выполнения запроса. Для упомянутой таблицы клиентов Customer, содержащей, допустим, 10000 строк, из которых 90 процентов относятся к клиентам из Калифорнии, следующий запрос возвратит значение CA (штат Калифорния) 9000 раз – результат, который едва ли можно назвать полезным.

    SELECT State FROM Customer

    Использование ключевого слова DISTINCT в подобных ситуациях является спасением. Будучи помещенным непосредственно после SELECT, ключевое слово DISTINCT инструктирует SQL Server избегать дублирующихся строк в результирующем множестве. При этом следующий запрос возвратит каждое значение State для штата только один раз, что вам и нужно.

    SELECT DISTINCT State FROM Customer

    Совет. Ключевое слово DISTINCT имеет антипод ALL, который инструктирует SQL Server возвращать все строки, как уникальные, так или нет. Поскольку этот режим действует для оператора SELECT, слово ALL обычно не используется, но вы можете его включить, если при этом синтаксис запроса становится более понятным и очевидным.

    Использование оператора SELECT DISTINCT

    Ключевое слово DISTINCT может быть задано в операторе SQL конструктора запросов Query Designer, либо путем установки свойств запроса.

    Создайте запрос SELECT DISTINCT с использованием панели диаграмм Diagram Pane

  • Откройте конструктор запросов Query Designer для таблицы Oils, щелкнув правой кнопкой мыши на имени таблицы в рабочей панели Details Pane, укажите на Open Table (Открытие таблицы) и выберите Return All Rows (Показать все строки).
  • Отобразите панель диаграмм Diagram Pane, щелкнув на кнопке Diagram Pane (Панель диаграмм)в панели инструментов конструктора запросов.
  • Нажмите кнопку Add Table (Добавить таблицу).Конструктор запросов Query Designer отобразит диалоговое окно Add Table (Добавление таблицы).
  • Выберите PlantParts в списке таблиц и нажмите Add (Добавить). Конструктор запросов Query Designer добавит таблицу в запрос.
  • Нажмите кнопку Close (Закрыть), чтобы закрыть диалоговое окно.
  • Щелкните на кнопке SQL Pane (Панель SQL)в панели инструментов конструктора запросов. Конструктор запросов Query Designer отобразит панель SQL Pane.
  • Удалите знак
  • Щелкните на кнопке SQL Pane (Панель SQL) в панели инструментов конструктора запросов. (Нажмите ОК, если конструктор запросов отобразит сообщение об ошибке в синтаксисе оператора SELECT.) Конструктор запросов Query Designer скроет панель SQL Pane.
  • Внимание! Когда вы открываете конструктор запросов Query Designer, базовым оператором SQL всегда является SELECT *. Выбор определенных столбцов в панели диаграмм Diagram Pane приводит к добавлению их в список столбцов. Эта возможность предусмотрена Microsoft.

  • В панели диаграмм Diagram Pane выберите для отображения только столбец PlantPart таблицы PlantParts.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит каждое значение PlantPart много раз.
  • Щелкните правой кнопкой мыши на пустой области панели диаграмм Diagram Pane и выберите Properties (Свойства). Конструктор запросов Query Designer отобразит диалоговое окно Properties (Свойства).
  • Установите флажок DISTINCT Values (Различать значения).
  • Нажмите кнопку Close (Закрыть), чтобы закрыть диалоговое окно.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос.Конструктор запросов Query Designer отобразит каждое значение лишь единожды.
  • Создайте запрос SELECT DISTINCT с использованием панели SQL Pane

  • Скройте панель диаграмм Diagram Paneи отобразите панель SQL Pane.
  • Замените имеющийся оператор SELECT на следующий:
    SELECT	DISTINCT PlantTypes.PlantType
    FROM	Oils INNER JOIN
    	PlantTypes ON Oils.PlantTypeID = PlantTypes.PlantTypeID
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит отличающиеся значения PlantType, имеющиеся в таблице Oils.
  • Оператор GROUP BY

    Ключевое слово DISTINCT инструктирует SQL Server возвращать только уникальные строки, в то время как фраза GROUP BY инструктирует SQL Server объединять строки с одинаковыми значениями в столбце или в столбцах, заданных во фразе, в одну строку.

    Внимание! Каждая строка, включенная во фразу GROUP BY, должна быть включена в выход запроса.

    Фраза GROUP BY чаще всего используется совместно с функцией агрегирования. Функция агрегирования выполняет вычисления над множеством значений и возвращает в результате единственное значение. Наиболее распространенными функциями агрегирования, используемой с GROUP BY, являются: функция MIN, которая возвращает наименьшее значение во множестве, функция MAX, которая возвращает наибольшее значение во множестве, и функция COUNT, возвращающая количество значений во множестве.

    Использование ключевого слова GROUP BY

    Фраза GROUP BY может быть задана с использованием любой из панелей конструктора запросов, но лучше всего это делать с помощью панели сетки Grid Pane и панели SQL Pane.

    Создайте запрос GROUP BY с использованием панели сетки Grid Pane

  • Скройте панель SQL Paneи отобразите панель сетки Grid Pane.
  • Добавьте в запрос столбец OilName.
  • Нажмите кнопку Group By (Сгруппировать)в панели инструментов конструктора запросов. Конструктор запросов Query Designer добавит столбец Group By в сетку и установит оба значения равными Group By.
  • Измените значение ячейки Group By для строки OilName на Count.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит количество элементов OilName для каждого типа PlantType.
  • Создайте запрос GROUP BY с использованием панели SQL Pane

  • Скройте панель сетки Grid Paneи отобразите панель SQL Pane.
  • Замените имеющийся оператор SELECT следующим:
    SELECT	PlantParts.PlantPart, Count(Oils.OilName) AS NumberOfOils
    FROM	Oils INNER JOIN
    	PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID
    GROUP BY PlantParts.PlantPart
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит количество элементов OilName для каждого типа PlantPart.
  • Использование фразы HAVING

    Фраза HAVING ограничивает строки, возвращаемые фразой GROUP BY, таким же образом, как фраза WHERE ограничивает строки, возвращаемые фразой SELECT. В один оператор SELECT может быть включена и фраза WHERE, и фраза HAVING – при этом фраза WHERE применяется до операции группировки, а фраза HAVING – после нее.

    Синтаксис фразы HAVING идентичен синтаксису фразы WHERE, за исключением того, что фраза HAVING может включать одну из функций агрегирования, включенных в список столбцов фразы SELECT. Заметим, однако, что вы должны повторять функцию агрегирования. Например, фраза HAVING, используемая в следующем операторе, является корректной:

    SELECT	PlantParts.PlantPart, Count(Oils.OilName) as NumberOfOils
    FROM	Oils INNER JOIN
    	PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID
    GROUP BY PlantParts.PlantPart
    HAVING Count(Oils.OilName) > 3

    Однако вы не можете использовать псевдоним для функции Count в фразе HAVING. Следовательно, приведенная ниже фраза HAVING не будет правильной:

    HAVING NumberOfOils > 3

    Создайте запрос с использованием ключевого слова HAVING в панели сетки Grid Pane

  • Скройте панель SQL Paneи отобразите панель сетки Grid Pane.
  • Добавьте > 5 в ячейку Criteria столбца OilName.
  • Нажмите кнопку Run (Выполнить)в панели инструментов конструктора запросов, чтобы повторно исполнить запрос.
  • Создайте запрос с использованием фразы HAVING в панели SQL Pane

  • Скройте панель сетки Grid Paneи отобразите панель SQL Pane.
  • Измените фразу
  • Нажмите кнопку Run (Выполнить)в панели инструментов конструктора запросов, чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит только те элементы PlantParts, которым соответствуют менее пяти типов масел.
  • Краткое содержание

    Чтобы ... Синтаксис оператора SQL
    Использовать запрос SELECT DISTINCT SELECT DISTINCT <список_столбцов> ...
    Создать запрос GROUP BY
    SELECT ...
    FROM ... 
    GROUP BY <группировка_по_столбцам>
    Использовать фразу HAVING, чтобы ограничить строки в запросе GROUP BY
    SELECT ...
    FROM ... 
    GROUP BY <группировка_по_столбцам> HAVING <условие_выбора>
    Страницы:

    Вы научитесь:

  • использовать ключевое слово DISTINCT для возвращения запросом только уникальных строк;
  • использовать фразу GROUP BY для создания запроса, возвращающего сводную информацию;
  • использовать фразу HAVING для ограничения строк, возвращаемых запросом GROUP BY.
  • Оператор SELECT DISTINCT

    Хотя одной из целей применения реляционной модели базы данных является устранение повторяющихся данных, большинство баз данных неизбежно будут содержать одинаковые значения в нескольких строках. Например, таблица, содержащая информацию об адресах клиентов, будет, вероятно, включать одни и те же значения страны и штата для многих строк. Это не создает повторы строк и вполне допустимо, поскольку каждое значение штата является атрибутом отдельного клиента. Аналогично, таблица на стороне многих в отношении один-ко-многим может иметь любое заданное значение внешнего ключа, повторяющееся многократно. Это не только не является неправильным, но и необходимо для реляционной целостности базы данных.

    Однако это повторение может дать двусмысленные результаты после выполнения запроса. Для упомянутой таблицы клиентов Customer, содержащей, допустим, 10000 строк, из которых 90 процентов относятся к клиентам из Калифорнии, следующий запрос возвратит значение CA (штат Калифорния) 9000 раз – результат, который едва ли можно назвать полезным.

    SELECT State FROM Customer

    Использование ключевого слова DISTINCT в подобных ситуациях является спасением. Будучи помещенным непосредственно после SELECT, ключевое слово DISTINCT инструктирует SQL Server избегать дублирующихся строк в результирующем множестве. При этом следующий запрос возвратит каждое значение State для штата только один раз, что вам и нужно.

    SELECT DISTINCT State FROM Customer

    Совет. Ключевое слово DISTINCT имеет антипод ALL, который инструктирует SQL Server возвращать все строки, как уникальные, так или нет. Поскольку этот режим действует для оператора SELECT, слово ALL обычно не используется, но вы можете его включить, если при этом синтаксис запроса становится более понятным и очевидным.

    Использование оператора SELECT DISTINCT

    Ключевое слово DISTINCT может быть задано в операторе SQL конструктора запросов Query Designer, либо путем установки свойств запроса.

    Создайте запрос SELECT DISTINCT с использованием панели диаграмм Diagram Pane

  • Откройте конструктор запросов Query Designer для таблицы Oils, щелкнув правой кнопкой мыши на имени таблицы в рабочей панели Details Pane, укажите на Open Table (Открытие таблицы) и выберите Return All Rows (Показать все строки).
  • Отобразите панель диаграмм Diagram Pane, щелкнув на кнопке Diagram Pane (Панель диаграмм)в панели инструментов конструктора запросов.
  • Нажмите кнопку Add Table (Добавить таблицу).Конструктор запросов Query Designer отобразит диалоговое окно Add Table (Добавление таблицы).
  • Выберите PlantParts в списке таблиц и нажмите Add (Добавить). Конструктор запросов Query Designer добавит таблицу в запрос.
  • Нажмите кнопку Close (Закрыть), чтобы закрыть диалоговое окно.
  • Щелкните на кнопке SQL Pane (Панель SQL)в панели инструментов конструктора запросов. Конструктор запросов Query Designer отобразит панель SQL Pane.
  • Удалите знак
  • Щелкните на кнопке SQL Pane (Панель SQL) в панели инструментов конструктора запросов. (Нажмите ОК, если конструктор запросов отобразит сообщение об ошибке в синтаксисе оператора SELECT.) Конструктор запросов Query Designer скроет панель SQL Pane.
  • Внимание! Когда вы открываете конструктор запросов Query Designer, базовым оператором SQL всегда является SELECT *. Выбор определенных столбцов в панели диаграмм Diagram Pane приводит к добавлению их в список столбцов. Эта возможность предусмотрена Microsoft.

  • В панели диаграмм Diagram Pane выберите для отображения только столбец PlantPart таблицы PlantParts.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит каждое значение PlantPart много раз.
  • Щелкните правой кнопкой мыши на пустой области панели диаграмм Diagram Pane и выберите Properties (Свойства). Конструктор запросов Query Designer отобразит диалоговое окно Properties (Свойства).
  • Установите флажок DISTINCT Values (Различать значения).
  • Нажмите кнопку Close (Закрыть), чтобы закрыть диалоговое окно.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос.Конструктор запросов Query Designer отобразит каждое значение лишь единожды.
  • Создайте запрос SELECT DISTINCT с использованием панели SQL Pane

  • Скройте панель диаграмм Diagram Paneи отобразите панель SQL Pane.
  • Замените имеющийся оператор SELECT на следующий:
    SELECT	DISTINCT PlantTypes.PlantType
    FROM	Oils INNER JOIN
    	PlantTypes ON Oils.PlantTypeID = PlantTypes.PlantTypeID
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит отличающиеся значения PlantType, имеющиеся в таблице Oils.
  • Оператор GROUP BY

    Ключевое слово DISTINCT инструктирует SQL Server возвращать только уникальные строки, в то время как фраза GROUP BY инструктирует SQL Server объединять строки с одинаковыми значениями в столбце или в столбцах, заданных во фразе, в одну строку.

    Внимание! Каждая строка, включенная во фразу GROUP BY, должна быть включена в выход запроса.

    Фраза GROUP BY чаще всего используется совместно с функцией агрегирования. Функция агрегирования выполняет вычисления над множеством значений и возвращает в результате единственное значение. Наиболее распространенными функциями агрегирования, используемой с GROUP BY, являются: функция MIN, которая возвращает наименьшее значение во множестве, функция MAX, которая возвращает наибольшее значение во множестве, и функция COUNT, возвращающая количество значений во множестве.

    Использование ключевого слова GROUP BY

    Фраза GROUP BY может быть задана с использованием любой из панелей конструктора запросов, но лучше всего это делать с помощью панели сетки Grid Pane и панели SQL Pane.

    Создайте запрос GROUP BY с использованием панели сетки Grid Pane

  • Скройте панель SQL Paneи отобразите панель сетки Grid Pane.
  • Добавьте в запрос столбец OilName.
  • Нажмите кнопку Group By (Сгруппировать)в панели инструментов конструктора запросов. Конструктор запросов Query Designer добавит столбец Group By в сетку и установит оба значения равными Group By.
  • Измените значение ячейки Group By для строки OilName на Count.
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит количество элементов OilName для каждого типа PlantType.
  • Создайте запрос GROUP BY с использованием панели SQL Pane

  • Скройте панель сетки Grid Paneи отобразите панель SQL Pane.
  • Замените имеющийся оператор SELECT следующим:
    SELECT	PlantParts.PlantPart, Count(Oils.OilName) AS NumberOfOils
    FROM	Oils INNER JOIN
    	PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID
    GROUP BY PlantParts.PlantPart
  • Нажмите кнопку Run (Выполнить), чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит количество элементов OilName для каждого типа PlantPart.
  • Использование фразы HAVING

    Фраза HAVING ограничивает строки, возвращаемые фразой GROUP BY, таким же образом, как фраза WHERE ограничивает строки, возвращаемые фразой SELECT. В один оператор SELECT может быть включена и фраза WHERE, и фраза HAVING – при этом фраза WHERE применяется до операции группировки, а фраза HAVING – после нее.

    Синтаксис фразы HAVING идентичен синтаксису фразы WHERE, за исключением того, что фраза HAVING может включать одну из функций агрегирования, включенных в список столбцов фразы SELECT. Заметим, однако, что вы должны повторять функцию агрегирования. Например, фраза HAVING, используемая в следующем операторе, является корректной:

    SELECT	PlantParts.PlantPart, Count(Oils.OilName) as NumberOfOils
    FROM	Oils INNER JOIN
    	PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID
    GROUP BY PlantParts.PlantPart
    HAVING Count(Oils.OilName) > 3

    Однако вы не можете использовать псевдоним для функции Count в фразе HAVING. Следовательно, приведенная ниже фраза HAVING не будет правильной:

    HAVING NumberOfOils > 3

    Создайте запрос с использованием ключевого слова HAVING в панели сетки Grid Pane

  • Скройте панель SQL Paneи отобразите панель сетки Grid Pane.
  • Добавьте > 5 в ячейку Criteria столбца OilName.
  • Нажмите кнопку Run (Выполнить)в панели инструментов конструктора запросов, чтобы повторно исполнить запрос.
  • Создайте запрос с использованием фразы HAVING в панели SQL Pane

  • Скройте панель сетки Grid Paneи отобразите панель SQL Pane.
  • Измените фразу
  • Нажмите кнопку Run (Выполнить)в панели инструментов конструктора запросов, чтобы повторно исполнить запрос. Конструктор запросов Query Designer отобразит только те элементы PlantParts, которым соответствуют менее пяти типов масел.
  • Краткое содержание

    Чтобы ... Синтаксис оператора SQL
    Использовать запрос SELECT DISTINCT SELECT DISTINCT <список_столбцов> ...
    Создать запрос GROUP BY
    SELECT ...
    FROM ... 
    GROUP BY <группировка_по_столбцам>
    Использовать фразу HAVING, чтобы ограничить строки в запросе GROUP BY
    SELECT ...
    FROM ... 
    GROUP BY <группировка_по_столбцам> HAVING <условие_выбора>
    Вернуться к учебному плану