Будучи языком запросов, а не языком программирования в чистом виде, SQL имеет ограниченные возможности семантики, если говорить о различных сложных конструкциях и логических операциях ветвления либо цикла, однако его недостатки можно компенсировать возможностями языков прикладного программирования, с которыми SQL успешно интегрируется.
После общего описания SQL было показано, как с помощью этого языка создавать базы данных и таблицы, работать с записями таблиц. Также были описаны некоторые особенности работы с SQL в различных СУБД.
В третьей части работы были продемонстрированы возможности работы с SQL в различных языках программирования высокого уровня. Для сравнения были взяты три языка - каждый в своей среде разработки, - и изучено подключение к базам данных и использование SQL-запросов. В случае первых двух языков (Pascal и C++) были созданы тестовые приложения, листинг которых находится в соответствующих приложениях. В случае третьего языка (ABAP) за неимением возможности разработать отдельное приложение был продемонстрирован существующий код.
Из трех языков наиболее удобным в использовании видится Pascal под управлением Lazarus; C++, как и в случае с другими аспектами этого языка - не только подключением к базам данных - обладает широкими возможностями, но сложен на практике; в ABAP наиболее естественно интегрирован SQL, но возможности самого языка программирования несколько ограничены. В процессе выполнения курсовой работы были выполнены следующие задачи:
) даны определения баз данных и СУБД, перечислены и раскрыты важнейшие их особенности; составлена классификация баз данных и, соответственно, систем управления базами данных по различным признакам;
) описаны различные модели данных, перечислены характеристики БД (базы данных) и СУБД (отношения, операции, ключи и так далее). Дано краткое описание языка UML (Unified Modeling Language), использующегося для проектирования реляционной БД, а также описан процесс проектирования базы данных;
) дана характеристика языка SQL; перечислены его особенности в рамках теории; дано поэтапное описание (с примерами) создания базы данных и таблицы, перечислены основные операторы языка; указаны особенности использования SQL в различных СУБД;
) изучена теоретическая возможность использования SQL в прикладном программировании; перечислены достоинства и недостатки такой концепции;
) более подробно описано практическое использование SQL в различных языках программирования, продемонстрированы примеры, дана сравнительная характеристика.
Учитывая, что все поставленные задачи решены,
можно обоснованно утверждать, что главная цель исследования достигнута.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. ГОСТ Р ИСО/МЭК ТО 10032-2007. Эталонная модель управления данными [Текст]. - Введ. 27.12.2007. - М.: Стандартинформ, 2009. - 40 с.
. Баженова И.Ю. Разработка распределенных приложений баз данных: Курс лекций. - М.: МГУ им. М.В. Ломоносова, 2006. - 203 с.
. Баканов В.М. Введение в язык SQL запросов к базам данных: Учебное пособие. - М.: МГАПИ, 2002. - 61 с.: ил.
. Бураков П.В., Петров В.Ю. Введение в системы баз данных: Учебное пособие. - СПб: СПбГУ ИТМО, 2010. - 128 с.
. Гудов А.М., Шмакова Л.Е. Введение в язык структурированных запросов SQL: Учебное пособие. - Кемерово, Кемеровский госуниверситет, 2001. - 118 с.
. Дьяков И.А. Базы данных. Язык SQL: Учебное пособие. - Тамбов: ТГТУ, 2004. - 80 с.
. Зиборов В.В. MS Visual C++ 2010 в среде .NET. Библиотека программиста. - Спб.: Питер, 2012. - 320 с.: ил.
. Кетков Ю.Л., Кетков А.Ю. Свободное программное обеспечение. FREE PASCAL для студентов и школьников. - СПб.: БХВ-Петербург, 2011. - 384 с.: ил.
. Копейкин М.В., Спиридонов В.В., Шумова Е.О. Базы данных. Основы SQL реляционных баз данных: Учебное пособие. - СПб.: СЗТУ, 2005. - 160 с.
. Э.В. Сысоев, Е.В. Бурцева. Базы данных: лекции к курсу. - Тамбов : Изд-во Тамб. гос. техн. ун-та, 2007. - 48 с.
. Токмаков Г. П. Базы данных. Концепция баз данных, реляционная модель данных, языки SQL и XML: учебное пособие / Г. П. Токмаков. - Ульяновск: УлГТУ, 2010. − 192 с.
. Токмаков Г. П. Базы данных и знаний. Проектирование баз данных по технологии «клиент-сервер» и разработка клиентских приложений: Учебное пособие / Г.П. Токмаков. - Ульяновск; УлГТУ, 2005. - 143 с.
. Фаро С., Паскаль Л. Рефакторинг SQL-приложений. - Пер. с англ. - СПб: Символ-Плюс, 2009. - 336 с.: ил.
. Шварц Б., Зайцев П., Ткаченко В., Заводны Дж., Ленц А., Бэллинг Д. MySQL. Оптимизация производительности, 2-е издание. - Пер. с англ. - Спб.: Символ-Плюс, 2010. - 832 с.: ил.
. Michael Alexander, Richard Kusleika. Access 2013 Bible. - New Jersey: Wiley, 2013 - 1296 p.
. Grant Allen, Mike Owens. The Definitive Guide to SQLite, Second Edition. - New York: Apress, 2010. - 368 p.
. Donald Bales. Beginning Oracle PL/SQL. Second edition. - New York: Apress, 2015. - 492 p.
. Alan Beaulieu. Learning SQL, Second Edition. - California: O’Reilly Media, Inc., 2009. - 338 p.
. Paul DuBois. MySQL (5th Edition) (Developer's Library). - Massachusetts: Addison-Wesley Professional, 2013. - 1176 p.
. Ken Greenwood. Sams Teach Yourself ABAP/4 in 21 Days. - Indiana: Sams, 1998. - 752 p.
. Ken Jones. Microsoft® SQL Server® 2008 T-SQL Fundamentals. - Washington: Microsoft Press, 2008. - 688 p.
. Bjarne Stroustrup. Programming: principles and practice using C++. Second edition. - Massachusetts: Addison-Wesley Professional, 2014. - 1312 p.
. James Wood. Object-Oriented Programming with ABAP Objects. 2nd, updated and revised edition 2016. - Massachusetts: SAP Press, 2015 - 470 p.
24. Базы данных URL: <http://www.site-do.ru/db/db1.php>, свободный доступ.
. Википедия - свободная энциклопедия [Электронный ресурс]. - URL: <https://ru.wikipedia.org/wiki/Данные>, свободный доступ.
. CIT Forum URL: <http://citforum.ru/>, свободный доступ.
. Википедия - свободная энциклопедия [Электронный ресурс]. - URL: <https://ru.wikipedia.org/wiki/SQL>, свободный доступ.
ПРИЛОЖЕНИЯ
Приложение А. Листинг SQL-запросов для создания базы данных и таблиц в ней, заполнения таблиц и выборки по указанным полям
DATABASE Test_SQL_1 CHARACTER SET utf8 COLLATE utf8_general_ci;USE Test_SQL_1;TABLE person
(person_id SMALLINT UNSIGNED,VARCHAR(20),VARCHAR(20),CHAR(1),_date DATE,VARCHAR(30),VARCHAR(20),VARCHAR(20),VARCHAR(20),_code VARCHAR(20),pk_person PRIMARY KEY (person_id)
);ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;ALTER TABLE person MODIFY gender enum('M','F');INTO person
(person_id, fname, lname, gender, birth_date)(null, 'William','Turner', 'M', '1972-05-27');INTO person
(person_id, fname, lname, gender, birth_date,, city, state, country, postal_code)(null, 'Susan','Smith', 'F', '1975-11-02',
'23 Maple St.', 'Arlington', 'VA', 'USA', '20220');TABLE favorite_food
(person_id SMALLINT UNSIGNED,VARCHAR(20),pk_favorite_food PRIMARY KEY (person_id, food),fk_fav_food_person_id FOREIGN KEY (person_id)person (person_id)
);INTO favorite_food (person_id,
food)(1, 'pizza');INTO favorite_food (person_id, food)(1, 'cookies');INTO
favorite_food (person_id, food)(1, 'nachos');person_id, fname, lname, birth_datepersonperson_id
= 1;foodfavorite_foodperson_id = 1BY food;
Приложение Б
Список основных операторов и служебных слов SQL
|
Оператор |
Назначение |
|
CREATE |
Создание таблицы или базы данных |
|
ALTER TABLE |
Изменение полей таблицы |
|
DROP |
Удаление базы данных или таблицы |
|
SELECT |
Выборка из таблицы или таблицы |
|
INSERT |
Добавить строку в таблицу |
|
UPDATE |
Изменить данные некоторой строки |
|
DELETE |
Удалить строки или таблицу |
|
Служебное слово |
|
|
FROM |
Указывает таблицу-источник выборки |
|
WHERE |
Указывает условие по некоторому полю |
|
ORDER BY |
Упорядочивает по некоторому полю |
|
GROUP BY |
Вычисляет количество значений некоторого поля, по значению другого |
|
HAVING |
Схож с WHERE, но используется с агрегатными данными |
|
BETWEEN |
Указывает, что значение поля должно быть между некоторыми границами |
|
IN |
Указывает, что значение поля должно принадлежать некоторому множеству |
|
LIKE |
Производит поиск строки по маске |
|
ALL |
Сравнивает значение поля со всеми значениями столбца |
|
DISTINCT |
Удаляет повторяющиеся записи из выборки |
Приложение В. Листинг тестовой программы,
разработанной в Lazarus
unit Unit1;
{$mode objfpc}{$H+}
Classes, SysUtils, mysql56conn, mysql50conn, sqldb, db, FileUtil, Forms,
Controls, Graphics, Dialogs, StdCtrls, ComCtrls, DbCtrls, DBGrids, Grids;
{ TMySQLtest }
TMySQLtest = class(TForm)
ButtonExecute: TButton;
ButtonConnect: TButton;
ButtonExit: TButton;
DataSource1: TDataSource;
EditHost: TEdit;
EditName: TEdit;
EditPassword: TEdit;
Host: TLabel;
Memo1: TMemo;
EditSQLCommand: TMemo;
MySQL50Connection1: TMySQL50Connection;
SQLCommand: TLabel;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
StatusBar1: TStatusBar;
UserName: TLabel;
Password: TLabel;
procedure ButtonConnectClick(Sender: TObject);
procedure ButtonExecuteClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
MySQLtest: TMySQLtest;
{$R *.lfm}
{ TMySQLtest }PrepareMemo;
//Глобальная процедура для подготовки Memo1 (очистка строк и заполнение заголовков полей)
i: integer;
TempString: String;
MySQLtest.SQLQuery1.Open;
TempString := '';
i := 0;
MySQLtest.Memo1.Clear;
MySQLtest.Memo1.Lines[0] := inttostr(MySQLtest.SQLQuery1.FieldCount);
While i < MySQLtest.SQLQuery1.FieldCount-1 do
begin
TempString := TempString + MySQLtest.SQLQuery1.Fields[i].FieldName + '.......';
inc(i);
end;
TempString := TempString + MySQLtest.SQLQuery1.Fields[i].FieldName;
i:=0;
MySQLtest.Memo1.Lines[0] := TempString;
for i := 1 to length(TempString) do
begin
MySQLtest.Memo1.Lines[1] := MySQLtest.Memo1.Lines[1] + '_'
end;
//Конец процедуры;PutResultToMemo;
//Глобальная процедура для заполнения Memo1 результатами выборки из SQLQuery1
i, j: integer;
FieldName, TempString: String;
MySQLtest.SQLQuery1.Open;
i := 0;
while not MySQLtest.SQLQuery1.EOF do
begin
j := 0;
TempString := '';
while j <= MySQLtest.SQLQuery1.FieldCount-1 do
begin
FieldName := MySQLtest.SQLQuery1.Fields[j].FieldName;
If MySQLtest.SQLQuery1.FieldByName(FieldName).AsString <> '' then
TempString := +MySQLtest.SQLQuery1.FieldByName(FieldName).AsString+'....'
else
TempString := TempString+'[nil]....';
inc(j)
end;
MySQLtest.SQLQuery1.Next;
MySQLtest.Memo1.Lines[i+2] := TempString;
inc(i)
end;
//Конец процедуры;ExecuteQuery;
try
//Начало соединения
MySQLtest.SQLQuery1.Active:=false;
MySQLtest.SQLQuery1.SQL.Clear;
MySQLtest.SQLQuery1.sql.add('SET character_set_client='+#39+'utf8'+#39+', character_set_connection='+#39+'cp1251'+#39+',character_set_results='+#39+'utf8'+#39+';');
MySQLtest.SQLQuery1.ExecSQL;
MySQLtest.SQLQuery1.SQL.Clear;.SQLQuery1.sql.AddStrings(MySQLtest.EditSQLCommand.lines);
//Соединение удачно
//Подготавливаем Memo1
PrepareMemo;
//Записываем результат в Memo1
PutResultToMemo;
except
ShowMessage('Ошибка при выполнении запроса');
exit;;TMySQLtest.ButtonConnectClick(Sender: TObject);
//Эта процедура выполняет подключение к MySQL, основываясь на данных из //3 полей Edit: EditHost, EditName, EditPassword
//Также выполняется первая выборка, основанная на тексте в EditSQLCommand
MySQL50Connection1.HostName := EditHost.Text;
MySQL50Connection1.UserName := EditName.Text;
MySQL50Connection1.Password := EditPassword.Text;
try
MySQL50Connection1.Connected := true
except
ShowMessage('Невозможно подключиться к базе данных');
exit;
end;
try
SQLTransaction1.Active:=true;
except
ShowMessage('Невозможно создать транзакцию');
exit;
end;
ExecuteQuery;
if MySQL50Connection1.Connected = true then
StatusBar1.SimpleText := 'Соединение установлено';TMySQLtest.ButtonExecuteClick(Sender: TObject);
ExecuteQuery.
Приложение Г.
Листинг тестовой программы, разработанной в Visual
Studio
// TestSQL.cpp: определяет точку входа для консольного приложения.
//
#include <windows.h>
#include <winsock.h>
#include <mysql.h>
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>namespace std;_tmain(int argc, _TCHAR* argv[])
{("cls");*conn;_RES *res;_ROW row;i = 0;
// Получение дексриптора соединения= mysql_init(NULL);(conn == NULL)
{(stderr, "Ошибка: невозможно создать дескриптор\n");
}
// Подключение к серверу(!mysql_real_connect(conn, "localhost", "root", "admin", "test", NULL, NULL, 0))
{(stderr, "Ошибка: невозможно подключиться к базе данных\n", mysql_error(conn));
}
{(stdout, "Подключение установлено\n");
}query;<< "Введите SQL-запрос\n";>> query;char* query_char = query.c_str();_set_character_set(conn, "utf8"); //Изменение кодировки запросов_query(conn, query_char); //Отправление запроса, введенного ранее
if (res = mysql_store_result(conn)) {(row = mysql_fetch_row(res)) {(i = 0; i <mysql_num_fields(res); i++) {::cout << row[i] << "\n"; //Циклический вывод данных, полученных из БД
}
}
} else fprintf(stderr, "%s\n", mysql_error(conn));
// Закрытие соединения_close(conn);("Pause");
}