Чтобы получить информацию о таблице, необходимо выполнить следующую хранимую процедуру:
sp_help имя таблицы.
После исполнения этой команды на экране появляется целый ряд информационных таблиц: таблица с общей информацией, таблица со свойствами колонок, таблица с ограничением IDENTITY, таблица с информацией о размещении на файлах, таблица с информацией об индексах, таблица с данными об ограничениях, таблица с информацией о ссылающихся таблицах (см. sp_depends и sp_keys).
Задание 1. С помощью утилиты Enterprise Manager создать таблицу требуемо структуры, выполнив следующие действия:
1. Выберите в левом окне Enterprise Manager базу данных, в которой планируется создание новой таблицы, дважды щелкнув по ней с помощью левой клавиши мыши.
2. Выберите элемент Table в указанной базе данных.
3. Один раз щелкните правой клавишей мыши по выделенному элементу или на свободном пространстве правого окна.
4. В контекстном меню выберите элемент New Table. (Вместо пунктов 2,3 и 4 можно было исполнить команду Action/New Table).
5. В открывшемся окне для создания новой таблицы необходимо указать названия столбцов, тип данных из раскрывающегося списка, размер для типов char, nvarchar, binary, varchar и nchar, а также задать флажок в графе Allow Nulls для тех колонок, в которых допускаются значения NULL.
6. Выбирая по очереди столбцы в верхней части окна, задайте в нижней части окна дополнительные параметры для этих столбцов:
Description – текстовое описание соответствующего столбца;
Default Value – значение по умолчанию;
Precision – точность p для типа numeric или decimal: Scale – масштаб, т. е. число цифр после точки; Identity = Yes – для столбца – счетчика;
Identity Seed – начальное значение счетчика;
Identity Increment – шаг приращения;
Is RowGuid = Yes – для колонки с глобальными идентификаторами;
Formula – формула для вычисления значений столбца;
Collation – сопоставление для столбца.
7. Сохранить новую таблицу в базе данных, щелкнув по кнопке Save и задав ей требуемое имя.
Задание 2. Показать сценарий создания новой таблицы, исполнив команду All
Tasks/Generate SQL Scripts ее контекстного меню, и сохранить в файле …Abc\Tabl Script. sql.
Задание 3. Для демонстрационных баз данных Pubs и Northwind создать их диаграммы,
используя мастер создания диаграмм Create Database Diagram Wizard:
1. Выберите базу данных Pubs (гостиницы).
2. Откройте контекстное меню базы данных.
3. Исполните команду New Database Diagrams.
4. Ознакомьтесь с порядком создания диаграмм:
а) создать новую диаграмму и включить в нее требуемые
таблицы в соответствии с поставленными целями просмотра базы данных;
б) добавить в диаграмму таблицы, связанные с выбранными;
в) упорядочить таблицы на диаграмме, что делается автоматически.
5. Щелкните по кнопке Next.
6. В левой части окна по очереди выбирайте требуемые таблицы из списка всех таблиц базы данных Pubs и щелкайте по кнопке Add. Кнопка Remove позволяет исключить таблицу из выбранного списка.
7. Установите флажок Add related tables automatically для автоматического добавления связанных таблиц.
8. Щелкните по кнопке Next.
9. Просмотрите список выбранных и связанных таблиц и если требуется его корректировка, то возвратитесь назад.
10. Щелкните по кнопке Next.
11. Созданная диаграмма заносится в папку Diagrams базы данных Pubs.
12. Откройте папку Diagrams базы данных Pubs.
13. Выберите новую диаграмму и для ее просмотра дважды щелкните на ней.
14. Убедитесь, что таблицы можно просматривать в различных режимах (Show), редактировать структуру (Column Property), отношения, ограничения целостности, индексы и ключи (Properties), модифицировать триггеры (Task/Manage Trigger), управлять доступом к таблице (Task/Manage Permissions), выяснять зависимости (Task/Display Dependencies), сгенерировать сценарий создания таблицы (Task/Generate SQL Scripts).
15. Выполните пункты 1-14 для базы данных Northwind.
Задание 4. Создать три взаимосвязанные таблицы jobs (работы), employee (служащий) и publishers (издатели), используя необходимые ограничения, исполнив следующие Transact-SQL команды:
CREATE TABLE jobs
(job_id smallint IDENTITY (1,1) PRIMARY KEY CLUSTERED, job_desc varchar (so) NOTT NULL
DEFAULT ‘New Position – title not formalized jet’, min_lul tinyint NOT NULL CHECK (min_lul > = 10), max_lul tinyint NOT NULL CHECK (max_lul > = 250)
)
CREATE TABLE employee
(emp_id CONSTRAINT PK_emp_id PRIMARY KEY NOTICLUSTERED
CONSTRAINT PK_emp_id CHECK (emp_id LIKE
‘[A-Z][A-Z][A-Z][1-9][0-9][0-9][FM]’ or
‘[A-Z]-[A-Z][1-9][0-9][0-9][0-9][FM]’, fname varchar (20) NOT NULL,
minit char (1) NULL,
lname varchare (30) NOT NULL,
job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs (job. id), job_lul tinyint DEFAULT 10,
pub_id char (4) NOT NULL DEFAULT(‘9952’)
REFERENCES publishers (pub_id),
hire_date datetime NOT NULL varchar (40) NULL, (getdate ())
)
CREATE TABLE publishers
(pub_id char (4) NOT NULL
CONSTRAINT OPKL_pubid PRIMARY KEY CLOSTERD CHEC (pub_id IN (‘1389’, ‘0736’, ‘0877’, ‘1622’, ‘1756’
OR pub_id LIKE ‘99[0-9][0-9]’), pub_name varchar (40) NULL,
city varchar (20) NULL, state char (2) NULL,
country varchar (30) NULL DEFAULT (‘OSA’)
)
Задание 5. Создать таблицу с глобальным идентификатором, выполнив команду: CREATE TABLE GUIDTAB
(guid uniqueidentifier CONSTRAINT GuidDefault DEFAULT NEWID (), Emploec_Name varchar (60) CONSTRAINT Guid_PK PRIMARY KEY (guid)
)
Задание 6. Создать таблицу с вычисляемым столбцом, исполнив команду: CREATE TABLE My Table
(low int, high int,
myavg AS (low + hvgh)/2
)--myuser-name AS USER_NAME()
Задание 7. Создать временную локальную и временную глобальные таблицы и найти их в системной базе tempdb.
Задание 8. Создать программную таблицу, объявив переменную типа Table, и заполнить ее данными. Создать аналогичную таблицу в базе данных и переписать в нее содержимое программной таблицы. Написать пакет команд для сравнительного анализа эффективности работы с этими двумя таблицами.
Задание 9. Получить информацию о свойствах таблицы: ее название, сведения о владельце, дата создания, колонки-счетчики с ограничением IDENTITY, колонки с глобальными идентификаторами, группа файлов для хранения данных, сведения об индексах, сведения об
ограничениях, сведения о таблицах, на которые ссылается данная таблица с помощью ограничения
FOREIGN KEY. Для получения указанных свойств исполнить команду:
EXEC *****@***= Имя таблицы (например job)
Задание 10. Получить информацию об объектах, зависимых от таблицы orders базы данных Northwind, исполнив команду:
EXEC sp_depends orders
Задание 11. Используя хранимую системную процедуру sp_fkeys, получить информацию о таблицах, связанных с данной через ограничения PRIMARY KEY и FOREIGN KEY.
Задание 12. Дополнить таблицу AllTypes базы данных Proba новыми колонками и занести в них значения по умолчанию.
Лабораторная работа №8
Добавление, извлечение, модификация и удаление данных в таблицах
Цель работы – изучение синтаксиса и семантики команд INSERT, SELECT, INTO, UPDATE, DELETE, их разделов SELECT, INTO, FROM, WHERE, GROUP BY, HAVING, UNION, ORDER BY, COMPUTE, FOR, OPTION и функций агрегирования, имеющихся в языке Transact- SQL для управления данными SQL Server 2000, а также приобретение навыков применения этих команд для манипулирования данными и использования программы массового копирования BCP (Bulk Copy Program) для включения в базы данных текстовых файлов.
SQL Server 2000 обеспечивает разнообразные механизмы управления данными, такие как ADO, OLE DB, ODBC, DB - Library и команды языка Transact-SQL, являющегося фундаментом всех остальных технологий. Для добавления данных в языке используются команды INSERT и SELECT INTO, для изменения данных – команда UPDATE и для удаления строк из таблиц – команда DELETE. Команда SELECT позволяет реализовать многофункциональный механизм доступа к данным любой сложности.
Команда INSERT позволяет вставить в таблицу одну или несколько строк. Упрощенный синтаксис этой команды таков:
INSERT [INTO] имя модифицируемой таблицы
[WITH (уровень блокировки запроса)]
{[(список колонок модифицируемой таблицы)]
{VALUES (список значений новой строки)\
команда SELECT}}\ DEFAULT VALUES
Если необходимо явно вставлять значения в колонки – счетчики, имеющие свойство
IDENTITY, то для модифицируемой таблицы надо выполнить команду: SET IDENTITY_INSERT имя модифицируемой таблицы ON
Если список столбцов не задан, то сервер будет вставлять данные последовательно во все столбцы, начиная с первого. Для каждого столбца должен быть указан аргумент, имеющий соответствующий тип. Аргументами могут быть константы, выражения соответствующего типа, значение NULL и значение по умолчанию DEFAULT. В списке столбцов можно не указывать столбцы со свойством IDENTITY, столбцы допускающие значение NULL и столбцы типа timestamp.
Если в команде задан источник данных DEFAULT VALUES, то строка будет содержать только значения по умолчанию или значения NULL.
Если в данной команде в место имени таблицы задать имя представления, то новая строка будет вставлена в представление, а точнее, в ту исходную таблицу, на основе которой было создано представление, при этом изменение данных через представление должно быть разрешено специальной командой. Для представления невозможно задать уровень блокировки.
Если необходимо быстро создать таблицу, имеющую такую структуру, чтобы в ней можно было сохранить результат выполнения запроса, то следует использовать следующую команду:
SELECT список выбираемых колонок исходных таблиц INTO имя автоматически создаваемой таблицы FROM список исходных таблиц
[условия выбора значений из таблиц]
Имена колонок новой таблицы либо совпадают с именами колонок исходных таблиц, либо задаются после ключевого слова AS, следующего за именем колонки исходной таблицы. Имя создаваемой таблицы должно быть уникальным в пределах базы данных. Чаще всего эта команда используется для создания временных локальных (#) и глобальных (##) таблиц.
Для любой базы данных использование команды SELECT… INTO запрещено. Для установки разрешения на ее использование необходимо выполнить команду:
EXES sp_dboption ‘имя базы данных’, ‘select into/bulkcopy’, ‘on’
Наиболее часто доступ к данным реализуется командой SELECT, начиная от простой выборки всех строк одной таблицы и кончая сложными запросами, обрабатывающими десятками и сотнями тысяч строк в десятках таблиц.
В большинстве случаев используется упрощенный вариант команды SELECT, имеющей следующий синтаксис:
SELECT опции выбора список выбора
[INTO новая таблица]
FROM список исходных таблиц или представлений
[WHERE условие поиска]
[GROUP BY условие группировки] [HAVLNG условия группового поиска]
[ORDER BY выражение для упорядочивания [AS\DESC]]
Части этой команды называются разделами и должна записываться в запросе именно в данном порядке.
Опции выбора определяют количественные характеристики запроса:
ALL – все строки таблицы;
DISTINCT – все несовпадающие строки таблицы; TOP n – первые n несовпадающие строки таблицы; TOP n PERCENT – первые n% несовпадающих строк;
WITH TIES – разрешает вывод дублирующих строк для последних двух вариантов.
Список выбора содержит имена столбцов различных таблиц для формирования результата. Столбцы могут переименовываться с помощью конструкции AS.
Если в качестве списка выбора задана звездочка (*), то в запрос будут включены все столбцы всех таблиц и представлений, заданных в качестве источников данных. Если в списке задана конструкция имя. *, то это означает, в список выбора надо включить все колонки объекта с данным именем. В список выбора можно включить и выражения, тогда их значения будут вычисляться при формировании каждой строки. Эта колонка будет либо безымянной, либо будет иметь имя, заданной конструкцией AS, следующей после выражения. Элемент списка в виде имя. IDENTICOL [AS имя счетчика] позволяет включить в результат колонку – счетчик объекта с данным именем. С помощью ключевого слова POWGVIDCOL аналогичным образом можно включить глобально уникальный идентификатор строк того или иного объекта.
Раздел INTO позволяет создать новую таблицу для хранения результатов запроса, структура которой будет определяться списком выбора, т. е. динамически при выполнении запроса.
Раздел FROM является обязательным в команде SELECT и определяет таблицы и представления для выборки данных. Если таблица одновременно является и источником данных, и получателем результатов, то ей необходимо задать псевдоним с помощью конструкции AS, что обеспечит правильную работу сервера. Для таблиц можно указывать уровни блокировок: HOLDLOCK, NOLOCK и т. д.
В разделе FROM можно задавать связанные таблицы для формирования сложных запросов:
исходная таблица, тип связи, исходная таблица
ON условие поиска или
исходная таблица CROSS JOIN исходная таблица.
При использовании ключевых слов CROSS JOIN или запятой происходит связывание каждой строки левой таблицы с каждой строкой правой таблицы, так что количество строк при выполнении запроса определяется как произведение количества строк первой таблицы на количество строк второй таблицы.
При использовании ключевых слов INNER JOIN или пробела выбираются пары строк из связанных таблиц, для которых имеются строки, удовлетворяющие критерию связывания в обеих таблицах. Строки из левой таблицы, для которых не имеется пары в связанной таблице, в результат не включаются. Также не включаются строки правой таблицы, для которых нет соответствующей строки в левой таблице.
При использовании ключевых слов LEFT [OUTER] JOIN в результат будут включены все строки левой таблицы, независимо от того, есть для них соответствующая строка в правой таблице или нет, при этом для соответствующих столбцов правой таблицы, включенных в запрос, при отсутствии соответствия будут заноситься значения NULL.
При использовании ключевых слов RIGHT [OUTER] JOIN в результат будут включены все строки правой таблицы, независимо от того, есть для них соответствующие строки в левой таблице. В столбцах левой таблицы, для тех строк, для которых нет соответствия, запишутся значения NULL.
При использовании ключевых слов FULL [OUTER] JOIN в результат будут включены все строки как правой, так и левой таблицы.
Логическое условие связывания двух таблиц, которое записывается после ключевого слово ON, должно быть логическим выражением, включающим любые операторы сравнения: =, <,
>, <=, >=,! =, <>. В ряде случаев в запросах используются опции оптимизации: LOOP, HASH, MERGE, REMOTE. Если эти опции не заданы, то оптимизацию запросов осуществляет сервер.
С помощью раздела WHERE можно сузить количество обрабатываемых строк данных,
написав одно или несколько логических условий:
WHERE условие поиска
или имя колонки * = имя колонки -- LEFT OUTER JOIN
или имя колонки * = имя колонки -- RIGHT OUTER JOIN
Логическое условие может быть произвольным, в том числе и не связанным с данными. Оно может включать логические операторы NOT, AND и OR. В ряде случаев, в особенности для сложных запросов предпочтительнее использовать условия связывания * = (аналог LEFT OUTER JOIN) или = * (аналог RIGHT OUTER JOIN), которые выполняются гораздо эффективнее.
Раздел GROUP BY позволяет выполнить группировку строк таблиц по определенным критериям. Для каждой группы можно выполнить специальные функции агрегирования, которые будут применены ко всем строкам группы:
AVG (имя столбца) – среднее значение в группе; SUM (имя столбца) – сумма значений группы;
MIN (имя столбца) – минимальное значение в группе; MAX (имя столбца) – максимальное значение в группе;
COUNT (имя столбца) – число строк в группе с непустым значением; COUNT (*) – число строк в группе, включая и пустые (NULL).
Синтаксис раздела следующий:
GROUP BY условие группировки --или BY ALL [WITH CUBE или ROLLUP] --супергруппировка.
В качестве условия группировки задается имя одного или нескольких столбцов таблицы. Именно эти столбцы должны быть включены в запрос. Наличие других столбцов не допускается. Если в запросе было определено условие, сужающее диапазон группировки выбираемых строк, то включение слова ALL обеспечит вывод всех групп, но функции агрегирования для дополнительных групп выполняться не будут.
Ключевое слово WITH CUBE инициирует суперагрегирование, когда в результат включаются строки, являющиеся результатом агрегирования уже агрегированных данных. В итоге получается многоуровневое агрегирование с итоговыми данными по всем уровням. Опция WITH ROLLUP позволяет устранить лишние строки при суперагрегировании.
Раздел HAVING задает условия поиска при определении групп с помощью раздела
GROUP BY:
HAVING условие поиска
Этот раздел аналогичен разделу WHERE.
Раздел UNION позволяет выполнить объединение данных из нескольких таблиц, имеющих одинаковый список столбцов, порядок их следования и свойства, при этом по умолчанию дублирующие строки не включаются, если не задано ключевое слово ALL:
SELECT список столбцов FROM имя первой таблицы
UNION [ALL]
SELECT список столбцов FROM имя второй таблицы и т. д.
Раздел ORDER BY используется, когда необходимо отсортировать данные в результирующем наборе:
ORDER BY | имя столбца в запросе [ASC или DESC], | |
имя столбца в запросе [ASC или DESC]… | ||
Здесь ключевые | слова ASC и DESC обеспечивают сортировку соответственно | по |
возрастанию или убыванию значений в соответствующем столбце.
Раздел COMPUTE позволяет применять к выбираемым столбцам функции агрегирования:
COMPUTE функция агрегирования (имя столбца запроса)
BY имена для группировки
Порядок использования столбцов в функциях агрегирования должен соответствовать порядку следования столбцов, указанному в разделе ORDER BY. Не допускается также использование ключевого слова DISTINCT.
Изменение данных в таблицах или задание значений переменным производится командой
UPDATE:
UPDATE имя таблицы или представления WITH блокировка SET имя колонки или переменной = выражение… FROM имена исходных таблиц
WHERE условия поиска
Удаление данных из таблиц производится командой DELETE: DELETE FROM имя таблицы или представления
или
DELETE FROM имя таблицы
WHERE условие поиска OPTION (уровни блокировки)
Экспорт данных из таблиц в файлы и импорт из файлов производиться утилитой bcp: Bcp “Northwind..shippers” out file. txt-c--символьный.
Задание 1. Создать базу данных InsertDB и необходимые таблицы для выполнения следующих команд INSERT:
A)Использование простой команды INSERT:
Create Database InsertDB
Create Table TabA(Col1 int, Col2 varchar(30)) Insert TabA Values(1,'Пример 1')
Select * From TabA
B)Использование произвольной последовательности колонок таблицы:
Create Table TabB(Col1 int, Col2 varchar(30)) Insert TabB (Col2,Col1) Values('Пример В',1)
Select * From TabB
C)Использование нулевых значений и значений по умолчанию:
Create Table TabC(Col1 int IDENTITY, Col2 varchar(30)
CONSTRAINT default_name DEFAULT('Значение TabC. Col2'), Col3 int NULL,
Col4 varchar(40))
Insert Into TabC(Col4) Values('Значение 1 TabC. Col4')
Insert Into TabC(Col2,Col4) Values('Явное значение TabC. Col2','Значение 2 TabC. Col4') Insert Into TabC(Col2,Col3,Col4) Values('SAV',44, 'ABC')
Select * From TabC
D) Явное задание значения для колонки-счетчика (с ограничением IDENTITY):
Create Table TabD(Col1 int IDENTITY, Col2 varchar(30))
Insert Into TabD Values('Счетчик изменяется автоматически') Insert Into TabD(Col2) Values('Вторая строка')
Set IDENTITY_INSERT TabD ON
Insert Into TabD(Col1,Col2) Values(-99, 'Явное значение') Select * From TabD
E)Использование представления для занесения значений в таблицу:
Create Table TabE(Col1 int, Col2 varchar(30)) GO
Create View ViewE AS Select Col2,Col1 From TabE GO
Insert Into ViewE Values('Строка 1',1) -- порядок ViewE Select * From TabE -- порядок TablE
F)Использование опции DEFAULT VALUES:
Create Default bound_default2 AS 'Col4' GO
Create Table TabF(Col1 int IDENTITY, Col2 varchar(30)
CONSTRAINT Fdefault_name DEFAULT('Значение TabF. Col2'), Col3 timestamp,
Col4 varchar(30), Col5 int NULL
)
GO
EXEC sp_bindefault 'bound_default2','TabF. Col4' GO
USE InsertDB
Insert Into TabF DEFAULT VALUES Select * From TabF
G)Использование команды SELECT для копирования данных в таблицу:
Create Table TabG(Col1 int IDENTITY, Col2 varchar(50))
GO
Set IDENTITY_INSERT TabG ON GO
Insert Into TabG (Col1,Col2) Select Col1,Col2 From TabD GO
Select * From TabG GO
Использование команды SELECT для копирования данных из таблицы:
Create Table TabG(Col1 int IDENTITY, Col2 varchar(30))
Set IDENTITY_INSERT TabG ON Insert Into TabG
Select * From TabD Select * From TabG
H)Копирование таблиц из базы данных Northwind в базу данных НордОст:
USE НордОст
[Set IDENTITY_INSERT имя таблиц из НордОст ON] Insert Into имя таблицы из НордОст
Select * From Northwind. dbo. Имя таблицы из Northwind
I)Использование команды SELECT...INTO:
EXEC sp_dboption ‘InsertDB’, ‘select into/bulkCopy’, ‘on’ SELECT Col1 AS Счетчик, Col2 AS Имя,
Col3 AS Версия, Col5 AS Номер
Into Новая_TabF From TabF
J)Выборка начальных строк таблицы:
USE Northwind
Select Top 7 * From Territories --различные
Select Top 10 Percent * From Territories --различные упорядоченные по TerritoryID Select Order By TerritoryID With Ties * From Territories --все 7
Select All * From Territories --все строки таблицы
Select Distinct * From Territories -- все без дублирующих
K)Использование псевдонимов в запросе:
USE Pubs
Select Top 10 au_id, au_fname AS [Фамилия], au_lname
From Authors --имя 2-го столбца изменено
L)Включение в результат дополнительного столбца-выражения:
Select Top 7 NewID() AS Глобальный_уникальный_номер, '--', au_id, DatePart
(ms, GetDate())
From Authors --три колонки являются выражениями, из них две-безыменные
M)Использование подзапроса, возвращающего одну строку:
Select Top 5 (Select au_fname From authors --значение подзапроса определяется
Where au_id='') AS Подзапрос, --заново для каждой строки
title_id
From Titles
N)Включение столбца-счетчика:
Select Top 50 Percent jobs. IDENTITYCOL AS Number, job_id, job_desc From jobs
-- для одной таблицы задание ее имени для счетчика необязательно, т. е.jobs
необязательно
O)Использование ключевых слов CROSS JOIN для связывания двух таблиц:
USE Pubs
SELECT discounts. stor_id, discounts. discounttype, stores. stor_name
FROM discounts CROSS JOIN stores --3*6=18 строк
-- убедиться, что CROSS JOIN можно заменить запятой
P)Использование ключевых слов INNER JOIN для связывания двух таблиц: SELECT authors. au_lname, authors. au_fname, titleauthor. au_ord, titleauthor. royaltyper FROM authors INEER JOIN titleauthor
ON authors. au_id = titleauthor. au_id
WHERE authors. sate = 'CA'
-- убедиться, что можно INNER JOIN заменить пробелом
Q)Использование ключевых слов LEFT OUTER JOIN для связывания двух таблиц:
SELECT authors. au_lname, authors. au_fname, titleauthor. royaltyper
FROM authors LEFT OUTER JOIN titleauthor
ON authors. au_id = titleauthor. au_id
WHERE (authors. state = 'CA') --19 строк
R)Использование ключевых слов RIGHT OUTER JOIN для связывания двух таблиц: SELECT titleauthor. au_ord, titleauthor. royaltyper, authors. au_lname, authors. au_fname FROM titleauthor RIGHT OUTER JOIN authors
ON titleauthor. au_id = authors. au_id
WHERE (authors. state = 'CA') --19 строк
S)Использование ключевых слов FULL OUTER JOIN для связывания двух таблиц:
SELECT discounts. stor_id, discounts. discounttype, stores. stor_name
FROM discounts FULL OUTER JOIN stores
ON discounts. stor_id = stores. stor_id --8 строк
-- убедиться, что в примерах Q, R и S слово OUTER можно опустить
T)Использование раздела WHERE оператора SELECT: Select * From authors Where 3=6 --0 строк Select * From authors Where state <> 'CA' --Калифорния Declare @@Var1 int
Set @@Var1 = 4095
Slect title_id, type, pub_id, price From titles
Where ((ytd_sales = @@Var1) OR
(price BETWEEN 5 AND 1строк
-- заменить OR на AND и убедиться, что получится одна строка
Select discounts. stor_id, discounts. discounttype, stores. stor_name
From discounts, stores --здесь”,”-это CROSS JOIN Where disscounts. stor_id = stores. stor_id --1 строка
--это уже INNER OUTER JOIN
-- Аналог этой команды следующий:
Select discounts/stor_id, discounts. discounttype, stores. stor_name
From discounts INEER JOIN stores
ON discounts. stor_id = stores. stor_id
-- этот запрос эффективнее предшествующего.
Select discounts. stor_id, discounts. discounttype, stores. stor_name
From discounts, stores
Where discounts. stor_id, *= stores. stor_id--3 строки
-- это - аналог LEFT OUTER JOIN: Select discounts. stor_id, discounts. disconttype, stores. stor_name From discounts LEFT OUTER JOIN stores
ON discounts. stor_id = stores. stor_id --3 строки
Select discounts. stor_id, discounts. discounttype, stores. stor_name
Where discounts. stor_id =* stores. stor_id
-- это - аналог RIGHT OUTER JOIN Select discounts. stor_id, discounts. discounttype, stores. stor_name From discounts RIGHT OUTER JOIN stores
ON discounts. stor_id = stores. stor_id --6 строк
U)Использование разделов GROUP BY и HAVING:
Select type, SUM(price), COUNT(*)
From titles -- type-тип изданий
Group By type --6 строк
-- выдается колонка type, колонка SUM и счетчик COUNT Select type, SUM(price), count = COUNT(*) -- имя столбца
Form titles
Where type < 'ps'
Group BY type --3 строки
Select type, SUM(price), count = COUNT(*) -- имя счетчика count
From titles
Where type < 'ps'
Group By ALL type --6 строк
-- строки с type >= 'ps'- без агрегирования
Select type, pub_id, SUM(price), COUNT(*) From titles
Where price <> 0
Group By type, pub_id --7 агрегированных строк
Select type, pub_id, SUM(price), COUNT(*) From titles
Where price <> 0
Group By type, pub_id With Cube --суперагрегирование
Select type, pub_id, SUM(price), COUNT(*) From titles
Where price <> 0
Group By type, pub_id --13 строк
With ROLLUP
V)Объединение таблиц с помощью раздела UNION:
USE Northwind
Select City, Phone Info #Tab1 From customers
Where contacttitle = 'Marketing Assistant' Select City, Phone Info #Tab 2 From Customers
Where contacttitle = 'Sales Associate' Selest City, Phone From #Tab1
UNION
Select City, Phone From #Tab2
W)Использование раздела ORDER BY:
USE Northwind
Select ContactTitle, City From Customers
Where ContactTitle IN ('Marketing Assistant'
'Sales Agent'
'Sales Associate')
Order By ContactTitle, City --18 строк
X)Использование раздела COMPUTE:
Select title_id, price From Titles
Where (type = 'bisiness') OR (type = 'mod_cook') Compute SUM(price), COUNT(price) --6строк и
Select title_id, price From Titles
-- SUM
-- =====
--77.9000
-- CNT
-- =====
-- 6 --всего 7строк
Where (type = 'business') OR (type = 'mod_cook') Order By type
Compute Count(price), Sum(Price) By type
Y)Обработка данных с помощью команды UPDATE:
Declare @@Var1 int
SET @@Var1 = 0
Update #TempTableAuthors SET @@Var1 = @@Var1 + 1
Where Contact = 0
Select @@Var1
GO
Declare @@Var2 varchar(40)
Update #TempTableAuthors SET @@Var2 = au_lname = au_lname + '__NO CONTRACT ' Where Contact = 0
Select au_id, au_lname, phone From #TempTableAuthors --2строки
Where Contract = 0
Select @@Var2 AS 'Значение переменной @@Var2' --1строка
Z)Использование команды DELETE:
Delete From #TempTableAuthors
Select * From #TempTableAuthors --0строк
Лабораторная работа №9
Планирование использования, создание и управление индексами
Цель работы – изучение назначения, типов и способов определения индексов, синтаксиса и семантики команд языка Transact-SQL для их создания, переименования, перестройки, создания статистики для оптимизации индексов и удаления, а также приобретения навыков создания и управления индексами с помощью команд, системных хранимых процедур, графических средств утилита Enterprise Manager и мастеров Create Index Wizard и Index Tuning Wizard.
Индекс представляет собой средство, помогающее ускорить поиск необходимых данных за счет физического или логического их упорядочения и эффективных способов использования таких упорядочений данных. Программная реализация индекса – это набор ссылок, упорядоченных по определенному столбцу таблицы, который в данном случае будет называться индексированным столбцом. Индексы – это своего рода предметные указатели для таблиц баз данных, при этом физически, в зависимости от типа индекса, данные могут храниться в порядке добавления их в таблицу.
В SQL Server 2000 реализованы эффективные алгоритмы поиска нужного значения в упорядоченной последовательности данных. Одних из таких алгоритмов является метод деления пополам, на каждом шаге которого данные делятся пополам и путем сравнения со средним значением определяется, найдено ли требуемое значение, а если не найдено, то решается, в какой половине данных оно находиться, при этом на каждом шаге происходит сокращение интервала поиска.
Индексы могут существенно повысить производительность выполнения операций поиска и выборки данных.
В идеале можно создать индексы для всех столбцов таблицы, но здесь есть одно существенное ограничение. Когда выполняется изменение строк таблицы, то помимо обновления самих данных необходимо выполнить обновление всех индексов. Обновление индексов требует практически столько же времени, сколько и обновление данных, поэтому на практике ограничиваются 4 или 5 индексами. Таким образом, основным преимуществом использования индексов является значительное ускорение выборки данных, а основным недостатком – замедление процесса обновление данных.
При определении столбца для индекса следует выбирать ключевые столбцы, которые задают критерии выборки данных, например, порядок сортировки. Не следует использовать столбцы с очень длинными данными. В крайнем случае, следует создавать укороченные варианты таких столбцов и использовать их для индексирования.
В MS SQL Server 2000 реализованы следующие типы индексов:
а) кластерные индексы;
б) не кластерные индексы;
в) уникальные индексы.
Не кластерные индексы являются наиболее типичными индексами. В отличие от кластерных, они не перестраивают физическую структуру таблицы, а лишь организуют ссылки на соответствующие строки (указатели – row locator), которые включают в себя:
а) информацию об идентификационном номере файла (ID file), в котором храниться
строка;
б) идентификационный номер страницы данных;
в) номер соответствующей строки на странице;
г) содержимое столбца.
При определении кластерного индекса физическое расположение данных
перестраивается в соответствии со структурой индекса. Логическая структура таблицы в этом случае представляет скорее словарь, чем индекс. Естественно, в таблице может быть определен только один кластерный индекс. Он может включать несколько столбцов, которые наиболее часто используются при поиске. Однако количество таких столбцов следует по возможности свести к минимуму. Желательно, чтобы столбцы кластерного индекса не слишком часто изменялись, так как из-за этого будут часто физически переупорядочиваться строки таблицы.
При создании в таблице первичного ключа с помощью ключевых слов PRIMARI KEY сервер автоматически для него кластерный индекс, если он не был создан ранее или если при определении ключа не был явно указан не кластерный индекс (NONCLUSTERED). Если в таблице определяются другие индексы, то их указатели ссылаются не на физическое положение строки, а на соответствующей элемент кластерного индекса.
Уникальные индексы гарантируют уникальность значений в индексируемом столбце. Он является надстройкой для таблицы и может быть реализован как для кластерного, так и для не кластерного индекса. Уникальные индексы используются редко, а для обеспечения целостности данных следует использовать ограничения UNIQVE или PRIMARI KEY.
При определении индекса надо задавать параметр, который будет устанавливать плотность записи данных на странице, - фактор заполнения (fill factor). Его значение определяет, какой процент доступного пространства индексных страниц будет заполнен данными при создании индекса, а какой процент будет заполняться постепенно по мере загрузки данных в таблицу. Если таблица используется только для чтения, то значение этого параметра надо задавать близким к 100%, если таблица часто обновляется и дополняться, то значение фактора дополнение должно быть задано небольшим.
Право на создание индекса имеет только владелец таблицы, и это право не может быть передано другому пользователю. Индекс можно создать одним из следующих способов:
а) с помощью команд языка Transact – SQL, которые предоставляют пользователю максимум возможностей;
б) с помощью Enterprise Manager;
в) средствами мастеров Create Index Wizard и Index Tuning Wizard.
Создание индекса командами языка Transact – SQL производится следующим образом:
а) автоматически при создании первичного ключа, когда создается кластерный индекс
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


