((http://82.146.63.245/moodle/course/view.php?id=6 Курс по Java))

===Реляционные базы данных. Язык SQL===

База данных Гоши Караваева file:/database1.zip



[[https://server.179.ru/tasks/python/2022a/pgm42__sql_and_sqlite.html Теория и задачи]]
[[https://server.179.ru/cgi-bin/new-client?contest_id=1015 Контест по SQL]]

Для работы (обучения) удобно использовать SQLite. Почему?
**0. Soft**
Удобно работать при помощи SQLite Browser. Установите его.
**1. Создание таблиц**
[[http://xbb.uz/db/Tipy-dannyh-v-SQLite-versii-3 Какие типы данных есть в SQLitе? (ДО п. 2)]]
Изучите синтаксис SQL для [[http://moonexcel.com.ua/уроки-sql14-создание-таблиц-create-table_ru создания и удаления таблиц]]

Создайте базу данных из след. таблиц (какие поля можно и нужно сделать ключевыми?)

STUDENT : ID, SURNAME, NAME, STIPEND, KURS, CITY, BIRTHDAY, UNIV_ID
LECTURER : ID, SURNAME, NAME, CITY, UNIV_ID
SUBJECT : ID, NAME, HOUR, SEMESTER
UNIVERSITY : ID, UNIV_NAME, RAITING, CITY
EXAM_MARKS : EXAM_ID, STUDENT_ID, SUBJ_ID, MARK, EXAM_DATE
SUBJ_LECT : LECTURER_ID, SUBJECT_ID

**2. Наполнение данными**
Изучите [[http://www.sql-tutorial.ru/ru/book_operator_insert.html синтаксис команды INSERT]].

В каждой таблице должно быть не менее 100 записей.
Для того, чтобы сделать это быстро, стоит использовать скрипты - программы, генерирующие команды INSERT

**3. Запросы а выборку из одной таблицы**
[[http://www.sql-tutorial.ru/ru/book_simple_select_statement.html Простейшие варианты]]
[[http://2sql.ru/novosti/sql-where/ Условие WHERE]]
[[https://function-x.ru/sql_select.html Дополнительные возможности SELECT]]
[[http://webmasterschool.ru/sql2/ch7.php Вычисляемые поля]]


==== Задачи на простой SELECT ====

**Совсем просто**

1. Напишите запрос для вывода идентификатора (номера) предмета
обучения, его наименования, семестра, в котором он читается,
и количества отводимых на этот предмет часов для всех строк таблицы SUBJECT.

2. Напишите запрос, выбирающий все данные из таблицы STUDENT,
расположив столбцы таблицы в следующем порядке: KURS, SURNAME, NAME, STIPEND.

3. Напишите запрос, позволяющий получить из таблицы EXAM_MARKS
значения столбца MARK (экзаменационная оценка) для всех студентов, исключив из списка повторение одинаковых строк.

4. Напишите запрос, выбирающий данные о фамилии, имени и номере курса для студентов, получающих стипендию больше 140.

5. Напишите запрос, который выполняет вывод списка университетов, рейтинг которых превышает 300 баллов.

6. Напишите запрос на вывод находящихся в таблице EXAM_MARKS
номеров предметов обучения, экзамены по которым сдавались между 10 и 20 января 1999 года.

7. Напишите запрос на вывод названий предметов обучения, начинающихся на букву «И».

8. Напишите запрос для выбора из таблицы EXAM_MARKS записей,
в которых отсутствуют значения оценок (поле MARK).


**Вычисления в запросах SELECT**

1. Составьте запрос для таблицы STUDENT таким образом, чтобы выходная таблица содержала один столбец, содержащий последовательность разделенных символом «;» (точка с запятой) значений
всех столбцов этой таблицы, и при этом текстовые значения должны отображаться прописными символами (верхний регистр),
то есть быть представленными в следующем виде: 10;КУЗНЕЦОВ;БОРИС;0;БРЯНСК;8/12/1981;10.

2. Составьте запрос для таблицы STUDENT таким образом, чтобы выходная таблица содержала всего один столбец в следующем виде:
б.кузнецов;место жительства-брянск;родился:8-дек-1981.

3. Вывести фамилии, имена студентов и величину получаемых ими
стипендий, при этом значения стипендий должны быть увеличены
в 100 раз.

4. Составьте запрос для таблицы UNIVERSITY таким образом, чтобы
выходная таблица содержала всего один столбец в следующем виде: Код-10;ВГУ-г. ВОРОНЕЖ;Рейтинг=296.

[[http://phys.bspu.by/static/lib/inf/int/tarasov/c10_iud.html UPDATE]]

====Изменение данных====
Измените некоторые данные в таблицах на значения NULL

[[http://phys.bspu.by/static/lib/inf/int/tarasov/c10_agr.html Агрегирующие функции]]
[[http://moonexcel.com.ua/уроки-sql8-группировка-данных-group-by_ru Группировка в запросах]]


====Агрегирующие функции====

1. Посчитайте количество записей по таблице с NULL значениями по какому-нибудь полю, включая и не включая их.
2. Напишите запрос для подсчета количества студентов, сдававших
экзамен по предмету обучения с идентификатором, равным 20.
3. Напишите запрос, который выполняет выборку для каждого студента значения его идентификатора и минимальной из полученных им оценок.
4. Напишите запрос, выполняющий вывод фамилии первого в алфавитном порядке (по фамилии) студента, фамилия которого начинается на букву «И».
5. Напишите запрос, который выполняет вывод данных для каждого
конкретного дня сдачи экзамена о количестве студентов, сдававших экзамен в этот день.
6. Напишите запрос для получения среднего балла для каждого студента.
7. Напишите запрос для определения количества студентов, сдававших каждый экзамен.


====Группировка и сортировка====

1. Предположим, что стипендия всем студентам увеличена на 20%.
Напишите запрос к таблице STUDENT, выполняющий вывод номера студента, фамилию студента и величину увеличенной стипендии. Выходные данные упорядочить: а) по значению последнего
столбца (величине стипендии); б) в алфавитном порядке фамилий
студентов.
2. Напишите запрос, выполняющий вывод списка предметов обучения в порядке а) убывания семестров и б) возрастания отводимых
на предмет часов. Поле семестра в выходных данных должно быть
первым, за ним должны следовать имя предмета обучения и идентификатор предмета.
3. Напишите запрос, который выполняет вывод а) среднего, б) минимального, в) максимального баллов всех студентов для каждой даты сдачи экзаменов и который представляет результаты в порядке
убывания этих значений.

====Связанные подзапросы====
1. Напишите запрос с подзапросом для получения данных обо всех оценках студента с фамилией «Иванов». Предположим, что его персональный номер неизвестен. Всегда ли такой запрос будет корректным?
2. Напишите запрос, выбирающий данные об именах всех студентов,
имеющих по предмету с идентификатором 101 балл выше общего среднего балла.
3. Напишите запрос, который выполняет выборку имен всех студентов, имеющих по предмету с идентификатором 102 балл ниже общего среднего балла
4. Напишите запрос, выполняющий вывод количества предметов, по которым экзаменовался каждый студент, сдававший более 20 предметов.
5. Напишите команду SELECT, использующую связанные подзапросы и выполняющую вывод имен и идентификаторов студентов, у которых стипендия совпадает с максимальным значением стипендии для города, в котором живет студент.
====JDBC===
[[https://ashishkin.ru/blog/sqlite-v-eclipse.html Подключение драйвера, начало работы]]
[[https://bitbucket.org/xerial/sqlite-jdbc/downloads/ Драйвер JDBC]]

[[http://java-online.ru/swing-jtable.xhtml Таблица в swing]]

Узнать количество и название столбцов

ResultSet rs = stmt.executeQuery("SELECT ...");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

// The column count starts from 1
for (int i = 1; i <= columnCount; i++ ) {
  String name = rsmd.getColumnName(i);
  // Do stuff with name
}

Написать GUI-программу c полем ввода и кнопкой
Пишем в поле ввода запрос SELECT, при нажатии на кнопку - результат отображается в таблице.

----
адрес оригинала: ((/Информатика/Архив/2020/10Б))