Məlumat bazasına qeydlərin daxil edilməsi, silinməsi, yenilənməsi. VBA Access-dən istifadə edərək verilənlər bazasına sorğu göndərmək üçün giriş adlarında sql sorğularının yaradılması

1 nömrəli laboratoriya işi

SQL: DATA EXTRACT - əmrSEÇİN

İşin məqsədi:

  • SQL ifadələri ilə tanış olmaq;
  • SELECT əmrindən istifadə edərək Access-də sadə SQL sorğularının yaradılmasını öyrənmək;

· IN, BETWEEN, LIKE, IS NULL operatorlarının istifadəsi.

Məşq edin№1. SQL rejimində TƏLƏBƏLƏR cədvəlindən AD və SOYAD sahələrinin bütün dəyərlərini seçmək üçün sorğu yaradın.

ADI, SOYADI SEÇİN

TƏLƏBƏLƏRDƏN;

Məşq edin№2 . SQL rejimində TƏLƏBƏLƏR cədvəlinin bütün sütunlarını seçmək üçün sorğu yaradın.

SEÇİN *

TƏLƏBƏLƏRDƏN;


Tapşırıq №3. SQL rejimində tələbələrin yaşadığı şəhərlərin adlarını seçmək üçün sorğu yaradın.

FƏRQLİ ŞƏHƏR SEÇİN

[ŞƏXSİ MƏLUMATLAR]DAN;

Tapşırıq № 4. SQL rejimində İvanov soyadlı bütün tələbələrin adlarını götürən seçim sorğusu yaradın, bu barədə məlumat TƏLƏBƏLƏR cədvəlində var.

SOYADINI, ADINI SEÇİN

TƏLƏBƏLƏRDƏN

SOYADI HARADA="İvanov";

Tapşırıq № 5. Büdcə təhsil forması üzrə UIT-22 qrupunda təhsil alan tələbələrin ad və soyadlarını əldə etmək üçün SQL rejimində seçim sorğusu yaradın.

SOYADINI, ADINI SEÇİN

TƏLƏBƏLƏRDƏN

WHERE GROUP="UIT-22" AND BUDGET=true;

Tapşırıq № 6. SQL rejimində sorğu yaradın. İMTAHA cədvəlindən nümunə üçün yalnız 4 və 5 qiymət alan tələbələr haqqında məlumat.

SEÇİN *

NƏDƏN [DƏYİŞMƏKİMTAHALAR]

HARADASİNİFIN(4,5);

Tapşırıq № 7. IOSU fənnindən imtahan qiyməti 3 olan tələbələr haqqında məlumat seçmək üçün zanpoc və SQL rejimi yaradın.

SEÇİN *

NƏDƏN [DƏYİŞMƏKİMTAHALAR]

HARADAƏŞYA=" IOSU"VəSİNİFIn deyil (4,5);

Tapşırıq № 8. Saatları 100 ilə 130 arasında olan elementlər üçün qeydləri seçmək üçün SQL rejimində sorğu yaradın.

SEÇİN *

FROMƏŞYALAR

HARADABAXIN100-130 ARASINDA;


Tapşırıq № 9. TƏLƏBƏLƏR cədvəlindən soyadları, məsələn, “C” hərfi ilə başlayan tələbələr haqqında məlumat seçmək üçün SQL rejimində sorğu yaradın.

SEÇİN *

FROMTƏLƏBƏLƏR

HARADASOYADIKİMİ"İLƏ*";

Nəticə:ərzində laboratoriya işi SQL təlimatları ilə tanış olmuş, IN, BETWEEN, LIKE operatorlarından istifadə etməklə SELECT əmrindən istifadə etməklə Access-də sadə SQL sorğularının yaradılmasını öyrənmişdir.

Bu dərs həsr olunub SQL sorğuları haqqında məlumat bazasına VBA Girişi. Biz VBA-da verilənlər bazasına INSERT, UPDATE, DELETE sorğularının necə edildiyini nəzərdən keçirəcəyik, həmçinin SELECT sorğusundan konkret dəyərin necə alınacağını öyrənəcəyik.

Proqrama daxil olanlar VBA Girişi verilənlər bazası ilə işləyərkən SQL server, çox vaxt onlar INSERT, UPDATE və ya sadə SQL SELECT sorğusu olsun, verilənlər bazasına SQL sorğusu göndərmək kimi sadə və zəruri bir vəzifə ilə qarşılaşırlar. Biz təcrübəsiz proqramçılar olduğumuz üçün bunu da bacarmalıyıq, ona görə də bu gün biz bunu edəcəyik.

Biz artıq SQL serverindən məlumatların əldə edilməsi mövzusuna toxunmuşuq, burada bu məlumatları əldə etmək üçün VBA-da kod yazmışıq, məsələn, MSSql 2008-dən mətn faylına məlumatların yüklənməsi haqqında məqalədə və ya ona da toxunmuşuq materialda azdır Access-dən Word və Excel şablonuna məlumatların yüklənməsi, lakin bu və ya digər şəkildə biz buna səthi baxdıq və bu gün bu barədə bir az daha ətraflı danışmağı təklif edirəm.

Qeyd! Aşağıdakı bütün nümunələr Access 2003 ADP layihəsi və MSSql 2008 verilənlər bazasından istifadə etməklə nəzərdən keçirilir.Əgər siz ADP layihəsinin nə olduğunu bilmirsinizsə, o zaman biz bunu Access ADP layihəsini necə yaratmaq və konfiqurasiya etmək olar materialında nəzərdən keçirdik.

Nümunələr üçün mənbə məlumatları

Deyək ki, bizdə ilin aylarının nömrələrini və adlarını ehtiva edən test_table cədvəlimiz var (sorğular istifadə edərək yerinə yetirilir. İdarəetmə studiyası)

CƏDVƏL YARADIN .( NULL DEYİL, (50) NULL) ON ON

Artıq dediyim kimi, biz MS SQL 2008 ilə işləmək üçün konfiqurasiya edilmiş ADP layihəsindən istifadə edəcəyik, orada test forması yaratmışam və imza ilə başlanğıc düyməsini əlavə etmişəm. "Qaç", kodumuzu sınamaq üçün ehtiyacımız olacaq, yəni. Bütün kodu hadisə idarəedicisinə yazacağıq " Düyməni basmaq».

Verilənlər bazasına sorğular VBA-da INSERT, UPDATE, DELETE

Çox gecikməmək üçün dərhal işə başlayaq, deyək ki, test cədvəlimizə bir sıra əlavə etməliyik ( kodu şərh etdi)/

Private Sub start_Click() "Sorğu sətirini saxlamaq üçün dəyişəni elan edin Dim sql_query String olaraq "Bizə lazım olan sorğunu ona yazın sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", "June")" "İcra et bu DoCmd.RunSQL sql_query End Sub

Bu halda sorğu cari verilənlər bazası əlaqə parametrlərindən istifadə etməklə yerinə yetirilir. Məlumatların əlavə edilib-edilmədiyini yoxlaya bilərik.

Gördüyünüz kimi, məlumatlar daxil edilmişdir.

Bir sətri silmək üçün aşağıdakı kodu yazırıq.

Private Sub start_Click() "Sorğu sətirini saxlamaq üçün dəyişəni elan edin Dim sql_query Sətir kimi "Orada silmə sorğusu yazın sql_query = "test_table SİL HARADAN id = 6" "İşlətin DoCmd.RunSQL sql_query End

Yoxlasaq, istədiyiniz xəttin silindiyini görərik.

Məlumatları yeniləmək üçün sql_query dəyişəninə yazın yeniləmə sorğusu, Ümid edirəm mənası aydındır.

VBA-da verilənlər bazasına sorğu seçin

Burada işlər digər SQL konstruksiyalarından bir az daha maraqlıdır.

Birincisi, deyək ki, cədvəldən bütün məlumatları əldə etməliyik və məsələn, biz onu emal edib mesaj şəklində göstərəcəyik və siz, əlbəttə, başqa məqsədlər üçün istifadə edə bilərsiniz, bunun üçün aşağıdakıları yazırıq. kod

Private Sub start_Click() "Dəyişənləri elan et" Verilənlər bazasından qeydlər dəsti üçün Dim RS As ADODB.Recordset "Sorğu sətri Dim sql_query Sim kimi "İclas məlumatlarını mesajda göstərmək üçün sətir Dim str Sim kimi "Qeydlər üçün yeni obyekt yaradın set RS = Yeni ADODB .Recordset "Sorğu xətti sql_query = "Test_table FROM ID, ad_mon SEÇ" "Cari layihə bağlantı parametrlərindən istifadə edərək sorğunu icra edin RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Yoxdurkən ( RS.EOF) "Mesajı göstərmək üçün dəyişəni doldurun str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "növbəti qeydə keçin RS.MoveNext Wend " msgbox str End Sub mesajını çıxarın

Burada qeyd dəstimizdəki bütün dəyərləri təkrarlamaq üçün artıq VBA Access döngələrindən istifadə edirik.

Ancaq çox vaxt qeydlər dəstindən bütün dəyərləri deyil, yalnız birini, məsələn, kodu ilə ayın adını almaq lazımdır. Bunu etmək üçün dövrədən istifadə etmək bir qədər bahadır, ona görə də biz sadəcə bir dəyər qaytaracaq və ona daxil olacaq sorğu yaza bilərik, məsələn, 5 kodundan istifadə edərək ayın adını alacağıq.

Private Sub start_Click() "Dəyişənləri elan et" Verilənlər bazasından qeydlər dəsti üçün Dim RS As ADODB.Recordset "Sorğu sətri Dim sql_query Sim kimi "Sətrin yekun dəyərini göstərmək üçün Dim str Sim kimi "Qeydlər dəsti üçün yeni obyekt yaradın RS = Yeni ADODB.Recordset "Sorğu xətti sql_query = "Test_table FROM ad_mon SEÇİN id = 5" "Cari layihə bağlantı parametrlərindən istifadə edərək sorğunu icra edin RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Dəyərimizi əldə edin str = RS. Fields(0) msgbox str End Sub

Universallıq üçün burada artıq hüceyrə adı ilə deyil, indeksi ilə müraciət etdik, yəni. 0 və bu ilk dəyərdir Rekordlar dəsti, sonunda dəyərimizi aldıq "Bilər".

Gördüyünüz kimi, hər şey olduqca sadədir. Əgər siz tez-tez verilənlər bazasından müəyyən bir dəyər əldə etməlisinizsə ( son misalda olduğu kimi), onda mən bütün kodu ayrı bir funksiyaya (VBA Access 2003-də funksiyanı necə yazmaq olar) bir giriş parametri ilə çıxarmağı məsləhət görürəm, məsələn, ay kodu ( nümunəmizi nəzərə alsaq) və sadəcə olaraq, bu dəyəri göstərmək lazım olduqda, lazımi parametrlə bizə lazım olan funksiyanı çağırın və budur, bununla VBA kodunu əhəmiyyətli dərəcədə azaldacağıq və proqramımızın qavrayışını yaxşılaşdıracağıq.

Bu gün üçün hamısı budur. Uğurlar!

"Mağaza" təhsil layihəsinin təsviri

Cədvəl əlaqə diaqramı

Cədvəllərin təsviri

m_kateqoriya - məhsul kateqoriyaları

m_income - malların qəbzi

m_nəticə - malların istehlakı

m_product - kataloq, məhsul təsvirləri

m_supplier - kataloq; təchizatçı məlumat

m_unit - kataloq; vahidlər

Bu təlim materialında verilmiş nümunələri praktiki olaraq yoxlamaq üçün aşağıdakı proqram təminatına malik olmalısınız:

Microsoft Access 2003 və ya daha yeni.

MS Access-də SQL Sorğu. Başlamaq

Cədvəlin məzmununu görmək üçün sol paneldəki cədvəlin adının üzərinə iki dəfə klikləyin:

Cədvəl sahəsində redaktə rejiminə keçmək üçün üzərinə klikləyin üst panel Dizayn rejimini seçin:

SQL sorğusunun nəticəsini göstərmək üçün sol paneldə sorğu adını iki dəfə klikləyin:

SQL sorğunun redaktə rejiminə keçmək üçün yuxarı paneldə SQL rejimini seçin:

SQL sorğusu. MS Access-də nümunələr. SEÇİN: 1-10

SQL sorğusunda verilənlər bazası cədvəllərindən seçim etmək üçün SELECT ifadəsi istifadə olunur.

SQL Query Q001.İstədiyiniz ardıcıllıqla yalnız tələb olunan sahələri əldə etmək üçün nümunə SQL sorğusu:

SELECT dt, product_id, məbləğ


m_gəlirdən;

SQL Query Q002. Bu misal SQL sorğusunda ulduz (*) simvolu m_məhsul cədvəlinin bütün sütunlarını sadalamaq, başqa sözlə, m_məhsul əlaqəsinin bütün sahələrini almaq üçün istifadə olunur:

SEÇİN *
FROM m_product;

SorğuSQL Q003. DISTINCT ifadəsi dublikat qeydləri aradan qaldırmaq və çoxsaylı unikal qeydlər əldə etmək üçün istifadə olunur:

FƏRQLİ məhsul_id SEÇİN


m_gəlirdən;

SQL Query Q004. ORDER BY ifadəsi qeydləri müəyyən bir sahənin dəyərlərinə görə çeşidləmək (sifariş etmək) üçün istifadə olunur. Sahənin adı ORDER BY ifadəsindən sonra göstərilir:

SEÇİN *
m_gəlirdən


qiymətə görə SİFARİŞ;

SQL Query Q005. ASC ifadəsi ORDER BY ifadəsinin tamamlayıcısı kimi istifadə olunur və artan çeşidləməni təyin etməyə xidmət edir. DESC ifadəsi ORDER BY ifadəsinə əlavə olaraq istifadə olunur və azalan çeşidləməni təyin etmək üçün istifadə olunur. Nə ASC, nə də DESC göstərilmədiyi halda, ASC-nin olması (defolt) qəbul edilir:

SEÇİN *
m_gəlirdən


dt DESC BY SİFARİŞ , qiymət;

SQL Query Q006. Cədvəldən lazımi qeydləri seçmək üçün seçim şərtini ifadə edən müxtəlif məntiqi ifadələrdən istifadə olunur. Boolean ifadəsi WHERE ifadəsindən sonra görünür. Məbləğin dəyəri 200-dən çox olan m_income cədvəlindən bütün qeydlərin alınmasına nümunə:

SEÇİN *
m_gəlirdən


HARADA məbləğ>200;

SQL Query Q007.İfadə üçün çətin şərtlər AND (birləşdirmə), OR (disjunction) və NOT (məntiqi inkar) məntiqi operatorlarından istifadə edin. m_outcome cədvəlindən məbləğ dəyəri 20 və qiymət dəyəri 10-dan böyük və ya ona bərabər olan bütün qeydləri əldə etməyə nümunə:

Qiymət


m_nəticədən
HARƏDƏ məbləğ=20 VƏ qiymət>=10;

SQL Query Q008.İki və ya daha çox cədvəldən verilənləri birləşdirmək üçün INNER JOIN, LEFT JOIN, RIGHT JOIN təlimatlarından istifadə edin. Aşağıdakı nümunə dt, product_id, məbləğ, qiymət sahələrini m_income cədvəlindən və başlıq sahəsini m_product cədvəlindən alır. m_income cədvəli qeydi m_product cədvəli qeydinə m_income.product_id dəyəri m_product.id dəyərinə bərabər olduqda qoşulur:



ON m_income.product_id=m_product.id;

SQL Sorğusu Q009. Bu SQL sorğusunda qeyd edilməli iki şey var: 1) axtardığınız mətn içəridədir. tək sitatlar("); 2) tarix #Month/Day/Year# formatında verilir, bu MS Access üçün doğrudur. Digər sistemlərdə tarixin yazılması formatı fərqli ola bilər. Qəbz haqqında məlumatın göstərilməsi nümunəsi 12 iyun 2011-ci il tarixində süd. Tarix formatı №6/12/2011# qeyd edin

SELECT dt, product_id, başlıq, məbləğ, qiymət


FROM m_income DAXİLİ QOŞULUN m_product

WHERE title="Milk" And dt=#6/12/2011#; !}

SQL Query Q010. BETWEEN təlimatı dəyərin müəyyən diapazona aid olub-olmadığını yoxlamaq üçün istifadə olunur. 1 iyun və 30 iyun 2011-ci il tarixləri arasında alınan məhsullar haqqında məlumatı göstərən nümunə SQL sorğusu:

SEÇİN *
FROM m_income DAXİLİ QOŞULUN m_product


ON m_income.product_id=m_product.id
HARADA dt #6/1/2011# və #6/30/2011# ARASINDA;

SQL sorğusu. MS Access-də nümunələr. SEÇİN: 11-20

Bir SQL sorğusu digərinə daxil edilə bilər. Alt sorğu sorğu daxilindəki sorğudan başqa bir şey deyil. Tipik olaraq, alt sorğu WHERE bəndində istifadə olunur. Ancaq alt sorğulardan istifadə etməyin başqa yolları da var.

Sorğu Q011. m_product cədvəlindəki məhsullar haqqında məlumat göstərilir, kodları da m_income cədvəlindədir:

SEÇİN *
m_məhsulundan


WHERE id IN (m_income FROM product_id SEÇİN);

Sorğu Q012. m_product cədvəlindən kodları m_outcome cədvəlində olmayan məhsulların siyahısı göstərilir:

SEÇİN *
m_məhsulundan


İD OLMADIĞINDA (m_nəticədən məhsul_id SEÇİN);

Sorğu Q013. Bu SQL sorğusu m_income cədvəlində olan, lakin m_outcome cədvəlində olmayan məhsul kodlarının və adlarının unikal siyahısını göstərir:

SEÇİN DISTINCT product_id, başlıq


FROM m_income DAXİLİ QOŞULUN m_product
ON m_income.product_id=m_product.id
WHERE product_id IN YOX (m_nəticədən məhsul_id SEÇİN);

Sorğu Q014. m_kateqoriya cədvəlində adları M hərfi ilə başlayan kateqoriyaların unikal siyahısı göstərilir:

DISTINCT başlığı SEÇİN


m_məhsulundan
"M*" kimi başlıq;

Sorğu Q015. Sorğuda sahələr üzrə hesab əməliyyatlarının yerinə yetirilməsi və sorğuda sahələrin adının dəyişdirilməsi nümunəsi (ləqəb). Bu nümunə, mənfəətin satışın 7 faizi olduğunu fərz etsək, hər bir xərc maddəsi üçün xərc = kəmiyyət*qiymət və mənfəəti hesablayır:


məbləğ*qiymət/100*7 AS mənfəət
FROM m_outcome;

Sorğu Q016. Arifmetik əməliyyatları təhlil edərək və sadələşdirərək, sorğunun icra sürətini artıra bilərsiniz:

Dt, məhsul_id, məbləğ, qiymət, məbləğ*qiymət AS nəticə_cəmi,


nəticə_cəmi*0,07 AS mənfəət
FROM m_outcome;

Q017 sorğusu.Çox cədvəllərdən verilənləri birləşdirmək üçün INNER JOIN ifadəsindən istifadə edə bilərsiniz. Aşağıdakı misalda, ctgry_id dəyərindən asılı olaraq, m_income cədvəlindəki hər bir giriş məhsulun aid olduğu m_kateqoriya cədvəlindəki kateqoriyanın adı ilə uyğunlaşdırılır:

c.title, b.title, dt, məbləğ, qiymət, məbləğ*qiymət gəlir_summa kimi SEÇİN


FROM (m_gəlir DAXİLİ QOŞULMA KİMİ m_product AS b ON a.product_id=b.id)
İNNER JOIN m_category AS c ON b.ctgry_id=c.id
SİFARİŞ C.title, b.title;

Sorğu Q018. SUM - cəm, COUNT - kəmiyyət, AVG - arifmetik orta, MAX - maksimum dəyər, MIN - minimum qiymət kimi funksiyalar məcmu funksiyalar adlanır. Bir çox dəyərləri qəbul edirlər və emal etdikdən sonra tək bir dəyər qaytarırlar. SUM məcmu funksiyasından istifadə edərək məbləğ və qiymət sahələrinin məhsulunun cəminin hesablanmasına bir nümunə:

Cəmi_məblək kimi CƏMİ(məbləğ*qiymət) SEÇİN


m_gəlirdən;

Sorğu Q019. Bir neçə ümumi funksiyadan istifadə nümunəsi:

Məbləği (məbləği) Məbləğ_Məbləği, AVG(məbləği) Məbləğ_AVG AS SEÇİN,


MAX(məbləğ) AS Məbləğ_Maks, Min(məbləğ) AS Məbləğ_Min,
Say(*) AS Ümumi_Sayı
m_gəlirdən;

Q020 sorğusu. Bu nümunədə 2011-ci ilin iyun ayında kapitallaşdırılan 1 kodu olan bütün malların məbləği hesablanır:

Cəmi(məbləğ*qiymət) gəlir_cəmi kimi SEÇİN


m_gəlirdən
HARADA product_id=1 VƏ dt #6/1/2011# VƏ #6/30/2011# ARASINDA;.

Sorğu Q021. Aşağıdakı SQL sorğusu 4 və ya 6 kodu olan əşyaların satış məbləğini hesablayır:

Nəticə_cəmi kimi Cəmi (məbləğ*qiymət) SEÇİN


m_nəticədən
HARADA product_id=4 OR product_id=6;

Sorğu Q022. 12 iyun 2011-ci il tarixində 4 və ya 6 kodlu malların nə qədər satıldığı hesablanır:

Nəticə_cəmi kimi Cəmi (məbləğ*qiymət) SEÇİN


m_nəticədən
HARADA (məhsul_id=4 OR məhsul_id=6) VƏ dt=#6/12/2011#;

Sorğu Q023. Vəzifə budur. “Çörək məmulatları” kateqoriyasında kapitallaşdırılmış malların ümumi məbləğini hesablayın.

Bu problemi həll etmək üçün üç cədvəllə işləməlisiniz: m_income, m_product və m_category, çünki:


- kapitallaşdırılmış malların miqdarı və qiyməti m_gəlir cədvəlində saxlanılır;
- hər bir məhsulun kateqoriya kodu m_product cədvəlində saxlanılır;
- başlıq kateqoriyasının adı m_kateqoriya cədvəlində saxlanılır.

Bu problemi həll etmək üçün aşağıdakı alqoritmdən istifadə edəcəyik:


- alt sorğudan istifadə edərək m_kateqoriya cədvəlindən "Çörək məmulatları" kateqoriya kodunun müəyyən edilməsi;
- alınan hər bir məhsulun kateqoriyasını müəyyən etmək üçün m_income və m_product cədvəllərinin əlaqələndirilməsi;
- kateqoriya kodu yuxarıdakı alt sorğu ilə müəyyən edilmiş koda bərabər olan mallar üçün mədaxil məbləğinin (= kəmiyyət*qiymət) hesablanması.
SEÇİN
m_product-DAN DAXİLİ QOŞULMA KİMİ m_gəlir AS b ON a.id=b.product_id
WHERE ctgry_id = (SEÇ id FROM m_category WHERE title="Çörək məhsulları"); !}

Sorğu Q024. Aşağıdakı alqoritmdən istifadə edərək "Çörək məhsulları" kateqoriyasındakı kapitallaşdırılmış malların ümumi miqdarının hesablanması problemini həll edəcəyik:
- m_income cədvəlindəki hər bir giriş üçün, onun məhsul_idinin dəyərindən asılı olaraq, m_kateqoriya cədvəlindən kateqoriyanın adı ilə uyğunlaşdırılır;
- “Çörək məmulatları” kateqoriyası olan qeydləri seçin;
- qəbz məbləğini hesablayın = kəmiyyət*qiymət.

FROM (m_məhsul DAXİLİ QOŞULMA KİMİ m_gəlir AS b ON a.id=b.product_id)

WHERE c.title="Çörək məmulatları"; !}

Sorğu Q025. Bu nümunə nə qədər malın istehlak edildiyini hesablayır:

COUNT(məhsul_id) məhsul_cnt kimi SEÇİN


FROM (SEÇİN DISTINCT product_id FROM m_outcome) AS t;

Sorğu Q026. Qeydləri qruplaşdırmaq üçün GROUP BY ifadəsi istifadə olunur. Tipik olaraq, qeydlər bir və ya bir neçə sahənin dəyərinə görə qruplaşdırılır və hər qrupa bəzi ümumi əməliyyatlar tətbiq edilir. Məsələn, aşağıdakı sorğu malların satışı haqqında hesabat yaradır. Yəni, malların adları və satıldıqları məbləğdən ibarət bir cədvəl yaradılır:

Başlıq SEÇİN, SUM(məbləğ*qiymət) nəticə_cəmi AS


FROM m_product DAXİLİ QOŞULMA KİMİ m_nəticə AS b
ON a.id=b.product_id
GROUP BY BY;

Sorğu Q027. Kateqoriya üzrə satış hesabatı. Yəni, məhsul kateqoriyalarının adlarını, bu kateqoriyaların məhsullarının satıldığı ümumi məbləği və orta satış məbləğini ehtiva edən bir cədvəl yaradılır. ROUND funksiyası orta dəyəri ən yaxın yüzliyə yuvarlaqlaşdırmaq üçün istifadə olunur (onluq ayırıcıdan sonrakı ikinci rəqəm):

SEÇİN c.başlıq, SUM(məbləğ*qiymət) nəticə_cəmi,


ROUND(AVG(məbləğ*qiymət),2) nəticə_cəm_orta
FROM (m_məhsul DAXİLİ QOŞULMA KİMİ m_nəticə AS b ON a.id=b.product_id)
INNER JOIN m_category AS c ON a.ctgry_id=c.id
c.başlığa görə qruplaşdırmaq;

Sorğu Q028. Onun daxilolmalarının ümumi və orta sayı hər bir məhsul üçün hesablanır və ümumi mədaxilləri ən azı 500 olan məhsullar haqqında məlumatları göstərir:

məhsul_id SEÇİN, SUM(məbləğ) məbləği_sum,


Dəyirmi(Ort(məbləğ),2) AS məbləğ_orta
m_gəlirdən
məhsul_idinə görə qruplaşdırın
Məbləğin (məbləğin) OLMASI>=500;

Sorğu Q029. Bu sorğu hər bir məhsul üçün 2011-ci ilin ikinci rübündə onun daxilolmalarının məbləğini və orta hesablamasını hesablayır. Məhsul qəbzinin ümumi məbləği ən azı 1000-dirsə, bu məhsul haqqında məlumat göstərilir:

Başlıq SEÇİN, SUM(məbləğ*qiymət) gəlir_cəmi AS


FROM m_come a DAXİLİ QOŞULUN m_product b ON a.product_id=b.id
HARADA dt #4/1/2011# VƏ #6/30/2011# ARASINDA
Başlığa görə qruplaşdırın
MƏBLƏĞİN OLMASI(məbləğ*qiymət)>=1000;

Sorğu Q030. Bəzi hallarda, bəzi cədvəlin hər bir qeydini digər cədvəlin hər bir qeydinə uyğunlaşdırmaq lazımdır; buna dekart məhsulu deyilir. Belə bir əlaqə nəticəsində yaranan cədvəl Dekart cədvəli adlanır. Məsələn, bəzi A cədvəlində 100, B cədvəlində 15 qeyd varsa, onda onların Dekart cədvəli 100*15=150 qeyddən ibarət olacaq. Aşağıdakı sorğu m_income cədvəlindəki hər bir qeydi m_outcome cədvəlindəki hər bir qeydlə birləşdirir:
m_gəlirdən, m_nəticədən;

Sorğu Q031. Qeydləri iki sahə üzrə qruplaşdırmaq nümunəsi. Aşağıdakı SQL sorğusu hər bir təchizatçı üçün ondan alınan malların miqdarını və miqdarını hesablayır:


SUM(məbləğ*qiymət) gəlir_cəmi kimi

Sorğu Q032. Qeydləri iki sahə üzrə qruplaşdırmaq nümunəsi. Aşağıdakı sorğu hər bir təchizatçı üçün bizim tərəfimizdən satılan məhsullarının miqdarını və miqdarını hesablayır:

təchizatçı_id, məhsul_id, SUM(məbləğ) məbləği_sum,




təchizatçı_id, məhsul_idinə görə Qrup;

Sorğu Q033. Bu nümunədə yuxarıdakı iki sorğu (q031 və q032) alt sorğular kimi istifadə olunur. LEFT JOIN metodundan istifadə edərək bu sorğuların nəticələri bir hesabatda birləşdirilir. Aşağıdakı sorğuda hər bir təchizatçı üçün alınan və satılan məhsulların miqdarı və miqdarı haqqında hesabat göstərilir. Nəzərə alın ki, əgər bəzi məhsullar artıq alınıbsa, lakin hələ satılmayıbsa, bu giriş üçün nəticə_cəmi xanası boş olacaq. ki, bu sorğu nisbətən mürəkkəb sorğuların alt sorğu kimi istifadə edilməsinə yalnız bir nümunədir. Böyük miqdarda məlumatla bu SQL sorğusunun performansı şübhəlidir:

SEÇİN *
FROM



SUM(məbləğ*qiymət) gəlir_cəmi kimi

ON a.product_id=b.id QROUP BY BY təchizatçı_id, product_id) AS a
SOL QOŞULUN
(təchizatçı_id, məhsul_id, SUM(məbləğ) məbləği_sum,
SUM(məbləğ*qiymət) nəticə_cəmi
DAXİLİ QOŞULMA KİMİ m_nəticədən m_product AS b
ON a.product_id=b.id GROUP BY BY təchizatçı_id, product_id) AS b
ON (a.product_id=b.product_id) VƏ (a.supplier_id=b.supplier_id);

Sorğu Q034. Bu nümunədə yuxarıdakı iki sorğu (q031 və q032) alt sorğular kimi istifadə olunur. RIGTH JOIN metodundan istifadə edərək bu sorğuların nəticələri bir hesabatda birləşdirilir. Aşağıdakı sorğuda hər bir müştərinin istifadə etdiyi ödəniş sistemlərinə uyğun olaraq ödənişlərinin məbləği və etdiyi investisiyaların məbləği haqqında hesabat göstərilir. Aşağıdakı sorğuda hər bir təchizatçı üçün alınan və satılan məhsulların miqdarı və miqdarı haqqında hesabat göstərilir. Nəzərə alın ki, əgər hansısa məhsul artıq satılıbsa, lakin hələ gəlib çatmayıbsa, bu giriş üçün gəlir_məbləği xanası boş olacaq. Belə boş hüceyrələrin olması satış uçotunda səhvin göstəricisidir, çünki satışdan əvvəl müvafiq məhsulun gəlməsi lazımdır:

SEÇİN *
FROM


(təchizatçı_id, məhsul_id, SUM(məbləğ) məbləği_sum,
SUM(məbləğ*qiymət) gəlir_cəmi kimi
m_gəlirDƏN DAXİLİ QOŞULMA KİMİ m_product AS b ON a.product_id=b.id
təchizatçı_id, məhsul_id) GROUP BY a
SAĞ QOŞULUN
(təchizatçı_id, məhsul_id, SUM(məbləğ) məbləği_sum,
SUM(məbləğ*qiymət) nəticə_cəmi
m_nəticədən DAXİLİ QOŞULMA KİMİ m_product AS b ON a.product_id=b.id
təchizatçı_id, məhsul_id) AS BY QRUPLA b
ON (a.təchizatçı_id=b.təchizatçı_id) VƏ (a.məhsul_id=b.məhsul_id);

Sorğu Q035. Məhsul üzrə gəlir və xərclərin məbləğini göstərən hesabat göstərilir. Bunun üçün m_gəlir və m_nəticə cədvəllərinə uyğun olaraq məhsulların siyahısı yaradılır, sonra bu siyahıdan hər bir məhsul üçün m_gəlir cədvəlinə uyğun gəlirlərinin məbləği və m_nəticə cədvəlinə uyğun olaraq xərclərinin məbləği hesablanır:

məhsul_id, gəlir_məbləği AS SUM(məbləğlə) SEÇİN,


SUM(xarici_məbləğ) nəticə_məbləği AS
FROM
(məhsul identifikatorunu SEÇİN, məbləğdə AS, məbləğdə 0 AS xaric
m_gəlirdən
BÜTÜN BİRLİK
SEÇİN məhsul_id, 0 AS məbləğində, məbləğ AS out_abcount
FROM m_nəticə) AS t
GROUP BY product_id;

Sorğu Q036. EXISTS funksiyası ona ötürülən çoxluq elementlərdən ibarətdirsə, TRUE qaytarır. EXISTS funksiyası ona ötürülən çoxluq boşdursa, yəni heç bir elementdən ibarət deyilsə, FALSE qaytarır. Aşağıdakı sorğu həm m_income, həm də m_outcome cədvəllərində olan məhsul kodlarını göstərir:

FƏRQLİ məhsul_id SEÇİN


FROM m_come AS a
MÖVCUD VAR(m_nəticədən məhsul_id SEÇİN AS b

Sorğu Q037. Həm m_income, həm də m_outcome cədvəllərində olan məhsul kodları göstərilir:

FƏRQLİ məhsul_id SEÇİN


FROM m_come AS a
WHERE product_id IN (m_nəticədən məhsul_id SEÇİN)

Sorğu Q038. m_income cədvəlində olan, lakin m_outcome cədvəlində olmayan məhsul kodları göstərilir:

FƏRQLİ məhsul_id SEÇİN


FROM m_come AS a
MÖVCUD OLMAYAN YERDƏ(m_nəticədən məhsul_id SEÇİN AS b
WHERE b.məhsul_id=a.məhsul_id);

Sorğu Q039. Maksimum satış məbləği olan məhsulların siyahısı göstərilir. Alqoritm aşağıdakı kimidir. Hər bir məhsul üçün onun satış məbləği hesablanır. Sonra bu məbləğlərin maksimumu müəyyən edilir. Sonra hər bir məhsul üçün onun satışlarının məbləği yenidən hesablanır və satış məbləği maksimuma bərabər olan malların kodu və satış məbləği göstərilir:

məhsul_id, SUM(məbləğ*qiymət) məbləği_sum kimi SEÇİN


m_nəticədən
məhsul_idinə görə qruplaşdırın
MƏMBƏ OLAN(məbləğ*qiymət) = (MAX(s_miqdar) SEÇİN
FROM (məhsulun_idinə görə m_nəticə QRUPUDAN s_məbləğ KİMİ SUM(məbləğ*qiymət) SEÇİN));

Sorğu Q040. Qorunan söz IIF ( şərti operator) Boolean ifadəsini qiymətləndirmək və nəticədən asılı olaraq hərəkəti yerinə yetirmək üçün istifadə olunur (TRUE və ya FALSE). Aşağıdakı misalda, miqdar 500-dən az olarsa, malın çatdırılması "kiçik" sayılır. Əks halda, yəni qəbz miqdarı 500-dən çox və ya ona bərabər olarsa, çatdırılma "böyük" hesab olunur:

SELECT dt, product_id, məbləğ,


IIF(m_gəlirdən məbləğ;

SQL Sorğusu Q041. IIF operatorunun bir neçə dəfə istifadə edildiyi halda, onu SWITCH operatoru ilə əvəz etmək daha rahatdır. SWITCH operatoru (çoxlu seçim operatoru) məntiqi ifadəni qiymətləndirmək və nəticədən asılı olaraq hərəkəti yerinə yetirmək üçün istifadə olunur. Aşağıdakı misalda, partiyadakı malların miqdarı 500-dən az olarsa, təhvil verilmiş lot “kiçik” sayılır. Əks halda, yəni malın miqdarı 500-dən çox və ya ona bərabər olarsa, lot “böyük” sayılır. ":

SELECT dt, product_id, məbləğ,


SWITCH(miqdar =500,"böyük") AS işarəsi
m_gəlirdən;

Sorğu Q042. Növbəti sorğuda qəbul edilmiş partiyada malların sayı 300-dən azdırsa, partiya “kiçik” sayılır. Əks halda, yəni şərt məbləği SELECT dt, product_id, məbləğ,
IIF(məbləğ IIF(m_gəlirdən məbləğ;

SQL sorğusu Q043. Növbəti sorğuda qəbul edilmiş partiyada malların sayı 300-dən azdırsa, partiya “kiçik” sayılır. Əks halda, yəni şərt məbləği SELECT dt, product_id, məbləğ,
SWITCH(məbləğin məbləği>=1000, "böyük") AS işarəsi
m_gəlirdən;

SQL sorğusu Q044. Aşağıdakı sorğuda satışlar üç qrupa bölünür: kiçik (150-yə qədər), orta (150-dən 300-ə qədər), böyük (300 və daha çox). Sonra hər qrup üçün ümumi məbləğ hesablanır:

Kateqoriya SEÇİN, SUM(nəticə_cəmi) Ctgry_Total


FROM (məbləği*nəticə_cəmi kimi qiymət seçin,
IIf(məbləğ*qiymət IIf(məbləğ*qiymət m_nəticədən) AS t
Kateqoriyaya görə Qrup;

SQL sorğusu Q045. DateAdd funksiyası verilmiş tarixə günlər, aylar və ya illər əlavə etmək və yeni tarix əldə etmək üçün istifadə olunur. Növbəti sorğu:
1) dt sahəsindən tarixə 30 gün əlavə edir və dt_plus_30d sahəsində yeni tarixi göstərir;
2) dt sahəsindən tarixə 1 ay əlavə edir və dt_plus_1m sahəsində yeni tarixi göstərir:

SEÇİN dt, dateadd("d",30,dt) AS dt_plus_30d, dateadd("m",1,dt) AS dt_plus_1m


m_gəlirdən;

SQL sorğusu Q046. DateDiff funksiyası iki tarix arasındakı fərqi müxtəlif vahidlərdə (günlər, aylar və ya illər) hesablamaq üçün nəzərdə tutulmuşdur. Aşağıdakı sorğu dt sahəsindəki tarix ilə cari tarix arasındakı fərqi günlər, aylar və illərlə hesablayır:

SEÇİN dt, DateDiff("d",dt,Tarix()) AS son_gün,


DateDiff("m",dt,Date()) AS son_aylar,
DateDiff("yyyy",dt,Tarix()) AS son_illər
m_gəlirdən;

SQL sorğusu Q047. DateDiff funksiyasından istifadə etməklə malın alındığı tarixdən (cədvəl m_gəlir) cari tarixə qədər olan günlərin sayı hesablanır və istifadə müddəti müqayisə edilir (cədvəl m_product):


DateDiff("d",dt,Date()) AS son_günlər
m_gəlirDƏN DAXİLİ QOŞULMA KİMİ m_product AS b
ON a.product_id=b.id;

SQL sorğusu Q048. Malların qəbul edildiyi tarixdən cari tarixə qədər olan günlərin sayı hesablanır, sonra bu miqdarın istifadə müddətini keçib-keçməməsi yoxlanılır:

SELECT a.id, product_id, dt, lifedays,


DateDiff("d",dt,Date()) AS son_günlər, IIf(son_günlər>həyat günləri,"Bəli","Xeyr") AS date_expire
m_gəlirdən a DAXİLİ QOŞUL m_məhsulu b
ON a.product_id=b.id;

SQL Sorğusu Q049. Malların qəbul edildiyi tarixdən cari tarixə qədər olan ayların sayı hesablanır. ay_son1 sütunu ayların mütləq sayını, month_last2 sütunu tam ayların sayını hesablayır:

dt, DateDiff("m",dt,Tarix()) AS ay_son1, SEÇİN


DateDiff("m",dt,Tarix())-iif(gün(dt)>gün(tarix()),1,0) AS ay_son2
m_gəlirdən;

SQL Query Q050. 2011-ci il üçün alınmış malların miqdarı və miqdarı haqqında rüblük hesabat göstərilir:

SEÇİM kvartal, SUM(nəticə_cəmi) AS Ümumi


FROM (SEÇİN məbləğ*qiymət AS nəticə_cəm, ay(dt) AS m,
KÖVÇƏ(m =10.4) AS kvartal
m_gəlirdən HARADA il(dt)=2011) AS t
Rübə görə Qrup;

Sorğu Q051. Aşağıdakı sorğu istifadəçilərin alınan malların miqdarından çox miqdarda malların istehlakı haqqında məlumatı sistemə daxil edə bilib-bilmədiyini öyrənməyə kömək edir:

məhsul_id SEÇİN, SUM(cəmdə) gəlir_cəmi AS, SUM(xərc_cəm) nəticə_cəmi AS


FROM (məhsul_id-i SEÇİN, məbləğ*qiymət daxildə, 0 xaric kimi
m_gəlirindən
BÜTÜN BİRLİK
məhsul_id-sini SEÇİN, cəmi kimi 0, cəmi kimi məbləğ*qiymət
m_nəticədən) AS t
məhsul_idinə görə qruplaşdırın
CƏMİ VAR (cəmdə)
Sorğu Q052. Sorğu ilə qaytarılan sətirlərin nömrələnməsi müxtəlif üsullarla həyata keçirilir. Məsələn, siz MS Access-in özündən istifadə etməklə MS Access-də hazırlanmış hesabatın sətirlərini yenidən nömrələyə bilərsiniz. Siz həmçinin proqramlaşdırma dillərindən, məsələn, VBA və ya PHP-dən istifadə edərək yenidən nömrələyə bilərsiniz. Ancaq bəzən bunu SQL sorğusunun özündə etmək lazımdır. Beləliklə, aşağıdakı sorğu m_income cədvəlinin sətirlərini ID sahəsinin dəyərlərinin artan sırasına uyğun olaraq nömrələyəcək:

COUNT(*) N, b.id, b.məhsul_id, b.miqdar, b.qiymət kimi SEÇİN


FROM m_income a DAXİLİ QOŞUL m_gəlir b ON a.id QRUP BY b.id, b.məhsul_id, b.miqdar, b.qiymət;

Sorğu Q053. Satış məbləğinə görə məhsullar arasında ilk beşliyə daxil olan məhsullar nümayiş etdirilir. İlk beş qeyd TOP təlimatından istifadə edərək çap olunur:

TOP 5, məhsul_id, cəm(məbləğ*qiymət) cəm kimi SEÇİN


m_nəticədən
məhsul_idinə görə qruplaşdırın
məbləğə görə SİFARİŞ(məbləğ*qiymət) DESC;

Sorğu Q054. Satış məbləğinə görə məhsullar arasında ilk beş məhsul göstərilir və nəticədə sıralar nömrələnir:

COUNT(*) N, b.məhsul_id, b.summa kimi SEÇİN


FROM


FROM m_outcome GROUP BY BY product_id) AS a
DAXİLİ QOŞULUN
(məhsul identifikatorunu seçin, cəmi(məbləğ*qiymət) cəmi,
summa*10000000+məhsul_id AS id
FROM m_outcome QRUP BY product_id) AS b
ON a.id>=b.id
QRUPLA B.məhsul_id, b.summa
COUNT (*) SAYIB (*) SİPARİŞİNİN OLMASI;

Sorğu Q055. Aşağıdakı SQL sorğusu MS Access SQL-də COS, SIN, TAN, SQRT, ^ və ABS riyazi funksiyalarının istifadəsini göstərir:

SEÇ (m_income-dən say(*) seçin) N kimi, 3.1415926 pi, k,


2*pi*(k-1)/N x, COS(x) COS_, SIN(x) SIN_, TAN(x) TAN_,
SQR(x) SQRT_ kimi, x^3 "x^3", ABS(x) ABS_ kimi
FROM (SAYI(*) K AS SEÇİN
m_gəlirDƏN DAXİLİ QOŞULMA KİMİ m_income AS b ON a.idGROUP BY BY) t;

SQL sorğusu. MS Access-də nümunələr. YENİLƏNİB: 1-10

Sorğu U001. Aşağıdakı SQL dəyişiklik sorğusu m_income cədvəlində 3 kodu olan malların qiymətlərini 10% artırır:

YENİLƏNİB m_gəlir SET qiyməti = qiymət*1.1


HARADA məhsul_id=3;

U002 sorğusu. Aşağıdakı SQL yeniləmə sorğusu m_income cədvəlindəki bütün məhsulların kəmiyyətini adları “Neft” sözü ilə başlayan 22 vahid artırır:

YENİLƏNİB m_gəlir SET məbləği = məbləğ+22


WHERE product_id IN (m_product FROM identifikatoru "Neft*" KİMİ başlığı SEÇİN HARADA);

U003 sorğusu. m_outcome cədvəlində dəyişiklik üçün aşağıdakı SQL sorğusu Sladkoe MMC tərəfindən istehsal olunan bütün malların qiymətlərini 2 faiz azaldır:

YENİLƏNİB m_nəticə SET qiyməti = qiymət*0.98


məhsul_id HARADA
(m_product-dan a.id SEÇİN və İNNER JOIN m_supplier b
ON a.supplier_id=b.id WHERE b.title="LLC)"Сладкое"");. !}

Məlumat bazasına qeydlərin daxil edilməsi, silinməsi, yenilənməsi

ExecuteReader() metodu yalnız oxumaq üçün irəliyə doğru məlumat axınından istifadə edərək SQL Select ifadəsinin nəticələrinə baxmağa imkan verən məlumat oxuyucu obyektini əldə edir. Bununla belə, əgər verilənlər cədvəlini dəyişdirən SQL ifadələrini yerinə yetirməlisinizsə, o zaman metodu çağırmalısınız. ExecuteNonQuery() bu obyektin komandalar. Bu vahid metod əmr mətninin formatından asılı olaraq əlavələr, dəyişikliklər və silinmələri yerinə yetirmək üçün nəzərdə tutulmuşdur.

Konsepsiya sorğusuz nəticə dəstini qaytarmayan SQL ifadəsi deməkdir. Beləliklə, Bəyanatları seçin sorğulardır, lakin Insert, Update və Delete ifadələri deyil. Müvafiq olaraq, ExecuteNonQuery() metodu yeni qeydlər dəsti deyil, bu ifadələrin təsir etdiyi sıraların sayını ehtiva edən int qaytarır.

Yalnız ExecuteNonQuery() sorğusundan istifadə etməklə mövcud verilənlər bazasının məzmununu necə dəyişdirəcəyini göstərmək üçün növbəti addım AutoLot verilənlər bazası prosesini əhatə edən öz məlumat giriş kitabxananızı yaratmaqdır.

Həqiqi istehsal mühitində sizin ADO.NET məntiqiniz, demək olar ki, bir sadə səbəbə görə .NET .dll yığıncağında təcrid olunacaq - kodun təkrar istifadəsi! Əvvəlki məqalələrdə bu, sizi qarşıya qoyulan işlərdən yayındırmamaq üçün edilməyib. Lakin AutoLot verilənlər bazası ilə işləməli olan hər bir proqram üçün eyni əlaqə məntiqini, eyni verilənləri oxuma məntiqini və eyni əmr icrası məntiqini inkişaf etdirmək vaxt itkisi olardı.

.NET kod kitabxanasında verilənlərə giriş məntiqini təcrid etməklə, istənilən istifadəçi interfeysi (konsol üslubu, iş masası üslubu, veb üslubu və s.) ilə müxtəlif proqramlar hətta dildən asılı olmayaraq mövcud kitabxanaya daxil ola bilər. Əgər siz C#-da verilənlərə çıxış kitabxanası hazırlasanız, o zaman digər .NET proqramçıları özlərini yarada biləcəklər istifadəçi interfeysləri istənilən dildə (məsələn, VB və ya C++/CLI).

Bizim məlumat girişi kitabxanamız (AutoLotDAL.dll) ADO.NET ilə əlaqəli növlərdən istifadə edərək AutoLot verilənlər bazası ilə qarşılıqlı əlaqədə olacaq tək ad sahəsini (AutoLotConnectedLayer) ehtiva edəcəkdir.

AutoLotDAL ("AutoLot Data Access Layer" üçün qısa) adlı yeni C# Sinif Kitabxanası layihəsi yaratmaqla başlayın və sonra orijinal C# kod faylının adını AutoLotConnDAL.cs olaraq dəyişdirin.

Sonra ad sahəsinin əhatə dairəsini AutoLotConnectedLayer olaraq dəyişdirin və orijinal sinfin adını InventoryDAL olaraq dəyişdirin, çünki bu sinif AutoLot verilənlər bazasının İnventar cədvəli ilə qarşılıqlı əlaqə yaratmaq üçün nəzərdə tutulmuş müxtəlif üzvləri müəyyən edəcək. Nəhayət, aşağıdakı .NET ad boşluqlarını idxal edin:

Sistemdən istifadə; System.Collections.Generic istifadə edərək; System.Text istifadə edərək; System.Data istifadə edərək; System.Data.SqlClient istifadə edərək; ad sahəsi AutoLotConnectedLayer ( ictimai sinif InventoryDAL ( ) )

Bağlantı məntiqinin əlavə edilməsi

İlk vəzifəmiz etibarlı əlaqə sətirindən istifadə edərək zəng prosesinin məlumat mənbəyinə qoşulmasına və ondan ayrılmasına imkan verən metodları müəyyən etməkdir. AutoLotDAL.dll yığıncağımız System.Data.SqlClient sinif növlərindən istifadə etmək üçün sərt kodlaşdırılacağı üçün InventoryDAL obyekti yaradılan zaman ayrılacaq özəl SqlConnection dəyişənini təyin edin.

Əlavə olaraq, bu dəyişənlə qarşılıqlı əlaqədə olacaq OpenConnection() metodunu və sonra başqa CloseConnection() təyin edin:

İctimai sinif InventoryDAL ( şəxsi SqlConnection connect = null; ictimai etibarsız OpenConnection(string connectionString) ( connect = new SqlConnection(connectionString); connect.Open(); ) public void CloseConnection() ( connect.Close(); ) )

Qısalıq üçün, InventoryDAL növü bütün mümkün istisnaları yoxlamayacaq və müxtəlif vəziyyətlər baş verdikdə (məsələn, əlaqə sətri səhv olduqda) xüsusi istisnalar atmayacaq. Bununla belə, əgər siz istehsalat məlumatlarına giriş kitabxanası qurursanız, iş vaxtında baş verə biləcək anomaliyaları nəzərə almaq üçün çox güman ki, strukturlaşdırılmış istisnaların idarə edilməsi üsullarından istifadə etməli olacaqsınız.

Daxiletmə məntiqinin əlavə edilməsi

Daxil et yeni girişİnventar cədvəlinə keçid SQL ifadəsinin formatlaşdırılmasına düşür Daxil et(istifadəçi girişindən asılı olaraq) və əmr obyektindən istifadə edərək ExecuteNonQuery() metodunu çağırmaq. Bunu etmək üçün İnventar cədvəlinin dörd sütununa (CarID, Rəng, Marka və PetName) uyğun gələn dörd parametri qəbul edən InventoryDAL sinfinə ictimai InsertAuto() metodunu əlavə edin. Bu arqumentlərə əsaslanaraq, yeni bir giriş əlavə etmək üçün bir xətt yaradın. Nəhayət, SqlConnection obyektindən istifadə edərək SQL ifadəsini yerinə yetirin:

İctimai etibarsız InsertAuto (int id, sətir rəngi, string maketi, string petName) ( // SQL bəyanatı string sql = string.Format("Invent Into Inventory" + "(CarID, Make, Color, PetName) Dəyərlər (@CarId, @Make, @Color, @PetName)"); istifadə edərək (SqlCommand cmd = yeni SqlCommand(sql, this.connect)) ( // Parametrləri əlavə edin cmd.Parameters.AddWithValue("@CarId", id); cmd.Parameters.AddWithValue("@Make", make); cmd. Parameters.AddWithValue("@Color", color); cmd.Parameters.AddWithValue("@PetName", petName); cmd.ExecuteNonQuery(); ) )

Əlaqəli verilənlər bazasında qeydləri təmsil edən siniflərin müəyyən edilməsi verilənlərə giriş kitabxanası yaratmağın ümumi üsuludur. Əslində, ADO.NET Entity Framework avtomatik olaraq verilənlər bazası məlumatları ilə qarşılıqlı əlaqə yaratmağa imkan verən güclü tipli siniflər yaradır. Yeri gəlmişkən, ADO.NET-in müstəqil təbəqəsi relational verilənlər bazasında verilmiş cədvəldən verilənləri təmsil etmək üçün güclü tipli DataSet obyektlərini yaradır.

Sətir birləşməsindən istifadə edərək SQL bəyanatının yaradılması təhlükəsizlik riski ola bilər (SQL daxiletmə hücumlarını düşünün). Bir az sonra təsvir ediləcək parametrləşdirilmiş sorğudan istifadə edərək əmr mətnini yaratmaq daha yaxşıdır.

Silinmə məntiqinin əlavə edilməsi

Silinmə mövcud rekord yeni bir rekord daxil etməkdən daha çətin deyil. InsertAuto() kodundan fərqli olaraq, kiminsə artıq sifariş etdiyi avtomobili Müştərilər cədvəlindən çıxarmaq cəhdinin edildiyi mümkün vəziyyəti idarə edən bir mühüm sınaq/tutma sahəsi göstəriləcək. InventoryDAL sinfinə aşağıdakı metodu əlavə edin:

İctimai etibarsız DeleteCar(int id) ( string sql = string.Format("Delete from inventory where CarID = "(0)"", id); use (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( cəhd edin ( cmd.ExecuteNonQuery(); ) catch (SqlException ex) ( İstisna xətası = yeni İstisna("Bağışlayın, bu maşın geri sifarişdədir!", məsələn; atma xətası; ) ) )

Dəyişiklik məntiqinin əlavə edilməsi

İnventar cədvəlində mövcud qeydin yenilənməsinə gəldikdə, dərhal aydın sual yaranır: zəng prosesində dəqiq nəyi dəyişməyə icazə vermək olar: avtomobilin rəngi, dostluq adı, model və ya hər üçü? Çevikliyi maksimuma çatdırmağın bir yolu, istənilən SQL ifadəsini ehtiva edə bilən sətir tipli bir parametr götürən metodu müəyyən etməkdir, lakin bu, ən azı risklidir.

İdeal olaraq, çağırış prosesinə qeydləri dəyişdirməyə imkan verən bir sıra üsullara sahib olmaq daha yaxşıdır fərqli yollar. Bununla belə, məlumat əldə etmək üçün sadə kitabxanamız üçün zəng prosesinə göstərilən avtomobilin dost adını dəyişməyə imkan verən vahid metod müəyyən edəcəyik:

İctimai etibarsız UpdateCarPetName(int id, string newpetName) ( string sql = string.Format("Inventory Set PetName = "(0)" Burada CarID = "(1)"", newpetName, id); istifadə edərək (SqlCommand cmd = yeni SqlCommand(sql, this.connect)) ( cmd.ExecuteNonQuery(); ) )

Nümunə alma məntiqinin əlavə edilməsi

İndi qeydləri seçmək üçün bir üsul əlavə etməliyik. Daha əvvəl göstərildiyi kimi, xüsusi məlumat provayderinin məlumat oxuyucu obyekti yalnız oxumaq üçün kursordan istifadə edərək qeydləri seçməyə imkan verir. Read() metodunu çağırmaqla siz hər bir qeydi bir-bir emal edə bilərsiniz. Bütün bunlar əladır, lakin indi biz bu qeydləri çağırış tətbiqi təbəqəsinə necə qaytaracağımızı anlamalıyıq.

Bir yanaşma Read() metodundan istifadə edərək məlumatları əldə etmək və sonra çoxölçülü massivi (və ya ümumi Siyahı kimi başqa obyekti) doldurub qaytarmaqdır. ).

Başqa bir yol, əslində müstəqil ADO.NET qatına aid olan System.Data.DataTable obyektini qaytarmaqdır. DataTable cədvəlli verilənlər blokunu (kağız və ya elektron cədvəl kimi) təmsil edən sinifdir.

DataTable sinfi sətir və sütunlar toplusu kimi məlumatları ehtiva edir. Bu kolleksiyalar proqramlı şəkildə doldurula bilər, lakin DataTable tipində məlumat oxuyucu obyektindən istifadə edərək onları avtomatik doldura bilən Load() metodu var! İnventar cədvəlindən verilənlərin Data Cədvəli kimi qaytarıldığı bir nümunə:

Public DataTable GetAllInventoryAsDataTable() ( DataTable inv = new DataTable(); string sql = "Select * Inventory"; istifadə edərək (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( SqlDataReader dr = cmd.ExecutevReader(); .Load(dr); dr.Close(); ) inv qaytarın; )

Parametrləşdirilmiş əmr obyektləri ilə işləmək

İndiyə qədər InventoryDAL növü üçün daxil etmək, yeniləmək və silmək məntiqində biz hər bir SQL sorğusu üçün sərt kodlu sətir literallarından istifadə etmişik. Yəqin ki, siz SQL parametrlərinə mətn parçası kimi deyil, obyekt kimi baxmağa imkan verən parametrləşdirilmiş sorğuların mövcudluğundan xəbərdarsınız.

SQL sorğuları ilə daha obyektyönümlü şəkildə işləmək nəinki yazı xətalarını azaltmağa kömək edir (güclü tipli xassələrlə), lakin parametrləşdirilmiş sorğular adətən sətirli hərfi sorğulardan daha sürətli olur, çünki onlar yalnız bir dəfə təhlil edilir (hər dəfə deyil). CommandText xüsusiyyəti SQL sətirinə təyin edilmişdir). Bundan əlavə, parametrləşdirilmiş sorğular SQL inyeksiya hücumlarından qoruyur (məlum məlumatlara giriş təhlükəsizliyi problemi).

Parametrləşdirilmiş sorğuları dəstəkləmək üçün ADO.NET əmr obyektləri fərdi parametr obyektlərinin kolleksiyasını saxlayır. Varsayılan olaraq, bu kolleksiya boşdur, lakin siz uyğun gələn istənilən sayda parametr obyekti əlavə edə bilərsiniz yer tutucu parametrləri SQL sorğusunda. Əgər SQL sorğusu parametrini hansısa əmr obyektinin parametrlər kolleksiyasının üzvü ilə əlaqələndirmək lazımdırsa, SQL parametrindən əvvəl @ simvolu qoyun (ən azı Microsoft ilə işləyərkən). SQL Server, baxmayaraq ki, bütün DBMS-lər bu təyinatı dəstəkləmir).

DbParameter növündən istifadə edərək parametrlərin qurulması

Parametrləşdirilmiş sorğular yaratmağa başlamazdan əvvəl gəlin DbParameter növü (provayder parametr obyektləri üçün əsas sinif) ilə tanış olaq. Bu sinif parametrin adını, ölçüsünü və növünü, həmçinin parametrin baxış istiqaməti kimi digər xüsusiyyətlərini təyin etməyə imkan verən bir sıra xüsusiyyətlərə malikdir. DbParameter növünün bəzi mühüm xüsusiyyətləri aşağıda verilmişdir:

DbType

CLR növü kimi təqdim olunan parametrdən məlumat növünü alır və ya təyin edir

İstiqamət

Parametr növünü qaytarır və ya təyin edir: yalnız giriş, yalnız çıxış, giriş və çıxış və ya dəyəri qaytarmaq üçün parametr

IsNullable

Parametrin boş dəyərləri qəbul edib-etmədiyini qaytarır və ya təyin edir

Parametr adı

DbParameter adını alır və ya təyin edir

Ölçü

Problemlər və ya quraşdırmalar maksimum ölçü parametr üçün məlumatlar (yalnız mətn məlumatları üçün faydalıdır)

Dəyər

Parametrin dəyərini qaytarır və ya təyin edir

Komanda obyektləri toplusunu DBParameter-ə uyğun obyektlərlə necə doldurmağı nümayiş etdirmək üçün gəlin InsertAuto() metodunu parametr obyektlərindən istifadə edəcək şəkildə yenidən yazaq (bütün digər üsullar oxşar şəkildə yenidən hazırlana bilər, lakin indiki nümunə bizim üçün kifayət edəcək):

İctimai etibarsız InsertAuto(int id, sətir rəngi, string make, string petName) ( // SQL bəyanat sətri sql = string.Format("Insert Into Inventory" + "(CarID, Make, Color, PetName) Dəyərlər("(0) ","(1)","(2)","(3)")", id, make, color, petName); // Parametrləşdirilmiş əmrdən istifadə edərək (SqlCommand cmd = new SqlCommand(sql, this.connect)) ( SqlParameter param = new SqlParameter(); param.ParameterName = "@CarID"; param.Value = id; param.SqlDbType = SqlDbType.Int; cmd.Parameters.Add(param); param = yeni SqlParameter();param. ParameterName = "@Make"; param.Value = make; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Color "; param.Value = color; param.SqlDbType = SqlDbType.Char; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@PetName"; param.Value = petName;param.SqlDbType = SqlDbType.Char;param.Size = 10;cmd.Parameters.Add(param);cmd.ExecuteNonQuery(); ) )

Qeyd edək ki, buradakı SQL sorğusu həmçinin hər birinin qarşısında @ simvolu olan dörd yer tutucu simvoldan ibarətdir. SqlParameter tipində ParameterName xassəsindən istifadə edərək, siz bu yer tutucuların hər birini təsvir edə və müxtəlif məlumatları (dəyər, məlumat tipi, ölçü və s.) güclü şəkildə yazılmış şəkildə təyin edə bilərsiniz. Bütün parametr obyektləri hazırlandıqdan sonra Add() çağırışından istifadə edərək əmr obyektləri kolleksiyasına əlavə edilir.

Burada parametr obyektlərinin dizaynı üçün müxtəlif xüsusiyyətlərdən istifadə olunur. Bununla belə, qeyd edək ki, parametr obyektləri müxtəlif xassələrin dəyərlərini təyin etməyə imkan verən bir sıra həddindən artıq yüklənmiş konstruktorları dəstəkləyir (bu, daha yığcam kod bazası ilə nəticələnir). Həmçinin nəzərə alın ki, Visual Studio 2010-da avtomatik olaraq sizin üçün bu yorucu parametrləri idarə edən kodun çoxunu yaradacaq müxtəlif qrafik dizaynerləri var.

Parametrləşdirilmiş sorğunun yaradılması çox vaxt daha çox kodla nəticələnir, lakin nəticə SQL ifadələrini proqramlı şəkildə tənzimləmək, eləcə də daha yaxşı performans üçün daha əlverişli yoldur. Bu texnika istənilən SQL sorğusu üçün istifadə edilə bilər, baxmayaraq ki, saxlanılan prosedurları yerinə yetirmək lazım olduqda parametrləşdirilmiş sorğular ən faydalıdır.

Qaydalar kvadrat mötərizələr konstruksiyanın [isteğe bağlı hissəsi] üçün dayanır. Şaquli bar seçimlər arasında seçimi göstərir (var1|var2). Ellips bir neçə dəfə mümkün təkrar deməkdir - 1 dəfə, 2 dəfə [, …]

SELECT bəyanatı

Microsoft Access verilənlər bazası mühərrikinə verilənlər bazasından məlumatları qeydlər dəsti kimi qaytarmağı tapşırır.

Sintaksis

SEÇİN [ predikat] { * | masa.* | [masa.]sahə 1

[, [masa.]sahə 2 [, ...]]}
FROM cədvəl_ifadəsi [, ...]




SELECT ifadəsi aşağıdakı elementləri ehtiva edir.

Element

Təsvir

Predikat

Aşağıdakı predikatlardan biri: ALL, DISTINCT, DISTINCTROW və ya TOP. Qaytarılan qeydlərin sayını məhdudlaşdırmaq üçün predikatlar istifadə olunur. Əgər predikat verilməyibsə, standart ALL-dir.

Bütün sahələrin göstərilən cədvəldən və ya cədvəllərdən seçildiyini göstərir

Cədvəl

Sahələrindən qeydlərin seçildiyi cədvəlin adı

sahə 1, sahə 2

Alınacaq məlumatları ehtiva edən sahələrin adları. Çoxsaylı sahələr göstərilibsə, məlumatlar adlarının qeyd olunduğu ardıcıllıqla alınacaq

ləqəb1, ləqəb2

Orijinal sütun adları əvəzinə sütun başlıqları kimi istifadə edilən adlar masalar

cədvəl_ifadəsi

Alınacaq məlumatları ehtiva edən bir və ya bir neçə cədvəl adı.

xarici_verilənlər bazası

Komponentdə göstərilən cədvəlləri ehtiva edən verilənlər bazasının adı cədvəl_ifadəsi cari verilənlər bazasında olmadıqda

Qeydlər

Bu əməliyyatı yerinə yetirmək üçün Microsoft Access verilənlər bazası mühərriki müəyyən edilmiş cədvəl(lər)də axtarış aparır, istədiyiniz sütunları alır, göstərilən şərtlərə cavab verən sətirləri seçir və nəticədə yaranan sətirləri müəyyən edilmiş qaydada çeşidləyir və ya qruplaşdırır.

SELECT ifadələri verilənlər bazası məlumatlarını dəyişmir.

SELECT ifadəsi adətən SQL ifadəsinin ilk sözüdür (SQL ifadəsi (string). Müəyyən edən ifadə SQL əmri, məsələn, SEÇ, YENİLƏNDİR və ya SİL, və HARADA və ya SİPARİŞ VERİN kimi bəndlər daxil olmaqla. SQL ifadələri/sətirləri adətən sorğularda və statistik funksiyalarda istifadə olunur.) Əksər SQL ifadələri ya SELECT ifadələri, ya da SELECT...INTO ifadələridir.

SELECT ifadəsi üçün minimum sintaksis aşağıdakı kimidir:

SEÇİN sahələr FROM masa

Cədvəldəki bütün sahələri seçmək üçün ulduzdan (*) istifadə edə bilərsiniz. Aşağıdakı nümunə İşçilər cədvəlindəki bütün sahələri seçir.

İşçilərdən * SEÇİN;

Əgər sahə adı FROM bəndində bir neçə cədvələ daxil edilibsə, ondan əvvəl cədvəlin adı və ifadəsi yazın. «.» (nöqtə). Aşağıdakı nümunədə "Şöbə" sahəsi "İşçilər" və "Nəzarətçilər" cədvəllərində mövcuddur. SQL ifadəsi İşçilər cədvəlindən şöbələri və Nəzarətçilər cədvəlindən nəzarətçi adlarını seçir.

İşçiləri SEÇİN. Şöbə, müdirlər. İcraçı Adı İşçilərdən DAXİLİ MÜDÜRLƏRƏ QOŞULUN HARADA İşçilər. Şöbə = Menecerlər. Şöbə;

RecordSet obyekti yaratdığınız zaman, cədvəl sahəsinin adı Microsoft Access verilənlər bazası mühərriki tərəfindən obyektdəki "Field" obyektinin adı kimi istifadə olunur. RecordSet. Sahənin adını dəyişdirmək lazımdırsa və ya sahəni yaradan ifadə tərəfindən təmin edilmirsə, qorunan sözdən istifadə edin (Zorunlu söz. Visual Basic kimi bir dilin elementi olan söz. Qorunan sözlərə ifadələrin adları, daxili funksiyalar və məlumat növləri, metodlar, operatorlar və obyektlər.) AS. Aşağıdakı nümunə qaytarılmış obyekti adlandırmaq üçün "Gün" başlığının necə istifadə edildiyini göstərir Sahə alınan obyektdə RecordSet.

İşçilərdən ad gününü gün kimi SEÇİN;

Birmənalı olmayan və ya eyni obyekt adlarını qaytaran ümumi funksiyalar və ya sorğularla işləyərkən Sahə, fərqli obyekt adı yaratmaq üçün AS bəndindən istifadə etməlisiniz Sahə. Aşağıdakı nümunədə qaytarılan obyekt Sahə alınan obyektdə RecordSet“Census” adı verilir.

İşçilərin siyahıyaalınması kimi SAYI(İşçi Kodu) SEÇİN;

SELECT ifadəsi ilə işləyərkən, əldə edilən məlumatları daha da məhdudlaşdırmaq və təşkil etmək üçün əlavə bəndlərdən istifadə edə bilərsiniz. Əlavə məlumat üçün istifadə etdiyiniz təklifin yardım mövzusuna baxın.

FROM bəndi

SELECT ifadəsində sadalanan sahələri ehtiva edən cədvəlləri və sorğuları təyin edir.

Sintaksis

SEÇİN sahə_siyahısı
FROM cədvəl_ifadəsi

FROM bəndini ehtiva edən SELECT ifadəsi aşağıdakı elementləri ehtiva edir:

Element

Təsvir

sahə_siyahısı

cədvəl_ifadəsi

Bir və ya bir neçə cədvəli müəyyən edən ifadə - məlumat mənbələri. İfadə cədvəl adı, saxlanılan sorğu adı və ya INNER JOIN, LEFT JOIN və ya RIGHT JOIN operatoru ilə qurulmuş nəticə ifadəsi ola bilər.

xarici_verilənlər bazası

Göstərilən bütün cədvəlləri ehtiva edən xarici verilənlər bazasına tam yol cədvəl_ifadəsi

Qeydlər


SELECT ifadəsindən sonra FROM bəndinin olması tələb olunur.

Cədvəllərin sıralanma ardıcıllığı cədvəl_ifadəsi fərq etməz.

Əlaqəli cədvəllərdən istifadə (Əlaqəli cədvəl. Açıq verilənlər bazasının bir hissəsi olmayan, lakin Microsoft Access-dən əldə edilə bilən faylda saxlanılan cədvəl. İstifadəçi əlaqəli cədvələ qeydləri əlavə edə, silə və dəyişə bilər, lakin onun strukturunu dəyişə bilməz. .) IN bəndinin əvəzinə siz xarici verilənlər bazasından məlumatların əldə edilməsi prosesini asan və səmərəli edə bilərsiniz.

Aşağıdakı nümunə İşçilər cədvəlindən məlumatların necə alınacağını göstərir.

SEÇ Soyadı, Ad

İşçilərdən;

SQL sorğuları üçün seçilmiş qeydləri göstərir ( SQL dili(Strukturlaşdırılmış Sorğu Dili). Əlaqəli DBMS-lərdə verilənlərə daxil olmaq, sorğulamaq, yeniləmək və idarə etmək üçün geniş istifadə olunan strukturlaşdırılmış sorğu və verilənlər bazası proqramlaşdırma dili.

Sintaksis

SEÇİN ]]
FROM masa

Bu predikatları ehtiva edən SELECT ifadəsi aşağıdakı komponentləri ehtiva edir:

Komponent

Təsvir

Heç bir predikatlar daxil edilmədikdə nəzərdə tutulur. Microsoft Access verilənlər bazası mühərriki SQL ifadəsinin şərtlərinə uyğun gələn bütün qeydləri seçir (SQL ifadəsi (sətir). SEÇ, YENİLƏNİB və ya SİL kimi SQL əmrini təyin edən və HARADA və ya SİPARİŞ BY kimi bəndləri ehtiva edən ifadə. SQL ifadələri/sətirləri adətən sorğularda və statistik funksiyalarda istifadə olunur). Aşağıdakı iki eyni nümunə İşçilər cədvəlindən bütün qeydlərin necə qaytarılacağını göstərir.

İşçilərdən

EmployeeCode ilə SİFARİŞ;

İşçilərdən

EmployeeCode ilə SİFARİŞ;

Seçilmiş sahələrdə dublikat məlumatları ehtiva edən qeydləri istisna edir. Yalnız SELECT ifadəsində sadalanan sahələrin hər birinin unikal dəyərləri sorğu nəticələrinə daxil edilir. Məsələn, İşçilər cədvəlində sadalanan bəzi işçilərin soyadı eyni ola bilər. Soyad sahəsində iki qeyddə "İvanov" soyadı varsa, aşağıdakı SQL ifadəsi "İvanov" soyadını ehtiva edən yalnız bir qeydi qaytarır.

FƏRQLİ Soyad SEÇİN

DISTINCT komponenti buraxılıbsa, sorğu "İvanov" soyadı ilə hər iki qeydi qaytarır.

SELECT bəndində bir neçə sahə varsa, bütün sahə dəyərlərinin birləşməsi sorğu nəticələrinə yalnız həmin qeyd üçün unikal olduqda daxil edilir.

DISTINCT komponentindən istifadə edən sorğunun nəticələri digər istifadəçilər tərəfindən edilən sonrakı dəyişiklikləri əks etdirmək üçün yenilənmir.

Eyni verilənləri olan ayrı-ayrı sahələri ehtiva etməkdənsə, bütövlükdə təkrarlanan qeydlərdən məlumatları istisna edir. Tutaq ki, “Müştəri kodu” sahəsindən istifadə etməklə “Müştərilər” və “Sifarişlər” cədvəllərini birləşdirən sorğu yaradılıb. Müştərilər cədvəlində dublikat Müştəri ID sahələri yoxdur, lakin onlar Sifarişlər cədvəlində mövcuddur, çünki hər bir müştərinin bir neçə sifarişi ola bilər. Aşağıdakı SQL ifadəsi, ən azı bir sifariş vermiş təşkilatları siyahıya almaq üçün DISTINCTROW komponentindən bu sifarişlərin təfərrüatlarını qeyd etmədən necə istifadə olunacağını göstərir.

Müştərilərdən DAXİLİ QOŞULUŞ Sifarişlərindən FƏRQLİ Mövzu SEÇİN

ON Müştərilər. CustomerId = Sifarişlər. Müştəri kodu

Başlığa görə SİFARİŞ;

DISTINCTROW komponenti buraxılıbsa, sorğu bir neçə dəfə sifariş verən hər bir təşkilat üçün çoxlu sıra ilə nəticələnir.

DISTINCTROW komponenti yalnız sorğuda istifadə olunan bəzi cədvəllərdən sahələr seçildikdə qüvvəyə minir. Əgər sorğuda yalnız bir cədvəl varsa və ya bütün cədvəllərdən sahələr götürülürsə, DISTINCTROW komponenti nəzərə alınmır.

TOP n

ORDER BY bəndi ilə müəyyən edilmiş diapazonda ilk və ya son qeydlər arasında olan qeydlərin müəyyən edilmiş sayını qaytarır. Tutaq ki, siz 1994-cü ilin ən yaxşı 25 şagirdinin adlarını göstərmək istəyirsiniz.

Ad Soyad

HARADA Məzuniyyət ili = 2003

GradePointAverage DESC ilə SİFARİŞ;

ORDER BY bəndini daxil etməsəniz, sorğu Tələbələr cədvəlindən WHERE bəndinə cavab verən təsadüfi 25 qeyd dəstini qaytaracaq.

TOP predikatı bərabər dəyərlər arasında seçimi nəzərdə tutmur. Əvvəlki nümunədəki 25 və 26-cı qeydlər eyni GPA-ya malik olsaydı, sorğu 26 qeyd qaytarardı.

Siz həmçinin SİPARİŞ BY bəndi ilə müəyyən edilmiş diapazonda ilk və ya sonuncu qeydlərin bəzi faizini əldə etmək üçün PERCENT ehtiyat sözündən istifadə edə bilərsiniz. Tutaq ki, ilk 25-lik əvəzinə, məzun sinifindəki tələbələrin ən aşağı 10%-ni göstərmək istəyirsiniz.

TOP 10 FAİZİ SEÇİN

Ad Soyad

HARADA Məzuniyyət ili = 2003

GradePointAverage ASC tərəfindən SİFARİŞ;

ASC predikatı diapazonun aşağı hissəsindən dəyərlərin çıxışını təyin edir. TOP predikatından sonra gələn dəyər Tam ədəd məlumat növü olmalıdır. Tam ədədi dəyərləri saxlamaq üçün istifadə edilən əsas məlumat növü. Tam ədəd dəyişəni -32768 ilə 32767 aralığında 64 bitlik (8 bayt) ədəd kimi saxlanılır. ) işarəsiz .

TOP predikatı sorğunun yenilənməsinə təsir etmir.

masa

Qeydlərin götürüldüyü cədvəlin adı.

həmçinin bax

SELECT bəyanatı

FROM bəndi

WHERE bəndi

FROM bəndində sadalanan cədvəllərdən hansı qeydlərin SELECT, UPDATE və ya DELETE ifadələri ilə işləndiyini müəyyən edir.

Sintaksis

SEÇİN sahə_siyahısı
FROM cədvəl_ifadəsi
HARADA seçim_şərtləri

WHERE bəndini ehtiva edən SELECT ifadəsi aşağıdakı hissələri ehtiva edir.

Hissə

Təsvir

sahə_siyahısı

İstənilən ləqəblərlə birlikdə götürülən sahə və ya sahələrin adı (Alias ​​(SQL). İfadədəki cədvəl və ya sahə üçün alternativ ad. Təxəllüslər adətən daha qısa cədvəl və ya sahə adları kimi sonrakı istinadların asanlığı üçün istifadə olunur. proqramlar, qeyri-müəyyən istinadların qarşısını almaq və sorğu nəticələrini göstərərkən daha təsviri adlar əldə etmək üçün.), predikatlar (ALL, DISTINCT, DISTINCTROW və ya TOP) və ya SELECT ifadəsinin hər hansı digər parametrləri ilə.

cədvəl_ifadəsi

Məlumatın alındığı cədvəl və ya cədvəllərin adı.

seçim_şərtləri

İfadə (İfadə. Riyazi və məntiqi operatorların, sabitlərin, funksiyaların, sahə adlarının, idarəetmə vasitələrinin və vahid qiymətlə nəticələnən xassələrin kombinasiyası. İfadə hesablamalar apara, mətni emal edə və ya məlumatları təsdiqləyə bilər.) daxil edilmiş qeydlərə uyğun olmalıdır. sorğu nəticələrində.

Qeydlər

Microsoft Access verilənlər bazası mühərriki WHERE bəndində sadalanan şərtlərə cavab verən qeydləri seçir. WHERE bəndi göstərilməyibsə, sorğu cədvəldəki bütün sətirləri qaytarır. Əgər sorğu bir neçə cədvəli təyin edirsə, lakin WHERE və ya JOIN bəndini göstərmirsə, sorğu Dekart məhsulu yaradır (Kartezian məhsulu. İki və ya daha çox cədvələ istinad edən FROM bəndinə malik olan SQL SELECT ifadəsinin icrasının nəticəsidir və HARƏDƏ və ya JOIN ifadəsi yoxdur. Qoşulma üsulunu təyin edən JOIN bəndi.) cədvəlləri.

WHERE bəndi tələb olunmur, lakin istifadə olunarsa, FROM bəndinə əməl etməlidir. Məsələn, siz satış departamentindən bütün işçiləri (HERE Departamenti = "Satış") və ya 18-30 yaş arası (HARƏDƏ Yaş 18-30) arasında olan müştəriləri seçə bilərsiniz.

Birdən çox cədvəldə SQL birləşmə əməliyyatı üçün JOIN bəndindən istifadə edilmirsə, nəticədə obyekt Rekord dəsti yeniləmək mümkün olmayacaq.

WHERE bəndi HAVING bəndinə bənzəyir və seçilmiş qeydləri müəyyənləşdirir. Qeydlər GROUP BY bəndinə görə qruplaşdırıldıqdan sonra HAVING bəndi də göstəriləcək qeydi müəyyənləşdirir.

WHERE bəndi GROUP BY bəndindən istifadə edərək qruplaşdırılmasına ehtiyac olmayan qeydləri istisna etmək üçün istifadə olunur.

SQL ifadəsi ilə hansı qeydlərin qaytarıldığını müəyyən etmək üçün müxtəlif ifadələrdən istifadə edin. Məsələn, aşağıdakı SQL ifadəsi maaşı RUR-dan çox olan bütün işçiləri seçir.

SEÇİN Soyadı, Əmək haqqı HARDADA İşçilərdən Əmək haqqı > 21000;

WHERE bəndində məntiqi operatorlar tərəfindən birləşdirilən 40-a qədər ifadə ola bilər (məsələn, YA).

Boşluq və ya durğu işarələrindən ibarət sahə adını daxil etsəniz, onu kvadrat mötərizə () içərisinə almalısınız. Məsələn, müştəri təfərrüatları cədvəlində xüsusi müştərilər haqqında məlumat ola bilər.

SEÇİN [Müştərinin sevimli restoranı]

Arqumentin təyin edilməsi seçim_şərtləri, tarix hərfi (Tarix hərfi. Etibarlı formatda simvolların istənilən ardıcıllığı, rəqəm işarələri (#) ilə əhatə olunmuşdur. Etibarlı formatlar Dil və Standartlar parametrlərində və Universal Tarix Formatında göstərilən tarix formatıdır.) ABŞ formatında təqdim edilməlidir. , hətta ABŞ-dan kənar tarix formatı istifadə olunsa belə Microsoft Access verilənlər bazası mühərrikinin versiyası. Məsələn, “10 may 1996-cı il” tarixi Böyük Britaniyada 10/5/96, Rusiyada isə 05/10/1996 kimi yazılır. Aşağıdakı nümunələrdə göstərildiyi kimi, tarix hərflərini rəqəm işarələrinə (#) əlavə etməyi unutmayın.

Böyük Britaniya verilənlər bazasında 10 may 1996-cı il tarixinə aid qeydləri tapmaq üçün aşağıdakı SQL ifadəsindən istifadə edin:

Sifarişlərdən * SEÇİN Göndərmə Tarixi = #10.05.1996#;

Funksiyadan da istifadə edə bilərsiniz DateValue, beynəlxalq parametrləri tanımaqla, Microsoft tərəfindən quraşdırılmışdır Windows®. Məsələn, Rusiya üçün bu kodu istifadə edin:

Göndərmə tarixi = DateValue ("05/10/1996");

Və aşağıdakı kod Böyük Britaniya üçündir:

Göndərmə tarixi = DateValue("10/5/96");

Qeyd. Seçim meyarları sətirində göstərilən sütun GUID (Replika ID (GUID) növündədirsə. Replikasiyanı unikal şəkildə müəyyən etmək üçün Microsoft Access verilənlər bazasında 16 baytlıq sahə istifadə olunur. GUID-lər replikaları, replika dəstlərini, cədvəlləri, qeydləri və digər obyektlər.Microsoft Access verilənlər bazalarında GUID kodları replika kodları adlanır.), seçim şərtləri bir qədər fərqli sintaksisdən istifadə edir.

HARADA ReplicaID = (GUID (AB-CDEF0ABCDEF))

İç-içə mötərizələrin və defislərin düzgün yerləşdirildiyinə əmin olun.

Mənbə səhifəsi: http://office. /ru-ru/access/HA.aspx? pid=CH

GROUP BY bəndi

Göstərilən sahələr siyahısında olan eyni dəyərləri olan qeydləri bir qeyddə birləşdirir. SQL aqreqasiya funksiyası SELECT ifadəsinə daxil edilərsə, hər bir qeyd üçün xülasə dəyəri yaradılır, məsələn: məbləğ və ya saymaq.

Sintaksis

SEÇİN sahə_siyahısı
FROM masa
HARADA seçim_şərti

GROUP BY bəndini ehtiva edən SELECT ifadəsinə aşağıdakı elementlər daxildir:

Element

Təsvir

sahə_siyahısı

İstənilən ləqəblərlə birlikdə götürülən sahələrin adları (Alias ​​(SQL). İfadədəki cədvəl və ya sahə üçün alternativ ad. Təxəllüslər adətən proqramlarda sonrakı istinadların asanlığı üçün daha qısa cədvəl və ya sahə adları kimi istifadə olunur, birmənalı olmayan istinadların qarşısını almaq və sorğu nəticələrini göstərərkən daha çox məlumatlandırıcı adlar əldə etmək.) və statistik SQL funksiyaları, predikatlar (ALL, DISTINCT, DISTINCTROW və ya TOP) və ya SELECT ifadəsinin digər parametrləri

masa

seçim_şərtləri

Seçim şərti. Əgər ifadədə WHERE bəndi varsa, o qeydlərə tətbiq edildikdən sonra dəyərlər Microsoft Access verilənlər bazası mühərriki tərəfindən qruplaşdırılacaq.

qrup_alan_siyahısı

qrup_alan_siyahısı

Qeydlər

GROUP BY bəndi isteğe bağlıdır.

SQL statistik funksiyaları SELECT ifadəsinə daxil edilmirsə, xülasə dəyərləri hesablanmır.

GROUP BY sahə dəyərləri Null (Null. Çatışmayan və ya naməlum məlumatları göstərmək üçün sahəyə daxil edilə bilən və ya ifadələrdə və sorğularda istifadə edilə bilən dəyər. Visual Basic-də Null açar sözü Null dəyərini təyin edir. Bəzi sahələr, məsələn əsas açar sahələri kimi Null dəyərləri ehtiva edə bilməz.), qruplaşdırılır və buraxılmır. Bununla belə, dəyərlər Sıfır SQL statistik funksiyalarının heç biri tərəfindən qiymətləndirilmir.

WHERE bəndi qruplaşdırılmasına ehtiyac olmayan sətirləri istisna etmək üçün istifadə olunur. HAVING bəndi qruplaşdırıldıqdan sonra qeydləri süzmək üçün istifadə olunur.

GROUP BY sahəsi siyahısından Memo məlumat növü (Memo Field məlumat növü. Microsoft Access verilənlər bazasındakı sahə məlumat növü. MEMO sahəsində 65535 simvola qədər ola bilər.) və ya OLE Object (Sahə məlumat növü) olmayan sahələr OLE obyekti" Microsoft Access verilənlər bazası ilə əlaqəli və ya daxil edilmiş digər proqramlardan obyektləri saxlamaq üçün istifadə edilən sahə məlumat növü.) sahə SELECT ifadəsinə daxil edilməsə belə, FROM bəndində göstərilən istənilən cədvəldəki istənilən sahəyə istinad edə bilər. Bunun üçün SELECT ifadəsində ən azı bir SQL statistik funksiyasının olması kifayətdir. Microsoft Access verilənlər bazası mühərriki MEMO Sahəsi və ya OLE Obyekt məlumatlarını ehtiva edən sahələr üzrə qruplaşdırmağa icazə vermir.

SELECT sahə siyahısındakı bütün sahələr ya GROUP BY bəndində yer almalı, ya da SQL toplama funksiyasının arqumentləri olmalıdır.

həmçinin bax

SELECT bəyanatı

SELECT...INTO bəyanatı

ALL, DISTINCT, DISTINCTROW, TOP predikatları

FROM bəndi

TƏKLİF OLAN

ORDER BY bəndi

WHERE bəndi

SQL statistik funksiyaları

Mənbə səhifəsi: http://office. /ru-ru/access/HA.aspx? pid=CH

TƏKLİF OLAN

GROUP BY bəndi ilə SELECT ifadəsində görünməli olan qruplaşdırılmış qeydləri müəyyən edir. Qeydlər GROUP BY bəndinə görə qruplaşdırıldıqdan sonra HAVING bəndi onun şərtlərinə cavab verənləri göstərəcək.

Sintaksis

SEÇİN sahə_siyahısı
FROM masa
HARADA seçim_şərtləri
GROUP BY qrup_alan_siyahısı

HAVING bəndini ehtiva edən SELECT ifadəsi aşağıdakı elementləri ehtiva edir:

Element

Təsvir

sahə_siyahısı

İstənilən ləqəblərlə birlikdə yüklənən sahələrin adları (Alias ​​(SQL). İfadədəki cədvəl və ya sahə üçün alternativ ad. Təxəllüslər adətən proqramlarda sonrakı istinadların asanlığı üçün daha qısa cədvəl və ya sahə adları kimi istifadə olunur, birmənalı olmayan istinadların qarşısını almaq və sorğu nəticələrini göstərərkən daha informativ adlar əldə etmək üçün.) və SQL statistik funksiyaları, predikatlar (ALL, DISTINCT, DISTINCTROW və ya TOP) və ya SELECT ifadəsinin digər parametrləri ilə.

masa

Qeydlərin yükləndiyi cədvəlin adı

seçim_şərti

Seçim şərti. Əgər ifadədə WHERE bəndi varsa, Microsoft Access verilənlər bazası mühərriki qeydlərə tətbiq edildikdən sonra dəyərləri qruplaşdıracaq.

qrup_alan_siyahısı

Qeydləri qruplaşdırmaq üçün istifadə edilən sahələrin adları (10-a qədər). Adların sırası qrup_alan_siyahısı qruplaşma səviyyəsini müəyyən edir - ən yüksəkdən aşağıya

qrup_şərti

Göstəriləcək qeydləri təyin edən ifadə

Qeydlər

HAVING bəndi isteğe bağlıdır.

HAVING bəndi qeydlərin seçimini təyin edən WHERE bəndinə bənzəyir. Qeydləri GROUP BY bəndi ilə qruplaşdırdıqdan sonra HAVING bəndi göstəriləcək qeydləri müəyyənləşdirir.

Növ kodunu seçin,

Məbləğ(InStock)

Məhsullardan

Növ koduna görə qruplaşdırın

Cəmi (InStock) > 100 OLMAQ Və "TEL*" kimi;

HAVING bəndində məntiqi operatorlar tərəfindən əlaqələndirilmiş 40-a qədər ifadə ola bilər Və ya.

Mənbə səhifəsi: http://office. /ru-ru/access/HA.aspx? pid=CH

ORDER BY bəndi

Sorğu ilə qaytarılan qeydləri göstərilən sahə(lər)in dəyərlərinin artan və ya azalan qaydada çeşidləyir.

Sintaksis

SEÇİN sahə_siyahısı
FROM masa
HARADA seçim_şərti
[, sahə 2 ][, ...]]]

ORDER BY bəndini ehtiva edən SELECT ifadəsi aşağıdakı elementləri ehtiva edir.

Element

Təsvir

sahə_siyahısı

İstənilən ləqəblərlə birlikdə götürülən sahələrin adları (Alias ​​(SQL). İfadədəki cədvəl və ya sahə üçün alternativ ad. Təxəllüslər adətən proqramlarda sonrakı istinadların asanlığı üçün daha qısa cədvəl və ya sahə adları kimi istifadə olunur, birmənalı olmayan istinadların qarşısını almaq və sorğu nəticələrini göstərərkən daha informativ adlar əldə etmək üçün.) və SQL statistik funksiyaları, predikatlar (ALL, DISTINCT, DISTINCTROW və ya TOP) və ya SELECT ifadəsinin digər parametrləri ilə.

masa

Qeydlərin götürüldüyü cədvəlin adı

seçim_şərtləri

Seçim şərtləri. Bəyanatda WHERE bəndi varsa, qeydlərə tətbiq edildikdən sonra Microsoft Access verilənlər bazası mühərriki qeydlərin dəyərlərini sifariş edəcək

sahə 1, sahə 2

Qeydlərin çeşidləndiyi sahələrin adları.

Qeydlər

ORDER BY bəndi isteğe bağlıdır. Məlumatları çeşidlənmiş formada göstərmək lazım olduqda istifadə edilməlidir.

Defolt çeşidləmə qaydası belədir (Sorlama qaydası. Verilənləri onun dəyərlərinə və növünə görə tənzimləmək üsuludur. Məlumat əlifba sırası ilə, ədədi dəyərlərə və ya tarixə görə sıralana bilər. Çeşidləmə sırası artan ola bilər (0-100, A-dan Z) və ya azalan (100-dən 0-a, Z-dən A-ya).) artan (A-dan Z-yə, 0-dan 9-a qədər). Aşağıdakı nümunələr işçi adlarının soyadlarına görə çeşidlənməsini nümayiş etdirir.

SEÇ Soyadı, Ad

İşçilərdən

Soyadı ilə SİFARİŞ;

SEÇ Soyadı, Ad

İşçilərdən

SİFARİŞ BY Soyad ASC;

Sahələri azalan qaydada çeşidləmək üçün (Z-dən A, 9-dan 0-a qədər) hər sahənin adına qorunan DESC sözünü əlavə edin. Aşağıdakı nümunə işçilərin maaşlarına əsasən azalan qaydada çeşidlənməyi nümayiş etdirir.

SEÇİN Soyadı, Əmək haqqı

İşçilərdən

SİFARİŞ İLƏ Əmək haqqı DESC, Soyadı;

SİFARİŞ BY bəndində MEMO Sahəsi (Yaddaş Sahəsi məlumat növü. Microsoft Access verilənlər bazasındakı sahə məlumat növü. MEMO sahəsində 65.535 simvola qədər ola bilər.) və ya OLE Obyekt Sahəsi (OLE Obyekti) tipli məlumatları ehtiva edən sahələri göstərsəniz Sahə məlumat növü "Microsoft Access verilənlər bazası ilə əlaqəli və ya daxil edilmiş digər proqramlardan obyektləri saxlamaq üçün istifadə edilən sahə məlumat növü.), bu xəta yaradacaq. Microsoft Access verilənlər bazası mühərriki bu sahə növlərini çeşidləyə bilməz.

ORDER BY bəndi adətən SQL ifadəsindəki sonuncu bənddir (SQL ifadəsi (sətir). SELECT, UPDATE və ya DELETE kimi SQL əmrini təyin edən və HARADA və ya ORDER BY kimi bəndləri ehtiva edən ifadə. SQL ifadələri. /sətirlər adətən sorğularda və statistik funksiyalarda istifadə olunur.).

ORDER BY bəndinə əlavə sahələr daxil edə bilərsiniz. Qeydlər əvvəlcə SİPARİŞ BY bəndində göstərilən sahəyə görə sıralanır. Birinci sahədə eyni dəyərlərə malik qeydlər daha sonra ikincinin göstərdiyi sahəyə görə sıralanır və s.
həmçinin bax

SELECT bəyanatı

SELECT...INTO bəyanatı

ALL, DISTINCT, DISTINCTROW, TOP predikatları

FROM bəndi

GROUP BY bəndi

TƏKLİF OLAN

WHERE bəndi

SQL statistik funksiyaları

Mənbə səhifəsi: http://office. /ru-ru/access/HA.aspx? pid=CH

INNER JOIN əməliyyatı

Bu cədvəllərin birləşdirici sahələrində eyni dəyərlər varsa, iki cədvəldən qeydləri birləşdirir.

Sintaksis

FROM Cədvəl 1 DAXİLİ QOŞULUN cədvəl 2 ON Cədvəl 1.sahə 1 müqayisə_operator cədvəli2.sahə 2

INNER JOIN əməliyyatı aşağıdakı elementlərdən ibarətdir:

Element

Təsvir

Cədvəl 1, cədvəl 2

Qoşulacaq qeydləri ehtiva edən cədvəllərin adları

sahə 1, sahə 2

Əlaqələndiriləcək sahələrin adları. Qeyri-rəqəmli sahələr eyni məlumat tipində olmalıdır (Məlumat Tipi. Sahənin ehtiva edə biləcəyi verilənlərin tipini təyin edən sahə xarakteristikası. Məlumat növlərinə aşağıdakılar daxildir: Boolean, Tam, Uzun, Valyuta, Tək, Cüt, Tarix, Sətir, və Variant (standart).) və eyni tipli məlumatları ehtiva edir. Lakin bu sahələrin adları fərqli ola bilər

müqayisə_operatoru

İstənilən müqayisə operatoru: (=,<, >, <=, >= və ya<>)




Üst