Лабораторная № 4 Тема: Изучение языка Transact SQL. Цель работы: изучить оператор SELECT, сортировку и выборку строк, научится связывать таблицы. Задание 1: Оператор SELECT Использование оператора SELECT Синтаксис оператора SELECT очень сложен и состоит из множества фраз и ключевых слов, но базовая его структура достаточно проста: SELECT [TOP n [PERCENT]] список_столбцов FROM список_источников [WHERE условие_поиска] [ORDER BY выражение] Обязательными являются только первая и вторая фразы (разделы) оператора SELECT. Первая фраза, SELECT список_столбцов, задает столбцы, которые будут возвращены запросом. Список столбцов может содержать реальные столбцы из таблицы и представления (виды), на которых основывается запрос, либо содержать вычисляемые столбцы, получаемые из оригинальных столбцов. Вторая фраза, FROM список_источников, задает таблицы и представления, на которых основывается запрос. Выборка всех столбцов Простейшим случаем использования оператора SELECT является выборка всех столбцов из одной таблицы. Как большинство версий языка SQL, Transact-SQL позволяет вам использовать знак звездочки (*), если вы хотите задать все столбцы, поэтому в этом простом случае оператор будет иметь следующую форму: SELECT * FROM имя_таблицы 1.Выберите все столбцы Выборка подмножества столбцов Хотя синтаксис SELECT * чрезвычайно прост в использовании, вам часто требуется, чтобы ваш запрос возвращал только избранные столбцы. Для этого следует указать столбцы в перечне список_столбцов оператора SELECT. 1.Выполните отбор столбцов с использованием панели SQL Pane 2.Выполните отбор столбцов с помощью панели диаграмм Diagram Pane Создание псевдонимов столбцов По умолчанию столбец в запросе носит то же имя, которое он имел в исходной таблице или строке. Однако полезно иметь возможность изменять имя, либо по причине слишком большой его длины ("MyLongColumnNameWithNoSpaces"), либо просто потому, что оно слишком непривычно для его отображения пользователю ("pk_varchar_50_col32713"). Оператор SELECT позволяет переименовывать столбцы в запросе путем создания псевдонимов. Псевдоним изменяет имя столбца в запросе, но не в таблице. 1.Создайте псевдоним столбца с использованием панели сетки Grid Pane 2.Создайте псевдоним столбца с использованием панели SQL Pane Создание вычисляемых столбцов В дополнение к столбцам, которые просто отображают информацию из исходных таблиц и представлений, ваш запрос может также содержать столбцы, которые вычисляются на основе исходных данных, функций SQL Server или любой их комбинации. Вычисляемый столбец создается путем задания выражения в качестве столбца. 1.Создайте вычисляемый столбец с использованием панели сетки Grid Pane 2.Создайте вычисляемый столбец с использованием панели SQL Pane Использование фразы TOP n Когда вы выбираете команду Return Top (Показать первые) из контекстного меню таблицы, SQL Server использует фразу TOP n, чтобы создать отображение в конструкторе запросов Query Designer. Помимо задания определенного количества строк, вы также можете отобразить часть строк в процентах от общего их количества, воспользовавшись фразой TOP n PERCENT, которая, как можно ожидать, возвращает указанный процент строк. 1.Отобразите первые 5 строк 2.Отобразите первые 5 процентов строк Задание 2: Сортировка и выборка строк Фраза ORDER BY Фраза ORDER BY является необязательным компонентом оператора SELECT. Она позволяет вам задавать порядок, в котором строки будут возвращены. Можно задать несколько столбцов, а строки возвращать в порядке возрастания или убывания. Сортировка строк Простейшая форма фразы ORDER BY предоставляет имя одного столбца, который будет использоваться для сортировки строк, возвращенных запросом. 1.Отсортируйте строки с использованием панели сетки Grid Pane. 2.Отсортируйте строки с использованием панели SQL Pane Сортировка по нескольким столбцам Вы можете указывать в фразе ORDER BY несколько столбцов. Если указано несколько столбцов, порядок их следования определяет результат – SQL Server будет сортировать строки по первому столбцу, затем по второму столбцу и т.д. Совет. Упражнения в этом разделе используют таблицу OilOdors, которая действует как узловая таблица, устанавливающая отношение много-ко-многим между таблицами Oils и Odors. Обычно вам следует использовать внешние ключи, содержащиеся в этой таблице, с помощью связывания. Как это делается, мы рассмотрим в следующем уроке, "Связывание таблиц". 1.Отсортируйте строки с использованием панели сетки Grid Pane 2.Отсортируйте строки с использованием панели SQL Pane Фраза WHERE Воспользовавшись необязательной фразой WHERE оператора SELECT, вы можете задать подмножество строк, которые будут возвращены. Например, вам нужно увидеть лишь тех клиентов, которые за предыдущие 12 месяцев приобрели вашу продукцию на сумму более $10000, либо только названия продуктов, начинающихся с буквы "R". Эти условия вы можете указать с помощью фразы WHERE. Базовая фраза WHERE Основу фразы WHERE составляет условие выбора, которое определяет, какие строки будут возвращены. Базовая структура фразы WHERE имеет форму WHERE <столбец> <оператор> < значение>. SQL Server предоставляет полный объем операторов сравнения, показанных в таблице 13-1. Таблица 13-1. Операторы сравнения Оператор Значение = Равно > Больше чем < Меньше чем >= Больше или равно <= Меньше или равно <> Не равно При этом <значение>, указанное в условии WHERE, может быть константой, такой как "Red" или 10000, либо выражением, возвращающим значение, таким как GETDATE. Аналогично, значение <столбец> может быть получено с помощью функций TransactSQL, такой как LEFT, которые возвращают указанное число символов, отсчитываемое от начала строки. 1.Задайте условие WHERE с использованием панели сетки Grid Pane 2.Задайте условие WHERE с использованием панели SQL Pane Использование специальных операторов В дополнение к стандартному формату фразы WHERE <столбец> <оператор> <значение> SQL Server также поддерживает три специальных оператора: LIKE, который позволяет вам указывать значения с использованием символов замещения, представленных в таблице 13-2; BETWEEN, который позволяет вам задавать диапазон значений; и IN, который позволяет вам задавать множество, в котором содержатся значения. Таблица 13-2. Символы замещения. Символ замещения Значение Пример - Любой одиночный символ LIKE 'a_' Соответствует "at" и "as", но не "and" % Любая строка из нуля или более символов LIKE '%t%' Соответствует "at", "bat" и "together", но не "lucky" [] Любой определенный символ внутри области или множества LIKE '[a-c]at' Соответствует "cat" и "bat", но не "fat" LIKE '[ab]at' Соответствует "bat", но не "cat" [^] Любой определенный символ, не LIKE '[^c]at' Соответствует "bat" и "fat", содержащийся в области или но не "cat" множестве 1.Задайте условие WHERE с использованием оператора LIKE 2.Задайте условие WHERE с использованием оператора BETWEEN 3.Задайте условие WHERE с использованием оператора IN Объединение условий отбора Помимо задания фразы WHERE с использованием одиночных выражений в формате <столбец> <оператор> <значение>, вы можете также объединять выражения с помощью логических операторов OR или AND. Условие WHERE в формате <выражение> OR <выражение> будет возвращать строки, которые отвечают одному из условий, в то время как условие WHERE в формате <выражение> AND <выражение> возвращает строки, отвечающие обоим условиям. 1.Задайте составное условие с использованием оператора OR 2.Задайте составное условие с использованием оператора AND Задание 3: Связывание таблиц Использование фразы FROM Базовая структура фразы FROM содержит имя одной таблицы или представления. Однако чтобы воспользоваться всей мощью реляционной модели, нужно иметь возможность извлекать столбцы из нескольких таблиц и представлений в одном запросе. Фраза FROM предоставляет механизм для осуществления этой операции с использованием следующего синтаксиса: FROM <таблица_или_предствление> <оператор_связывания> <таблица_или_предствление> ON <условие_связывания> Условие связывания представляет собой выражение, аналогичное условию отбора, используемого в фразе WHERE. Оно задает, как будут соответствовать строки в двух таблицах. Большинство операций связывания выполняются на основе выражений эквивалентности, таких как Column A = Column B. Однако SQL Server поддерживает любые логические операторы, а условие связывания может быть сколь угодно сложным, состоящим из нескольких выражений, соединенных с помощью логических операторов AND или OR. таким же образом, как во фразе WHERE с несколькими условиями отбора. Выражение связывания может быть повторено для добавления дополнительных таблиц и представлений в запрос. Синтаксис для связывания нескольких таблиц следующий: FROM <таблица_или_вид> <оператор_связывания> <таблица_или_вид> ON <условие_связывания> <оператор_связывания> <таблица_или_вид> ON <условие_связывания> . . . Имеется теоретическое ограничение в 256 таблиц на запрос, однако весьма маловероятно, что вам когда-либо понадобится более пяти или шести таблиц, а обычно используется два или три. На деле, если вы обнаружите, что вам требуется связать более десяти таблиц в одном запросе, внимательно изучите схему вашей базы данных, чтобы убедиться, что она корректно нормализована. Создание связей Связи могут быть созданы в конструкторе запросов Query Designer либо с использованием панели сетки Grid Pane, либо с использованием панели SQL Pane. Панелью сетки Grid Pane лучше пользоваться, если вы связываете таблицы, которые являются формально зависимыми в схеме базы данных, поскольку конструктор запросов будет создавать связь между ними автоматически. Альтернативой является применение панели SQL Pane, которая обеспечивает большую гибкость. Имена объектов Если вы работаете с единственной таблицей или представлением, у вас скорее всего не будет неопределенности относительно исходного столбца, поскольку все имена столбцов в таблице должны быть уникальными. Если же вы работаете с несколькими таблицами в запросе, вам следует проявлять осторожность при указании имен столбцов. Полная спецификация для любого объекта базы данных определяется четырьмя идентификаторами: именем сервера, именем базы данных, именем владельца и именем объекта. Идентификаторы отделяются друг от друга точками. Таким образом, полное имя для таблицы Oils в моей системе будет следующим: BUNNY.Aromatherapy.dbo.Oils Некоторые объекты, такие как таблицы и представления, содержат другие объекты. Чтобы сослаться на один из таких объектов (в нашем случае, на столбцы), вы должны просто добавить его имя после имени объекта. Полное имя для столбца OilID таблицы Oils будет следующим: BUNNY.Aromatherapy.dbo.Oils.OilID К счастью, чтобы избежать двусмысленности, вам достаточно задать лишь часть иерархии. В запросе, основанном на единственной таблице, например, имени столбца само по себе будет достаточно для идентификации. Если же запрос связывает более одной таблицы, и таблицы содержат столбцы с одинаковыми именами, вы должны включить имя таблицы в имя объекта: Oils.OilID OilProperties.OilID делают различия вполне очевидными. Внутреннее связывание Наиболее распространенной формой связывания является внутреннее связывание. Внутреннее связывание возвращает только те строки, для которых условие связывания имеет значение TRUE. 1.Свяжите две таблицы с использованием панели диаграмм Diagram Pane 2.Свяжите две таблицы с использованием панели SQL Pane 3.Свяжите несколько таблиц с использованием панели диаграмм Diagram Pane 4.Свяжите несколько таблиц с использованием панели SQL Pane Внешнее связывание Иногда вам надо, чтобы запрос возвращал все строки из одной или более таблиц, независимо от того, имеют ли они соответствующие строки в другой таблице. Это осуществляется с помощью внешнего связывания, которое может быть левым, правым и полным. Левое внешнее связывание возвращает все строки из левой таблицы во фразе JOIN и только те строки из правой таблицы, для которых условие связывания истинно (имеет значение TRUE). Синтаксис для левого связывания следующий: FROM ЛеваяТаблица LEFT OUTER JOIN ПраваяТаблица ON <условие_связывания> Например, оператор SELECT, представленный ниже, возвращает все строки в таблице Oils, отвечающие значениям PlantPart из таблицы PlantParts, для которых задан PlantPartID. Если отвечающих значениям строк в таблице PlantParts нет, запрос возвратит NULL в качестве значения PlantPart для строки. SELECT Oils.OilName, PlantParts.PlantPart FROM Oils LEFT OUTER JOIN PlantParts ON Oils.PlantPartID = PlantParts.PlantPartID Правое внешнее связывание является противоположностью левого внешнего связывания: оно возвращает все строки из правой таблицы в фразе JOIN и отвечающие условию значения из левой таблицы, в то время как полное внешнее связывание возвращает все строки из обеих таблиц, отвечающие условию. 1.Создайте левое внешнее связывание с использованием панели диаграмм Diagram Pane 2.Создайте правую внешнюю связь с использованием панели SQL Pane Объединения Последним типом связывания является объединения. Объединения помещают результаты выполнения двух различных операторов SELECT в один набор строк. При внутреннем и внешнем связывании столбцы из двух таблиц размещаются построчно. Объединение размещает строки из двух таблиц в одном столбце, как если бы вы взяли два набора строк и получили единое их множество, в котором один набор располагается под другим. Фактический порядок строк в полученном результате определяется фразой ORDER BY. Синтаксис объединения отличается от синтаксиса связывания. Он имеет следующий вид: SELECT <список_столбцов> FROM <имя_таблицы> UNION [ALL] SELECT <список_столбцов> FROM <имя_таблицы> [ORDER BY <список_столбцов>] Вы можете добавить в запрос столько операторов UNION SELECT, сколько захотите (с учетом ограничения в 256 таблиц), но все операторы SELECT должны возвращать одно и то же количество столбцов одинаковых или совместимых типов и в одном и том же порядке. Первый оператор SELECT будет определять имена столбцов, а фраза ORDER BY последнего оператора SELECT будет определять порядок сортировки. По умолчанию SQL Server не допускает дублирования строк в результате выполнения запроса с объединением. Если вы, однако, укажете UNION ALL, дублирующиеся строки будут сохранены. 1.Создайте объединение Задание 4: Избирательная выборка данных Оператор 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, либо путем установки свойств запроса. 1.Создайте запрос SELECT DISTINCT с использованием панели диаграмм Diagram Pane 2.Создайте запрос SELECT DISTINCT с использованием панели SQL Pane Оператор 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. 1.Создайте запрос GROUP BY с использованием панели сетки Grid Pane 2.Создайте запрос GROUP BY с использованием панели SQL Pane Использование фразы 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 1.Создайте запрос с использованием ключевого слова HAVING в панели сетки Grid Pane 2.Создайте запрос с использованием фразы HAVING в панели SQL Pane Выполните практические задания 15,16,17,18 из учебника. Для ответа по лабораторной работе необходимо ответить на следующие вопросы: Выборка всех столбцов. Выборка подмножества столбцов. Отбор столбцов с помощью Diagram Pane. Создание псевдонима столбцов с помощью Grid Pane. Создание псевдонима столбца с помощью SQL Pane. Уметь использовать фразу Top n. Сортировать строки с помощью Grid Pane, SQL Pane, по нескольким столбцам. 8. Задание условия WHERE c операторами LIKE, BETWEEN, IF, OR, AND. 9. Связывание таблиц с помощью Diagram Pane, SQL Pane. 10.Создание внешнего соединения. 11.Создание объединения. 12.Создание запроса Select Distinct с помощью Diagram Pane, SQL Pane. 13.Создание запроса с группировкой (GROUP BY). 14.Создание запроса c использованием HAVING. 1. 2. 3. 4. 5. 6. 7.