Loading...
nakov avatar nakov SoftUni Team Trainer 5295 Точки

[Sample Exam] Databases

Колеги, подготвил съм и съм ви качил за тренировка примерен изпит по бази данни в сайта на курса: https://softuni.bg/trainings/20/Databases-Feb-2015.

Изпитът съдържа няколко части:

  • Дадена ви е SQL Server база данни (схема с таблици и връзки между тях + данни) във вид на SQL скрипт. Вашата задача е да напишете няколко SQL заявки за извличане на данни.
  • Дадена ви е SQL Server база данни. Трябва да добавите в нея няколко таблици, да промените някои данни, да изтриете някои данни и за добавите някои данни. Накрая трябва да напишете SQL заявка, с която проверява дали промените са били правилно направени.
  • Писане на изгледи / съхранени процедури / функции в базата.
  • Моделиране на релационна схема по текстово описание (database modeling), вкарване на данни и писане на заявка върху вкараните данни.

Можете да тренирате в judge системата: http://judge.softuni.bg/Contests/70/Databases-Sample-Exam.

За да се автоматизира проверката на изпита използваме автоматична проверка на резултата от всяка задача, вместо да проверяваме дали са правилни SQL заявките, извеждащи този резултат, тъй като всяка задача може да има разнообразни решения. При изпращане на резултат от SQL заявка, моля копирайте данните заедно с хедърите (на първия ред рябва да са заглавията на колоните, разделени с табулация, а на следващите редове - колоните с данни, разделени с табулация).

На изпита (на 1 март) може да очаквате подобна тема, която ще включва същите 4 части, но върху различна база данни с различни таблици и данни. Ще обхванем отново MS SQL Server и MySQL.

Както винаги, ще направим и подготовка на живо за изпита (на 27 февруари), където ще решим всички тези задачи (и ще запишем видео за онлайн студентите).

15
Databases Basics 02/03/2015 10:38:57
Valleri avatar Valleri 304 Точки

Струва ми се, че задача 12 е с грешен отговор. В базата имаме само 1 обява от Бургас, а в отговорите имаме общо 3, съответно ми гърми и в judge.

http://pastebin.com/XFKvS4JL

4
13/02/2015 21:42:44
VGeorgiev avatar VGeorgiev 1384 Точки

Объркано е авторското решение и от там идва грешката в тестовете. Ще го оправим.

EDIT: Оправено е решението и теста в judge.

4
14/02/2015 10:28:09
kyamaliev avatar kyamaliev 209 Точки

Оправете и таблицата в условието :)

0
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Поправихме условието и тестовете.

0
borislavml avatar borislavml 368 Точки

Колеги, аз ли нещо не съм наред или в условието липсва скрипта за създаване на базата? В архива има три файла: условието, решенията и предполагаемия скрипт Ads-Database-SQL-Server.sql , в който обаче има едиствено една заявка към table Ads и нищо друго.Виждам, че в джъджа има събмити с точки, явно има скрипт ..... в недоумение съм. Някой?

1
kotow avatar kotow 34 Точки

Явно нещо са едитвали и са затрили скрипта.

Слагам го  тук докато го оправят.

 

1
17/02/2015 10:24:28
borislavml avatar borislavml 368 Точки

И аз така си помислих, мерси много! smile

0
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Беше затрит Ads database скрипта, потвърждавам, наша грешка. Оправихме го.

3
Matrix avatar Matrix 1092 Точки

На изпита може ли да се използва ORM framework?

0
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Малко е странно това питане, тък като трябва да се пишат SQL завки, а ORM още не сме учили. В повечето задачи един ORM framework ще затрудни работата вместо да я улесни.

Не е забранено да се ползва ORM, може. Може да се ползват и други инструменти, които сметнеш за полезни.

2
Valleri avatar Valleri 304 Точки

Имам малко проблеми с MySQL задачата. Insert-ите не са коректни според това, което е написано в условието.

Това ми е диаграмата: http://postimg.org/image/sxp3wqm3j/

В условието пише, че в Orders трябва да има 4 полета - Id, CustomerId, Date, OrderItemsId (???).
OrderItems трябва да има Id, ProductId. Quantity.

От инсертите обаче излиза друго:

Orders съдържа: CustomerId, Date
OrderItems би трябвало да е таблица, която обединява Orders и Products и, според селектите, представлява нещо такова:
Id (Identity insert ON?)
OrderId
ProductId
Quantity

Кое от двете според вас е правилното условие?

 

p.s. Свастиката не е нарочно : ))

0
20/02/2015 10:04:21
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Не си разбрал условието на задачата. Никъде не пие, че трябва да имаш "OrderItemsId". Грешна ти е диаграмата.

Един Order представлява покупка. Една покупка се прави от даден човек на дадена дата и съдържа много на брой OrderItems. Когато имаме 1 към много в базите данни, таблицата с "много" има FK към таблицата с 1.

Демек OrderItems таблицата трябва да има FK към Orders и Products.

Второто (което си написал накрая), е вярно.

1
borislavml avatar borislavml 368 Точки

А как ще ни "забраните/спрете" да не си направим тази последната задача на SQL SERVER вместо МySQL.smile Реално скрипта за наливане на данни какъвто и да е, и колкото и да е голям може да се преправи за две минути и да си направя цялата задача в SQL SERVER (E/R Диаграма, таблици и куерита).

Не че е големия чийт или ше спечеля нещо, но просто като ми е по удобно в SQL SERVER...

2
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Ще се стараем задачите да предразполагат хората да ползват определена технология, но няма как да ги спрем да правят друга. Примерно за задачата за MySQL се изисква отговорът да е в CSV формат и това става лесно с MySQL Workbench, но с SQL Server Management Studio -> не.

0
Stoyan.Stoyanov avatar Stoyan.Stoyanov 96 Точки

Остава ли 1-ви март като дата за изпита по Бази данни?

Ясни ли са вече часовете за провеждането му?

Ще има ли записване за група?

1
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Да, изпитът по бази данни ще е на 1 март от 15:30 часа в СофтУни.

Сутринта ще има друг изпит: ООП от 9:00.

2
Matrix avatar Matrix 1092 Точки

Stoyan.Stoyanov, прекалено малко останахме, за да има записване за групи :D Една група сме всички вече... А ето сега виждам,  че и записването е пуснато вече, точно една група има само... Бяхме над 550 души в началото, ама сегааа - 1 група ;)

1
23/02/2015 11:51:48
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Ще олучите информация по e-mail.

1
kyamaliev avatar kyamaliev 209 Точки

Звездичката на задача 3 да не би да е защото ако има картинка трябва да напишем 'no' а при NULL - 'yes'?

6
GoShow avatar GoShow 595 Точки

Да, маалко е наопаки :)

1
arsoman avatar arsoman 419 Точки

А може ли идея как се прави, стигам до момента, в който при NULL показвам "no", ама другото не мога да го докарам...

0
Ventsislav avatar Ventsislav 343 Точки

arsoman прави се със case.
Ето примерно решение : http://pastebin.com/aa2XY5Kg.
Авторското решение е подобно.
P.S. : Мисля че трябва да е наопаки както каза GoShow. Защото за да ти даде точките трябва да напишеш 'yes' когато няма картинка и обратното за да ти даде точките в https://judge.softuni.bg/

1
24/02/2015 01:53:38
AlexKondov avatar AlexKondov 91 Точки

Колеги имам едно питане относно 13-та зада§а - Ads by Users. Разбирам задачата, всичко е ОК, но джъджа приема верен резултат, само когато потребителя 'maria' го изкарам с 4 обяви. Самия потребител в таблицата има само 2, но тъй като има и две роли, дублира резултата. Не знам дали нарочно е направена така задачата, но аз го сметнах за грешка.

2
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Здравей Алекс,

Имаше грешка в авторското решение. То показваше, че maria има 4 обяви, а реално maria има 2 обяви.

Ето поправена заявката, която вече работи коректно:

SELECT
  MIN(u.UserName) as UserName,
  COUNT(a.Id) as AdsCount,
  (CASE WHEN admins.UserName IS NULL THEN 'no' ELSE 'yes' END) AS IsAdministrator
FROM
  AspNetUsers u
  LEFT JOIN Ads a ON u.Id = a.OwnerId
  LEFT JOIN (
    SELECT DISTINCT u.UserName
    FROM AspNetUsers u
    LEFT JOIN AspNetUserRoles ur ON ur.UserId = u.Id
    LEFT JOIN AspNetRoles r ON ur.RoleId = r.Id
    WHERE r.Name = 'Administrator'
  ) AS admins ON u.UserName = admins.UserName
GROUP BY OwnerId, u.UserName, admins.UserName
ORDER BY u.UserName

Заявката извлича всички админи (с вложения SELECT) съединява ги с всички потребители и всички обяви и групира по потребител, за да сметне броя обяви. Използва се LEFT JOIN за да може да излязат всички потребители, заедно с всички обяви, заедно с информация дали потребителят е админ.

Оправени са тестовете в judge системата.

2
24/02/2015 15:37:23
presian avatar presian 223 Точки

Имам едно малко питане решавайки 16 задачка стигнах до един проблем с крайния резултат!

след два часа цъкане видях къде имам разлика с авторското решение и ми се струва, че не аз съм в гршка!

Може ли още някой да си каже мнението?

Става въпрос за подусловие 3 и 4 на 16 задачка:

Според авторското решение заявките са:

UPDATE Ads
SET TownId = (SELECT TownId FROM Towns WHERE Name='Paris')
WHERE DATEPART(weekday, Date) = 6

UPDATE Ads
SET TownId = (SELECT TownId FROM Towns WHERE Name='Hamburg')
WHERE DATEPART(weekday, Date) = 5

Аз ги правя по този начин:

UPDATE Ads
SET TownId = (SELECT t.Id FROM Towns t WHERE t.Name = 'Paris')
WHERE DATENAME (WEEKDAY, [Date]) = 'Friday'

UPDATE Ads
SET TownId = (SELECT t.Id FROM Towns t WHERE t.Name = 'Hamburg')
WHERE DATENAME(WEEKDAY, [Date]) = 'Thursday'

Съответно на края аз получавам един Null по-малко в резултата, явно при моята заяка се променя някой Null на Paris, манипулацията с деня от седмицата изкарва еднакъв резултат и не е релевантна.

Та въпроса е защо във заявката към Towns се ползава колона от Ads таблицата или поне в моята база в Towns няма TownId, такава имам само в Ads

1
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Имаше грешка в тестовете в judge системата. Оправена е. Авторското решение беше вярно. Твоето също изглежда вярно. Има 3 NULL стойности в отговора, не 4. Пробвай сега отново.

4
georgimanov avatar georgimanov 107 Точки

Здравейте,

Относно 3-та задача, дали може да сподели отговорите? Това е моят резултат http://pastebin.com/r1YJ3geH

Пробвах с тази заявка

SELECT Title, [Date], CASE
  WHEN ImageDataUrl IS NOT NULL THEN 'no'
  WHEN ImageDataUrl IS NULL THEN 'yes'
  END AS [Has Image]
FROM Ads
ORDER BY Id

 

EDIT : 4/4 Решението

SELECT Ads.Title, Ads.Date, CASE
  WHEN Ads.ImageDataURL IS NULL THEN 'no'
  ELSE 'yes'
  END AS [Has Image]
FROM Ads

2
28/02/2015 01:27:24
ttitto avatar ttitto 1153 Точки

Може би е добра идея да се помисли дали да не си качим и кода някъде освен изходите на решенията. Идеята ми е, че ако излезе нещо непредвидено може да се наложи частична ръчна проверка на някоя задача. Не винаги всички сортировки могат да се предвидят, както и всички начини на решение на една и съща задача;

Ето пример: 12та задача от ЛАБА

моето решение:

SELECT c.Name AS Category , u.Username, min(u.PhoneNumber) AS [PhoneNumber], COUNT(a.Id) AS [Answers Count]
FROM Categories c LEFT OUTER JOIN Questions q
ON q.CategoryId = c.Id LEFT OUTER JOIN Answers a
ON a.QuestionId = q.Id JOIN Users u
ON a.UserId = u.Id
GROUP BY c.Name, u.Username
HAVING COUNT(a.Id) <> 0 AND min(u.Phonenumber) Is NOT NULL
ORDER BY COUNT(a.Id) DESC

авторското решение:

SELECT c.Name AS Category , u.Username, u.PhoneNumber AS [PhoneNumber], COUNT(a.Id) AS [Answers Count]
FROM Categories c LEFT OUTER JOIN Questions q
ON q.CategoryId = c.Id LEFT OUTER JOIN Answers a
ON a.QuestionId = q.Id JOIN Users u
ON a.UserId = u.Id
GROUP BY c.Name, u.Username, u.PhoneNumber
HAVING COUNT(a.Id) <> 0 AND min(u.Phonenumber) Is NOT NULL
ORDER BY COUNT(a.Id) DESC

Същият изход, само подредбата на редовете е различна, заради включването на телефона в GROUP BY клаузата. Но това не е казано в условието.

2
nakov avatar nakov SoftUni Team Trainer 5295 Точки

Добра идея, препоръчвам да си пазите всички решения по време на изпита.

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.