SQL Server

Published on July 2016 | Categories: Documents | Downloads: 34 | Comments: 0 | Views: 347
of 14
Download PDF   Embed   Report

Governor and resources

Comments

Content

НАПРЕДНИ ПОВРЗУВАЊА
-Типови на поврзувања и нивна употреба
-Користење на алијасите на табелите
-Користење на агрегатни функции со поврзани табели

КОРИСТЕЊЕ АЛИЈАСИ

Синтаксата за доделување алиас на колона е следната:
SELECT RTrim(vend_name) + „ („ + RTrim(vend_country) + „)‟ AS
vend_title
FROM vendors
ORDER BY vend_name;
SQL овозможува доделување на алијаси на табели. Постојат 2 главни причини за да се
направи тоа:
-Поедноставување на SQL синтаксата.
-Повеќекратно употребување на иста табела во единечен SELECT изараз.
Да го разгледаме следниот SELECT израз:
SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = „TNT2‟;
Во горниот израз ќе забележиме дека трите табели во FROM изразот имаат алијаси.
Customers AS c, го одредува с како алијас за customers. Ваквиот пристап овозможува
замена на целиот текст “customers” со “c”. Во овој пример алијасите на табелите се
користеа како составен дел од WHERE изразот. Алијасите може да се користат во
SELECT израз, ORDER BY израз и други слични изрази.

*Алијасите за табелите се користат eдинствено при извршувањето на изразот. Тие никога
не се врќаат до клиентот.

КОРИСТЕЊЕ НА РАЗЛИЧНИ ТИПОВИ ПОВРЗУВАЊА
САМОПОВРЗУВАЊЕ
Како што е споменато користењето на алијаси на табелите може да се употреби за
користење на иста табела повеќепати во единечен SELECT израз.
Да претпоставиме дека имаме проблем со продуктот (ID DTNTR) и сакаме да ги добиеме
сите продукти од истиот добавувач за да откриеме дали проблемот се јавува и кај нив.
Најпрвин треба да дознаеме на кој добавувач припага DTNTR и потоа да ги добиеме сите
продукти од тој добавувач.

SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = „DTNTR‟);
ИЗЛЕЗ:
prod_id prod_name
---------- -------------------DTNTR Detonator
FB Bird seed
FC Carrots
SAFE Safe
SLING Sling
TNT1 TNT (1 stick)
TNT2 TNT (5 sticks)
Првото решение користи подизрази. Внатрешниот SELECT израз го враќа vend_id на
добавувачот кој го произведува DTNTR. Тој идентификатор ID се користи во WHERE
клаузата, со што ги добиваме сите производи од тој добавувач.
Истиот израз можеме да го запишеме и следниов начин:
SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = „DTNTR‟;

ИЗЛЕЗ:
prod_id prod_name
---------- -------------------DTNTR Detonator
FB Bird seed
FC Carrots
SAFE Safe
SLING Sling
TNT1 TNT (1 stick)
TNT2 TNT (5 sticks)
Двете табели во овој израз всушност се истата табела, со тоа што products табелата се
појавува во FROM клаузата двапати. Иако ваквиот начин е легален, сите референци до
табелата products би биле двозначни бидејки SQL сервер нема да знае кон која инстанца на
products табелата се реферира.
За да се разреши овој проблем се користат алијаси на табелите. Првото појавување на
табелата products има алијас р1, а второто р2. Овие алијаси се користат како имиња на
табелата. SELECT изразот го користи p1 префиксот за да ги определи целосните имиња на
бараните колони. WHERE клаузата најпрвин ги поврзува табелите (vend_id во р1 – vend_id
во р2) и потоа ги филтрира податоците според prod_id во втората табела, за да на крај ги
добиеме посакуваните податоци.
.
*Самоповрзувањето се користи за да го замени користење на внатрешни изрази. Иако
резултатот е ист, овие поврзувања се извршуваат побрзо од внатрешните изрази.
ПРИРОДНО ПОВРЗУВАЊЕ
Кога се поврзуваат табели, најмалку една колона се појавува во повеќе од една табела.
Стандардното поврзување ги враќа сите податоци, дури и повеќето појавувања на истата
колона. Природното поврзување ги елиминира повеќето појавувања, така што враќа само
едно од секоја колона. ѓ
Природното поврзување е поврзување во кое ги селектираме колоните кои се уникатни.
Ова се прави со користење на вајлд карта (SELECT *) за една табела и подделови од
колоните на сите останати табели.
SELECT c.*, o.order_num, o.order_date,
oi.prod_id, oi.quantity, OI.item_price
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
AND oi.order_num = o.order_num
AND prod_id = „FB‟;

Во овој пример вајлд карта се користи само за првата табела. Сите останати колони се
експлицитно дефинирано за да не се појават дупли колони. Во принцип секое внатрешно
поврзување е природно поврзување, и најверојатно никогаш нема да имаме потреба да
вршиме поврзување кое не е природно.

НАДВОРЕШНО ПОВРЗУВАЊЕ
Повеќето поврзувања вршат релација помеѓу редиците од една табела со редици од друга
табела. Но можеби ќе има потреба да вклучиме редици кои не се релационо поврзани. На
пример:
-

Да се пресмета колку нарачки има секој клиент, вклучувајки ги и клиентите кои
сеуште немаат направено нарачки.
Излистај ги сите продукти со количината која е нарачана, вклучувајки ги и
продуктите кои не се нарачани.
Пресметај ја просечната продажба, земајки ги во предвид и клиентите кои сеуште
не направиле нарачка.

Во секој од овие пример, поврзувањето вклучува и редици кои немаат асоцирани редици
во релационата табела. Ваквиот начин на поврзување се нарекува надворешно
поврзување.
Следниот SELECT израз е едноставно поврзување. Тој ги дава сите клиенти и нивните
нарачки.
SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id;

Синтаксата за надворешно поврзување е слична. За да добиеме листа на клиенти,
вклучувајки ги и тие кои немаат направено нарачки го употребуваме следниот израз:
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
ИЗЛЕЗ:
cust_id order_num
----------- ----------10001 20005

10001 20009
10002 NULL
10003 20006
10004 20007
10005 20008

Исто како и внетрешното поврзување, овој SELECT израз го користи зборот OUTER JOIN
за да го специфицира типот на поврзување. За разлика од внатрешното поврзување,
надворешното поврзување ги вклучува и редовите кои што не се релационо поврзани.
Кога се користи надворешно поврзување треба да се дефинираат зборовите RIGHT или
LEFT за да се определи од која табела да се вклучат сите редици (RIGHT за табелата од
десната страна на OUTER JOIN, LEFT за табелата од левата страна). Во горенаведениот
пример се користи LEFT OUTER JOIN за да се селектираа сите редици од табелата која
што е од левата страна на FROM клаузата (табелата customers). Доколку сакаме да ги
селектираме сите редици од табелата на десно дефинираме RIGHT OUTER JOIN:
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT OUTER JOIN orders
ON orders.cust_id = customers.cust_id;
*Постојат две основни форми на надворешно поврзување: лево и десно надворешно
поврзување. Разликата помегу нив е распоредот на табелите кои се поврзуваат. Левото
надворешно поврзување може да се претвори во десно со менување на распоредот на
табелите во FROM и WHERE клаузата.
*Досега споменавме два начини за дефинирање на внатрешно поврзување: преку WHERE
клауза и со користење на INNER JOIN синтакса. Во врска со надворешното поврзување
споменавме само OUTER JOIN синтакса, но не и WHERE клауза.
Еве пример за надворешно поврзување со користење на WHERE клауза:
SELECT customers.cust_id, orders.order_num
FROM customers, orders
WHERE customers.cust_id *= orders.cust_id;
Инструкцијата *= прави SQL серверот да ги проследи сите редици од првата колона
(customers, бидејки знакот * се наога веднаш до табелата customers), и само релационите
редици од втората табела orders. На тој начин *= креира лево надворешно поврзување,
додека =* креира десно надворешно поврзување.

Синтаксата на оваа форма не е дел од АNSI стандардот и не е подржано во поновите
верзии на SQL сервер. Таа е подржана во in SQL Server 6.x, SQL Server 7, and SQL Server
2000, a дополнително може да се користи и во SQL Server 2005. Затоа се препорачува да се
избегнува надворешното поврзување со користење на WHERE клауза.
*Постои и една друга форма на надворешно поврзување која ретко се користи. FULL
OUTER JOIN се користи за да се проследат релационите редици од двете табели, како и
нерелационите редици од истите. Синтаксата за FULL OUTER JOIN е истата како и за
останатите типови на надворешно поврзување.

ПОВРЗУВАЊА СО АГРЕГАТНИ ФУНКЦИИ
Агрегатните функции се користат за сумирање на податоците. Агрегатните функции може
да се користат за сумирање на податоците на поврзани табели.
Доколку сакаме да проследиме листа на клиенти и бројот на нарачки кои ги направил
секој клиент го употребуваме следниот израз заедно со функцијата Count():
SELECT customers.cust_name,
customers.cust_id,
Count(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_name,
customers.cust_id;
ИЗЛЕЗ:
cust_name cust_id num_ord
----------------------- ----------- ----------Coyote Inc. 10001 2
Wascals 10003 1
Yosemite Place 10004 1
E Fudd 10005 1
Ваквиот SELECT израз користи INNER JOIN за да ги поврзе табелите customers & orders.
Клазулата GROUP BY ги групира податоците oд customer, така што повикувањето на
функцијата Count (orders.order_num) го брои бројот на нарачки за секој клиент и го враќа
како num_ord.
Агрегатните функции може да се користат и со другите типови на поврзувања:
SELECT customers.cust_name,

customers.cust_id,
Count(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_name,
customers.cust_id;
ИЗЛЕЗ:
cust_name cust_id num_ord
----------------------- ----------- ----------Coyote Inc. 10001 2
Mouse House 10002 0
Wascals 10003 1
Yosemite Place 10004 1
E Fudd 10005 1
Овој пример користи лево надворешно поврзување за да ги вклучи сите клиент (customers)
дури и тие кои немаат направено нарачки (orders). Резултатите прикажуваат клиент Mouse
House кој нема направено нарачки.
*Во зависност од базата на податоци која се користи, може да се појави следново
предупредување: Null value is eliminated bu an aggregate other SET operation.
Oва не е порака за грешка, туку е информациско известување кое ни кажува дека редицата
Mouse House би требало да врати вредност NULL бидејки нема нарачки. Бидејки се
користи фунцкијата Count() вредноста NULL се конвертира во број 0.

КОМБИНИРАЊЕ НА ИЗРАЗИ
- Комбинирање на повеќе SELECT изрази со помош на УНИЈА
оператор

КОМБИНИРАНИ ИЗРАЗИ
Повеќто SQL изрази соджат единечен SQL израз кој ги враќа податоците од една или
повеќе табели. Т-SQL овозможува користење на повеќе изрази и враќање на единечен
резултат. Ваквите изрази се познати како соединети изрази.
Комбинираните изрази може да се користат:
- Враќање слични структурирани податоци од различни табели во единечен израз.
- Извршување на повеќе изрази врз една табела и враќање на резултатите како
единечен израз.
*Комбинирањето на 2 изрази врз иста табела е тесно поврзано со употреба на повеќе
WHERE клаузи во еден израз. Секој SELECT израз со повеќе WHERE клаузи може да се
дефинира како комбиниран израз. Сепак перформансите и времето на извршување на
двете техники е различно и зависи од типот на изразот каде што се употребува.

КРЕИРАЊЕ КОМБИНИРАНИ ИЗРАЗИ
SQL изразите се комбинираат со користење на операторот унија (UNION). Со користење
на UNION може да се дефинираат повеќе SELECT изрази и нивниот резултат да се
комбинира како единечен резултат.

КОРИСТЕЊЕ НА УНИОН
Користењето на UNION е прилично едноставно. Се што треба да се направи е да се
дефинираат два SELECT изрази и да се смести зборото UNION помеѓу нив. Наз пример,
потребна ни е листа на сите продукти кои имаат цена 5 или помалку. Освен тоа сакаме да
ги вметниме и сите продукти од добавувачите 1001 и 1002 без разлика на цената. Овој
пример може да се реши и со користење на WHERE клауза, но ние ќе користиме оператор
UNION:
ВЛЕЗ 1:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5;

ИЗЛЕЗ:
vend_id prod_id prod_price
----------- ---------- ---------1003 FC 2.50
1002 FU1 3.42
1003 SLING 4.49
1003 TNT1 2.50
ВЛЕЗ 2:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
ИЗЛЕЗ:
vend_id prod_id prod_price
----------- ---------- ---------1001 ANV01 5.99
1001 ANV02 9.99
1001 ANV03 14.99
1002 FU1 3.42
1002 OL1 8.99
Првио SELECT израз ги проследува сите продукти со цена непоголема од 5. Вториот
израз користи IN за да ги најде сите продукти од добавувачите 1001 и 1002.
За да ги комбинираме овие изрази го правиме следното:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
ИЗЛЕЗ:
vend_id prod_id prod_price
----------- ---------- ---------1001 ANV01 5.99
1001 ANV02 9.99
1001 ANV03 14.99
1002 FU1 3.42
1002 OL1 8.99
1003 FC 2.50
1003 SLING 4.49
1003 TNT1 2.50

Ваквиот израз е составен од два SELECT изрази одвоени со зборот UNION. Зборот
UNION прави SQL серверот да ги изврши двата изрази и да го комбинира излезот како
единечен резултат. Соодветно на тоа изразот може да се запише и преку користење на
WHERE клауза без употреба на зборот UNION:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
OR vend_id IN (1001,1002);
Во овој пример користење на UNION може да биде покомплицирано отколку користење
на WHERE клауза.Но доколку имаме посложени услови, или доколку податоци беа
проследувани од повеќе табели, UNION може да го поедностави процесот.

ПРАВИЛА ЗА КОРИСТЕЊЕ НА UNION
Постојат неколку правила за користење на UNION:
-

-

UNION мора да се состои од два или повеќе SELECT изрази, межусебно разделени
со зборот UNION. Доколку на пример, користиме четири SELECT изрази ќе треба
да употреби UNION трипати.
Секој израз во UNION мора да ги содржи истите колони, изрази или агрегатни
функции и мора мора да бидат подредени според ист редослед.
Типовите на податоци во колоните мора да бидат компатибилни т.е. не мора да
бидат од истиот тип, но мора да бидат од тип кој SQL серверот ќе може да ги
конвертира.

ВКЛУЧУВАЊЕ ИЛИ ЕЛИМИНИРАЊЕ НА ДУПЛИ РЕДИЦИ
Како што може да видиме од претходниот пример, доколку двата SELECT изрази се
извршуваат одделно, првиот SELECT израз враќа 4 редици, а вториот враќа 5 редици.
Сепак со користење на операторот UNION на резултат добиваме 8 редици наместо 9. Тоа е
затоа што UNION автоматски ги отстранува дуплите редици. Тоа е стандардно
подесување на операторот UNION, кое доколку сакаме може да го промениме, со тоа што
го употребуваме зборот UNION ALL:
Input ▼
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL

SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
ИЗЛЕЗ:
vend_id prod_id prod_price
----------- ---------- ---------1003 FC 2.50
1002 FU1 3.42
1003 SLING 4.49
1003 TNT1 2.50
1001 ANV01 5.99
1001 ANV02 9.99
1001 ANV03 14.99
1002 FU1 3.42
1002 OL1 8.99

*UNION речиси секогаш може да ги изврши истите работи кои што ги извршуваат и
повеќе WHERE услови. UNION ALL е форма од UNION која што не може да се замени со
употреба на WHERE клаузи.

СПРТИРАОЕ НА РЕЗУЛТАТ ПД КПМБИНИРАНИ ИЗРАЗИ
Резултатпт пд SELECT израз се спртира сп кпристеое на клаузата ORDER BY. Кпга се кпмбинираат
изрази сп UNION, ORDER BY клаузата мпже да се упптреби самп еднаш и тпа на крајпт пд
ппследнипт SELECT израз. Сппред тпа, упптребата на ппвеќе ORDER BY клаузи е забранета.
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002)
ORDER BY vend_id, prod_price;.

ИЗЛЕЗ:
vend_id prod_id prod_price
----------- ---------- ---------1001 ANV01 5.99
1001 ANV02 9.99
1001 ANV03 14.99
1002 FU1 3.42
1002 OL1 8.99
1003 FC 2.50
1003 TNT1 2.50
1003 SLING 4.49

Пваа упптреба на UNION кпристи една ORDER BY клауза на крајпт пд ппследнипт SELECT израз.
Иакп ORDER BY се јавува какп дел пд ппследнипт SELECT израз, SQL серверпт гп кпристи истипт за
да ги спртира резултатите пд сите SELECT изрази.

*Сите гпренаведени примери се спстпе пд изрази врз една табела. UNION пператпрпт мпже да се
кпристи за кпмбинираое на изрази на различни табели.

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close