Основи створення запиту

Кожен може підійти до завдання створення запиту різними шляхами Я, наприклад, при створенні коду SQL розглядаю запит за допомогою логічного методу, хоча багато хто підходить до нього з точки зору конструктора запитів утиліти Management Studio Ще один підхід пропонує сам синтаксис інструкції SELECT Для того щоб проілюструвати декларативну природу запиту, слід сказати, що як би ви не вчинили, при фізичному виконанні запиту буде все одно використаний інший, оптимізований порядок

Синтаксична організація інструкції запиту

У своїй базовій формі інструкція SELECT повідомляє серверу, які дані слід витягти, зокрема, які стовпці і рядки з яких таблиць отримати і як сортувати дані

Нижче наведений спрощений синтаксис інструкції SELECT

SELECT *, стовпці або вирази

[FROM таблиця]

[JOIN таблиця ON умова]

[WHERE умови]

[GROUP BY стовпці]

[HAVING умови]

[ORDER BY стовпці]

Інструкція SELECT починається зі списку стовпців або виразів Як мінімум обовязково наявність хоча б одного виразу, все інше – необовязково Найпростіша з можливих інструкцій SELECT виглядає наступним чином:

SELECT 1

Пропозиція FROM в інструкції SELECT збирає всі джерела даних в єдиний набір, над яким працюватиме інша частина інструкції У пропозиції FROM може брати участь безліч таблиць, які посилаються один на одного за допомогою одного з декількох типів обєднань

Пропозиція WHERE фільтрує рядки набору даних, зібраного пропозицією FROM, на основі деяких умов

Агрегатні функції виконують в наборі даних підсумкові підрахунки Пропозиція GROUP BY може групувати великі безлічі в кілька невеликих підмножин на основі значень стовпців, згаданих у цьому реченні Потім агрегатні функції застосовуються до цих невеликим підмножини даних, після чого результати агрегатних функцій фільтруються за допомогою пропозиції HAVING

Нарешті, пропозиція ORDER BY визначає порядок сортування результуючого набору даних

Графічне подання інструкції запиту

Утиліта SQL Server Management Studio містить два основні інструменти формування та відправлення запитів: конструктор запитів (Query Designer) і редактор запитів (Query Editor) Конструктор запитів пропонує графічний метод створення запиту Водночас редактор запитів є ідеальним засобом разового вилучення даних, тому що не містить графіки, що вказує користувачу, як саме він повинен створювати запит У редакторі користувач працює з кодом SQL настільки близько, наскільки це можливо

З точки зору SQL Server не має значення, звідки саме походить запит Кожна інструкція оцінюється і обробляється як одна інструкція SQL

Коли дані відбираються за допомогою конструктора запитів, інструкції SQL можна вручну вводити і редагувати на третій панелі (рис 71) Нижня панель відображає результати виконання запиту в табличному або текстовому режимі також на ній відображаються різні повідомлення У вікні Object Browser відображається дерево всіх обєктів SQL Server, так само як і шаблони для створення нових обєктів за допомогою коду

Якщо у вікні запиту SQL виділений небудь текст, то після натискання клавіші Рада або клацання на кнопці Execute Query буде виконана тільки ця частина

запиту Це відмінний спосіб тестування коду SQL по частинах

Базою даних за замовчуванням є master, хоча цей факт сильно залежить С °ветвід налаштувань системи безпеки Перед виконанням запиту переконайтеся,

що в комбінованому списку на панелі інструментів обрана пользова-> тельская база даних також для цього можна скористатися командою use база_данних

Логічна структура запиту

Найкраще розглядати інструкції DML мови SQL з точки зору їх логічної організації Оскільки SQL є декларативною мовою, логічна організація може відповідати, а може і не відповідати фізичної схемою виконання запиту на сервері Логічна організація також частіше за все не схожа з синтаксичної Як би там не було, я рекомендую розглядати запит в наступному порядку

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp FROM Виконання запиту починається з підготовки початкового набору даних порядок збору джерел даних вказано в пропозиції FROM

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp WHERE Процес фільтрації, який визначається в реченні WHERE, відбирає тільки ті рядки, для яких кваліфікаційна характеристика містить фразу % First Aid% .

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Обчислення стовпців Як тільки рядки доступні і відфільтровані, з них відбираються і обчислюються стовпці, зазначені в списку інструкції SELECT

Додаткова Структура виразів SQL детально розглядається в розділі 8

інформація

4&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Консолідація При необхідності SQL може здійснювати консолідацію на безлічі даних, таких як пошук середнього значення, угруповання даних за значеннями в заданому стовпці, або перетворення результату в зведену (або перехресне) таблицю

Підсумкові функції SQL будуть розглянуті в розділі 11

Новинка

2005

5&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ORDER BY Як тільки рядки будуть зібрані пропозицією FROM і відфільтровані пропозицією WHERE, вони можуть бути відсортовані відповідно до пропозиції ORDER BY

6&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Предикат Після того як рядки відібрані, обчислення виконані і дані відсортовані в заданому порядку, SQL може обмежити результуючий набір тільки першими кількома рядками або повернути заданий набір рядків

Чим складніша інструкція SELECT, тим складніше стає розбір її логічної організації Індекси і таблиці, доступні оптимізаторові запитів, також впливають на побудову плану виконання запиту

Як тільки ви почнете мислити категоріями інструкції SELECT, а не графічного інтерфейсу користувача, розуміння структури цієї інструкції та вміння читати план виконання запиту допоможе вам обійти всі труднощі налагодження запиту

Фізична структура запиту

SQL Server приймає інструкцію SELECT і виробляє план виконання запиту Як ви вже здогадалися, це не що інше, як порядок виконуваних операцій (рис 72)

Пропозиція from для вибору джерел даних

Першим компонентом типової інструкції SELECT є пропозиція FROM У простих інструкціях відбору пропозицію FROM містить всього одну таблицю Однак ця пропозиція може містити й безліч повязаних між собою таблиць, підзапити в якості тимчасових таблиць, а також подання Максимальна кількість таблиць, доступних однієї інструкції SELECT, становить 256

Puc 72 Фізичний план виконання запиту сильно відрізняється від синтаксичної та логічної структури запиту

Пропозиція FROM закладає фундамент всіх наступних операцій інструкції SELECT Для того щоб стовпець таблиці містився в результуючому наборі даних, або був доступний умовами пропозиції WHERE, або став основою сортування в реченні ORDER BY, ця таблиця повинна бути згадана в реченні FROM

Можливі джерела даних

Мова SQL є надзвичайно гнучким і може приймати дані з безлічі різних типів джерел, згаданих у реченні FROM

Таблиці SQL Server

■ Підзапити, що виступають в ролі тимчасових таблиць, також звані підвибірка-ми та оперативними уявленнями Про них ми детально поговоримо в главі 10

■ Загальні табличні уявлення (ETS), вперше введені в SQL Server 2005, додають нові функції і форматування в традиційні підзапити

■ Уявлення, або збережені інструкції SELECT, доступні пропозицією FROM так, ніби вони є звичайними таблицями Уявлення ми докладно розглянемо в розділі 14

■ Певні користувачем функції, які повертають таблиці Більш повна інформація про користувача функції наведена в главі 22

■ Розподілені джерела даних, переміщені з інших баз та додатків (наприклад, Oracle, Excel або Access) за допомогою функції openquery () та інших, описаних у главі 15

■ Робота з джерелами даних XML виконується за допомогою запитів Xquery Більш докладно ця тема висвітлена в главі 31

Іменовані діапазони

Будь таблиці в реченні FROM може бути присвоєний іменований діапазон, або псевдонім Як тільки у таблиці зявляється псевдонім, по ньому до неї можна звертатися в інших пропозиціях інструкції SELECT Ключове слово AS є необовязковим, і часто його обходять увагою У наступному прикладі доступ здійснюється до таблиці Guide, але звернення до неї виконується за псевдонімом G:

– FROM таблиця [AS] переменная_діапазона USE СНА2

SELECT GLastName, GFifstName FROM Guide AS G

На сайті книги (wwwSQLServerBiblecom) ви знайдете приклади програм для всіх глав цієї книги, а також сценарії, створюють і заповнюють бази даних прикладів

На мові SQL команда use задає поточну базу даних Це програмна версія вибору бази даних в утиліті Management Studio

Імя таблиці

Якщо імя обєкта бази даних, такого як таблиця або стовпець, конфліктує з яким-або ключовим словом SQL, ви можете вказати серверу, що це саме імя обєкта, уклавши його в квадратні дужки Таблиця [Order] (замовлення) у базі даних OBXKites є типовим прикладом використання ключового слова в імені таблиці

USE OBXKites

SELECT OrderlD, OrderDate FROM [Order]

Незважаючи на те що вважається поганим тоном включати в імена обєктів бази даних прогалини, деякі розробники налаштовані по-іншому У даному випадку при вказівці імені обєкта також використовуються квадратні дужки Таблиця Order Details в базі даних прикладів Northwind ілюструє це правило:

USE Northwind

SELECT OrderID, ProductID, Quantity FROM [Order Details]

Чотирьохкомпонентні імена таблиць

Повне і правильне імя таблиці складається з чотирьох складових частин:

Сервер База_данних Схема Таблиця

Якщо таблиця знаходиться в поточній базі даних, то імена сервера і бази не обовязкові Хоча це й не обовязково, але вважається хорошим тоном вказувати явно імя схеми Зазвичай схемою є dbo – це спадщина попередніх версій SQL Server, де всі обєкти належали власникам, а імя dbo представляло власника бази даних

Використання четирьохкомпонентного імені дозволяє багаторазово використовувати план виконання запиту Вказівка ​​імені власника-це не тільки хороша програмістська практика, а й спосіб підвищення швидкодії запитів

Тепер, коли ви ознайомилися з чотирикомпонентної формою імен обєктів бази даних, у всіх прикладах книги в іменах в явному вигляді вказуватиметься власник

Додаткова Щоб ближче ознайомитися з питаннями схем, областей визначення і доз-^ інформація шений, зверніться до глави 40 Багаторазове використання планів виконання запитів розглядається в чолі 50

Умови WHERE

Умови WHERE фільтрують набір даних, сформований пропозицією FROM, і відбирають з нього тільки ті рядки, які увійдуть до результуючий набір даних Умови можуть посилатися на дані в таблицях, вираження, вбудовані скалярні функції SQL і призначені для користувача функції В умовах WHERE можуть також використовуватися оператори порівняння та символи макропідстановки, перераховані в табл 71

Одним із способів істотного підвищення продуктивності баз даних з архітектурою клієнт / сервер є дозвіл ядру бази даних виконувати роботу з обмеження числа що повертаються рядків, замість того щоб навантажувати викликає додаток непотрібними йому даними У той же час, якщо структура бази даних для виявлення потрібних рядків вимагає використання в реченні where функцій, продуктивність суттєво впаде, так як функції будуть виконуватися над кожною з рядків Таким чином, правильно складене пропозиція where, засноване на добре спланованою структурі бази даних, є самим головним важелем підвищення продуктивності запитів в руках розробника

Таблиця 71 Стандартні оператори порівняння

Опис

Оператор

Приклад

Так само

=

Quantity=12

Більше

&gt&nbsp

Quantity&gt12

Більше або дорівнює

&gt=

Quantity&gt=12

Менше

&lt&nbsp

Quantity&lt12

Менше або дорівнює

&lt=

Quantity&lt=12

Не дорівнює

&lt&gt, =

Quantity&lt&gt12, Quantity=12

Чи не менше

&lt

Quantity&lt12

Чи не більше

&gt

Quantity&gt12

Оператори порівняння, містять знак оклику, не сумісні зі стандартом ANSI Зокрема, оператор <> допустимо, а оператор = – Ні

На додаток до стандартних операторам порівняння, які, без сумніву, вам знайомі, в мові SQL містяться спеціальні оператори between, in, like і is Перші три з них будуть описані в цьому розділі Тестування відсутніх значень, що виконується оператором is, а також сама обробка порожніх значень будуть описані в главі 8

Кращим способом знайти яку-небудь річ є пошук саме її, а не відсів всіх речей, якими вона не є Набагато простіше знайти в місті конкретну фірму, ніж довести, що її не існує Те ж справедливо і для пошуку в базах даних Доказ того, що рядок задовольняє умові, виконується швидше, ніж відсів всіх рядків, що не задовольняють умові У загальному випадку заміна негативного умови where позитивним умовою значно підвищує продуктивність запиту

Використання умови between

Умова BETWEEN перевіряє значення на його приналежність деякого діапазону У даному випадку діапазон включає граничні значення Наприклад, умова between 1 and 10 буде справедливо для чисел 1 і 10 При використанні умови between перша межа діапазону повинна бути менше другого, так як в перекладі на людський мову це умова звучить так: Більше або дорівнює першому значенню і менше або дорівнює другий .

Найчастіше умова between використовують з датами У наступному прикладі (рис 73) виконується пошук всіх подій з бази даних Cape Hatteras Adventures, що сталися з липня 2001 року На початку програми база даних СНА2 оголошується поточної, а потім до неї виконується запит:

USE СНА2

SELECT EventCode, DateBegin FROM dboEvent

Результат виконання запиту наступний:

WHERE DateBegin BETWEEN 07/01/01 AND 07/31/01;

Рис 73 Умови пропозиції WHERE в конструкторі запитів утиліти Management Studio можна помістити як на панель таблиці, так і на панель SQL

Наведений як приклад запит повертає точний результат тільки в тому випадку, якщо дати зберігаються без вказівки часу У той же час у більшості додатків дата і час витягуються за допомогою вбудованої функції SQL Server Get Date (), яка одночасно витягує обидві величини При цьому точність витягання часу складає 3 мілісекунди Таким чином, в даному випадку наведений як прикладу запит теоретично повинен не включати в себе рядки з датою і часом більш 00:00:00000 31/07/2001 Однак у разі одночасного зберігання дати та часу останнім відомим часом для SQL Server буде 23:59:59:998, що і продемонстровано в наступному прикладі У цьому прикладі ми спочатку створюємо базу даних для тестування, заповнюємо її декількома рядками даних, а потім виконуємо запит, ілюструє розглянутий питання:

CREATE TABLE dboDateTest(

PK INT IDENTITY,

OrderDate DATETIME )

go

INSERT dboDateTest(OrderDate)

VALUES(*1/1/01 00:00)

INSERT dboDateTest(OrderDate)

VALUES(1/1/01 23:59)

INSERT dboDateTest(OrderDate)

VALUES(1/1/01 11:59:59995 pm)

INSERT dboDateTest(OrderDate)

VALUES(1/2/01 )

Наступний приклад демонструє останнім доступне час дня:

SELECT *

FROM dboDateTest

WHERE OrderDate BETWEEN 1/1/1 AND 1/1/1 11:59:59998 PM;

Результат виконання цього запиту:

PK         OrderDate

1 01-01-2001 00:00:00000

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 01-01-2001 23:59:00000

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 01-01-2001 23:59:59997

SQL Server автоматично коригує запит до найближчих трьох мілісекунд, в результаті чого виходить помилковий набір даних:

SELECT *

FROM dboDateTest

WHERE OrderDate BETWEEN 1/1/1 AND l/l/l 11:59:59999 PM;

Результат виконання цього запиту:

PK         OrderDate

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 01-01-2001 00:00:00000

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 01-01-2001 23:59:00000

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 01-01-2001 23:59:59997

4&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp 02-01-2001 00:00:00000

Тепер видалимо тестову таблицю:

DROP TABLE DateTest

Ми бачимо, що останнім часом діапазону останнього запиту було скориговано до найближчих трьох мілісекунд, і в результаті в результат помилково була включена рядок, що відноситься до наступного дня

Та ж проблема виникає і при використанні типу даних smalldatetime, в якому час округлюється до хвилини В результаті умова пропозиції WHERE column <= 23: 59: 30 буде округлене до нуля годин наступного дня.

Наступний запит з сценарію FamilyQueries Sql використовує умова between для пошуку матерів, які народили дітей менш ніж через 9 місяців після заміжжя

У пропозиції FROM даний запит збирає інформацію про матерів, про дати укладення їхнього шлюбу і народження дітей з таблиці person Після цього пропозиція WHERE обмежує результат тими рядками, в яких поле DateOfBirth (дата народження дитини) потрапляє в конкретний часовий діапазон:

SELECT PersonFirstName + 1 + PersonLastName AS Mother,

Convert(Char(12), MarriageDateOfWedding, 107) as Wedding,

ChildFirstName + + ChildLastName as Child,

Convert(Char(12), ChildDateOfBirth, 107) as Birth FROM Person JOIN Marriage

ON PersonPersonID = MarriageWifelD JOIN Person Child

ON PersonPersonID = ChildMotherlD WHERE ChildDateOfBirth BETWEENMarriageDateOfWedding

AND DATEADD(mm, 9, MarriageDateOfWedding)

Результат виконання даного запиту:

Mother    Wedding       Child            Birth

Alysia Halloway Jan 01, 1975 James Halloway May 24, 1975

Використання умови in

Умова пошуку in аналогічно оператору порівняння equals, проте в даному випадку шукається відповідність даним зі списку Якщо значення міститься в списку, то результатом виразу буде true Наприклад, якщо дані про регіон ввести в базу Cape Hatteras Adventures, то наступний код знайде всі базові табори в Північній Кароліні (NC) і Західній Вірджинії (WV):

USE СНА2

SELECT BaseCampname FROM dboBaseCamp WHERE Region IN(1NC, 1WV)

Результат виконання запиту буде наступним:

Result:

BaseCampName

West Virginia Cape Hatteras Asheville NC

Фактично умова запиту in є еквівалентом обєднання оператором or декількох порівнянь equals Попередній запит можна було б замінити наступним:

USE СНА2

SELECT BaseCampname

FROM dboBaseCamp

WHERE Region = NCORRegion = WV;

Як бачимо, результат його виконання не відрізняється від попереднього:

BaseCampName

West Virginia Cape Hatteras Asheville NC

Оператор in можна комбінувати з оператором not для виключення відповідних рядків Наприклад, пропозиція where not in (NC, SC) поверне всі рядки базових таборів за винятком що знаходяться в Північній і Південній Кароліні:

USE СНА2

SELECT BaseCampname FROM dboBaseCamp

WHERE Region NOT IN (NC, SC)

Результат буде наступним:

BaseCampName

FreePortFt

LauderdaleWest

Virginia

Дуже важко довести зворотне, особливо якщо в списку міститься пусте значення NULL Пусте значення як би невідомо, тому потенційно будь-яке значення може перебувати на його місці Наступна інструкція демонструє, як включення в список порожнього значення унеможливлює доказ відсутності в ньому букви А:

SELECT IN WHERE A NOT IN (В, NULL)

Ця інструкція не поверне результат, оскільки пусте значення потенційно може бути буквою А. Оскільки SQL не може логічно довести відсутність цієї букви в списку, пропозиція WHERE повертає значення false Коли б оператор not in ні використовувався зі списком, що містить пусте значення, будь-яка рядок буде оцінена як не задовольняє умові

Цілком очевидно, що оператор in є досить потужним підмогою Незважаючи на те що в наведених вище прикладах містилися тільки списки з зумовленими значеннями, при комбінуванні цього оператора з підзапитами (про них ми поговоримо в наступному розділі), генеруючими динамічний список, його використання вирішує масу проблем

Використання умови like

Умова like використовує символи макропідстановки для пошуку рядків, відповідних заданому шаблону Однак ці символи макропідстановки відрізняються від використовуються в DOS, з якими ви, напевно, добре знайомі У табл 72 представлені символи макропідстановки як SQL, так і MS-DOS

У наступному прикладі умова like використовується для пошуку всіх товарів, назви яких починаються з Air:

USE OBXKites SELECT ProductName FROM dboProduct WHERE ProductName LIKE Air%;

Результат буде наступним:

ProductName

Air Writer 36 Air Writer 48 Air Writer 66

Наступний запит шукає назви всіх товарів, що починаються з літер діапазону від а до d включно:

SELECT ProductName FROM Product

WHERE ProductName LIKE 1[a-d]%*

Результат його виконання буде наступним:

ProductName

Basic Box Kite 21 inch Dragon Flight Chinese 6&quot Kite Air Writer 36 Air Writer 48 Air Writer 66 Competition 36&quot

Competition Pro 48&quot

Black Ghost Basic Kite Flight Advanced Acrobatics Adventures in the OuterBanks Cape Hatteras T-Shirt

Для пошуку по шаблонах, що містить символи макропідстановки, можна використовувати два методи: або укласти шаблон в квадратні дужки, або помістити перед ним символ Escape Нюанс останнього підходу полягає в тому, що символ Escape повинен бути визначений у вираженні like

У наступних двох прикладах виконується пошук фрази F-15 в таблиці product бази даних OBXKites У першому запиті дефіс полягає у квадратні дужки, що вказує на те, що це символ макропідстановки У другому запиті символ амперсанда (&) визначається як символ Escape:

SELECT ProductCode, ProductName FROM Product

WHERE ProductName LIKE %F [-]15%■

SELECT ProductCode, ProductName

FROM Product

WHERE ProductName LIKE % F & -15% ESCAPE Обидва запиту повертають один і той же результат:

ProductCode  ProductName

1013              Eagle F-15

З двох методів пошуку з використанням символів макропідстановки квад-Увага ратні дужки є специфічним методом Т-SQL, що не відповідає стандарту ANSI SQL Водночас метод Escape є одночасно відповідним стандартом ANSI SQL і, отже, стерпним

При використанні оператора like врахуйте, що порядок сортування символів в базі даних повинен розрізняти символи верхнього і нижнього регістра і відповідати передбаченому вами в запиті При бажанні ви можете використовувати необовязкове ключове слово collate, щоб явно визначити порядок зіставлення, використовуваний в операторі like

Незважаючи на те що оператор like може виявитися винятково корисним, його використання може позначитися на продуктивності Індекси грунтуються на перших символах стовпців, а не на фразах в їх середині Якщо виявилося, що додатку часто потрібно використовувати оператор like, то краще активізуйте повнотекстову індексацію Це метод індексації, який приймає в розрахунок зважені комбінації слів і в що повертається таблиці вказує ступінь відповідності знайденої фрази заданої фразі Більш докладно про повнотекстової індексації ви дізнаєтеся в розділі 13

Множинні умови where

У реченні WHERE можна комбінувати безліч умов за допомогою логічних булевих операторів and, or і not Як і в математичних операторах, у булевих логічних операторах існує свій порядок пріоритетів Найвищий пріоритет має оператор and, далі йде or і, нарешті, not Розглянемо приклад:

SELECT ProductCode, ProductName FROM dboProduct WHERE

ProductName LIKE Air%

OR

ProductCode BETWEEN 1018 AND 1020

AND

ProductName LIKE %G%;

Результат буде наступним:

ProductCode  ProductName

1009&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Air Writer 36

1010&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Air Writer 48

1011&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Air Writer 66

1019&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Grand Daddy

1020&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Black Ghost

Якщо у виразі використовувати дужки, то результат запиту радикально зміниться:

SELECT ProductCode, ProductName FROM dboProduct WHERE

(ProductName LIKE Air%

AND

ProductName LIKE %G%;

Тепер результат виглядає так:

ProductCode       ProductName

1019&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Grand Daddy

1020&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Black Ghost

Незважаючи на те що два наведених запиту дуже схожі, в першому з них використовувався природний порядок пріоритетів булевих операторів, тобто and обчислювався перед or При цьому оператор or включив в результати товари Air Writer

У другому запиті за допомогою дужок була явно задана послідовність булевих операторів Оператор or обєднав усі товари Air Writer з товарами, що мають коди 1018, 1019 і 1020 Після цього оператор and відібрав з цього списку тільки ті товари, в назвах яких містилася буква д Тільки продукти із кодами 1019 і 1020 пройшли обидва цих тесту

При програмуванні складних булевих або математичних виразів явно визначайте послідовність операцій за допомогою дужок, і ви зможете уникнути маси непорозумінь і помилок, повязаних з вашими припущеннями про пріоритети

SELECT..WHERE

Це дивно, але при використанні в інструкції SELECT пропозиції WHERE абсолютно не обовязково використання пропозиції FROM або будь-яких посилань на таблиці Інструкція SELECT без пропозиції FROM видає один рядок

Наприклад, результатом інструкції SELECT abc1 буде рядок abc

Пропозиція WHERE в нетаблічной інструкції SELECT служить обмеженням, застосовуваним до всієї інструкції Якщо умова WHERE істинно, то інструкція SELECT буде працювати, як і передбачалося

Результатом інструкції SELECT abc WHERE 1> 0 буде та ж рядок abc

Якщо ж умова WHERE ложно, то інструкція SELECT взагалі не виконується:

DECLARE @test NVARCHAR(15)

SET @test = z;

SELECT @test = abc WHERE 1&lt0

SELECT @test

Результатом буде символ 1 z . За своєю функцією пропозицію WHERE в нетаблічной інструкції SELECT є скороченим аналогом оператора IF Наступний приклад є повним аналогом попереднього:

DECLARE @test NVARCHAR(15)

SET @test = 1z’

IF 1&ltOSELECT ©test = abc

SELECT ©test

Результатом цього коду також буде символ z.

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*