Категории команд SQL

Определение данных (Data Definition Language, DDL).
Определение состава и конфигурации хранимых данных в базе данных (например, создание таблиц)
CREATE, ALTER, DROP, RENAME и TRUNCATE

Манипулирование данными (Data Manipulation Language, DML)
Добавление, изменение или удаление в таблице или таблицах
INSERT, UPDATE, DELETE

Выборка данных
Получение контрольной информации из базы данных
SELECT (широкий набор параметров)

Управление данными (Data Control Language, DCL)
Присваивание пользователям привилегий на таблицы или действия.
Объектная привилегия - в отношении таблицы, системная -
в отношении всей базы данных.
Присвоение - GRANT, обратное - REVOKE

Управление транзакциями
После выполнения одной или нескольких команд DML есть возможность
сохранить изменения (COMMIT), либо ROLLBACK для их отмены ("отката").
Доступно производить отмену после транзакций на любую нужную глубину
(необходимость промежуточных точек) - SAVEPOINT




Связывание с динамической библиотекой в Visual C++

Для того, чтобы компиляция проекта связанного с использованием сторонних динамических библиотек в среде Microsoft Visual Studio C++ проходила корректно, необходимо в настройках проекта изначально прописать наименования и пути к требуемым внешним файлам. К таким внешним файлам как правило относятся *dll (непосредственно динамическая библиотека), *.lib (библиотека импорта нашей динамической библиотеки) и *.h (заголовочный файл или header файл). Поэтому в свойствах проекта необходимо заявить о них, путем прописывания в соответствующих разделах:

1) Свойства Project -> Выбираем All Configurations (объединяет и Debuger и Release);

2)  Раздел C/C++ -> General (Общие) -> Additional Include Directories (Дополнительные каталоги включений) -> Прописываем пути к библиотеке импорта и
заголовочному файлу (например, ...\Project\my project\my project)

3) Раздел Linker -> General (Общие) -> Additional Library Directories (Дополнительные каталоги библиотек) -> Прописываем пути к библиотеке импорта и
заголовочному файлу (например, ...\Project\my project\my project)

4) Раздел Linker -> Input -> Additional Dependencies (Дополнительные зависимости) -> Прописываем полное наименование библиотеки импорта (например, myLib.lib), если несколько, то перечисляем через пробел.

Необходимо сделать оговорку, для удобства и правильной работы компилятора, желательно, а может и необходимо все рабочие файлы (в моем случае это sqlite3.dll, sqlite3.lib, sqlite3.h, sqlite3.exp, sqlite3.def , sqlite3db.db) размещать в одном каталоге, например каталоге Вашего проекта "...\Project\my project\my project".

После компиляции проекта (в режиме debug или/и release) для работы приложения нужно не забыть приложить к нему нашу динамическую библиотеку.

Всем удачной работы.

Разработка консольного приложения для работы с базой данных SQLite

Во время разработки консольного приложения для работы с базой данных SQLite столкнулся с рядом проблем.
Импорт динамической библиотеки SQLite в среде Microsoft Visual Studio 9.0 с помощью утилитки lib.exe проходил с ошибками:
- Cannot find mspdb80.dll с предложением деинсталляции и
- sqlite3.def : fatal error LNK1107: invalid or corrupt file: cannot read at 0x108














Первое было решено так: добавил в переменную окружения PATH пути C:\Program Files\Microsoft Visual Studio 9.0\VC\bin
(здесь я расположил sqlite3.dll и sqlite3.def) и C:\Program Files\Microsoft VisualStudio 9.0\Common7\IDE (здесь распологалась искомая mspdb80.dll). Потом скопировал mspdb80.dll в ...\VC\bin. Все заработало. Позже выяснилось, что необходимо было проделать так:
1) добавить в Path ...\VC\bin и 2) start->run->cmd-> vcvars32.bat.
Лично не проверял, но можно будет попробовать.
Вторая ошибка была чисто синтаксической: лишний пробел.

После кодинга проекта при попытке компиляции вылезла другая проблема:
fatal error C1902: Program database manager mismatch.
Все дело оказалось в ранее скопированной mspdb80.dll в ...\VC\bin.
Простое удаление и все снова в порядке.
Последующие компиляции проходили без ошибок, единственное - смущали сообщения компилятора:
Native' has exited with code 1 (0x1). После замены "system("pause");" на "_getch();" (#include stdio.h) (для ожидания реакции пользователя приложения) компилятор сообщил:
Native' has exited with code 0
Это говорило о безошибочном исходе компиляции. На выходе имеем рабочее приложение.

Реляционная база данных SQLite


SQLite - легковесная встраиваемая реляционная база данных. Из особенностей: не использует парадигму "клиент-сервер",
поддерживает практически весь стандартный набор SQL инструкций, движок SQLite представляет собой библиотеку (sqlite3.dll), то есть не является
отдельно работающим процессом, предоставляет в качестве протокола обмена вызываемые функции (API).
Для платформы Win32 (Precompiled for Windows) на официальном сайте - sqlite.org - можно скачать непосредственно саму библиотеку - sqlite3.dll
(sqlite - dll - win32), а также функциональную клиентскую часть - sqlite3.exe (sqlite - shell - win32). Последний доступный релиз версии - v.3.7.10
Клиентская оболочка sqlite3.exe позволяет напрямую через консоль работать с базой данных.
Прежде, чем приступать к работе необходимо проделать небольшие манипуляции: 1) шрифт консоли должен быть переведен на Lucida Console
(правый клик по консоли -> Свойства -> Шрифт), 2) перевести кодовую страницу в 1251 с помощью команды "chcp 1251", по умолчанию code page равен 866.
Это необходимо для корректной вставки текстовых данных в таблицы базы данных.

Ниже представлен список всех специальных команд и дано краткое их описание.

Команда Краткое описание
.databases Вывод списка имен всех подключенных в текущем сеансе баз данных и соответствующих им файлов.
.dump ?TABLES?: Дамп всех SQL инструкций использованных в создании БД или отдельной таблицы в текстовом формате
.echo ON|OFF ВКЛ | ВЫКЛ эхо введенных команд
.exit Выход из программы
.explain ON|OFF Управляет режимом вывода виртуальных машинных команд. Используется при выполнении SQL запроса EXPLAIN.
.header(s) ON|OFF ВКЛ | ВЫКЛ показ заголовков столбцов
.import FILE TABLE Импорт данных из файла FILE в таблицу TABLE
.indices TABLE Показывает имена всех индексов таблицы
.mode MODE Установка режима вывода: line(s), column(s), insert, list, html и других
.nullvalue STRING Напечатает строку STRING вместо NULL данных при выводе SQL запроса SELECT
.output FILENAME Послать весь вывод в файл FILENAME
.output stdout Послать весь вывод на экран
.promt MAIN COTINUE Изменить стандартную строку подсказки
.quit Выход их программы
.read FILENAME Выполнение SQL инструкций из файла FILENAME
.schema ?TABLE? Покажет текст SQL инструкции CREATE для всех таблиц или указанной таблицы
.separator STRING Изменить строку разделитель колонок, используется при выводе SQL запроса SELECT и команды .import
.show Показать значения установленных переменных
.tables ?PATTERN? Вывод списка имен таблиц БД (возможно по шаблону)
.timeout MS Блокирование открытия таблиц на число миллисекунд MS
.width NUM NUM : Установка ширины столбцов при выводе в режиме column

Подробно рассмотрим некоторые из этих команд. Предварительно создадим базу данных, на которой мы и рассмотрим специальные команды. Из командной строки запустите консольную программу "sqlite3.exe" введя следующее:

sqlite3 exam.db
SQLite version 3.1.3
Enter ".help" for instructions
Где exam.db имя создаваемой базы данных.

Создадим таблицу tbl1, с помощью SQL инструкции CREATE TABLE.

sqlite> CREATE TABLE tbl1 (one INTEGER PRIMARY KEY AUTOINCREMENT,
two VARCHAR(50), three REAL);

Вставим несколько записей в данную таблицу. Отмечу, что в инструкции создания таблицы для каждого поля мы задали тип данных для его значений, этот тип данных игнорируется программой "SQLite". Система управления базой данных "SQLite" довольно свободно относится к определению типов данных, что не характерно для стандарта языка SQL. Типизация данных в "SQLite" основывается на так называемом принципе "typeless", означающий игнорирование информации о типе данных в определении столбцов таблицы при ее создании с помощью инструкции CREATE TABLE. И все же лучше включать имена типов столбцов при объявлении таблиц, это повысит переносимость вашей базы данных. Имеется одно исключение из принципа "typeless" - это столбец типа INTEGER PRYMARY KEY (INTEGER не INT; INT PRIMARY KEY - удовлетворяет принципу "typeless"). Столбец с типом INTEGER PRIMARY KEY должен содержать 32-х битное целое число, попытка записать данные любого другого типа в столбец этого типа приведет к ошибке. Этот тип обычно используется перед спецификатором столбца AUTOINCREMENT, столбец с типом INTEGER PRIMARY KEY AUTOINCREMENT является ключевым столбцом таблицы, его значения генерируются автоматически.

sqlite> INSERT INTO tbl1 VALUES(NULL, 'hello', 3.10);
sqlite> INSERT INTO tbl1 VALUES(NULL, 'is', 5.34);
sqlite> INSERT INTO tbl1 VALUES(NULL, 'from', NULL);

Создадим, пока пустую таблицу tbl2 и индекс по ее первому полю "ikey".

sqlite> CREATE TABLE tbl2 (ikey INTEGER PRIMARY KEY, nm VARCHAR(50));
sqlite> CREATE UNIQUE INDEX itbl2 ON tbl2(ikey);
sqlite>

Команда .dump

Позволит вам получить полный дамп (листинг) всех SQL инструкций использованных при создании базы данных или некоторой конкретной таблицы.

Синтаксис:

.dump ?TABLE?
где TABLE - необязательное имя таблицы, для которой вы хотите получить дамп SQL инструкций.

Пример:

sqlite> .dump
BEGIN TRANSACTION;
CREATE TABLE tbl1 (one integer primary key autoincrement, two varchar(50),
three real);
INSERT INTO "tbl1" VALUES(1, 'hello', 3.1);
INSERT INTO "tbl1" VALUES(2, 'is', 5.34);
INSERT INTO "tbl1" VALUES(3, 'from', NULL);
DELETE FROM sqlite_sequence;
INSERT INTO "sqlite_sequence" VALUES('tbl1', 3);
CREATE TABLE tbl2 (ikey integer integer primary key, nm VARCHAR(20));
CREATE UNIQUE INDEX itbl2 on tbl2(ikey);
COMMIT;
sqlite>

Эту команду можно использовать для экспорта базы данных созданную в SQLite в другую программу работы с базами данных. Для этого необходимо сохранить полный дамп SQL инструкций в файле.

sqlite> .output exam.sql --перенаправить вывод в файл
sqlite> .dump

Команда .header(s)

Включает / выключает вывод названий заголовков столбцов.

Синтаксис:

.header(s) ON | OFF
где,

ON - включить вывод имен заголовков столбцов
OFF - отключить вывод имен заголовков столбцов
Пример:

sqlite> .header ON
sqlite> SELECT * FROM tbl1;
one|two|three
1|hello|3.1
2|is|5.34
3|from|
sqlite> .header OFF
sqlite> SELECT * FROM tbl1;
1|hello|3.1
2|is|5.34
3|from|
sqlite>

Команда .import

С помощью данной команды имеется возможность импортировать данные из текстового файла. Данные в текстовом файле должны быть разделены строкой-разделителем, эта строка разделитель определяется командой .separator. По умолчанию символом-разделителем является символ вертикальной черты "|". Данная команда введена в версии 3.

Синтаксис:

.import FILE TABLE
где,

FILE - имя входного тестового файла с данными
TABLE - имя таблицы куда вставляются данные
Пример:

Подготовим следующие данные в файле exam.txt

1;Roy
2;Ted
3;Sam
4;Bob
Вставим эти данные в таблицу tbl2, для этого выполним следующие команды:

sqlite> .separator ';' -- установим символ-разделитель в точку с запятой
sqlite> .import exam.txt tbl2 -- импорт данных
sqlite> SELECT * FROM tbl2;
1; Roy
2; Ted
3; Sam
4; Bob

Команда .mode

Данная команда изменяет формат вывода таблицы SQL запросом SELECT. "SQLite" может вывести результат запроса в следующих форматах: csv, column, html, insert, line, list, tabs, tcl. Для версии 2.8 поддерживается только следующие форматы: line(s), column(s), insert, list, html. Рассмотрим их по порядку.

- Режим csv. В данном формате столбцы записи таблицы разделяются запятыми.

Пример:

sqlite> .mode csv
sqlite> SELECT * FROM tbl1;
1,"hello",3.1
2,"is",5.34
3,"from",
sqlite>

Режим удобен для экспорта таблицы в сторонние программы, например данный формат, понимает Excel.

Режим column. В этом режиме вывод выровнен по левой границе столбцов записей таблицы.

Пример:

sqlite> .mode columns
sqlite> SELECT * FROM tbl1;
1 hello 3.1
2 is 5.34
3 from
sqlite>

Смотрите также команду .width для задания ширины столбцов.

Режим html. Вывод в этом режиме выполнен в стиле определения таблицы языка html. Удобен для включения таблицы в страничку сайта.

Пример:

sqlite> .mode html
sqlite> SELECT * FROM tbl2;

1
Roy

2
Ted

3
Sam

4
Bob

sqlite>

Режим insert. В данном режиме генерируются SQL запросы INSERT для таблицы, имя которой указано третьим параметром в команде.

Синтаксис:

.mode insert TABLE
где TABLE - имя таблицы, для которой генерируются инструкции INSERT

Пример:

sqlite> .mode insert tbl3
sqlite> SELECT * FROM tbl1;
INSERT INTO tbl3 VALUES(1,'hello',3.1);
INSERT INTO tbl3 VALUES(2,'is',5.34);
INSERT INTO tbl3 VALUES(3,'from',NULL);
sqlite>

Режим line. Здесь каждый столбец выводится в отдельной строке в формате имя_столбца = значение. Записи разделяются пустой строкой.

Пример:

sqlite> .mode line
sqlite> SELECT * FROM tbl1;
one = 1
two = hello
three = 3.1

one = 2
two = is
three = 5.34

one = 3
two = from
three =
sqlite>

Режим list. Является режимом, установленным по умолчанию. Каждая запись таблицы выводится в отдельной строке с разделением столбцов символом-разделителем. Символ-разделитель определяется командой .separator, и по умолчанию равен прямой черте '|'.

Пример:

sqlite> .mode list
sqlite> SELECT * FROM tbl1;
1|hello|3.1
2|is|5.34
3|from|
sqlite>

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

Пример:

sqlite> .mode tabs
sqlite> SELECT * FROM tbl1;
1 hello 3.1
2 is 5.34
3 from
sqlite>

Режим tcl. Вывод выполнен в формате элементов списка языка TCL.

Пример:

sqlite> .mode tcl
sqlite> SELECT * FROM tbl2;
"1" " Roy \r"
"2" " Ted\r"
"3" " Sam\r"
"4" " Bob\r"
sqlite>

Команда .output

Данная команда перенаправляет вывод в файл или обратно на экран.

Синтаксис:

.output FILENAME
.output stdout
где,

FILENAME - имя файла, куда направлен вывод
stdout - направит вывод на экран
Команда .read

Читает и выполняет SQL инструкции из файла.

Синтаксис:

.read FILENAME
где FILENAME - имя файла содержащего SQL инструкции

Пример:

Создайте текстовый файл, содержащий следующие SQL запросы:

BEGIN TRANSACTION;
CREATE TABLE tbl3 (name VARCHAR(30), lastname VARCHAR(50), num INT);
INSERT INTO tbl3 VALUES ('Jim', 'Green', 1653);
INSERT INTO tbl3 VALUES ('Ann', 'Folkin', 1891);
INSERT INTO tbl3 VALUES ('Fredy', 'Donovan', 2345);
COMMIT;

Назовем созданный файл exam.sql, и выполним следующие команды:

sqlite> .read exam.sql
sqlite> SELECT * FROM tbl3;
Jim|Green|1653
Ann|Folkin|1891
Fredy|Donovan|2345
sqlite>

Команда .schema

Данная команда выдаст все SQL инструкции CREATE TABLE и CREATE INDEX использованные для создания таблиц и индексов текущей базы данных. Возможно указание имени конкретной таблицы, для которой необходимо вывести SQL инструкцию ее создания.

Синтаксис:

.schema ?TABLE?
где, ?TABLE ? - необязательное имя таблицы

Пример:

sqlite> .schema
CREATE TABLE sqlite_sequence(name,seq);
CREATE TABLE tbl1 (one integer primary key autoincrement, two varchar(50), three real);
CREATE TABLE tbl2 (ikey integer integer primary key, nm VARCHAR(20));
CREATE TABLE tbl3 (name VARCHAR(30), lastname VARCHAR(50), num INT);
CREATE UNIQUE INDEX itbl2 on tbl2(ikey);
sqlite>

Команда .tables

Команда выдаст список названий таблиц созданных в текущей базе данных. Возможно, использовать определение шаблона, для выдачи имен таблиц удовлетворяющему шаблону. Синтаксис шаблона аналогичен определению шаблона в предложении LIKE.

Синтаксис:

.tables ?PATTERN?
где ?PATERN? - необязательное определение шаблона поиска

Пример:

sqlite> .tables
sqlite_sequence tbl1 tbl2 tbl3
sqlite> .tables %tb% 'с шаблоном
tbl1 tbl2 tbl3
sqlite>

Команда .width

Используется для установки ширины столбцов, при формате вывода установленном в column.

Синтаксис:

.width NUM NUM :
где NUM - ширина соответствующего столбца в символах.

Пример:

sqlite> .mode column
sqlite> .width 3 10 7
sqlite> SELECT * FROM tbl1;
1 hello 3.1
2 is 5.34
3 from
sqlite>