10 Б

Курс по Java

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


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


Теория и задачи
Контест по SQL


Для работы (обучения) удобно использовать SQLite. Почему?
0. Soft
Удобно работать при помощи SQLite Browser. Установите его.
1. Создание таблиц
Какие типы данных есть в SQLitе? (ДО п. 2)
Изучите синтаксис SQL для создания и удаления таблиц


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


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. Наполнение данными
Изучите синтаксис команды INSERT.


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


3. Запросы а выборку из одной таблицы
Простейшие варианты
Условие WHERE
Дополнительные возможности SELECT
Вычисляемые поля


Задачи на простой 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.


UPDATE

Изменение данных

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


Агрегирующие функции
Группировка в запросах


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


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


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


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

Связанные подзапросы

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


JDBC

Подключение драйвера, начало работы
Драйвер JDBC


Таблица в 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, при нажатии на кнопку – результат отображается в таблице.