Тема 6.1 Драйверы, соединения и запросы
JDBC (JavaDataBaseConnectivity) – обычный прикладной интерфейс (API) языка Java для организации сотрудничества между приложением и СУБД. Это сотрудничество осуществляется посредством драйверов не, снабжающих реализацию неспециализированных интерфейсов для конкретных СУБД и конкретных протоколов.
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 (на данный момент 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
System.out.print(rsmd.getColumnName(i) + \t);
}
// выводим строки
while (rs.какое количество()) {
System.out.println();
for (int i = 1; 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 семь дней + 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
System.out.print(rsmd.getColumnName(i) + \t);
}
// выводим строки
while (rs.next()) {
System.out.println();
for (int i = 1; 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). Шахматы
Минимальный перечень черт:
- Фамилия спортсмена, дата рождения, страна, спортивный разряд, принимал участие ли в борьбе за титул мирового чемпиона, рейтинг, примечание
- Турнир, страна, город, дата проведения, уровень турнира;
- Стартовый номер спортсмена в данном турнире, занятое место.
Один шахматист может принимать участие в различных турнирах.
Выборки:
- Выбрать турнир с самым высоким рейтингом участников.
- Выбрать те турниры, где все призовые места заняли представители страны-хозяина турнира.
- Выяснить турниры, в которых участник с самым высоким рейтингом занял последнее место.