Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

КонспектЛекций

.pdf
Скачиваний:
15
Добавлен:
14.05.2015
Размер:
1.73 Mб
Скачать

В данном запросе в разделе WHERE указаны условия связи и условия фильтрации данных.

Связь между таблицами с использованием раздела FROM (стандарт SQL2, внешние объединения)

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

[INNER] JOIN. Данный тип связи используется по умолчанию. Строки левой таблицы, для которых не имеется пары в правой таблице, в результат выборки не включаются. Строки правой таблицы, для которых не имеется пары в левой таблице, также в результат не включаются.

LEFT [OUTER] JOIN. Все строки левой таблицы включаются в результат выборки. При этом, если отсутствуют строки в правой таблице, то в соответствующих столбцах правой таблицы, включенных в результат запроса, будет установлено значение NULL. Строки правой таблицы, для которых не имеется пары в левой таблице, в результат не включаются.

RIGHT [OUTER] JOIN. Все строки правой таблицы включаются в результат выборки. Для соответствующих столбцов левой таблицы, включенных в запрос, устанавливается значение NULL. Строки левой таблицы, для которых не имеется пары в левой таблице, в результат не включаются.

FULL [OUTER] JOIN. В результат будут включены все строки как левой, так и правой таблицы.

CROSS JOIN – выражение эквивалентно просто запятой между таблицами.

Пример связи двух таблиц:

SELECT authors.au_lname, authors.au_fname, titleauthor.royalty

FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id

WHERE authors.state=’CA’

Если бы мы хотели узреть и тех авторов из штата Калифорния, которые не получили гонорар, то надо было бы использовать конструкцию LEFT JOIN

Пример связи нескольких таблиц:

SELECT

countries.name_rus AS страна, subjects.name_rus AS регион, msu.name_rus AS район, data.year AS год

FROM

data INNER JOIN

subjects ON data.subject = subjects.subject INNER JOIN msu ON data.msu = msu.id_msu INNER JOIN

countries ON subjects.country = countries.country

Раздел GROUP BY позволяет выполнять группировку строк таблиц по определённым критериям. Типичным примером использования GROUP BY является суммирование однотипных значений. GROUP BY почти всегда используется вместе с функциями агрегирования. GROUP BY разделяет таблицу на группы, а функция агрегирования вычисляет для каждой из них итоговое значение.

Основные функции агрегирования:

AVG(<поле>)

Среднее значение для указанного столбца или выражения

COUNT(<поле>)

Количество строк, исключая NULL-строки в указанном столбце

COUNT(*)

Общее количество строк, включая NULL-строки

21

MAX(<поле>)

Максимальное значение в указанном столбце

MIN(<поле>)

Минимальное значение в указанном столбце

SUM(<поле>)

Сумма всех значений в указанном столбце

STDEV(<поле>)

Статистическое стандартное отклонение для значений столбца

VAR(<поле>)

Несмещенная оценка дисперсии величин указанного столбца

Следующий запрос определяет количество книг каждого издательства, зарегистрированных в базе данных:

SELECT publishers.publisher, COUNT(titles.title) FROM titles, publishers

WHERE titles.pub_id = publishers.pub_id GROUP BY publisher

Правила использования группировок в запросах:

1)Функции агрегирования не работают со значениями NULL.

2)В разделе SELECT (т.е. для вывода) можно указывать только те поля, по которым осуществляется группировка. Чтобы вывести значения столбцов, не указанных в критериях группировки, необходимо применять к ним функции агрегирования.

3)Раздел WHERE не допускает использования функций агрегирования.

Ещё один пример: подсчитать, сколько записей ввёл каждый из операторов по каждому региону за 2003 год.

SELECT max(subjects.name_rus) as [субъект], COUNT(*) AS [количество записей], max(users.u_name) as [оператор]

FROM subjects, data, users

WHERE data.subject = subjects.subject and data.id_user = users.id_user and data.year=2003 GROUP BY data.subject, data.id_user

ORDER BY [субъект]

Если при выполнении группировки используется раздел WHERE, то возможно появление групп, не содержащих ни одной строки. По умолчанию эти группы не включаются в результат выборки. Однако если необходимо вывести все без исключения группы, то используется вариант GROUP BY ALL. При этом для групп, не содержащих ни одной строки, не выполняются функции агрегирования, вместо которых выводится значение NULL.

Простой запрос, использующий функцию агрегирования без группировки:

SELECT Count(*) FROM data

Раздел HAVING.

Этот раздел практически аналогичен по назначению с разделом WHERE (горизонтальная фильтрация), однако используется для задания условий групповой фильтрации. В этом разделе допускается использование функций агрегирования.

Определим количество книг каждого издательства, исключая случаи единственного экземпляра.

SELECT publishers.publisher, COUNT(titles.title) FROM titles, publishers

WHERE titles.pub_id = publishers.pub_id GROUP BY publisher

HAVING COUNT(*)>1;

Другой пример: получить номера деталей, суммарное количество которых на складе превышает

400 шт.

SELECT number, SUM(volume) FROM warehouse

22

GROUP BY number HAVING SUM(volume)>400

Раздел ORDER BY предназначен для упорядочения набора данных, возвращаемых после выполнения запроса. Используются ключевые слова ASC (по возрастанию, используется по умолчанию) и DESC (по убыванию). При этом в сортировке могут участвовать столбцы, не входящие в раздел SELECT. Приоритет в сортировке по столбцам, указанным первыми.

SELECT data.* FROM data ORDER BY subject, msu, year

Раздел UNION служит для объединения результатов выборки, возвращаемых двумя и более запросами. Это может быть выборка из одной таблицы или слияние данных из множества таблиц. Иными словами, раздел UNION вставляется между двумя запросами, возвращающими одинаковый набор столбцов. В результат будут включены строки как первого, так и второго запроса. По умолчанию дублирующие строки в результат не включаются.

SELECT publisher, url FROM publishers

UNION

SELECT site, url FROM wwwsites

Использование вложенных запросов.

Команда SELECT позволяет использовать подзапросы в предикатах главного (т.е. в разделах WHERE и HAVING). Совместно с подзапросом можно использовать предикат EXIST, который возвращает истину, если вывод подзапроса не пуст.

Задача: найти названия всех изданий, выпущенные издательством «Wiley»

SELECT title FROM titles WHERE pub_id IN

(SELECT pub_id FROM publishers WHERE publisher='Wiley');

Более сложные задачи: даны отношения

Suppliers (id_supplier, name) – поставщики (код поставщика, ФИО поставщика) Supply (id_supplier, number) – поставки (код поставщика, номер детали) Components (number, title) – детали (номер детали, наименование детали).

1.Найти имена поставщиков, которые поставляют все детали из занесённых в базу.

SELECT MAX(suppliers.name) FROM suppliers, supply

WHERE suppliers.id_supplier=supply.id_supplier GROUP BY supply.id_supplier

HAVING COUNT( DISTINCT supply.number) = ( SELECT COUNT(number) FROM components)

2.Получить список поставщиков, поставляющих деталь с номером 222.

SELECT * FROM suppliers WHERE EXIST

(SELECT * FROM supply

WHERE suppliers.id_supplier = supply.id_supplier AND supply.number = 222);

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

Простой пример: контроль ссылочной целостности вручную:

SELECT * FROM data WHERE item NOT IN (SELECT item FROM items)

23

Реализация реляционной алгебры средствами оператора SELECT (Реляционная полнота SQL) Для того, чтобы показать, что язык SQL является реляционно полным, нужно показать, что любой реляционный оператор может быть выражен средствами SQL.

1. Объединение:

2. Пересечение:

3. Разность:

4. Декартово

SELECT * FROM A

SELECT * FROM

SELECT * FROM A

произведение:

UNION

A

EXCEPT

SELECT A.*, B.* FROM

SELECT * FROM B

INTERSECT

SELECT * FROM B

A, B

 

SELECT * FROM

 

 

 

B

 

 

5. Ограничение:

6. Проекция

7. Соединение по

8. Деление:

SELECT * FROM A

отношения:

условию:

SELECT DISTINCT A.X

WHERE С;

SELECT DISTINCT

SELECT A.*, B.*

FROM A

 

X, Y, Z FROM A

FROM A, B WHERE

WHERE NOT EXIST

 

 

С;

(SELECT * FROM B

 

 

 

WHERE NOT EXIST

 

 

 

(SELECT * FROM A A1

 

 

 

WHERE A1.X = A.X

 

 

 

AND A1.Y = B.Y));

4. Операторы определения данных (основные сведения).

Создание, удаление и модификация таблиц.

Создание таблицы: Синтаксис:

CREATE TABLE <имя_таблицы>

(<имя_столбца> {<тип_данных> | AS <выражение>}

{[DEFAULT <значение>] | [IDENTITY [(начальное значение, инкремент)]]} {[NULL | NOT NULL] | [UNIQUE | PRIMARY KEY]}

[REFERENCES <имя главной таблицы> [(<имя столбца>)]] , ...)

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

Наиболее часто используется повторяющаяся конструкция <имя столбца> <значение>:

NULL указывает на то, в этом столбце возможны неопределённые значения (естественно, такой столбец не может быть ключевым).

UNIQUE (ограничение целостности) указывает, что каждое значение в столбце является уникальным в пределах этого столбца. Для такого ограничения целостности автоматически создаётся индекс.

PRIMARY KEY – создаётся первичный ключ на базе соответствующего столбца. Для таблицы может быть создано только одно такое ограничение целостности.

DEFAULT – указывается значение по умолчанию для данного столбца.

IDENTITY – создаётся столбец-счётчик. Только один столбец может быть счётчиком. REFERENCES – определяет, что столбец будет служить внешним ключом для таблицы, указанной с помощью параметра <имя главной таблицы>. Столбцы, входящие во внешний ключ, могут ссылаться только на столбцы первичного ключевого ограничения или ограничения UNIQUE. Дополнительно ограничение может быть уточнено ключевыми словами ON DELETE {CASCADE | NO ACTION} ON UPDATE {CASCADE | NO ACTION}

Примеры создания таблиц (работа с которыми была рассмотрена выше):

CREATE TABLE authors (au_id INT PRIMARY KEY, author CHAR(25) NOT NULL);

24

CREATE TABLE publishers (pub_id INT PRIMARY KEY, publisher VARCHAR(255) NOT NULL, url VARCHAR(255) DEFAULT ‘неизвестен’);

CREATE TABLE titles (title_id INT NOT NULL PRIMARY KEY, title CHAR(255) NOT NULL, yearpub INT, pub_id INT REFERENCES publishers(pub_id);

Создание таблицы с вычисляемыми полями:

CREATE TABLE MyTable (FirstCol int, SecondCol int, ThirdCol AS (FirstCol+SecondCol)/2.0)

Удаление таблицы: Синтаксис:

DROP TABLE <имя_таблицы>

Модификация таблицы:

Команда ALTER TABLE берёт на себя все действия по копированию данных во временную таблицу, удалению старой таблицы, созданию вместо неё новой таблицы с нужной структурой и последующим переписыванием в неё данных. Все эти действия происходят без участия пользователя, при этом установленные права доступа к таблице сохраняются.

Добавление столбцов (синтаксис):

ALTER TABLE <имя_таблицы> ADD

(< возможное содержание аналогично содержимому в скобках для команды CREATE TABLE >

,...)

Удаление столбцов:

ALTER TABLE <имя_таблицы> DROP (<имя столбца>, …)

Модификация столбцов:

ALTER TABLE <имя_таблицы> MODIFY

(< возможное содержание аналогично содержимому в скобках для команды CREATE TABLE >

,...)

Пример:

ALTER TABLE MyTable ADD DateCol datetime DEFAULT GETDATE() NOT NULL UNIQUE

Создание, удаление и модификация индексов.

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

К настоящему времени разработаны эффективные математические алгоритмы поиска данных в упорядоченной последовательности. Одним из таких алгоритмов является метод половинного деления. В простейшем варианте для поиска любого значения берётся начальное приближение в середине упорядоченной последовательности значений, и хранимая в ней величина сравнивается с искомым значением. Если искомая величина меньше выбранного значения, то дальнейшему делению пополам подвергается первая половина списка, иначе – вторая. Поиск заканчивается, как только достигнуто совпадение искомой величины и анализируемого значения.

Основным недостатком использования индексов является замедление процесса обновления (в том числе добавления и удаления) данных, так как для обеспечения целостности данных после

25

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

Создание индекса (синтаксис):

CREATE [UNIQUE] INDEX <имя_индекса> ON <имя_таблицы> (<имя_столбца>,...)

Пример:

CREATE INDEX au_index ON authors (au_id); CREATE INDEX title_index ON titles (title_id);

Удаление индекса:

DROP INDEX <имя_индекса>

5. Операторы манипулирования данными.

К этой группе относятся операторы добавления, изменения и удаления записей.

INSERT – добавление информации к таблице

Синтаксис:

INSERT INTO <имя_таблицы> [ (<имя_столбца>,...) ] VALUES

{

1.[ (<значение>,..) ]

2.|[ <SELECT-запрос> ]

3.|[ DEFAULT VALUES ]

}

Синтаксис строки 1 позволяет ввести только одну строку в таблицу. Если вводятся все поля записи, то список столбцов можно не задавать. Вместо значения поля можно указывать DEFAULT. Оператор ввода данных с помощью синтаксиса строки 2 позволяет ввести сразу множество строк, если их можно выбрать из некоторой другой таблицы. При этом порядок следования столбцов и тип данных в столбцах должных совпадать. Строка 3 используется, если создаётся запись с значениями по умолчанию.

Примеры:

INSERT INTO publishers VALUES (16,"Microsoft Press","http://www.microsoft.com");

INSERT INTO Authors (au_id, au_lname, au_fname) VALUES (666,’Бездомный’,’Иван’)

INSERT INTO Addresses (name, phone, address) VALUES ( SELECT name, phone, address FROM tmp_table)

С не меньшим успехом в последнем случае можно использовать и конструкцию SELECT

INTO…

UPDATE – обновление информации в таблице

Синтаксис:

UPDATE <имя_таблицы> SET <имя_столбца> = <значение>,...

[FROM {<имя таблицы> | <SELECT-запрос>},…] [WHERE <условие>]

За один вызов UPDATE можно изменить данные в одном или нескольких столбцах для одной или множества записей только в одной таблице. С ключевого слова SET начинается блок, в котором определяется список изменяемых столбцов. Синтаксис <значение>:=={<константа> | <переменная> | <выражение> | DEFAULT | NULL}. Изменению подвергаются все строки, удовлетворяющие критериям ограничения области действия запроса UPDATE, которые задаются с помощью раздела WHERE.

Примеры:

26

UPDATE Authors SET address = “Садовая 13А, кв. 50” WHERE au_lname = ”Берлиоз” AND au_fname = ”Михаил”

UPDATE publishers SET url="сайт неизвестен" WHERE url IS NULL

Если в инструкции UPDATE будет пропущен раздел WHERE, то заданные в разделе SET изменения будут сделаны в каждой строке таблицы. Имеет смысл для проверки сначала выполнить инструкцию типа SELECT Count(*) с тем же критерием WHERE, чтобы узнать, сколько строк будет изменено с помощью UPDATE. При составлении выражения можно ссылаться на любые столбцы таблицы, включая изменяемые.

UPDATE Titles SET price=price+10

Если при изменении данных в таблице необходимо учесть состояние данных в других таблицах, то они указываются в разделе FROM. После того как источник данных указан в разделе FROM, в разделах WHERE и SET можно ссылаться на столбцы этого источника данных.

Пример: в таблице subjects (subject, fo, name) в поле fo указан номер федерального округа, к которому принадлежит данный субъект федерации. В частично заполненной таблице peoples (xsubject, xfo, value) осталось незаполненным поле xfo с тем же смыслом. Как восстановить недостающую информацию?

UPDATE Peoples SET xfo = fo FROM subjects WHERE xsubject=subject

DELETE – удаление информации из таблицы

Синтаксис:

DELETE FROM <имя_таблицы> [ WHERE <условие> ]

С помощью DELETE можно удалить как отдельные строки, так и множество строк. Без WHERE будут удалены все строки таблицы. В разделе WHERE также можно использовать вложенные подзапросы.

Примеры:

DELETE FROM publishers WHERE publisher = "Microsoft Press"

Удалить из таблицы students студентов, имеющих две и более двойки по результатам экзаменов (если это позволяют ограничения целостности):

DELETE FROM students WHERE id_student IN (

SELECT id_student FROM testing WHERE result=2 GROUP BY id_student HAVING count(*)>2

)

Дополнительные сведения о языке SQL будут изложены в следующих главах, посвящённых различным диалектам SQL в нескольких широко известных на сегодняшний день СУБД.

27

Глава 3. СУБД MS SQL Server и язык Transact-SQL.

1. Введение в SQL Server.

Microsoft SQL Server 2000, на базе которого будет строиться дальнейшее изложение, является реляционной СУБД, поддерживающей технологию клиент-сервер вплоть до создания распределённых баз данных в масштабе локальной или глобальной компьютерной сети. SQL Server позволяет создавать базы данных различного масштаба: от уровня домашней сети до корпоративного. По уровню значимости основным конкурентом SQL Server, которому обычно отдаётся первое место по многим показателям, является Oracle Corporation.

Краткая история:

В 1988 году Microsoft и Ashton-Tate анонсировали первую версию Microsoft SQL Server

— реляционную СУБД для локальных вычислительных сетей. Новый продукт носил название Ashton-Tate/Microsoft SQL Server и представлял собой версию Sybase DataServer для OS/2. Роль Ashton-Tate заключалась в том, что эта фирма предоставила dBASE IV, используемую для разработки приложений.

В 1992 выпущен SQL Server 4.2 — 16-разрядная СУБД, результат совместной работы Microsoft и Sybase. В этой СУБД были реализованы клиентские библиотеки для MSDOS, Windows и OS/2, помимо этого в нее впервые были включены средства администрирования с графическим интерфейсом под управлением Windows.

В 1996 году выпущен SQL Server версии 6.5, обладавший встроенной поддержкой Webприложений, средствами распределенного администрирования, наличием динамических блокировок.

1998 — выпущен Microsoft SQL Server 7.0 с радикально измененной архитектурой. Это была первая версия SQL Server, не содержавшая унаследованного кода, оставшегося со времен сотрудничества с Sybase. Особо стоит отметить появление в этой версии OLAPслужб (служб анализа данных) в составе продукта (до этого серверные OLAP-средства, производимые поставщиками серверных СУБД, включая и Oracle, продавались исключительно как отдельные продукты и относились к категории весьма дорогостоящего программного обеспечения).

В 2000 – выпущен Microsoft SQL Server 2000, поддерживающий XML (eXtensible Markup Language, расширяемый язык разметки), а также содержащий множество нововведений в административных утилитах. Версия Microsoft SQL Server 2000 построена на основе ядра Microsoft SQL Server 7.0. Ее отличительными особенностями являются повышенная масштабируемость, производительность и интеграция с Internet.

Одним из главных событий, определивших дальнейшую судьбу Microsoft SQL Server, стало решение Microsoft сосредоточить усилия исключительно на поддержке только платформы Windows NT. Эта СУБД настолько связана с операционной системой, что ее надежность, масштабируемость и производительность определяются надежностью, масштабируемостью и производительностью самой платформы, и положение SQL Server на рынке будет зависеть от выпуска новых версий Windows. Рекомендуемая платформа: Windows 2000 Server.

Одним из преимуществ SQL Server является простота его применения, в частности администрирования. SQL Server Enterprise Manager, входящий в состав всех редакций Microsoft SQL Server, представляет собой полнофункциональное и достаточно простое средство для администрирования этой СУБД.

SQL Server имеет в своём составе программное обеспечение для установки на серверные системы и клиентское программное обеспечение, которое устанавливается на персональные компьютеры клиентов. Приложения клиента выполняют всю работу по взаимодействию с пользователем, включая отображение информации и предоставление возможности работы с

28

приложением через графический интерфейс пользователя. Все клиентские приложения взаимодействуют с SQL Server, используя один или два собственных API (Application Programming Interface) для доступа к базе данных: ODBC (Open Databases Connectivity,

открытое соединение с базами данных) и DB-Library (Библиотека баз данных). Продукты SQL Server содержат множество сервисов и компонентов как на компьютерах клиентов, так и на компьютере-сервере, которые взаимодействуют друг с другом, а также с сервисами и компонентами Windows.

SQL Server поддерживает весьма широкий набор сетевых протоколов. Для каждого из них поддерживается режим прямого доступа с использованием типичных для каждого протокола средств (например, Sockets (сокеты) для TCP/IP или IPS/SPX; Named Pipes (именованные каналы) для NetBios), что дает возможность обращаться к серверу не только из среды Windows и OS/2, но и с платформ Mac и Unix. Дополнительно для протоколов TCP/IP, IPX/SPX и NetBios поддерживается доступ через защищенные вызовы RPC (Remote Procedure Call, удалённый вызов процедур). Данный тип соединений называют trusted connection, или доверительные соединения.

Как принято для серверных приложений Windows NT, ядро SQL Server реализовано в виде набора сервисов, для управления которыми используются административные утилиты. Компоненты, образующие ядро SQL Server:

собственно сервер, который может быть запущен как сервис MSSQLServer или как приложение с командной строки (Sqlservr.exe);

компонент SQL Executive – сервис SQLExecutive, обеспечивающий выполнение на основе расписания таких операций, как репликация данных, запуск заданий; кроме того на него возлагается контроль за наступлением событий и оповещение администраторов и/или операторов;

компонент DTC (Distributed Transaction Coordinator) – сервис MSDTC, отвечающий за выполнение распределенных транзакций;

компонент SQL Mail, обеспечивающий интеграцию SQL Server в почтовую систему организации и позволяющий отправлять запросы и получать результаты их выполнения по почте.

Устройства баз данных (database devices) могут размещаться в дисковых файлах или на неразмеченных разделах жестких дисков (RAW partitions), устройства резервных копий (dump devices) могут быть ассоциированы с дисками, съемными накопителями, устройствами записи на магнитные ленты и именованными каналами (для систем распределенного резервного копирования). Базы данных являются непосредственными хранилищами пользовательских данных и хранимых процедур. Каждая база данных, допускающая режим записи, должна иметь ассоциированный с ней журнал транзакций, который может располагаться как на отдельном устройстве, так и делить устройство с базой данных.

Версия языка SQL, используемого SQL Server, называется Transact-SQL, или T-SQL, в память о том, что в именно этом в диалекте SQL появились операторы управления транзакциями. В T- SQL поддерживаются все операторы стандарта ANSI SQL-92, включая оператор CASE, декларативную целостность (Declarative Reference Integrity, или DRI) и описание объединений

(joins).

Дополнительно T-SQL позволяет указывать оптимизатору запросов порядок выполнения операций и используемые индексы. Наличие оператора EXEC, способного воспринимать в качестве входного параметра символьную строку, дает возможность динамически формировать и исполнять предложения SQL.

29

2.Типы данных, управляющие конструкции языка и функции

Transact-SQL.

Типы данных и преобразование типов.

Встроенные и определённые пользователем типы данных хранятся в текущей базе данных в таблице systypes и могут быть просмотрены командой

SELECT * FROM systypes

1.Бинарные: требуется указывать числа в 16-ричном виде, например 0хFF. binary(n) – n определяет количество байт для хранения (до 8000 байт); под каждое

значение будет выделено указанное количество байт вне зависимости от фактических размеров данных.

varbinary(n) – n определяет максимальное количество байт для хранения (до 8000 байт); если массив данных m<n, то фактически отводится m+4 байта, если m>n, то данные усекаются до размера поля.

image – хранятся бинарные данные размером до 231-1 байт (~2 Гбайт), память выделяется страницами по 8000 байт. Использование этого поля оправдано, если требуется хранить очень длинные данные. Специальных функции отображения содержимого полей этого типа SQL Server не имеет.

Пример:

DECLARE @VA binary(10), @VB varbinary(10) SELECT @VA = 0xFF, @VB= 0xAC

SELECT 'Значение переменной VA: ' = @VA, 'Значение переменной VB: ' = @VB SELECT 'Длина VA: ' = DATALENGTH(@VA), 'Длина VB: ' = DATALENGTH(@VB)

2.Символьные: интерпретируются в зависимости от того, какая кодовая страница была установлена при инсталляции сервера.

char(n) – n<=8000, ASCII символы (1 байт), резервируется всегда n символов, если размер данных меньше, строка дополняется пробелами справа.

varchar(n) – то же что и char(n), но резервируется максимум n символов. Если размер данных m<n, то дополнения пробелами не происходит.

nchar(n) – n<=4000, Unicode символы (2 байта), остальное как в char(n). nvarchar(n) – n<=4000, Unicode символы (2 байта), остальное как в varchar(n).

Примеры:

DECLARE @name nvarchar(25) SET @name = N'Д''Артаньян' SELECT @name

-- Что получится в каждом из столбцов?

SELECT 1+1,'1'+'1','1'+'2'+3

Типичные функции для работы со строками: LEN(…) – возвращает длину строки в символах;

LTRIM(…) и RTRIM(…) – удаляет пробелы в начале и в конце строки SUBSTRING(…) – возвращает подстроку из строки

REPLACE(…) – заменяет подстроку указанным значением

3.Текстовые:

позволяют хранить достаточно большие объёмы текстовой информации

text – хранение ASCII текстовых блоков размером <=231-1 символов (~2 Гбайт), выделяемых постранично.

ntext – хранение Unicode текстовых блоков размером <=230-1 символов (~1 Гбайт),

30