Управління даними відповіді до іспиту (щоб допомогти розібратися, а не для списування), fkn antitotal
Primary tabs
[Практичний довідник з MySQL]
УВАГА - ТЕГИ code І /code НЕ ПОТРІБНІ В ЗАПИТІВ - ВОНИ - ТЕХНІЧНА ВИТРАТА -МЕНІ ПРОСТО ЛЕНЬ ЗМІНЯТИ РЕЗМІТКУ - ОТЖЕ ДОВГО ФОРМАТУВАЛА.
Наша база даних має такий вигляд -
1) Напишіть запит для визначення кількості предметів, що вивчаються на кожному курсі. 2) Напиши запит, який виконує виведення імен та прізвищ викладачів, які читають по два і більше предметів. 3) Напишіть запит, що виконує висновок списку прізвищ студентів, які мають тільки відмінні оцінки та проживають у місті, що не збігається з містом їх університету. 4) Напишіть запит, що збільшує розмір стипендії на 20% всім студентам, у яких сума балів перевищує значення 50. 5) Написати запит, який виконує виведення даних про прізвища студентів, які мають повний набір оцінок (п'ятірки, четвірки, трійки). ) 6) Написати запит , який для кожного конкретного дня складання іспиту виводить кількість студентів, які складали іспит цього дня. 7) Написати Запит, що виконує виведення кількості годин занять, що проводяться викладачем Лагутіним (мабуть, мається на увазі - всі години за рік з усіх предметів) 8) Введіть запис для нового студента, якого звуть Орлов Микола, який навчається на першому курсі ВДУ, що живе у Воронежі, відомості про дату народження та розмір стипендії невідомі.
================================================== ===== Тепер я спробую відповісти на ці питання, щоб підготуватися до іспиту. Жодну з трьох атестацій я не здав - через відсутність належного старання 0))). Як сказав Юрій Гагарін - "Поїхали!" =============================================== ========
1) Напишіть Запит длявизначення кількості предметів, що вивчаються кожному курсі.
(у тій схемі бази даних, що нам видали неправильно було написано поле SEMESTER - >) Спробуємо вирішити це питання звернувшись до таблиці SUBJECT у складі-
Виведемо кількість предметів для кожного семестру -
SELECT SEMESTER , COUNT(*) FROM SUBJECT GROUP BY SEMESTE R;
Поки що я не бачу способу вирішити це завдання, використовуючи лише одну таблицю SUBJECT; Взагалі, поле "курс" є тільки в таблиці "STUDENT", на яку "вказує" таблиця "EXAM_MARKS". "EXAM_MARKS" також вказує на "SUBJECT". Якщо мати на увазі, що такий зв'язок встановлений для всіх студентів (просто дані з іспитів не заповнені, тому що вони могли їх ще не складати), але це не показує однозначний зв'язок так як другокурсники також складали іспит за перші семестри.
Вирішимо це завдання за допомогою JOIN , використовуючи підзапит, якось так:
але такий варіант не прокотить через помилку - #1060 - Duplicate column name 'STUDENT_ID' щоб уникнути цієї помилки необхідно вибирати не всі поспіль рядки, а тільки ті, що нас цікавлять, а цікавлять нас курси, на яких предмети вивчаються . Отримуємо:
- і це діюче рішення.
Тепер ще один момент. Стверджується (одним із викладачів з практики) що це завдання цілком можна розв'язати з допомогою UNION. Що ж, спробуємо:
- Виконання даного запиту покаже, що на першому курсі читаються 6 предметів, виконаємо перевірку - SELECT * FROM SUBJECT ; - і порахуємо вручну, благо це не списків студентів чи екзаменаційних нами нашої навчальної бази. Виходить, що 6 предметів - математика два семестри поспіль. Тепер виконаємо об'єднання за допомогою UNION (тільки для двох курсів, тому що в навчальній базі їх всього і єдва - третій пристібайте за аналогією)) -
і знову ж таки - виконайте перевірку щоб переконатися в правильності запиту - SELECT * FROM SUBJECT ;
2) Напиши запит, що виконує виведення імен та прізвищ викладачів, які читають по два і більше предметів.
схоже на те, що запит працює. Давайте тепер подивимося на викладачів взагалі - SELECT * FROM LECTURER; або подивимося, якщо хтось веде більше 4-х -
таких немає. До речі, за завданням виводити число предметів, не треба. Відповідно, запит постає у вигляді -
3) Напишіть запит, що виконує висновок списку прізвищ студентів, які мають лише відмінні оцінки та проживають у місті, що не збігається з містом їхнього університету.
Таких є 235 штук. тепер давайте подивимося на їхній середній бал. -
Переконаємося, що ці хлопці не з інших міст -
Ну що ж - перші тридцять чоловік, яких я побачив - хорошісти)) Отже, вирішення цього завдання -
4) Напишіть запит, що збільшує розмір стипендії на 20% всім студентам, у яких сума балів перевищує значення 50.
Перш ніж розв'язати це завдання, давайте виведемо на екран цих самих студентів, що добре навчаються, і їх стипендії - і запам'ятаємо кілька перших рядків (хоча б один) щоб потім переконається, що стипендію ми підвищили кому треба).
цей запит обробляється успішно. на результати не екран чомусь не виводяться. спробуємо обійтися без вкладеного запиту -
хм. субд просто повертає порожній результат. спробуємо зменшити суму балів -
більше 1000 осіб отримали 20 і більше балів) щож - тепер давайте збільшимо стипендію неіснуючим хлопцям - для конкретики візьмемо тих, у кого більше 30 балів -
їх лише 29 .У першої студенткистипендія 400 р - і це не порядок!)) підвищуємо. - До речі, давайте спочатку спробуємо підвищити їй однієї (запам'ятаємо її id = 413;
тепер дивимося, що вийшло. По-йому вийшло дуже навіть непогано) - тепер у неї 480;
Відповідно, загальний запит виглядатиме як - то так -
- неправильно - дасть помилку -
тоді перепишемо запит у вигляді -
(зауваження - щоб оновити відразу кілька рядків, як у попередньому запиті використовуйте умову не "WHERE ЩО-ТО=", а "WHERE ЩО-ТО IN") виконується цей запит дуже довго) тобто взагалі висне, хоча синтаксично він вірний (стверджую не тільки я)) - може бути і не правий тоді не тільки я 0)))
хлопці з форуму програмістів підказують такий варіант, який виконується на моєму комп'ютері за 9 з гаком секунд.
як ви можете бачити,тут ми позбулися HAVING.
5) Написати запит виконує виведення даних про прізвища студентів, які мають повний набір оцінок (п'ятірки, четвірки, трійки.)
Спробуємо почати із запиту виду:
6) Написати запит, який для кожного конкретного дня складання іспиту виводить кількість студентів, які складали іспит у цей день.
- цей чомусь не обробляється у phpmyadmin, але у командному рядку обробляється нормально. Аналогічно тому що DISTINCT це неявний GROUP BY можна використовувати запит виду - SELECT EXAM_DATE, COUNT(*) FROM (SELECT STUDENT.STUDENT_ID,EXAM_DATE FROM STUDENT LEFT JOIN EXAM_MARKS ON STUDENT.STUDENT_ID=EXAM_MAR GROUP BY STUDENT.STUDENT_ID) AS MYTABLE1 GROUP BY EXAM_DATE; - На іспиті, думаю, його навіть краще написати. --------------------------------------------------- ----------------------------
7) Написати Запит, що виконує виведення кількості годин занять,проведених викладачем Лагутіним (мабуть, мається на увазі - весь годинник за рік з усіх предметів
хм. нуль рядків. Подивимося - чи є взагалі такий викладач. - SELECT SURNAME FROM LECTURER WHERE SURNAME='Лагутін'; Такого чувака немає. давайте спробуємо з кимось іншим)
- Бабкіна Надія, під номером 1 - давайте подивимося скільки годин на рік вона витрачає на студентів -
- начебто як 315) Знову ж таки - не стверджую що даний запит є дуже оптимальним, бо HAVING - перевіряється вже після угруповання предметів на прізвища ВСІХ викладачів. принаймні десь в інтернеті про це було написано. --------------------------------------------------- ----------------------------
8) Введіть запис для нового студента, якого звуть Орлов Микола, який навчається на першому курсі ВДУ, що живе у Воронежі, відомості про дату народження та розмір стипендії невідомі.
Це завдання скоріше знання чарівних слів. ніж на логіку. Вирішимо її -
-------------------------------------------------- --------------------- Нехай є деяка таблиця STUDENT1 еквівалентна STUDENT. вставте в неї зі STUDENT усі дані про студентів, які успішно склали більше п'яти іспитів.