lec_05_3_4_2007.ppt
- Количество слайдов: 43
o o Типы данных SQL Server BIGINT хранит целые числа со знаком и без знака в диапазоне от 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Занимает 8 байт. Bl. NARY[(n)] хранит двоичное значение фиксированной длины от 1 до 8000 байт. Значение типа BINARYзанимает n + 4 байта. BIT – хранит значения 1, 0 или NULL, которое обозначает «unknown» . В одном байте может храниться до 8 значений из столбцов типа BIT таблицы. В еще одном байте можно разместить дополнительные 8 значений типа BIT. Столбцы типа BIT нельзя индексировать. CHAR[(n)], CHARACTER[(n)] – хранит символьные данные фиксированной длины от 1 до 8000 символов. Все неиспользованное место по умолчанию заполняется пробелами. Тип занимает n байт. 1
o DATETIME хранит значение даты и времени в диапазоне с 01 01 1753 00: 00 до 31 12 9999 23: 59. Для хранения требуется 8 байт. o DECIMAL (p, s), DEC (p, s), NUMERIC (p, s) хранит десятичные дроби длиной до 38 цифр. Значения р и s определяют, соответственно, точность и масштаб. Масштаб по умолчанию равен 0. При точности 1 9 используется 5 байт. При точности 10 19 используется 9 байт. При точности 20 28 используется 13 байт. При точности 29 39 используется 17 байт. o DOUBLE PRECISION cиноним FLOAT(53). o FLOAT[(n)] хранит значения с плавающей точкой в диапазоне от 1. 79 Е + 308 до 1. 79 Е + 308. Точность, определяемая параметром и, может изменяться в пределах от 1 до 53. Для хранения 7 цифр (n от 1 до 24) требуется 4 байта. Значения, превышающие 7 цифр, занимают 8 байт. 2
o IMAGE – хранит двоичное значение переменной длины до 2 147 483 647 байт. Этот тип данных часто используется для хранения графики, звука и файлов, таких, как документы MS Word и электронные таблицы MS Excel. Значениями типа IMAGE нельзя свободно манипулировать. Столбцы типа IMAGE и TEXT имеют множество ограничений на способы использования. o INT [IDENTITY [(seed, increment)] хранит целые числа со знаком или без знака в диапазоне от 2 147 483 648 до 2 147 483 647. Занимает 4 байта. Все целочисленные типы данных, а также типы, хранящие десятичные дроби, поддерживают свойство IDENTITY автоматически инкрементируемый идентификатор строки. o MONEY хранит денежные значения в диапазоне от 922337203685477. 5808 до 922337203685477. 5807. Значение занимает 8 байт. 3
o NCHAR(n), NATIONAL CHARACTER(n) хранит данные формата UNICODE фиксированной длины до 4000 символов. Для хранения требуется n*2 байт. o NTEXT, NATIONAL TEXT – хранит фрагменты текста в формате UNICODE длиной до 1 073 741 823 символа. o NVARCHAR(n), NATIONAL CHAR VARYING(n), NATIONAL CHARACTER VARYING(n) хранит UNICODE данные переменной длины до 4000 символов. Занимаемое место вычисляется как удвоенное значение длины всех символов, вставленных в поле (число символов * 2). В SQL Server системный параметр SET ANSI_PADDING для полей NCHAR и NVARCHAR всегда установлен (ON). 4
o REAL хранит значения с плавающей точкой в диапазоне 3. 40 Е+38 до 3. 40 Е+38. Занимает 4 байта. Тип REAL функционально эквивалентен типу FLOAT(24). o SMALLDATETIME хранит дату и время в диапазоне от '01 01 1900 00: 00' до '06 06 2079 23: 59' с точностью до минуты. (Минуты округляются до меньшего значения, если значение секунд 29. 998 и менее, в противном случае они округляются до большего значения. ) Значение занимает 4 байта. o SMALLINT хранит целые числа со знаком или без знака в диапазоне от 32 768 до 32 767. Занимает 2 байта. o SMALLMONEY хранит денежные значения в диапазоне от 214748. 3648 до 214748. 3647. Значения занимают 4 байта. 5
o SQL_VARIANT хранит значения, относящиеся к другим поддерживаемым SQL Server типам данных, за исключением типов TEXT, NTEXT и других значений типа SQL_VARIANT. Может хранить до 8016 байт данных, поддерживаются значения NULL и DEFAULT. Тип SQL_VARIANT используется в столбцах, параметрах, переменных и возвращаемых функциями и хранимыми процедурами значениях. o TABLE специальный тип, хранящий получившийся в результате работы последнего процесса набор данных. Используется исключительно для процедурной обработки и не может применяться в инструкциях CREATE TABLE. 6
o TEXT хранит очень большие фрагменты текста длиной до 2 147 483 647 символов. Значениями типа ТЕХТ и IMAGE часто гораздо труднее манипулировать, чем, значениями типа VARCHAR. Например, нельзя создавать индекс по столбцу типа TEXT или IMAGE. o TIMESTAMP – хранит автоматически генерируемое двоичное число, обеспечивающее уникальность в текущей базе данных. Тип TIMESTAMP занимает 8 байт. o TINYINT – хранит целые числа без знака в диапазоне от 0 до 255 и занимает 1 байт. VARBINARY[(n)] представляет собой двоичное значение переменной длины, до 8000 байт. Занимаемое место соответствует размеру вставленных данных плюс 4 байта. 7
o VARCHAR[(n)], CHAR VARYING [(n)], CHARACTER VARYING [(n)] хранит символьные данные фиксированной длины размером от 1 до 8000 символов. Занимаемое место равно реальному размеру введенного значения в байтах, а не значению n. 8
Совместимость типов При выполнении операций над столбцами разного типа можно автоматически приводит значения участвующие в операции к совместимым типам. Для явного приведения типов используется функция CAST. Совместимыми считаются только типы DATETIME, CHAR и INT. Пример: Сравнить два столбца Data (тип DATETIME) и Char_Data (тип CHAR) SELECT . . . WHERE Char_Data <= CAST(Data AS CHAR); 9
Создание таблиц Таблицы определяются с помощью команды CREATE TABLE. Создается пустая таблица не имеющая строк и не содержащую никаких данных. CREATE TABLE определяет имя таблицы и множество поименованных столбцов в указанном порядке. Для каждого столбца устанавливается тип и размер. Каждая таблица должна иметь, по крайней мере, один столбец. CREATE TABLE: CREATE TABLE <Имя_таблицы> [EXTERNAL [FILE] "<имя_файла>"] (<опр_столбца> [, <опр__столбца> | <ограничение> . . . ]); Синтаксис команды o <опр_столбца> — определение столбца БД 10
Определение столбца имеет такой формат: <опр_столбца> = <имя_столбца>{<тип_данных> | COMPUTED [BY] (<выражение>) | <домен>} [DEFAULT {<литерал>| NULL | USER}] [NOT NULL] [<огранич_столбца>] [COLLATE collation] Обозначения: <имя_столбца> — имя столбца; <тип_данных> — тип столбца; COMPUTED [BY] (выражение>) — служит для определения столбца вычисляемых значений; <домен> — имя домена; DEFAULT — определяет значение, которое по умолчанию заносится в столбец при вставке новой записи; <огранич_столбца> — ограничения, накладываемые на значения столбца; COLLATE collation — определяет порядок сортировки символов (для символьных столбцов) 11
Пример: CREATE TABLE Salespeople (snum int, sname varchar(10), city varchar(10), cost smallmoney); Ограничение на множество допустимых значений данных в таблице При указании ограничения для значений поля, SQL будет автоматически отвергать значения, не удовлетворяющие указанному критерию: ограничения на столбцы (column constraints) ограничения на таблицу (table constraints) 12
Ограничения на столбцы применимы только к отдельным столбцам, а ограничения на таблицу – к группам, состоящим из одного или более столбцов. Объявление ограничений. Для определения ограничений используют команду CREATE TABLE с расширенным синтаксисом: CREATE TABLE <имя таблицы> ( <имя столбца> <тип данных> <ограничения на столбец>, …, <ограничения на таблицу> (<имя столбца> [, <имя столбца>… ])); 13
Исключение NULL значений. Для запрета использования NULL значений в поле, необходимо использовать ключевое слово NOT NULL: Пример: CREATE TABLE Sales. People (snum int NOT NULL, sname varchar(10) NOT NULL, city varchar (10), comm smallmoney); 14
Уникальность значений. Для уникальности значений поля в качестве ограничения на этот столбец необходимо использовать ключевое слово UNIQUE. Замечание: ограничение применимо к столбцам, которые объявляются как NOT NULL. Пример: CREATE TABLE Sales. People (snum int NOT NULL UNIQUE, sname varchar(10) NOT NULL UNIQUE, city varchar (10), comm smallmoney); 15
Команду UNIQUE можно использовать для уникальности группы полей. Замечание: При объединении в группу важен порядок. Например, значения столбцов ‘a’, ’b’ и ‘b’, ‘a’ отличаются друг от друга (дают две различные комбинации) Пример: CREATE TABLE Customers (cnum int NOT NULL, cname varchar(10) NOT NULL, city varchar (10), rating int, snum int NOT NULL, UNIQUE (cnum, snum) ); 16
Ограничение на значение столбцов Использование ограничения CHECK позволяет определить условие, которому должны удовлетворять вводимые в таблицу значения. Их проверка осуществляется до размещения данных в таблице. CHECK (<ограничение>) <ограничение> = {<значение> <знак операции> {<значение 1> | (<выбор_одного>)} I <значение> [NOT] BETWEEN <значение 1> AND <значение 2> I <значение> [NOT] LIKE <маска_подобия> [ESCAPE <символ>] I <значение> [NOT] IN (<значение 1> [, <значение 2>. . . ] | <выбор_многих>) 17
I <значение> IS [NOT] NULL I <значение> {[NOT] {= I < I >} I >= I <=} {ALL | SOME | ANY} (<выбор_многих>) I EXISTS (<выражение_выбора>) I SINGULAR (<выражение_выбора>) I <значение> [NOT] CONTAINING <значение 1> I <значение> [NOT] STARTING [WITH] <строка> I NOT <ограничение> I <ограничение> OR <ограничение> I <ограничение> AND <ограничение> } <значение> = {столбец | <константа><выражение> | <функция> I NULL I USER I RDB$DB_KEY } [COLLATE collation] 18
<константа> = число I "строка" <функция> = { COUNT (* I [ALL] <значение> I DISTINCT <значение>) I SUM ([ALL] <значение> I DISTINCT <значение>) I AVG ([ALL] <значение> I DISTINCT <значение>) I MAX ( [ALL] <значение> I DISTINCT <значение>) I MIN ( [ALL] <значение> I DISTINCT <значение>) | CAST (<значение> AS <тип_данных>) | UPPER (<значение>) | GEN__ID (генератор, <значение>)} 19
Используемые обозначения: o <знак операции> — один из следующих символов или их комбинация: = < > <= >= !< !> <> != o <выбор_одного> — оператор SELECT, возвращающий одно значение или не возвращающий ничего o <маска_подобия> — произвольная строка, возможно, содержащая символы заменители % (символ процента) и/или _ (символ подчеркивания): • символ процента означает произвольное (в том числе и нулевое) количе ство любых символов, которые могут стоять на его месте; 20
• символ подчеркивания означает, что на его месте должен стоять любой символ; o <символ> — любой символ, отличный от символа заменителя, который в маске подобия играет роль символа заменителя o <выбор_многих> — оператор SELECT, который может возвращать более одного значения (список значений) или ни одного o <выражение_выбора> — оператор SELECT, который может возвращать более одного значения (список значений) или ни одного. 21
Примеры: CREATE TABLE My. Table ( Столбец не должен содержать отрицательных значений Col 1 INT CHECK(Col 1>=0), Значения столбца >= 100 и <= 200 Соl 2 INT CHECK (Col 2 BETWEEN 100 AND 200), Значения столбца должны заканчиваться символами “руб. " Соl 3 VARCHAR(40) CHECK(Col 3 LIKE '% руб. '), Значения столбца должны совпадать с одним из значений столбца Num таблицы My. Num Соl 4 INT CHECK(Col 4 IN (SELECT Num FROM My. Num)), Строка в значении столбца должна начинаться пробелом Соl 5 VARCHAR(5) CHECK(Col 5 STARTING WITH " ") 22
С помощью CHECK можно осуществлять проверку правильности вводимых в таблицу данных. CREATE TABLE Sales. People (snum int NOT NULL PRIMARY KEY, sname varchar(10) NOT NULL UNIQUE, city varchar (10), comm decimal , CHECK (comm < 0. 1 AND city = ‘Barselona’)); Это означает, что для записей с city = ’Barselona’ значение поля comm может быть только меньше 0. 1. 23
Установка начальных значений С помощью ключевого слова DAFAULT полю можно задавать значение, которое будет ему присваиваться в том случае, если при вставке новой строки в таблицу никакого значения для него не указано. Пример: CREATE TABLE Sales. People (snum int NOT NULL PRIMARY KEY, sname varchar(10) NOT NULL UNIQUE, city varchar (10) DEFAULT = “New York”, comm decimal CHECK (comm < 1)); 24
Вычисляемые столбцы С помощью спецификатора COMPUTED [BY] в таблице можно создать вычисляемый столбец Вычисляемые столбцы во всем подобны вычисляемым объектам полям за тем исключением, что вычисление выражения осуществляет не клиентская программа, а сервер. Пример: ALTER TABLE My. Table ADD Summa COMPUTED (Col*Cena) 25
Определение ключей и ссылочных целостностей С помощью спецификатора PRIMARY KEY можно указать столбец (столбцы), по которому (которым) в таблице будет построен первичный ключ. Если в первичный ключ входит единственный столбец, спецификатор ставится при определении столбца. CREATE TABLE My. Table( Col 1 INT NOT NULL PRIMARY KEY, Col 2 VARCHAR(20)); Если в состав первичного ключа должны входить несколько столбцов, спецификатор ставится после определения всех полей. CREATE TABLE My. Table( Col 1 INT NOT NULL, Col 2 VARCHAR(20) NOT NULL, PRIMARY KEY (Col 1, Col 2)); 26
В любом случае поля, по которым строится первичный ключ, не могут быть пустыми, поэтому при их определении указывается спецификатор NOT NULL. По функциональным возможностям оно сходно с ограничением UNIQUE, за исключением того, что только один первичный ключ (состоящий из любого количества столбцов) может быть определен для данной таблицы. Пример: CREATE TABLE Sales. People (snum int NOT NULL PRIMARY KEY, sname varchar(10) NOT NULL UNIQUE, city varchar(10) NOT NULL UNIQUE, comm decimal); 27
Внешний ключ создается для обеспечения ссылочной целостности в дочерней таблице с помощью спецификатора FOREIGN KEY Синтаксис задания внешнего ключа: FOREIGN KEY (<сп_столбцов_дочерней__табл>) REFERENCES <имя___родит__таблицы> [<сп_столбцов_родит_таблицы>] [ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] [ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] Обозначения: <сл_столбцов__дочерней_табл> — список столбцов дочерней таблицы, ко торые входят во внешний ключ; 28
o <имя_родит_таблицы> — имя родительской таблицы; o <сп_столбцов_родит_таблицы> — список столбцов родительской таблицы, которые являются ключевыми для связи таблиц (список можно опускать, если связь с родительской таблицей устанавливается по первичному ключу); o необязательные параметры ON DELETE и ON UPDATE указывают, что должен делать сервер при соответственно удалении и изменении первичного ключа родительской таблицы: • NO ACTION — блокировать удаление (изменение), если в дочерней таблице есть хотя бы одна запись, ссылающаяся на удаленное (измененное) значение; 29
• CASCADE — произвести каскадные изменения в дочерней таблице: удалить записи, ссылающиеся на удаленное значение первичного ключа, или изменить вторичный ключ в соответствии с новым значением первичного ключа; • SET DEFAULT — установить значение вторичного ключа, заданное по умолчанию; • SET NULL — установить значение NULL. Пример: Р — родительская таблица С — дочерняя. CREATE TABLE P( P_ID INT NOT NULL PRIMARY KEY, P_0 ther INT); 30
CREATE TABLE С ( C_Number INT, C_Other INT, FOREIGN KEY (C_Number) REFERENCES P ON UPDATE CASCADE ON DELETE NO ACTION); 31
Изменение и удаление таблиц Изменение ранее созданной таблицы осуществляется оператором ALTER TABLE, в котором дополнительно указывается характер действия спецификаторами: ADD – добавить; DROP удалить. Добавлять можно только столбцы, удалять — столбцы и именованные ссылочные целостности. Пример: Добавление нового столбца ALTER TABLE P ADD New_Column VARCHAR(50); Удаление таблиц реализуется оператором DROP TABLE My. Table; 32
Создание индексов Помимо первичных и вторичных ключей, с помощью которых устанавливается реляционная связь между таблицами, для каждой таблицы можно создавать индексы. Индексы необходимы для ускорения поиска нужных записей и сортировки. Индексы используют такой же механизм упорядочивания записей, как и ключи, так что разделение на ключи и индексы носит чисто логический характер. Для создания индекса используется оператор CREATE INDEX следующего формата: CREATE [UNIQUE] {[ASC[ENDING] | DESC[ENDING]} INDEX <Имя_индекса> ON <Имя__таблицы> (<Столбец1> [, <Столбец2> [, . . . ]]) Обозначения: o UNIQUE — создается уникальный индекс; o ASC [ENDING] — значения индекса сортируются по возрастанию (спецификатор по умолчанию); 33
o DESC [ENDING] — значения сортируются по убыванию; o <Имя__индекса> — имя индекса (должно быть уникальным среди всех осталь ных имен индексов в БД); o <Имя_таблицы> — имя таблицы, для которой создается индекс; o <Столбец. Ы> — имя входящего в индекс столбца. Пример: Создать убывающий индекс по столбцу NSum для таблицы My. Table CREATE DESC INDEX NSum_Index ON My. Table (NSum); Если поиск (сортировка) записей идет по двум и более столбцам одновременно, полезно создать составной индекс, который способен существенно ускорить выполнение запроса. Пример: CREATE INDEX Complex ON My. Table (NFirm, NDate) 34
Изменение и удаление индекса В реальной работе иногда возникает необходимость вставки в ту или иную таблицу БД сразу множества записей. В этом случае можно временно отключить индекс следующим оператором: ALTER INDEX <Имя_индекса> INACTIVE После завершения операции индекс вновь можно включить оператором: ALTER INDEX <Имя_индекса> ACTIVE Вставка/удаление с отключенным индексом (индексами) реализуется быстрее, так каждая единичная операция не вызывает перестройки индекса (индексов). Замечание: Нельзя отключать уникальные индексы, так как в этом случае в столбцы индекса могут быть введены неуникальные значения и включение индекса приведет к ошибке. Удаление индекса осуществляется оператором: DROP INDEX <Имя_индекса> Затем индекс требуется создать заново 35
Определение типов данных таблиц Назначая типы данных колонкам таблиц, можно использовать «свои» типы — домены. Это удобно, если имеются одинаковые поля в нескольких таблицах. Кроме того, применение доменов в SQL сценарии гарантирует реализацию операции соединения таблиц, а значит, поддержку ссылочной целостности. Имя таб. Имя поля Тип Длина Stydent NSt INT Fam VARCHAR 50 Imya VARCHAR 50 Otch VARCHAR 50 Data. R DATETIME Kurs VARCHAR 1 Predmet NPr INT Pred VARCHAR 50 36
Имя таб. Имя поля Тип Длина Ocenki NOc INT Ocenka VARCHAR 20 Uspevaemoct NUs INT Data. Oc DATETIME NFPred INT NFOc INT NFSt INT 37
Создание таблиц базы данных «Успеваемость студентов» CREATE TABLE Student( NSt INT CHECK (VALUE > 0) NOT NULL, Fam VARCHAR(50) NOT NULL, Imya VARCHAR(50) NOT NULL, Otch VARCHAR(50) NOT NULL, Data. R DATETIME NOT NULL, Kurs VARCHAR(1) DEFAULT ‘ 1’ CHECK (VALUE IN (‘ 1’, ‘ 2’, ‘ 3’, ‘ 4’, ‘ 5’)) NOT NULL, PRIMARY KEY (NSt) ); 38
CREATE TABLE Predmet( NPr INT CHECK (VALUE > 0) NOT NULL, Pred VARCHAR (50) NOT NULL, PRIMARY KEY (NPr) ); CREATE TABLE Ocenki( NOc INT CHECK (VALUE > 0) NOT NULL, Ocenka VARCHAR(20) NOT NULL, PRIMARY KEY (NOc) ); CREATE TABLE Uspevaemost( NUs INT CHECK (VALUE > 0) NOT NULL, Data. Oc DATETIME NOT NULL, 39
NFPred INT CHECK (VALUE > 0) NOT NULL, NFOc INT CHECK (VALUE > 0) NOT NULL, NFSt INT CHECK (VALUE > 0) NOT NULL, PRIMARY KEY (NUs), FOREIGN KEY (NFPred) REFERENCES Predmet (NPr) ON UPDATE NO ACTION ON DELETE NO ACTION, FOREIGN KEY (NFOc) REFERENCES Ocenki (NOc) ON UPDATE NO ACTION ON DELETE SET NULL, FOREIGN KEY (NFSt) REFERENCES Stydent (NSt) ON UPDATE NO ACTION ON DELETE CASCADE); 40
Добавление данных осуществляется с использованием команды INSERT. /* Добавить данные о студентах */ INSERT INTO Student VALUES (1, ‘Иванов’, ‘Иван’, ‘Иванович’, '01. 88‘, ‘ 1’ ); INSERT INTO Student VALUES (2, ‘Петров’, ‘Петр’, ‘Петрович’, '02. 88‘, ‘ 2’ ); /* Добавить данные о предметах */ INSERT INTO Predmet VALUES (1, ‘Алгебра'); INSERT INTO Predmet VALUES (2, ‘Математический анализ'); INSERT INTO Predmet VALUES (3, ‘Компьютерные науки'); 41
/* Добавить данные об оценках */ INSERT INTO Ocenki VALUES (1, ‘зачет’); INSERT INTO Ocenki VALUES (2, ‘удовлетворительно’); INSERT INTO Ocenki VALUES (3, ‘хорошо’); INSERT INTO Ocenki VALUES (4, ‘отлично’); /* Добавить данные об успеваемости */ INSERT INTO Uspevaemoct VALUES (1, '01. 09. 07‘, 1, 1, 1); INSERT INTO Uspevaemoct VALUES (1, '01. 15. 07‘, 2, 4, 2); INSERT INTO Uspevaemoct VALUES (1, '01. 21. 07‘, 3, 1, 2); 42
Сервера поддерживают ссылочную целостность, которая реализована как ограничения (constraints) значений primary и foreign ключей. Ее принято называть декларативной целостностью. Пример: Изменим оценку у студентов с зачета на хорошо, следующей SQL командой: UPDATE Uspevaemost SET NFOc =3 WHERE NFOc = 1 43
lec_05_3_4_2007.ppt