Како писати Мицрософт Аццесс СКЛ упите од нуле

Како писати Мицрософт Аццесс СКЛ упите од нуле

Мицрософт Аццесс је вероватно најмоћнији алат у читавом пакету Мицрософт Оффице, али ипак мистификује (а понекад и плаши) моћне кориснике система Оффице. Са стрмијом кривуљом учења од Ворд -а или Екцел -а, како би неко требало да се замоти око употребе овог алата? Ове недеље ће Бруце Еппер размотрити нека од питања која је ово питање покренуло од једног од наших читалаца.





Читалац пита:

Имам проблема са писањем упита у Мицрософт Аццесс -у. Имам базу података са две табеле производа које садрже заједничку колону са нумеричким кодом производа и повезаним називом производа. Желим да сазнам који производи из Табеле А се могу пронаћи у Табелу Б. Желим да додам колону под називом Резултати која садржи назив производа из Табеле А ако постоји, и назив производа из Табеле Б ако не постоји у Табели А. Имате ли неки савет?





Бруцеов одговор:

Мицрософт Аццесс је систем за управљање базом података (ДБМС) дизајниран за употребу на Виндовс и Мац машинама. Користи Мицрософт -ов Јет енгине за обраду и складиштење података. Такође пружа графичко сучеље за кориснике које скоро елиминише потребу за разумевањем језика структурираних упита (СКЛ).





СКЛ је командни језик који се користи за додавање, брисање, ажурирање и враћање информација ускладиштених у бази података, као и за измену основних компоненти базе података, попут додавања, брисања или измене табела или индекса.

Полазна тачка

Ако још нисте упознати са Аццессом или неким другим РДБМС -ом, предлажем да почнете са овим ресурсима пре него што наставите:



Основно разумевање концепата наведених у овим чланцима учиниће следеће мало лакшим за варење.

Односи база података и нормализација

Замислите да водите компанију која продаје 50 различитих врста виџета широм света. Имате базу клијената од 1.250 и у просеку месечно продате 10.000 виџета овим клијентима. Тренутно користите једну табелу за праћење свих ових продаја - ефективно једну табелу базе података. И сваке године додаје хиљаде редова у вашу табелу.





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





Ако се Јоан Смитх уда за Теда Баинеса и преузме његово презиме, сваки ред који садржи њено име сада треба промијенити. Проблем је још већи ако случајно имате два различита клијента са именом 'Јоан Смитх'. Управо је постало много теже одржавати доследне податке о продаји због прилично уобичајеног догађаја.

Коришћењем базе података и нормализацијом података можемо раздвојити ставке у више табела као што су инвентар, клијенти и наруџбине.

Само гледајући део клијента у нашем примеру, уклонили бисмо колоне за име клијента и адресу клијента и ставили их у нову табелу. На горњој слици сам такође разбио ствари за детаљнији приступ подацима. Нова табела такође садржи колону за примарни кључ (ЦлиентИД) - број који ће се користити за приступ сваком реду у овој табели.

У оригиналну табелу у којој смо уклонили ове податке, додали бисмо колону за страни кључ (ЦлиентИД) која се повезује са одговарајућим редом који садржи информације за овог клијента.

Сада, када Јоан Смитх промени име у Јоан Баинес, промену је потребно извршити само једном у табели клијента. Свака друга референца из спојених табела повлачи одговарајуће име клијента, а извештај који прегледа оно што је Јоан купила у последњих 5 година добиће све наруџбе под њеним девојачким и венчаним именом, без потребе да мења начин на који се извештај генерише .

Као додатна предност, ово такође смањује укупну количину утрошеног простора за складиштење.

Придружи се типовима

СКЛ дефинише пет различитих врста спајања: ИННЕР, ЛЕФТ ОУТЕР, РИГХТ ОУТЕР, ФУЛЛ ОУТЕР и ЦРОСС. Кључна реч ОУТЕР је опционална у СКЛ изразу.

Мицрософт Аццесс дозвољава употребу ИННЕР -а (подразумевано), ЛЕФТ ОУТЕР, РИГХТ ОУТЕР и ЦРОСС. ФУЛЛ ОУТЕР није подржан као такав, али употребом ЛЕФТ ОУТЕР, УНИОН АЛЛ и РИГХТ ОУТЕР може се лажирати по цену већег броја ЦПУ циклуса и И/О операција.

Излаз ЦРОСС споја садржи сваки ред лијеве таблице упарен са сваким редом десне таблице. Једини пут када сам видео да се користи ЦРОСС придруживање је током тестирања оптерећења сервера база података.

Хајде да погледамо како функционишу основни спојеви, па ћемо их модификовати тако да одговарају нашим потребама.

Почнимо са креирањем две табеле, ПродА и ПродБ, са следећим својствима дизајна.

Аутоматско нумерисање је аутоматски растући дугачак цео број додељен уносима који се додају у табелу. Опција Тект није измењена, па ће прихватити текстуални низ до 255 знакова.

Сада их напуните неким подацима.

Да бих показао разлике у начину рада 3 типа спајања, обрисао сам уносе 1, 5 и 8 из ПродА -е.

Следећи, креирајте нови упит одласком на Креирај> Дизајн упита . Изаберите обе табеле у дијалогу Прикажи табелу и кликните Додај , онда Близу .

Кликните на ПродуцтИД у табели ПродА, превуците је на ПродуцтИД у табели ПродБ и отпустите дугме миша да бисте створили однос између табела.

Десним тастером миша кликните на линију између табела која представља однос између ставки и изаберите Придруживање својстава .

Подразумевано је изабран тип придруживања 1 (ИННЕР). Опција 2 је придруживање ЛИЈЕВО ОУТЕР, а 3 ДЕСНО ОУТЕР придруживање.

Прво ћемо погледати ИННЕР придруживање, па кликните на ОК да бисте одбацили дијалог.

У дизајнеру упита изаберите поља која желимо да видимо са падајућих листа.

Када покренемо упит (црвени ускличник на траци), он ће приказати поље ПродуцтНаме из обе табеле са вредношћу из табеле ПродА у првој колони и ПродБ у другој.

Приметите да резултати приказују само вредности где је ПродуцтИД једнак у обе табеле. Иако постоји унос за ПродуцтИД = 1 у табели ПродБ, он се не приказује у резултатима јер ПродуцтИД = 1 не постоји у табели ПродА. Исто важи и за ПродуцтИД = 11. Постоји у табели ПродА, али не и у табели ПродБ.

Коришћењем дугмета Поглед на врпци и преласком на СКЛ приказ можете видети СКЛ упит који је генерисао дизајнер који је користио за добијање ових резултата.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Враћајући се на Десигн Виев, промените тип спајања на 2 (ЛИЈЕВО ВАЊСКО). Покрените упит да бисте видели резултате.

Као што видите, сваки унос у табели ПродА представљен је у резултатима, док се само они у ПродБ -у који имају одговарајући унос ПродуцтИД у табели ПродБ приказују у резултатима.

Празан простор у колони ПродБ.ПродуцтНаме је посебна вредност (НУЛЛ) јер у табели ПродБ нема одговарајуће вредности. Ово ће се касније показати важним.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Покушајте исто са трећом врстом спајања (ДЕСНО ВАЊСКО).

Резултати показују све из табеле ПродБ док приказује празне (познате као НУЛЛ) вредности где ПродА табела нема одговарајућу вредност. Ово нас засад највише приближава резултатима жељеним у питању нашег читаоца.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Коришћење функција у упиту

Резултати функције се такође могу вратити као део упита. Желимо да се нова колона под називом „Резултати“ појави у нашем скупу резултата. Његова вредност ће бити садржај колоне ПродуцтНаме у табели ПродА ако ПродА има вредност (није НУЛЛ), у супротном треба узети из табеле ПродБ.

Функција непосредног ИФ (ИИФ) може се користити за генерисање овог резултата. Функција има три параметра. Први је услов који мора да има вредност Тачна или Нетачна. Други параметар је вредност коју треба вратити ако је услов Тачан, а трећи параметар је вредност коју треба вратити ако је услов Нетачно.

Конструкција потпуне функције за нашу ситуацију изгледа овако:

IIF(ProdA.ProductID Is Null, ProdB.ProductName,ProdA.ProductName)

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

Могли смо да користимо и „Није нулл“ и променили редослед параметара Тачно и Нетачно да бисмо добили исти резултат.

Када ово стављате у Дизајнер упита, морате унети целу функцију у поље Фиелд:. Да бисте навели да креира колону „Резултати“, морате да користите псеудоним. Да бисте то урадили, предговорите функцију са „Резултати:“ као што се види на следећем снимку екрана.

Еквивалентни СКЛ код за ово би био:

SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null,ProdB.ProductName,ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Сада, када покренемо овај упит, он ће произвести ове резултате.

ствари које треба урадити са малином пи 2

Овде видимо за сваки унос где табела ПродА има вредност, та вредност се одражава у колони Резултати. Ако нема уноса у ПродА табели, унос из ПродБ -а се појављује у Резултати, што је управо оно што је наш читалац питао.

За више ресурса за учење Мицрософт Аццесса, погледајте Јоел Лее'с Хов то Леарн Мицрософт Аццесс: 5 бесплатних мрежних ресурса.

Објави Објави Твеет Емаил Да ли је вредно надоградње на Виндовс 11?

Виндовс је редизајниран. Али да ли је то довољно да вас убеди да пређете са Виндовс 10 на Виндовс 11?

Прочитајте следеће
Повезане теме
  • Продуктивност
  • Питајте стручњаке
О аутору Брус Епер(Објављено 13 чланака)

Брус се са електроником игра од 70 -их, рачунари од раних 80 -их и тачно одговара на питања о технологији коју није користио нити видео све време. И сам себе нервира покушавајући да свира гитару.

Више од Бруцеа Еппера

Претплатите се на наш билтен

Придружите се нашем билтену за техничке савете, критике, бесплатне е -књиге и ексклузивне понуде!

Кликните овде да бисте се претплатили