Садржај
1 Релационе базе података
1.0 1 Релационе базе података
1.0 2 Релационе базе података - квиз
1.0 3 Веза један према више
1.0 4 Веза један према више - квиз
1.0 5 Веза више према више
1.0 6 Веза више према више - квиз
1.0 7 Алат за пројектовање
1.0 8 СУБП
1.0 9 Креирање базе на други начин
1.0 10 Још неке SQL команде
1.1 1 Упит SELECT
1.1 2 Упит SELECT - упит из једне табеле - задаци
1.1 3 Упит SELECT - упит из једне табеле - квиз
1.1 4 Упит SELECT - функције и подупити - задаци
1.1 5 Упит SELECT - функције и подупити - квиз
1.1 6 Упит SELECT - спајање - задаци
1.1 7 Упит SELECT - спајање - квиз
1.1 8 Упит SELECT - нерешени задаци
1.2 1 База података за библиотеку - креирање базе
1.2 2 БП Библиотека - Упит SELECT - упит из једне табеле - задаци
1.2 3 БП Библиотека - Упит SELECT - упит из једне табеле - нерешени задаци
1.2 4 БП Библиотека - Упит SELECT - спајање - задаци
1.2 5 БП Библиотека - Упит SELECT - спајање - нерешени задаци
1.2 6 БП Библиотека - Упит SELECT - функције и подупити - задаци
1.2 7 БП Библиотека - Упит SELECT - функције и подупити - нерешени задаци
1.3 1 База података за возачке дозволе - креирање базе
1.3 2 БП Возачке дозволе - Дијаграм и подаци - практичан рад
1.3 3 БП Возачке дозволе - Упит SELECT - задаци
1.3 4 БП Возачке дозволе - Упит SELECT - нерешени задаци
1.4 1 БП Филмови - Креирање базе - практични рад
1.4 2 БП Филмови - Дијаграм и подаци - практични рад
1.4 3 БП Филмови - Упит SELECT - задаци
1.4 4 БП Филмови - Упит SELECT - нерешени задаци
2 Писање програма унутар система за управљање базама података
2.0 1 Процедуре и команда INSERT
2.0 2 Процедуре и команде UPDATE и DELETE
2.0 3 Процедуре и команде INSERT, UPDATE, и DELETE - квиз
2.0 4 Процедуре и тестирање програма
2.0 5 Процедуре и упит SELECT
2.0 6 Процедуре и курсор за упит SELECT
2.1 1 Функције и упит SELECT
2.1 2 Процедуре и функције са упитом SELECT - квиз
2.1 3 Процедуре и функције са упитом SELECT из једне табеле - задаци
2.1 4 Процедуре и функције са упитом и групним функцијама - задаци
2.1 5 Процедуре и функције са упитом SELECT са спајањем табела - задаци
2.1 6 Процедуре и функције са упитом - нерешени задаци
2.1 7 Формат XML
2.2 1 База података за библиотеку - Процедуре, функције и поређење различитих решења
2.2 2 Процедуре, функције и поређење различитих решења
2.2 3 Процедуре и функције са упитом SELECT из једне табеле - вежбање
2.2 4 Процедуре и функције са упитом SELECT са спајањем табела - вежбање
2.2 5 Процедуре и функције са упитом и групним функцијама и подупитима - вежбање
2.2 6 Процедуре и функције са упитом SELECT - нерешени задаци
2.3 1 База података за возачке дозволе - процедуре и функције са упитом SELECT - вежбање
2.3 2 База података за возачке дозволе - процедуре и функције - нерешени задаци
2.4 1 База података за филмове - процедуре и функције са упитом SELECT - вежбање
2.4 2 База података за филмове - процедуре и функције - нерешени задаци
3 Писање програма у програмским језицима вишег нивоа
3.0 1 Писање програма у развојном окружењу Visual Studio
3.0 2 Писање програма у развојном окружењу Visual Studio - практичан рад
3.0 3 Писање програма у развојном окружењу Visual Studio - процедуре
3.0 4 Писање програма у развојном окружењу Visual Studio - квиз
3.1 1 Угнежђени упит SELECT унутар програма
3.1 2 Угнежђени упит SELECT унутар програма - задаци
3.1 3 Позив процедуре унутар програма
3.1 4 Позив креиране функције унутар програма
3.1 5 Програм са угнежђеним командама у развојном окружењу Visual Studio - квиз
3.1 6 Програм са угнежђеним упитом SELECT из једне табеле - вежбање
3.1 7 Програм са угњежђеним упитом и групним фунцкијама - вежбање
3.1 8 Програм са угнежђеним упитом SELECT са спајањем табела - вежбање
3.1 9 Програм са класом
3.1 10 Програм са угнежђеним упитом - нерешени задаци
3.1 11 Програм са угнежђеним командама INSERT, UPDATE, и DELETE
3.2 1 База података за библиотеку - програм са угнежђеним упитом SELECT из једне табеле - задаци
3.2 2 База података за библиотеку - програм са угнежђеним упитом SELECT - вежбање
3.2 3 База података за библиотеку - програм са угнежђеним упитом - нерешени задаци
3.3 1 База података за возачке дозволе - програм са угнежђеним упитом SELECT - вежбање
3.3 2 База података за возачке дозволе - програм са угнежђеним упитом - нерешени задаци
3.4 1 База података за филмове - програм са угнежђеним упитом SELECT - вежбање
3.4 2 База података за филмове - програм са угнежђеним упитом - нерешени задаци
4 Друга софтверска решења - СУБП Oracle
4.0 1 Oracle Apex и језик PL/SQL
4.0 2 Језик PL/SQL - задаци
4.0 3 Језик PL/SQL - квиз
4.0 4 Језик PL/SQL – нерешени задаци
4.0 5 Наредбе гранања
4.0 6 Наредбе гранања - нерешени задаци
4.0 7 Наредбе циклуса
4.0 8 Наредбе циклуса - нерешени задаци
4.1 1 База података за библиотеку - практичан рад
4.1 2 Наредба SELECT INTO
4.1 3 Наредба SELECT INTO - zadaci
4.1 4 Наредба SELECT INTO - квиз
4.1 5 Наредба SELECT INTO - вежбање
4.1 6 Наредба SELECT INTO - нерешени задаци
4.2 1 Курсори - Узимање података из више редова
4.2 2 Курсори - задаци
4.2 3 Различити начини да се реши проблем
4.2 4 Курсори - нерешени задаци
4.2 5 Курсор са параметром
4.2 6 Курсор са параметром - задаци
4.2 7 Курсор са параметром - нерешени задаци
4.2 8 Курсори - квиз
4.2 9 Курсори и гранање - задаци
4.2 10 Курсори - вежбање
4.2 11 Тренутне позајмице члана - пример
4.2 12 Спискови књига - пример
4.3 1 Процедуре и функције у СУБП-у Oracle Apex
4.3 2 Процедуре и функције - задаци
4.3 3 Процедуре и функције - нерешени задаци
4.3 4 Позајмице једне књиге - пример
4.3 5 Тренутне позајмице - пример
4.3 6 Процедуре и друге SQL команде
4.3 7 Тригери
4.3 8 Списак свих објеката у бази података
4.4 1 Креирање апликације помоћу алата App Builder
4.4 2 Додатне опције App Builder алата
4.4 3 Покретање апликације
4.4 4 Креирање нових страница у апликацији
4.4 5 Покретање раније креиране процедуре
4.4 6 Алат App Builder и XML
4.5 1 База података за салон аутомобила у СУБП-у Oracle Apex - 1. део
4.5 2 База података за салон аутомобила у СУБП-у Oracle Apex - 2. део
4.5 3 База података за салон аутомобила у СУБП-у Oracle Apex - 3. део
4.5 4 База података за продавницу - нерешени пројектни рад

База података за библиотеку - програм са угнежђеним упитом SELECT - вежбање

Решити следеће задатке писањем програма у развојном окружењу Visual Studio Community и употребом програмског језика C#.

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

Детаљно објашњење формирања упита SELECT који треба да буде део програма је објашњен раније у материјалима и по потреби је могуће вратити се на тај део као помоћ у писању комплетног решења.

Сви приказани задаци су у вези са табелама које чине базу података за библиотеку. Следи списак свих табела са колонама. Примарни кључеви су истакнути болд, а страни италик.

../_images/slika_316a.jpg

Када се покрене развојно окружење Visual Studio Community, потребно је да се креира нови пројекат избором опције Create a new project. Изабрани језик треба да буде C#, а врста пројекта Windows Forms App, апликација са графичким корисничким интерфејсом.

Када се креира нови пројекат, први корак је додавање раније креиране базе података. У прозору Solution Explorer је потребно да се кликне десни тастер миша над називом пројекта, а затим да се изабере Add/Existing Item… са менија који се појави. База података коју смо креирали се већ налази на рачунару и потребно је пронаћи и изабрати фајл Biblioteka.mdf у којем је сачувана. Тачна локација може да се провери у систему SQL Server Management Studio у којем смо креирали базу.

../_images/slika_316b.jpg

Класе које су нам потребне за читање података из базе и њихов приказ у програму се налазе у именском простору System.Data.SqlClient који није аутоматски укључен у нови пројекат. Потребно је да додамо следећи ред на врх документа са програмским кодом.

using System.Data.SqlClient;

Приликом писања програма, потребно је да се употреби конекциони стринг који је формиран у ранијим примерима, а односи се на повезивање програма на базу података Biblioteka.mdf. У решењима задатака стоји KONEKCIONI_STRING на местима где се очекује конекциони стринг.

  1. Разматра се могућност да се уведу одређена ограничења члановима библиотеке који нередовно враћају књиге. Једна од мера би можда била да се њима не издају ретке књиге које су често тражене, а драстичнија мера би могла да подразумева и укидање чланства. Да би се на добар начин донела одлука, библиотека је одлучила да пажљиво проучи списак чланова који касне са враћањем књига и због тога плаћају казне да би се видело колико има таквих чланова и да ли има неких међу њима који се баш истичу.

Задатак 1: Приказати имена и презимена чланова, уз датуме и износе плаћених казни. Списак уредити по члановима, тако да све казне једног члана буду приказане једна испод друге.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT ime, prezime, datum, iznos " +
        "FROM kazne JOIN clanovi " +
        "ON(kazne.broj_clanske_karte=clanovi.broj_clanske_karte) " +
        "ORDER BY prezime, ime";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Задатак 2: Приказати број до сада плаћених казни и укупан износ.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT COUNT(*) broj_kazni, " +
        "SUM(iznos) ukupan_iznos " +
        "FROM kazne";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Задатак 3: Приказати број чланова који су до сада каснили са враћањем књига и због тога плаћали казне.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT COUNT(DISTINCT broj_clanske_karte) " +
        "FROM kazne";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Задатак 4: : Приказати број чланске карте, име и презиме сваког члана, уз број плаћених казни. Списак уредити по члановима.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT clanovi.broj_clanske_karte, ime, prezime, COUNT(*) " +
        "FROM kazne JOIN clanovi " +
        "ON(kazne.broj_clanske_karte = clanovi.broj_clanske_karte) " +
        "GROUP BY clanovi.broj_clanske_karte, ime, prezime " +
        "ORDER BY clanovi.broj_clanske_karte, ime, prezime";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Задатак 5: Приказати имена и презимена чланова, уз број плаћених казни, који имају више од једне плаћене казне.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT ime, prezime, COUNT(*) " +
        "FROM kazne JOIN clanovi " +
        "ON(kazne.broj_clanske_karte = clanovi.broj_clanske_karte) " +
        "GROUP BY ime, prezime " +
        "HAVING COUNT(*)>1 " +
        "ORDER BY ime, prezime";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Потребно је употребити спољно спајање LEFT OUTER JOIN да би се на списку појавио и запослени који нема менаџера.

Задатак 6: Приказати име и презиме члана који је платио највећи износ казне до сада.

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

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT DISTINCT ime, prezime " +
        "FROM kazne JOIN clanovi " +
        "ON(kazne.broj_clanske_karte = clanovi.broj_clanske_karte) " +
        "WHERE iznos = (SELECT MAX(iznos) FROM kazne)";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
  1. У току месеца маја је акција и библиотека поклања по једну књигу својим верним члановима који тог месеца дођу да позајме књиге. Тренутно је у библиотеку дошла Милица Зорановић и библиотекар жели да провери како изгледа њена историја чланства, тј. да ли је већ дужи низ година члан библиотеке.

Задатак 1: Приказати списак година када је члан датог имена и презимена био члан библиотеке, тј. за које је платио чланарину.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    string ime = textBox1.Text;
    string prezime = textBox2.Text;
    cmd = "SELECT god " +
        "FROM clanarine JOIN clanovi " +
        "ON(clanarine.broj_clanske_karte = clanovi.broj_clanske_karte) " +
        "WHERE ime='" + ime + "' " +
        "AND prezime='" + prezime + "'";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}

Задатак 2: Приказати број година када је члан датог имена и презимена био члан библиотеке, тј. за које је платио чланарину.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    string ime = textBox1.Text;
    string prezime = textBox2.Text;
    cmd = "SELECT COUNT(god) " +
        "FROM clanarine JOIN clanovi " +
        "ON(clanarine.broj_clanske_karte = clanovi.broj_clanske_karte) " +
        "WHERE ime='" + ime + "' " +
        "AND prezime='" + prezime + "'";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
  1. Библиотека разматра да наручи још књига Завода за уџбенике. Да би донели ту одлуку, потребно је да се види колико су књиге овог издавача тражене.

Задатак: Приказати датуме узимања и називе књиге за све позајмице књига датог издавача.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    string izdavac = textBox1.Text;
    cmd = "SELECT datum_uzimanja, knjige.naziv " +
        "FROM pozajmice JOIN primerci " +
        "ON(pozajmice.inventarski_broj = primerci.inventarski_broj) " +
        "JOIN knjige ON(primerci.id_knjige = knjige.id_knjige) " +
        "JOIN izdavaci ON(knjige.id_izdavaca = izdavaci.id) " +
        "WHERE izdavaci.naziv = '" + izdavac + "'";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
  1. Члан библиотеке Милица Зорановић је дошла у библиотеку да позајми неку књигу, али нема идеју шта би следеће читала. Библиотекар је предложио да крену од списка аутора чије је књиге већ позајмљивала, па да виде да ли би Милица читала још неку од књига неког од тих аутора.

Задатак: Приказати без понављања имена и презимена аутора чије је књиге читао члан датог имена и презимена.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    string ime = textBox1.Text;
    string prezime = textBox2.Text;
    cmd = "SELECT DISTINCT a.ime, a.prezime " +
        "FROM pozajmice po JOIN clanovi c " +
        "ON(po.broj_clanske_karte = c.broj_clanske_karte) " +
        "JOIN primerci pr ON(po.inventarski_broj= pr.inventarski_broj) " +
        "JOIN knjige k ON(pr.id_knjige= k.id_knjige) " +
        "JOIN autori_knjige ak ON(ak.id_knjige= k.id_knjige) " +
        "JOIN autori a ON(ak.id_autora= a.id_autora) " +
        "WHERE c.ime = '" + ime + "' AND c.prezime = '" + prezime + "'";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
  1. Библиотека организује прославу за своје запослене и позивнице планира да пошаље мејлом, али са различитим текстом за различите тимове. Ради слања позивница, потребан је списак мејл адреса по тимовима.

Задатак: Написати упит којим се приказују мејл адреса запосленог и мејл адреса његовог менаџера. Списак уредити по менаџерима, па унутар истог тима по запосленима.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT z.mejl zaposleni, m.mejl menadzer " +
        "FROM zaposleni z LEFT OUTER JOIN zaposleni m " +
        "ON(z.id_menadzera = m.id) " +
        "ORDER BY m.mejl, z.mejl";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
  1. Тренутно се размишља о корекцији износа за чланарине и корекцији попуста у ситуацијама где се остварује попуст на чланарину. Да би се донела добра одлука, потребно је проучити како се кретао износ просечне чланарине до сада.

Задатак: Написати упит којим се приказује просечна висина чланарине за сваку годину.

private void button1_Click(object sender, EventArgs e)
{
    string conText = KONEKCIONI_STRING;
    string cmd;
    cmd = "SELECT god, AVG(iznos) " +
        "FROM clanarine " +
        "GROUP BY god";
    SqlDataAdapter da = new SqlDataAdapter(cmd, conText);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;
}
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+