Отличие типов данных CHAR и VARCHAR заключается в том, что для хранения в таблице
строк символов типа CHAR используется точно size байт (хотя содержание хранимых
строк может быть значительно короче), в то время как для строк типа VARCHAR незанятые
символами строк (?пустые?) байты в таблице не хранятся.
Подчеркнем, что величины len и dec (в отличие от size) не влияют
на размер хранения данных в таблице, а только форматируют вывод данных из таблицы.
Примечание. Тип данных BLOB поддерживается непосредственно не всеми СУБД, однако каждая из них предлагает его аналог (например, BINARY или IMAGE).
Рекомендация. Разрабатывая мобильное приложение (рассчитанное на работу в
среде различных СУБД), старайтесь без необходимости избегать использования необязательных
возможностей в описании типов
данных.
CREATE TABLE имя_табл (с_спецификация, ...);где с_спецификация имеет разнообразный синтаксис. Здесь же рассматриваются наиболее часто используемые ее формы.
имя_столбца тип_данных [NULL]где имя_столбца - имя столбца таблицы, а тип_данных - спецификация одного из типов данных, рассмотренных в разделе ?Типы данных языка SQL?. Необязательное ключевое слово NULL означает, что ячейкам данного столбца разрешено быть пустыми (т.е. не содержать какого-либо значения).
имя_столбца тип_данных NOT NULL [DEFAULT по_умолч] [PRIMARY KEY]где конструкция NOT NULL запрещает иметь в таблице пустые ячейки в данном столбце. Конструкция PRIMARY KEY указывает, что содержимое столбца будет играть роль первичного ключа для создаваемой таблицы. Конструкция DEFAULT по_умолч переопределяет имеющееся для столбцов каждого типа данных значение ?по умолчанию? (например, 0 для числовых типов), используемое при добавлении в таблицу оператором INSERT INTO строк, не содержащих значений в этом столбце.
PRIMARY KEY имя_ключа (имя_столбца, ...)Эта спецификация позволяет задать первичный ключ для таблицы в виде композиции содержимого нескольких столбцов.
KEY имя_ключа (имя_столбца, ...)
CREATE TABLE nodes (
id SMALLINT NOT NULL PRIMARY KEY, # номер узла
x FLOAT NOT NULL, # x-координата
y FLOAT NOT NULL); # y-координата
CREATE TABLE elements (
id SMALLINT NOT NULL PRIMARY KEY, # номер КЭ
n1 SMALLINT NOT NULL, # номер первой вершины
n2 SMALLINT NOT NULL, # номер второй вершины
n3 SMALLINT NOT NULL, # номер третьей вершины
props CHAR(12) NOT NULL DEFAULT 'steel');Столбец props таблицы elements предназначен для хранения названия материала КЭ и не может содержать ?пустых? полей, его значением ?по умолчанию? является строка символов ?steel? (сталь).
CREATE TABLE materials (
name CHAR(12) NOT NULL PRIMARY KEY, # название материала
density FLOAT NOT NULL, # плотность
elastics FLOAT NOT NULL, # модуль Юнга
poisson FLOAT NOT NULL, # к-т Пуассона
strength FLOAT NOT NULL); # прочность
CREATE TABLE loadings (
type CHAR(1) NOT NULL, # тип граничного условия
direction CHAR(1), # направление действия
node SMALLINT NOT NULL, # номер узла приложения
value FLOAT, # числовое значение
KEY key_node (node) ); # вторичный ключВ таблице граничных условий loadings поля столбцов direction и value могут быть пустыми (иметь значение NULL), поскольку не все виды нагрузок имеют направление действия и/или величину.
ALTER TABLE имя_табл м_специкация [,м_спецификация ...]где м_спецификация имеет различные формы. Ниже рассматриваюся наиболее часто используемые.
ADD COLUMN с_спецификациягде с_спецификация - описание добавляемого столбца в том виде, как оно используется для создания таблицы оператором CREATE TABLE.
DROP PRIMARY KEY
ALTER COLUMN имя_столбца SET по_умолчили
ALTER COLUMN имя_столбца DROP DEFAULT
ALTER TABLE materials ADD COLUMN capacity FLOAT NOT NULL, # теплоемкость ADD COLUMN conductivity FLOAT NOT NULL; # теплопроводность
DROP TABLE имя_табл, ...Подчеркнем, что оператор DROP TABLE удаляет не только все содержимое таблицы, но и само описание таблицы из БД. Если требуется удалить только содержимое таблицы, то необходимо использовать оператор DELETE FROM.
INSERT INTO имя_табл VALUES (знач, ...);где знач - константное значение ячейки строки. Значения ячеек в списке должны соответствовать порядку перечисления спецификаций столбцов таблицы в операторе CREATE TABLE. Допустимо в качестве знач указывать ключевое слово NULL, что означает отсутствие значения для соответствующей ячейки строки.
INSERT INTO имя_табл (имя_столбца, ...) VALUES (знач, ...);Здесь списки имен столбцов и значений ячеек добавляемой строки должны быть согласованы, хотя нет никаких требований к их порядку. Допустимо опускать в списках информацию о некоторых ячейках строки, при этом
INSERT INTO имя_табл [(имя_столбца, ...)] SELECT ...Такой оператор дает возможность добавить в таблицу 0, 1 или сразу несколько новых строк, полученных в результате запроса к базе данных, реализуемого оператором SELECT.
INSERT INTO nodes VALUES (25, 6.3, 1.8);Отметим, что добавление новой строки будет удачным только в том случае, если узла с таким же идентификатором в таблице nodes еще нет - дело в том, что столбец id этой таблицы объявлен первичным ключом и, следоваательно, значения всех его ячеек должны быть уникальны.
Пример
Добавление информации о новом КЭ в таблицу elements:
INSERT INTO elements (n1, n2, n3, id) VALUES (14, 25, 18, 46);В результате в таблице elements появится новая строка, содержащая в поле props значение ?steel?, как умолчательное значение, определенное при создании таблицы.
Пример
Включение в таблицу materials сведений о новом материале:
INSERT INTO materials VALUES ( 'wood', 0.6, 2.0, 0.12, 50);Пример
INSERT INTO loadings VALUES ( 'r', 'x', 2, NULL);
SELECT [ALL | DISTINCT] в_выражение, ...
FROM имя_табл [син_табл], ...
[WHERE сложн_условие]
[GROUP BY полн_имя_столбца|ном_столбца, ...]
[ORDER BY полн_имя_столбца|ном_столбца [ASC|DESC], ...]
[HAVING сложн_условие];Результатом работы оператора является выводимая на стандартный вывод (экран дисплея) вновь построенная таблица, для которой
[имя_табл|син_табл.]имя_столбцаКонкретизирующий таблицу префикс в имени столбца необходим только для различения столбцов, имеющих одинаковое имя в разных таблицах из списка FROM.
SELECT * FROM materials;2. Простым (и также часто используемым) случаем в_выражение является полное имя столбца одной из таблиц списка FROM.
SELECT node, type FROM loadingПолученная результирующая таблица содержит дублирующие строки для узла 27. Избежать этого можно, добавив в оператор ключевое слово DISTINCT, запрещающее включение в итоговую таблицу одинаковых строк.
SELECT DISTINCT node, type FROM loadings;3. В общем случае в_выражение может представлять собой сложное скобочное выражение над содержимым столбцов таблицы, использующее арифметические, строковые, логические операции и функции. Наиболее часто используемые функции описаны ниже в таблицах 1, 2, 3.
Синтаксис | Возвращаемое значение |
ABS(x) | абсолютное значение x |
SQRT(x) | квадратный корень от x |
MAX(x, y, ...) | значение наибольшего элемента из списка x, y, ... |
MIN(x,y, ...) | значение наименьшего элемента из списка x, y, ... |
Синтаксис | Возвращаемое значение |
LEFT(s,n) | первые n символов строки s |
RIGHT(s.n) | последние n символов строки s |
SUBSTRING(s, m, n) | строка, получаемая копированием n символов из строки s, начиная с m-ого символа строки s |
LCASE(s) | строка, полученная из s преобразованием всех букв в строчные |
UCASE(s) | строка, полученная из s преобразованием всех букв в прописные |
CONCAT(s1, s2, ...) | строка, полученная конкатенацией (слиянием) строк s1, s2, ... |
LENGTH(s) | длина строки s |
Синтаксис | Возвращаемое значение |
x = y
x ?? y x ? y x ? y x ?= y x ?= y |
1 (?истина?) или 0 (?ложь?) в зависимости от результата операции сравнения (соответственно, ?равно?, ?не равно?, ?больше?, ?меньше?, ?не больше?, ?не меньше?) |
NOT l |
1, если l=0
0, если l=1 |
l1 AND l2 | результат логической операции ?И? над l1 и l2 |
l1 OR l2 | результат логической операции ?ИЛИ? над l1 и l2 |
BETWEEN (x, y z) | результат выполнения логического выражения (x?=y AND x?=z) |
ISNULL (v) |
1, если v имеет значение ?пусто? (NULL)
0, в противном случае |
IFNULL (v1, v2) |
v1, если v1 не ?пусто?
v2, в противном случае |
s LIKE образец |
1, при удачном сопоставлении строки s с образец
0, в противном случае |
s NOT LIKE образец |
0, при удачном сопоставлении строки s с образец
1, в противном случае |
Пример
Пусть необходимо при выводе информации о плотности материалов из таблицы materials
идентифицировать материалы, имеющие в своем составе алюминий (правильнее, имеющие
в своем названии упоминание об алюминии). Эта задача может быть решена с помощью
следующего оператора.
SELECT name, name LIKE '%alu%', density FROM materials;Пример
SELECT id, n1, n2, n3, MAX(ABS(n1-n2),ABS(n1-n3),ABS(n2-n3)) FROM element4. В общем случае в_выражение допускает использование агрегативных (называемых также групповыми) функций, принимающих в качестве своего единственного аргумента значения всех ячеек указанного столбца результирующей таблицы. Основные такие функции представлены в таблице 4. Таблица 4. Агрегативные функции
Синтаксис | Возвращаемое значение |
SUM(x) | сумма значений столбца x результирующей таблицы |
MAX(x) | наибольшее значение из всех значений ячеек столбца x |
MIN(x) | наименьшее значение из всех значений ячеек столбца x |
AVG(x) | среднее значение для всех значений ячеек столбца x |
COUNT(x) | общее количество ячеек в столбце x |
Пример
Для отыскания наибольшего значения модуля Юнга для материалов, имеющихся в таблице
materials, можно использовать следующий оператор
SELECT MAX(elastics) FROM materials
SELECT COUNT(*) FROM elements Описание критерия выборки содержимого строк результирующей матрицыВ качестве критерия выбора информации из таблиц списка FROM оператора SELECT выступает сложн_условие, записываемое после ключевого слова WHERE и имеющее следующий вид:
прост_условие
или
прост_условие AND сложн_условие
или
прост_условие OR сложн_условиеТипичными вариантами прост_условие являются следующие.
полн_имя_столбца @ полн_имя_столбца_или_константагде @ - один из операторов сравнения: ? (?больше?), ? (?меньше?), ?= (? не меньше?), ?= (?не больше?), = (?равно?), ?? (?не равно?), а полное_имя_столбца - имя столбца, конкретизированное при необходимости именем или синонимом имени таблицы, как это было описано выше.
полн_имя_столбца [NOT] LIKE образецгде образец имеет вид, описанный в таблице 3.
полн_имя_столбца IS [NOT] NULL
Примечание. Обратите внимание, что синтаксис сложн_условие существенно
?беднее? синтаксиса в_выражение. Дело в том, что сложн_условие используется
(в том числе и на физическом уровне организации БД) на этапе выборки из исходной
(возможно, очень большой) таблицы (таблиц) необходимых строк в результирующую. Для
сокращения
времени прямого доступа к строкам таблиц они (таблицы) снабжаются ключами
и индексами. Реальный эффект от использования ключей и индексов может быть достигнут
только при условии, что запросы на поиск в таблицах используют в качестве критерия
поиска только значения ячеек столбцов в ?чистом? виде, а не в виде их комбинации
в сложном выражении.
Конструкция же в_выражение применяется, по сути дела, к значениям столбцов
уже результирующей таблицы, поэтому сложность в_выражение на эффективность
выполнения запроса практически никакого влияния не оказывает.
Пример
Для определения координат местоположения узла 11 может использоваться следующий
оператор:
SELECT * FROM nodes WHERE id = 11;
SELECT id FROM elements WHERE n1 = 20 OR n2 = 20 OR n3 = 20;
SELECT * FROM nodes WHERE x ?= 0 AND y ?= 0;Пример
SELECT * FROM loadings WHERE value IS NOT NULL;
Пример
Для вывода информации об узлах КЭ-сетки в убывающем порядке их (узлов) идентификаторов
может быть использован следующий оператор:
SELECT * FROM nodes ORDER BY id DESC;Пример
SELECT * FROM elements ORDER BY n1, n2;
Оператор SELECT выводит значения агрегативных функций для самых ?малых? подгрупп.
Пример
Пусть необходимо определить количество узлов КЭ-сетки, охватываемых каждым видом
граничных условий. Для этого может быть использован следующий оператор
SELECT type, COUNT(*) FROM loadings GROUP BY type;Примечание. Конструкция HAVING сложн_условие, как необязательная составная часть предложения GROUP BY, позволяет определять дополнительный (к WHERE сложн_условие) критерий выборки строк в группы. Этот дополнительный критерий применяется в режиме постпроцессорной обработки к таблице, полученной в результате использования критерия из конструкции WHERE.
SELECT id, elastics FROM elements, materials WHERE id = 25 AND props = name;Примечание. Обратите внимание, что в данном примере нигде в операторе SELECT не потребовалось использовать полные имена столбцов различных таблиц. Объясняется это тем, что имена столбцов таблиц elements и materials различны, и поэтому неоднозначностей в именовании быть не может.
SELECT e.id, node1.x, node1.y, node2.x, node2.y, node3.x, node3.y FROM elements e, nodes node1, nodes node2, nodes node3 WHERE e.n1 = node1.id AND e.n2 = node2.id AND e.n3 = node3.id;Примечание. Обратите внимание, что необходимая для выполнения данного запроса промежуточная таблица в виде декартового произведения (если бы она реально строилась) имеет размер в 31*29*29*29=756059 строк (31 строка в таблице elements и 29 строк в таблице nodes).
DELETE FROM имя_табл [WHERE сложн_условие]где сложн_условие имеет описанный выше синтаксис. В результате выполнения оператора из таблицы удаляются все строки, удовлетворяющие критерию сложн_условие. Если в операторе DELETE FROM конструкция WHERE опущена, то удаляются все строки таблицы.
UPDATE имя_табл SET имя_столбца=выражение, ...
[WHERE сложн_условие]где выражение - выражение (в простейшем случае - константа), согласующееся по результату с типом данных столбца. В выражение допустимо использование значений ячеек любых столбцов таблицы, рассмотренных ранее операций и функций (но не агрегативных), а также прежнего содержимого модифицуруемой ячейки. Обновлению подлежат столбцы строк, отвечающих критерию сложн_условие. Если конструкция WHERE в операторе отсутствует, то обновляются все строки таблицы.
UPDATE elements SET props='brass'; SELECT * FROM elements; Пример
В нашей КЭ-сетке элемент 22 имеет ?неправильную? форму. Ставится задача заменить его двумя новыми конечными элементами, имеющими форму, более близкую к равносторонней. Эта задача может быть решена следующей последовательностью операторов
DELETE FROM elements WHERE id=22; INSERT INTO nodes VALUES (30, 45.0, -33.5); INSERT INTO elements VALUES (22, 21, 30, 19); INSERT INTO elements VALUES (32, 21, 23, 30);Пример
INSERT INTO nodes VALUES (30, 45.0, -33.5); UPDATE elements SET n2 = 30 WHERE id = 22; INSERT INTO elements VALUES (32, 21, 23, 30);