|
Программирование >> Программирование баз данных
из результирующего набора строки с дублирующимися данными) или в операторе COUNT {), если требуется выполнить подсчет количества неповторяющихся значений. Для ознакомления с особенностями конструкции DISTINCT рассмотрим четыре небольших запроса, которые в основном не требуют пояснений. Прежде всего выполним выборку из таблицы SalesOrderDetail всех строк со значениями SalesOrderlD от 43685 до 43687: SELECT SalesOrderlD FROM Sales.SalesOrderDetail WHERE SalesOrderlD BETWEEN 43685 AND 43687; Выполнение этого оператора приводит к получению следующих результатов: SalesOrderlD 43685 43685 43685 43685 43686 43686 43686 43687 43687 (9 row(s) affected) Теперь введем в действие конструкцию DISTINCT: SELECT DISTINCT SalesOrderlD FROM Sales.SalesOrderDetail WHERE SalesOrderlD BETWEEN 43685 AND 43687; В результате ситуация существенно изменяется: SalesOrderlD 43685 43686 43687 (3 row(s) affected) Теперь рассмотрим, какое влияние оказывает применение этой конструкции на результаты подсчета количества. Вернемся к первому из рассматриваемых запросов: SELECT COUNT(SalesOrderlD) FROM Sales.SalesOrderDetail WHERE SalesOrderlD BETWEEN 43685 AND 43687; Выполнение этого запроса приводит к получению значения количества, равного девяти: (1 row(s) affected) Но если мы укажем, что в результатах должны учитывать только неповторяющиеся данные: SELECT COUNT(DISTINCT SalesOrderlD) FROM Sales.SalesOrderDetail WHERE SalesOrderlD BETWEEN 43 6 85 AND 43 6 87; (1 row(s) affected) Следует отметить, что ключевое слово DISTINCT может использоваться с любой функцией агрегирования, но можно поставить под сомнение то, будут ли при этом иметь многие из этих функций какое-либо практическое значение. Например, трудно представить себе, для чего может потребоваться вычисление средних значений только по строкам, оставшимся после применения предиката DISTINCT. Ввод данных с помощью оператора insert Оператор INSERT имеет примерно такой основной синтаксис: INSERT [INTO] <table> [(column list)] VALUES (data values) Рассмотрим последовательно структуру этого оператора. Прежде всего отметим, что INSERT- оператор действия. Само ключевое слово INSERT сообщает СУБД SQL Server, что должна быть выполнена вставка данных, а все, что следует за этим ключевым словом, является уточнением деталей требуемого действия. Ключевое слово INTO главным образом предназначено лишь для уточнения. Его единственным назначением является повышение удобства чтения оператора. Без ключевого слова INTO можно полностью обойтись, но автор настоятельно рекомендует использовать его именно по той причине, по которой оно было предусмотрено в определении оператора, - благодаря ему значительно повышается удобство чтения. За указанными ключевыми словами следует имя таблицы, в которую должны быть вставлены данные. До сих пор синтаксис оператора вставки не представлял особых сложностей для изучения, а с этого момента мы переходим к рассмотрению немного более трудной темы: списка столбцов. Явно заданный список столбцов (в котором должен быть конкретно указан каждый столбец, принимающий вводимые значения) является необязательным, но если это явное определение не используется, то приходится соблюдать исключительную осторожность. Если явно заданный список столбцов не пред}смот-рен, то предполагается, что каждое значение в операторе INSERT должно соответствовать столбцу, находящемуся в той же порядковой позиции в строке таблицы, что и само вводимое значение (первое значение вводится в первый столбец, второе значение- во второй и т.д.). Кроме того, значение должно быть задано для каждого столбца, который не принимает NULL-значений и не имеет значения, заданного по умолчанию (пояснения к сказанному будут даны немного позже), пока не будет достигнут последний столбец. Короче говоря, в этой части оператора должен находиться список из одного или нескольких столбцов, данные для заполнения которых будут приведены в следующей части оператора. Наконец, задаются значения, которые должны быть вставлены в базу данных. Для этого могут применяться два способа: явно заданные значения и значения, полученные с помощью оператора SELECT. Для того чтобы задать значения, необходимо прежде всего ввести ключевое слово VALUES, а затем представить список значений, разделенных запятыми, который заключен в круглые скобки. Количество элементов в списке значений должно точно совпадать с количеством столбцов в списке столбцов. Тип данных каждого значения также должен совпадать или допус1сать неявное преобразование в тип данных столбца, которому соответствует это значение (сопоставление столбцов и вставляемых в них значений осуществляется с учетом порядка следования). Иногда разработчики задумываются над тем, следует ли задавать значение конкретно для каждого столбца. Но фактически рекомендуется при любых обстоятельствах указывать каждый столбец, применяемый для вставки данных, даже если используемое по умолчанию значение вставляется с помощью ключевого слова DEFAULT или явно задается NULL-значение. Ключевое слово DEFAULT сообщает СУБД SQL Server, что должно быть вставлено то значение, которое предусмотрено по умолчанию для данного столбца (если такое значение не предусмотрено, появляется ошибка). Соблюдение указанной рекомендации способствует повышению удобства кода для чтения, поскольку позволяет полностью определить, какие данные должны быть введены в таблицу. Кроме того, по мнению автора, явное указание имени каждого столбца способствует уменьшению количества ошибок, а также повышает вероятность того, что разработанные ранее операторы будут оставаться применимыми даже после тюго, как в дальнейшем в структуру таблицы будут внесены изменения. Например, предположим, что имеется оператор INSERT, который выглядит примерно так: INSERT INTO HumanResources.JobCandidate VALUES (1, NULL, DEFAULT); Как было сказано выше, если отдельный список столбцов не предусмотрен (вскоре будет описано, как предусмотреть в операторе список столбцов), то все значения должны быть заданы в том же порядке, в каком определены соответствующие им столбцы в таблице. Исключением из этого правила является ситуация, в которой таблица включает столбец идентификации, поскольку такой столбец при вводе данных не учитывается. В частности, ознакомление с определением таблицы HumanRescoures. Job-Candidate показывает, что оно начинается с определения столбца идентификации JobCandidatelD. Поскольку это- столбец идентификации, известно, что в системе его заполнение осуществляется путем автоматической выработки значения идентификации, поэтому в операторе вставки данных соответствующее значение должно быть пропущено. Эта книга предназначена для профессиональных разработчиков (а более подробные сведения изложены в книге Программирование баз Microsoft SQL Server 2005. Базовый курс), поэтому автор исходит из предположения, что читатель уже знаком с рассмат-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |