Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Глава 6 JDBC (Java DataBase Connectivity)




Тема 6.1 Драйверы, соединения и запросы

 

JDBC (JavaDataBaseConnectivity) – стандартный прикладной интерфейс (API) языка Java для организации взаимодействия между приложением и СУБД. Это взаимодействие осуществляется с помощью драйверов JDBC, обеспечивающих реализацию общих интерфейсов для конкретных СУБД и конкретных протоколов.

JDBC предоставляет интерфейс для разработчиков, использующих различные СУБД. С помощью JDBC отсылаются SQL-запросы только к реляционным базам данных (БД), для которых существуют драйверы, знающие способ общения с реальным сервером базы данных.

Строго говоря, JDBC не имеет прямого отношения к J2EE, но так как взаимодействие с СУБД является неотъемлемой частью Web-приложений, то эта технология рассматривается в данном контексте.

Последовательность действий:

1. Загрузка класса драйвера базы данных при отсутствии экземпляра этого класса.

Например:

String driverName = "com.mysql.jdbc.Driver";

дляСУБД MySQL,

String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";

дляСУБД MSAccess или

String driverName = "org.postgreesql.Driver";

для СУБД PostgreeSQL.

После этого выполняется собственно загрузка драйвера в память:

Class.forName(driverName);

и становится возможным соединение с СУБД.

Эти же действия можно выполнить, импортируя библиотеку и создавая объект явно.

2. Установка соединения с БД.

Для установки соединения с БД вызывается статический метод
getConnection() классаDriverManager. В качестве параметров методу передаются URL базы данных, логин пользователя БД и пароль доступа. Метод возвращает объект Connection. URL базы данных, состоящий из типа и адреса физического расположения БД, может создаваться в виде отдельной строки или извлекаться из файла ресурсов.

Connection cn = DriverManager.getConnection("jdbc:mysql://localhost/my_db", "root", "pass");

В результате будет возвращен объект Connection и будет одно установленное соединение с БД my_db. Класс DriverManager предоставляет средства для управления набором драйверов баз данных. С помощью метода
registerDriver() драйверы регистрируются, а методом getDrivers() можно получить список всех драйверов.

3.Создание объекта для передачи запросов.

После создания объекта Connection и установки соединения можно начинать работу с БД с помощью операторов SQL. Для выполнения запросов применяется объект Statement, создаваемый вызовом метода createStatement() класса Connection.

Statement st = cn.createStatement();

Объект класса Statement используется для выполнения SQL-запроса без его предварительной подготовки. Могут применяться также объекты класса PreparedStatement для выполнения подготовленных запросов. Созданные объекты можно использовать для выполнения запроса SQL, передавая его в один из методов executeQuery(String sql) или executeUpdate(String sql).

4. Выполнение запроса.

Результаты выполнения запроса помещаются в объект ResultSet:

ResultSet rs = st.executeQuery("SELECT * FROM my_table");

Для добавления, удаления или изменения информации в таблице вместо метода executeQuery()запрос помещается в метод executeUpdate().

5.Обработка результатов выполнения запроса производится методами интерфейса ResultSet, где самыми распространенными являются next() и
getString(int pos) а также аналогичные методы, начинающиеся с getТип(int pos) (getInt (int pos),getFloat(int pos) и др.) и updateТип(). Эффективным способом извлечения значения поля из таблицы ответа является обращение к этому полю по его позиции в строке.

При первом вызове метода next() указатель перемещается на таблицу результатов выборки в позицию первой строки таблицы ответа. Когда строки закончатся, метод возвратит значение false.

6.Закрытие соединения

cn.close();

После того как база больше не нужна, соединение закрывается.

Для того чтобы правильно пользоваться приведенными методами, программисту требуется знать типы полей БД. В распределенных системах это знание предполагается изначально.

СУБД MySQL совместима cJDBC и будет применяться для создания экспериментальных БД. Последняя версия CУБД может быть загружена с сайта www.mysql.com. Для корректной установки необходимо следовать инструкциям мастера установки. Каталог лучше выбирать по умолчанию. В процессе установки следует создать администратора СУБД с именем root и паролем pass. Если планируется разворачивать реально работающее приложе­ние, необходимо исключить тривиальных пользователей сервера БД (иначе злоумышленники могут получить полный доступ к БД).



Дополнительно требуется подключить библиотеку, содержащую драйвер MySQL

Mysql-connector-java-3.1.12.jar

 

Тема 6.2 Простое соединение и простой запрос

 

Теперь следует воспользоваться всеми предыдущими инструкциями и создать простое соединение с БД.

Листинг 6.1

import java.sql.*;

public class Main {

public static void main(String[] args) {

Connection cn = null;

Statement st = null;

try {

Class.forName("com.mysql.jdbc.Driver");

try {

cn = DriverManager.getConnection( "jdbc:mysql://localhost/my_db", "root", "");

try {

st = cn.createStatement();

st.executeUpdate("CREATE TABLE user(id INT(3) PRIMARY KEY, name VARCHAR(20) )");

st.executeUpdate("INSERT INTO userVALUES (1,'user1')");

st.close();

} catch (SQLException ex) {

System.out.println("Error in Statement " + ex);

}

cn.close();

} catch (SQLException ex) {

System.out.println("Error in create Connection " + ex);

}

} catch (ClassNotFoundException ex) {

System.out.println("Error in download Driver " + ex);

}

}

}

В результате выполнения данной программы в базе данныхmy_db(должна быть создана на сервере заранее) будет создана таблица test и в нее внесены данные. В данном примере используется вложенная система блоков try-catch, что позволяет остановить выполнение, как только произошла какая-то ошибка. В случае большого количества запросов это не очень удобно. В листинге 6.2 приведен класс позволяющий более удачно работать с базой данных.

Листинг 6.2

import java.sql.*;

public class DB {

private Connection cn;

private Statement st;

public DB (String path, String nameDB, String login, String pass) {

try {

Class.forName("com.mysql.jdbc.Driver");

try {

cn = DriverManager.getConnection(path + nameDB, login, pass);

try {

st = cn.createStatement();

} catch (SQLException ex) {

System.out.println("Error in Statement " + ex);

}

} catch (SQLException ex) {

System.out.println("Error in create Connection " + ex);

}

} catch (ClassNotFoundException ex) {

System.out.println("Error in download Driver " + ex);

}

}

public void update(String sql) {

try {

st.executeUpdate(sql);

} catch (SQLException ex) {

System.out.println("Error in update " + ex);

}

}

public void close() {

try {

st.close();

cn.close();

} catch (SQLException ex) {

System.out.println("Error in close " + ex);

}

}

}

public class Main {

public static void main(String[] args) {

DB db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");

db.update("CREATE TABLE user(id INT(3) PRIMARY KEY, name VARCHAR(20) )");

db.update("INSERT INTO userVALUES (1,'user1')");

db.update("INSERT INTO userVALUES (2,'user2')");

db.update("INSERT INTO userVALUES (3,'user3')");

db.close();

}

}

В результате выполнения данной программы будет создана такая же таблица как и в листинге 6.1 и в нее занесены данные.

Тема 6.2 Класс ResultSet

Этот класс представляет результирующий набор базы данных. Он обеспечивает приложению построчный доступ к результатам запросов в базе данных. Во время обработки запроса ResultSet поддерживает указатель на текущую обрабатываемую строку. Приложение последовательно перемещается по результатам, пока они не будут все обработаны или не будет закрыт ResultSet.

Основныеметоды:

public boolean absolute(int row) throws SQLException

Метод перемещает курсор на заданное число строк от начала, если число положительно, и от конца - если отрицательно.

public void afterLast() throws SQLException

Этот метод перемещает курсор в конец результирующего набора за последнюю строку.

public void beforeFirst() throws SQLException

Этот метод перемещает курсор в начало результирующего набора перед первой строкой.

public void deleteRow() throws SQLException

Удаляет текущую строку из результирующего набора и базы данных.

public ResultSetMetaData getMetaData() throws SQLException

Предоставляет объект метаданных для данного ResultSet. Класс ResultSetMetaData содержит информацию о результирующие таблице, такую как количество столбцов, их заголовок и т.д.

public int getRow() throws SQLException
Возвращаетномертекущейстроки.

public Statement getStatement() throws SQLException

Возвращаетэкземпляр Statement, которыйпроизвелданныйрезультирующийнабор.

public boolean next() throws SQLException
public boolean previous() throws SQLException

Эти методы позволяют переместиться в результирующем наборе на одну строку вперед или назад. Во вновь созданном результирующем наборе курсор устанавливается перед первой строкой, поэтому первое обращение к методу next() влечет позиционирование на первую строку. Эти методы возвращают true, если остается строка для дальнейшего перемещения. Если строк для обработки больше нет, возвращается false. Если открыт поток InputStream для предыдущей строки, он закрывается. Также очищается цепочка предупреждений SQLWarning.

public void close() throws SQLException

Осуществляет немедленное закрытие ResultSet вручную. Обычно этого не требуется, так как закрытие Statement, связанного с ResultSet, автоматически закрывает ResultSet. К сожалению, не все разработчики JDBC-драйверов придерживаются этих конвенций, например, драйвер Oracle самостоятельно не закрывает ResultSet'ы, так что настоятельно советую закрывать вручную.

Листинг 6.3

import java.sql.*;

public class DB {

private Connection cn;

private Statement st;

private ResultSet rs;

public DB(String path, String nameDB, String login, String pass) {

try {

Class.forName("com.mysql.jdbc.Driver");

try {

cn = DriverManager.getConnection(path + nameDB, login, pass);

try {

st = cn.createStatement();

} catch (SQLException ex) {

System.out.println("Error in Statement " + ex);

}

} catch (SQLException ex) {

System.out.println("Error in create Connection " + ex);

}

} catch (ClassNotFoundException ex) {

System.out.println("Error in download Driver " + ex);

}

}

public void update(String sql) {

try {

st.executeUpdate(sql);

} catch (SQLException ex) {

System.out.println("Error in update " + ex);

}

}

public ResultSet query(String sql) {

try {

rs = st.executeQuery(sql);

} catch (SQLException ex) {

System.out.println("Error in query " + ex);

}

return rs;

}

public void close() {

try {

st.close();

cn.close();

} catch (SQLException ex) {

System.out.println("Error in close " + ex);

}

}

}

 

import java.sql.*;

public class Main {

public static void main(String[] args) {

DB db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");

ResultSet rs = db.query("SELECT * FROM user");

try {

while (rs.next()) {

System.out.println("ib = " + rs.getInt(1) + "\tname = " + rs.getString(2));

}

} catch (SQLException ex) {

System.out.println("Error in rs " + ex);

}

db.close();

}

}

В результате выполнения данной программы получим:

ib = 1 name = user1

ib = 2 name = user2

ib = 3 name = user3

 

Тема 6.3 Метаданные

 

СуществуетцелыйрядметодовинтерфейсовResultSetMetaData
иDatabaseMetaDataдляинтроспекцииобъектов. С помощью этих методов можно получить список таблиц, определить типы, свойства и количество столбцов БД. Для строк подобных методов нет.

Получить объект ResultSetMetaData можно следующим образом:

ResultSetMetaDatarsMetaData = rs.getMetaData();

Некоторые методы интерфейса ResultSetMetaData:

intgetColumnCount() – возвращает число столбцов набора результатов объекта ResultSet;

StringgetColumnName(intcolumn) – возвращает имя указанного столбца объекта ResultSet;

intgetColumnType(intcolumn) – возвращает тип данных указанного столбца объекта ResultSet и т.д.

Получить объект DatabaseMetaData можно следующим образом:

DatabaseMetaDatadbMetaData = cn.getMetaData();

Некоторые методы весьма обширного интерфейса DatabaseMetaData:

StringgetDatabaseProductName() – возвращает название СУБД;

StringgetDatabaseProductVersion() – возвращает номер версии СУБД;

StringgetDriverName() – возвращает имя драйвера JDBC;

StringgetUserName() – возвращает имя пользователя БД;

StringgetURL() – возвращает местонахождение источника данных;

ResultSetgetTables() – возвращает набор типов таблиц, доступных для данной БД, и т.д.

Добавим в класс DB метод showDatabaseMetaData() демонстрирующий работу некоторых методов из класса DatabaseMetaData и метод showResultSet() выводящий все данные из объекта класса ResultSet.

Листинг 6.4

import java.sql.*;

public class DB {

private Connection cn;

private Statement st;

private ResultSet rs;

public DB(String path, String nameDB, String login, String pass) {

try {

Class.forName("com.mysql.jdbc.Driver");

try {

cn = DriverManager.getConnection(path + nameDB, login, pass);

try {

st = cn.createStatement();

} catch (SQLException ex) {

System.out.println("Error in Statement " + ex);

}

} catch (SQLException ex) {

System.out.println("Error in create Connection " + ex);

}

} catch (ClassNotFoundException ex) {

System.out.println("Error in download Driver " + ex);

}

}

public void update(String sql) {

try {

st.executeUpdate(sql);

} catch (SQLException ex) {

System.out.println("Error in update " + ex);

}

}

public ResultSet query(String sql) {

try {

rs = st.executeQuery(sql);

} catch (SQLException ex) {

System.out.println("Error in query " + ex);

}

return rs;

}

public void close() {

try {

st.close();

cn.close();

} catch (SQLException ex) {

System.out.println("Error in close " + ex);

}

}

public void showDatabaseMetaData() {

try {

//получаемметаданные

DatabaseMetaData dbmd = cn.getMetaData();

//выводиминформациюпроБД

System.out.println(dbmd.getDatabaseProductName());

System.out.println(dbmd.getDatabaseProductVersion());

System.out.println(dbmd.getDriverName());

System.out.println(dbmd.getDriverVersion());

} catch (SQLException ex) {

System.out.println("Error in showDatabaseMetaData " + ex);

}

}

public void showResultSet(ResultSet rs) {

try {

//получаемметаданные

ResultSetMetaData rsmd = rs.getMetaData();

//выводимназваниястолбцов

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

System.out.print(rsmd.getColumnName(i) + "\t");

}

// выводим строки

while (rs.next()) {

System.out.println();

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

System.out.print(rs.getString(i) + "\t");

}

}

} catch (SQLException ex) {

System.out.println("Error in showResultSet " + ex);

}

}

}

 

public class Main {

public static void main(String[] args) {

DB db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");

db.showDatabaseMetaData();

db.showResultSet(db.query("SELECT * FROM user"));

db.close();

}

}

 

В результате работы данной программы получили:

MySQL

5.1.53-community

MySQL-AB JDBC Driver

mysql-connector-java-5.1.18

id name

1 user1

2 user2

3 user3

 

Тема 6.4 Подготовленные запросы

 

Для представления запросов существуют еще объекты PreparedStatement. Объекты этого класса используются при выполнении часто повторяющихся запросов SQL. Такой оператор предварительно готовится и хранится в объекте, что ускоряет обмен информацией с базой данных.

Одно из важных свойств метода prepareStatement – возможность обработки входных параметров. Они помечаются в операторе SQL символом "?" на месте фактического значения. В программе Java проводится соответствие между параметрами и методами setXXXX()– setInt, setFloat, setString и т.д., в соответствии с типами входных параметров. Все методы setXXXX() принимают в качестве параметров значение параметра и указатель parameterIndex, который равен 1 для первого "?", 2 – для второго и т.д. Выполнение sql-оператора обеспечивается методами объекта PreparedStatement:

· executeQuery()– для выполнения запроса выборки SELECT ;

· executeUpdate()– для выполнения запроса модификации данных INSERT, UPDATE или DELETE.

Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL. Оценить преимущества во времени можно, выполнив большое число повторяемых запросов с предварительной подготовкой запроса и без нее.

PreparedStatement ps = null;

String sql = "INSERT INTO user (id, name) VALUES(?,?)";

//компиляция (подготовка) запроса

ps = (PreparedStatement) cn.prepareStatement(sql);

ps.setInt(1, id);

ps.setString(2, name);

//выполнение подготовленного запроса

ps.executeUpdate();

В таблице каждая строка содержит данные об одном объекте и, прежде чем создавать таблицу, удобно создать класс-сущность, имя которого будет совпадать с названием таблицы, а поля – с названиями столбцов.

В листинге 6.5 приведен пример использования подготовленного запроса и класса сущности.

Листинг 6.5

public class User {

private int id;

private String name;

public User() {

}

public User(int id, String name) {

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return super.toString(); //To change body of generated methods, choose Tools | Templates.

}

}

import java.sql.*;

public class DB {

private Connection cn;

private Statement st;

private ResultSet rs;

public DB(String path, String nameDB, String login, String pass) {

try {

Class.forName("com.mysql.jdbc.Driver");

try {

cn = DriverManager.getConnection(path + nameDB, login, pass);

try {

st = cn.createStatement();

} catch (SQLException ex) {

System.out.println("Error in Statement " + ex);

}

} catch (SQLException ex) {

System.out.println("Error in create Connection " + ex);

}

} catch (ClassNotFoundException ex) {

System.out.println("Error in download Driver " + ex);

}

}

public void update(String sql) {

try {

st.executeUpdate(sql);

} catch (SQLException ex) {

System.out.println("Error in update " + ex);

}

}

public ResultSet query(String sql) {

try {

rs = st.executeQuery(sql);

} catch (SQLException ex) {

System.out.println("Error in query " + ex);

}

return rs;

}

public void close() {

try {

st.close();

cn.close();

} catch (SQLException ex) {

System.out.println("Error in close " + ex);

}

}

public void showDatabaseMetaData() {

try {

//получаем метаданные

DatabaseMetaData dbmd = cn.getMetaData();

//выводим информацию про БД

System.out.println(dbmd.getDatabaseProductName());

System.out.println(dbmd.getDatabaseProductVersion());

System.out.println(dbmd.getDriverName());

System.out.println(dbmd.getDriverVersion());

} catch (SQLException ex) {

System.out.println("Error in showDatabaseMetaData " + ex);

}

}

public void showResultSet(ResultSet rs) {

try {

//получаем метаданные

ResultSetMetaData rsmd = rs.getMetaData();

//выводим названия столбцов

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

System.out.print(rsmd.getColumnName(i) + "\t");

}

// выводим строки

while (rs.next()) {

System.out.println();

for (int i = 1; i <= rsmd.getColumnCount(); i++) {

System.out.print(rs.getString(i) + "\t");

}

}

System.out.println();

} catch (SQLException ex) {

System.out.println("Error in showResultSet " + ex);

}

}

public void addUser(User user) {

try {

PreparedStatement ps = null;

String sql = "INSERT INTO " + user.getClass().getSimpleName() + " (id, name) VALUES(?,?)";

//компиляция (подготовка) запроса

ps = (PreparedStatement) cn.prepareStatement(sql);

ps.setInt(1, user.getId());

ps.setString(2, user.getName());

//выполнение подготовленного запроса

ps.executeUpdate();

} catch (SQLException ex) {

System.out.println("Error in addUser " + ex);

}

}

public void changeNameUser(User user) {

try {

PreparedStatement ps = null;

String sql = "UPDATE " + user.getClass().getSimpleName() + " SET name=? WHERE id=" + user.getId();

ps = (PreparedStatement) cn.prepareStatement(sql);

ps.setString(1, user.getName());

ps.executeUpdate();

} catch (SQLException ex) {

System.out.println("Error in changeNameUser " + ex);

}

}

public void deleteUser(User user) {

String sql = "DELETE FROM " + user.getClass().getSimpleName() + " WHERE id=" + user.getId();

update(sql);

}

}

 

public class Main {

public static void main(String[] args) {

DB db = new DB("jdbc:mysql://localhost/", "my_db", "root", "");

System.out.println("Вывод текущего состояния таблицы");

db.showResultSet(db.query("SELECT * FROM user"));

db.addUser(new User(4, "user4"));

db.addUser(new User(5, "user5"));

db.addUser(new User(6, "user6"));

System.out.println("Вывод таблицы после добавления нескольких объектов");

db.showResultSet(db.query("SELECT * FROM user"));

db.changeNameUser(new User(6, "new_user6"));

User mas[] = {new User(7, "user7"), new User(8, "user8"), new User(9, "user9")};

for (int i = 0; i < mas.length; i++) {

db.addUser(mas[i]);

}

System.out.println("Вывод таблицы после добавления массива объектов");

db.showResultSet(db.query("SELECT * FROM user"));

for (int i = 0; i < mas.length; i++) {

db.deleteUser(mas[i]);

}

System.out.println("Вывод таблицы после удаления массива объектов");

db.showResultSet(db.query("SELECT * FROM user"));

db.close();

}

}

 

В результате выполнения данной программы получим:

Вывод текущего состояния таблицы

id name

1 user1

2 user2

3 user3

Вывод таблицы после добавления нескольких объектов

id name

1 user1

2 user2

3 user3

4 user4

5 user5

6 user6

Вывод таблицы после добавления массива объектов

id name

1 user1

2 user2

3 user3

4 user4

5 user5

6 new_user6

7 user7

8 user8

9 user9

Выводтаблицыпослеудалениямассиваобъектов

id name

1 user1

2 user2

3 user3

4 user4

5 user5

6 new_user6

 

 

Выводы к главе:

· JDBC (JavaDataBaseConnectivity) – стандартный прикладной интерфейс (API) языка Java для организации взаимодействия между приложением и СУБД.

· При работе с базой данных необходимо:

1). Загрузить драйвер в память

2). Создать соединение с базой данных

3). Создать объект для передачи запросов

4). Отправить запрос в базу данных

5). Обработать результат работы запроса

6). Закрыть соединение с базой данных

· ResultSet представляет результирующий набор базы данных. Он обеспечивает приложению построчный доступ к результатам запросов в базе данных.

· Метаданные позволяют получить различные данные про базу данных и про выборку.

· Объект PreparedStatement обеспечивает более быстрое выполнение оператора SQL и имеет возможность обработки входных параметров. Используется для часто передаваемых запросов.

· Прежде чем создавать таблицу, удобно создать класс-сущность, имя которого будет совпадать с названием таблицы, а поля – с названиями столбцов.

 

Задания к главе:

 

1). Производство

Минимальный список характеристик:

· Код изделия, название изделия, является ли типовым, примечание - для каких целей предназначено, годовой объем выпуска;

· код, название, адрес и телефон предприятий, выпускающих изделия;

· название, тип, единица измерения материала, цена за единицу, отметка об использовании материала в данном изделии;

· количество материала в спецификации изделия, дата установления спецификации, дата отмены;

· год выпуска и объем выпуска данного изделия предприятием.

Одно изделие может содержать много типов материалов и один и тот же материал может входить в состав разных изделий.

Выборки:

· Определить изделие, в которое входит больше всего материалов типа 'цветной металл'.

· Вывести список изделий, которые не производились в 2000 г.

· Вывести список изделий, для которых затраты на материалы в 2000 г. снизились по сравнению с предыдущим годом.

· Вывести среднемесячный расход материала 'лапша' в 2000 г.

2). Сеть магазинов

Минимальный список характеристик:

· Номер, ФИО, адрес, телефон владельца магазина, размер вклада в магазин, номер регистрации;

· номер, название, адрес и телефон магазина, уставной капитал, профиль;

· номер, ФИО, адрес, телефон поставщика, а также стоимость поставки данного поставщика в данный магазин.

Один и тот же магазин может иметь несколько владельцев и один и тот же владелец может иметь в собственности много магазинов.

Примечание: профиль - продуктовый, галантерейный, канцелярский и т.п.

Выборки:

· Определить самого молодого предпринимателя, владеющего собственностью в районе 'Киевский'.

· Определить случаи, когда регистрировалось владение лицами, не достигшими 18 лет.

· Определить случаи, когда больше 50% уставного капитала магазина внесено предпринимателем, проживающим в другом районе.

· Вывести список профилей магазинов, которыми владеет предприниматель 'Кузнецов' в порядке убывания вложенного в них капитала.

3). Телефонная станция

Минимальный список характеристик:

· Номер абонента, фамилия абонента, адрес, наличие блокиратора, примечание;

· Код АТС, код района, количество номеров;

· Номер спаренного телефона абонента, задолженность.

Один спаренный номер одной АТС может использоваться несколькими абонентами и один и тот же абонент может использовать телефоны разных АТС.

Выборки:

· Выбрать пары сблокированных телефонов.

· Определить АТС, районы действия которых перекрываются.

· Выбрать телефоны группового пользования, Вывести их номера и фамилии абонентов.

· Выбрать список абонентов АТС 47, имеющих задолженность больше 100 руб.

4). Городской транспорт

Минимальный список характеристик:

· Вид транспорта, средняя скорость движения, количество машин в парке, стоимость проезда;

· номер маршрута, количество остановок в пути, количество машин на маршруте, количество пассажиров в день;

· начальный пункт пути, конечный пункт, расстояние.

Один и тот же вид транспорта может на разных маршрутах использовать разные пути следования.

Выборки:

· Определить оптимальный по времени маршрут между пунктами 'Холодная Гора' и 'Парк '.

· Определить среднее время ожидания на остановке троллейбуса №39.

· Вывести маршруты трамваев в порядке убывания их протяженности.

· Вывести список ежедневных денежных поступлений для всех видов транспорта.

5). Шахматы

Минимальный список характеристик:

· Фамилия спортсмена, дата рождения, страна, спортивный разряд, участвовал ли в борьбе за звание чемпиона мира, рейтинг, примечание

· Турнир, страна, город, дата проведения, уровень турнира;

· Стартовый номер спортсмена в данном турнире, занятое место.

Один шахматист может участвовать в разных турнирах.

Выборки:

· Выбрать турнир с самым высоким рейтингом участников.

· Выбрать те турниры, где все призовые места заняли представители страны-хозяина турнира.

· Определить турниры, в которых участник с самым высоким рейтингом занял последнее место.





Рекомендуемые страницы:


Читайте также:



Последнее изменение этой страницы: 2016-05-30; Просмотров: 428; Нарушение авторского права страницы


lektsia.com 2007 - 2021 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.1 с.) Главная | Обратная связь