Титры к видео уроку - "Введение в SQL"

Ссылка на полный видео урок

Здравствуйте, я рад вас приветствовать на курсе SQL Essential. Наш видео-курс будет состоять из девяти уроков, которые позволят вам освоить все основные концепции программирования под SQL Server 2013. Так же данный курс рассматривает вопросы оптимизации SQL Server, советы при разработке, и базовые задачи администрирования. Все наши уроки будут состоять из теоретической и практической части, так же каждому уроку будет домашнее задание, которые вы сможете выполнить дома. Для успешного прохождения данного курса вам потребуется уверенное владение персональным компьютером и базовые знания с любого процедурного или объектно-ориентированного языка программирования. Сегодня мы рассмотрим с понятием базы данных, с реляционной моделью данных и с реляционными базами данных. Так же мы познакомимся с программой Management Studio и в конце концов рассмотрим типы данных, которые можно использовать в Transaction SQL. База данных прежде всего это место хранения нашей информации. Технологию баз данных можно рассматривать как в широком так и в узком аспекте. Если рассматривать это понятие в широком смысле, то базой данных можно назвать любое средство, которое позволяет хранить и обрабатывать данные. Давайте рассмотрим это понятие в узком аспекте. Если рассматривать это понятие в узком аспекте, то БД можно представить как совокупность самостоятельных фактов, которые систематизированы таким образом что бы они могли быть найдены и обработаны с помощью ЕОМ. Что мы получаем? Кроме файла, в котором находятся данные, этот файл у нас находиться на жестком диске, еще нужно иметь программу, которая сможет управлять базой данных. Такие программы так и называются – системы управления базами данных (СУБД). СУБД это совокупность программных и лингвистических средств, которые обеспечивают управление созданием и использованием баз данных. То есть вся робота с БД будет делаться с помощью СУБД. На нашем видео-курсе мы будем работать с программой, которая называется Microsoft SQL Server 2012.

Каждая СУБД должна уметь реализовывать основные функции. Первая из них это управление данными во внешней памяти, то есть файлами, которые находятся у нас на жестком диске. Так же каждая СУБД должна уметь управлять данными в оперативной памяти (ОП), так же должна уметь вести журнал изменений, системное копирование и восстановление после сбоев. К тому же каждая СУБД должна поддерживать языки баз данных. Язык определения данных и язык манипулирования данными. Об этих языках мы поговорим на следующих уроках. Различные БД можно классифицировать по типам данных, описании, хранении и манипулировании данными. То есть модели данных мы будем называть формальную теорию представления и обработки в СУБД, которая включает: аспект структуры, манипуляции и целостности. Существуют различные структуры но каждая из них по меньшей мере три этих аспекта. Аспект «Структура» определяет что из себя представляет логически БД. Аспект «Манипулирование» определяет способы модификации данных и способы извлечения данных из БД. Аспект «Целостность» определяет целостность объектных данных в БД, вернее даже – корректность данных. То есть, как мы понимает каждая БД и каждая СУБД строиться на основе какой то явной или неявной модели данных. Например основой Microsoft QSL Server является реляционная модель данных. На этой модели строятся все реляционные БД. Термин «Реляционные» говорит о том, что БД основаны на математическом понятии отношение. Как и все остальные модели данных реляционная модель включает в себя структурный аспект, о котором мы говорили, аспект целостности и аспект обработки. Структурный аспект этой модели говорит о том, что данные в реляционных БД представляют из себя набор отношений. Что касается аспекта обработки то реляционная модель поддерживает операторы манипулирования данными, которые основываются на реляционной алгебре и реляционном исчислении.

Аспект целостности включает набор различных ограничений, которые гарантируют отвержения невозможных значений в БД. Итак, хорошо, мы, наверное, слишком углубились в теорию, давайте рассмотрим следующий пример. Итак, давайте представим что мы владеем бизнесом, и у нас есть некоторая информация, которая касается этого бизнеса. Информацию можно представить как ни что иное чем набор фактов. Набор фактов, то есть информация имеет свойство неким образом реализовываться в иерархические структуры. Ну давайте к примеру возьмем единичный факт. Допустим факт «Николай», понимаем что это имя или нашего сотрудника или клиента (в данном случае это наш клиент). И давайте к этому факту мы приумножим все другие факты, которые касаются данного объекта. И если мы определим эти факты и вынесем их отдельно то мы получим второй элемент нашей иерархии, то есть нашей структуры. Это все факты, которые касаются одного объекта. Это Николай Петрович Задорожный, который живет по адресу Лужная 17. Теперь давайте пойдем дальше и соберем все факты, которые касаются однотипных объектов. Если мы просканируем наши факты то увидим что есть еще один объект, который касается вот этого типа объекта. Это еще один клиент Александр Александрович Синчук, который проживает по адресу Хартицкая 5. Итак, давайте пойдем еще дальше и соберем все факты, которые у нас есть и касаются нашего бизнеса. В итоге получим такую структуру, в которой данные можно представить как таблички. Теперь давайте элементы нашей структуры отобразим в терминах БД. Переходим на следующий слайд, значит единичный факт мы будем называть полем. Все факты, которые будут касаться одного объекта мы будем называть записями. Набор всех фактов о однотипных объектах мы будем называть табличной и набор фактов о всех объектах, которые мы имеем мы будем называть базой данных. То есть мы понимаем что база данных это набор таблиц, каждая из таблиц содержит набор данных и если мы добавим сюда еще и связь между таблицами то мы получим модель реляционной базы данных. То есть мы понимаем что информация храниться в таблицах, в таблицах хранятся непосредственные данные которые состоят из полей и записей. Так же иногда поля мы будем называть столбцами а записи будем называть строками. И если мы посмотрим на таблицу, которая у нас продемонстрирована то увидим, что не все поля имеют одинаковые данные. То есть некоторые поля могут содержать только числа, некоторые поля могут содержать только строковые значения. Некоторые поля содержат только дату и некоторые содержат вообще значение NULL. Это фиксируются с помощью свойств полей таблиц. Каждое поле таблицы имеет свойства, это имя, тип данных и допустимость пустого значения. Имя столбца реализует обращение к конкретному полю нашей таблицы. Тип данных определяет информация какого типа может храниться в данном поле. Как мы видим в таблице, которая у нас продемонстрирована то поля строк нашей таблицы, поля с именем AdressLine2 имеют значения NULL. NULL это способ представления пустого значения в SQL Server. Так же значение NULL называют маркером пустого значения. И допустимость значений NULL в полях таблицы диктуются как раз этим свойством «Допустимость пустого значения». Большая часть работы в БД выполняется с таблицами и любая БД поддерживает следующие четыре типовые операции над таблицами: это добавление информации, обновление уже существующей информации, удаление информации и просмотр информации, которая содержится в таблице. И все эти операции выполняются с помощью инструкции SQL.

Специально для создания, изменения и манипулирования в БД существует язык структурированных запросов, который называется SQL. Этот язык был создан компанией IBM для экспериментальной базы данных IBM System R. В 1986 году американским национальным институтом стандартов была представлена первая версия данного стандарта. Целью разработки стало создание простого непроцедурного языка, которым бы мог воспользоваться любой пользователь, который даже не имеет навыком программирования. SQL не является языком программирования, он является прежде всего информационно логическим языком, который предназначен для написания, изменения и извлечения данных в реляционных БД. Вот мы видим основной набор операций в SQL, это: создание в базе данных новой таблицы, добавление в таблицу новых записей, изменение существующих записей, удаление записей, выборка записей из одной или нескольких таблиц и так же изменение структур таблиц. Понятно что существование стандарта на бумаге не обязательно означает существование такого стандарта на практике и многие производители программного обеспечение решили что функционал текущей версии недостаточен и его нужно расширить. В результате у производителей СУБД возникли разные диалекты SQL в общем случае между собой не совместимы, поскольку SQL не является процедурным языком программирования вводимые представителями разработки СУБД изменгения касались в первую очередь процедурных расширений, это хранимые процедуры и языки надстройки. Практически в каждой СУБД применяется свой процедурный язык и Microsoft тут не исключение. Разработчиками Microsoft было создано процедурное расширение языка SQL, которое называется Transact- SQL или же сокращенно Т- SQL. Язык Т- SQL является ключом к использованию Microsoft SQL Server. Все приложения взаимодействующие с Microsoft SQL Server независимо от их реализации и пользовательского интерфейса отправляют серверу именно инструкции этого языка. Т- SQL расширил стандарт SQL такими дополнительными возможностями, это : управляющие операторы, локальные и глобальные переменные, различные дополнительные функции для обработки строк, дат, математики и т.п., поддержка аутентификации Microsoft Windows. На практическом занятии к этому уроку мы рассмотрим какие образом в Т- SQL можно создать БД и в этой БД можно создать таблицу, но перед этим мы рассмотрим какие типы данных существуют в Microsoft SQL Server. Для этого нам потребуется научится создавать переменные с помощью Т- SQL. Для того что бы создать переменную Т- SQL нужно воспользоваться инструкцией DECLARE. Инструкция DECLARE создает переменную с заданным именем, заданным типом и если это нужно присваивает начальное значение этой переменной. В данном примере мы с помощью инструкции DECLARE создаем переменную с именем @A, имя переменной иногда так же называют идентификатором. Идентификатор любой переменной, который мы можем создать с помощью должен начинаться с символа «@». После указания имени переменной мы указываем тип переменной INT (INT говорит о том что переменная может содержать только целое значение ) и тут же мы с помощью оператора присвоение «=» присеваем переменной А значение «2». Для того что бы вывести на экран значение переменной А нужно воспользоваться инструкцией PRINT. После инструкции PRINT мы указываем имя переменной, которую мы хотим вывести. В данном случае у нас будет выведено значение «2». Что бы присвоить переменной новое значение можно использовать инструкцию SET, после чего указываем имя переменной, дальше ставим символ присвоения и указываем новое значение. После выполнения этой строки переменная А будет содержать значение «7». Дальше будем выводить значение переменной А и уже получим новое значение «7». Далее мы рассмотрим различные типы данных, которые мы можем использовать в SQL Server. Все типы данных, которые можно использовать разделяются на 7 категорий, это: целые числа, числа с фиксированной запятой, дата и время, текстовые данные, двоичные данные и пользовательские типы. Все эти категории мы рассмотрим на практических примерах, давайте перейдем к ним. Как мы уже говорили язык Transact SQL является ключом к использованию SQL Server. Все приложения, которые взаимодействуют с SQL Server независимо от их реализации и пользовательского интерфейса отправляют серверу инструкции Transact SQL. То есть на самом деле SQL Server имеет программный интерфейс с которым могут взаимодействовать только программы. И для того чтобы удобно использовать Microsoft SQL Server с помощью графических средств есть два варианта: первый вариант написать собственное приложение на языке C# использую технология ADO .NET которая будет посылать данные на сервер, посылать инструкции Transact SQL на сервер, который будет что то выполнять и посылать мне ответы, которые я буду выводить в интерфейсе этого приложения. Но есть и другой способ это использовать уже готовую программу SQL Server Management Studio, это графическая среда которая реализует управление экземпляром SQL сервера. Итак давайте запустим эту программу. Я запускаю SQL Server 2012 Management Studio и у меня появляется окошко, которое просит меня подключиться к какому либо из экземпляров SQL Server-а который установлен у меня на локальной машине.

Я буду подключаться к копии экземпляра SQL Server-а, у меня установлена экспресс редакция этого сервера, я нажимаю connect и тем самым подключаюсь к моему серверу. Теперь я могу нажимать кнопку New Query и у меня появится поле в котором я могу писать инструкции Т- SQL и выполнять их. Выполнять их можно или нажатием кнопки «F5» или «Execute» графического интерфейса Management Studio. Хорошо, давайте теперь перейдем к примерам. Переходим к примеру, который демонстрирует нам создание переменной (этот пример мы уже рассматривали в презентации). В это примере мы создали переменную @A, INT присвоили начальное значение, вывели это значение на экран, присвоили новое значение и еще раз вывели его на экран. Давайте выполним набор этих инструкций. Мы говорили что можно нажать клавишу F5 или кнопку «Execute». Давайте я нажму кнопку «Execute» и у меня выполняется набор инструкций и в окошке вывода вижу следующее: после выполнения инструкций на 9й строке у меня в окошке вывода появляется значение «2», это значение переменной @A, дальше я присвоил новое значение и в окошке вывода получил значение «7». Так же можно нажать кнопку «F5» и получил абсолютно те же результаты. К тому же Management Studio и SQL Server позволяет выполнять сразу же не все инструкции, которые находятся в поле для записи инструкций Transact SQL а так же возможно выполнять некоторые из них. Для этого я сделаю следующее, я хочу выполнить только инструкцию DECLARE шестой строки и инструкцию PRINT на 9й строке. Я выделяю блок кода, нажимаю «Execute» и выполняется только 2 инструкции создание переменной со значением «2» и вывод на экран. Давайте перейдем к следующему примеру и рассмотрим какие еще типы данных можно использовать при работе с SQL Server. В SQL Server у каждого столбца, локальной переменной, выражения и параметра есть определенный тип данных. Тип данных это своего рода атрибут, который определяет какого рода данные могут храниться в объекте, это могут быть целые числа, символы, данные денежного типа, время и дата, двоичные строковые данные и так далее. SQL Server предоставляет набор системных типов данных, которые определяют все типы данных, которые могут использоваться в SQL Server. В первом примере, который касается типов данных мы можем рассматривать целочисленный тип данных который доступный в SQL Server.

Все эти типы данных: Bit, TinyInt, SmallInt, Int и BigInt хранят непосредственно целые значения и отличаются они только диапазоном и соответственно количеством памяти, которую нужно зарезервировать под одно значение того или иного типа. Первые два типа которые мы рассмотрим могут хранить только целые значения положительные. Тип Bit может хранить целое значение без знака в диапазоне 0 или 1. На 11й строке мы выводим на экран Bit, на 13й строке объявляем переменную с именем @bit типа Bit которому присваиваем значение «0». На 14й строке выводим значение @bit на экран. На 16й строке переменной @bit присваиваем значение «1» и на 17й выводим на экран. На 19й присваиваем значение «-4», которое выходит из диапазона значений типа @bit, при этом любое значение которое выходит из диапазона будет превращаться в 1. На 20й строке после присвоения «-4» мы выводим значение переменной @bit. И тут в окошке вывода на 20й строке мы увидим 1. Давайте выполним блок кода с 11й по 20ю строку. Мы присвоили начальное значение «0», вывели на экран и видим что у нас здесь есть ноль. Далее присвоили «1», вывели на экран. Присвоили «4», было неявное преобразование к единице, вывели на экран и получили «1» как последнее значение в окошке вывода. Следующий тип данных это тип данных TinyInt – это целое число без знака в диапазоне от 0 до 255. На 26-й строке мы выводим на экран строку TinyInt, на 28й строке мы объявляем переменную типа TinyInt , которой присваиваем значением «0». 29-я строка выводим на экран значение этой переменной. На 31-й строке присваиваем значение «25», это значение так же не выходит из диапазона значений TinyInt, выводим на экран на 32-й строке, видим что все нормально выводится. На 34-й строке мы переменной типа TinyInt присваиваем значение 256. Это значение уже выходит из диапазона возможных значений для типа TinyInt и тут мы с вами получим ошибку присвоения арифметического переполнения, то есть будет ошибка которая вернем предыдущее значение и на самом деле после выполнения строки 34 переменная TinyInt будет хранить значение 25 а не 256. Давайте выполним с 26-й по 35-ю строку и увидим следующее: было первое присвоение, «0» вывелось на экран, второе – «25» вывелось на экран. А дальше при попытке присвоить 256 мы получили ошибку арифметического переполнения и при последующем выводе значения TinyInt на экран мы получили предыдущее значение, то есть значение «25». Следующие типы данных которые мы рассмотрим это: SmallInt, Int и BigInt они могут хранить так же целое значение в большем диапазоне и с отрицательными значениями. Тип SmallInt это целое со знаком в диапазоне значений от -32 768 до 32 767. На 41-й строке мы вывели значение SmallInt, на 43-й объявили переменную с именем @SmallInt типа SmallInt которому присвоили значение 32767, это значение верхнего диапазона для типа SmallInt. На 44-й строке вывели на экран, на 46-й присвоили значение нижнего диапазона типа SmallInt а на 47-й вывели на экран. Дальше, тип Int и тип BigInt, в принципе работа с этими типами такая же. Обратите внимание на диапазон значений. Теперь давайте разберемся сколько байт в памяти будет занимать той или иной переменной. Если мы будем использовать значение переменной TinyInt то одно значение типа TinyInt будет занимать 1 байт в памяти. Значение типа SmallInt будет занимать 2 байта в памяти, Int займет 4 байта в памяти и BigInt будет занимать 8 байт в памяти. Что касается типа bit то тут немножко все сложнее. На самом деле ядро SQL Server оптимизирует хранение столбцов типа bit. То есть если мы используем поля типа bit в таблице и у нас имеется 8 или меньше столбцов такого типа то они хранятся как 1 байт, если имеется от 9 до 16 столбцов то они хранятся как 2 байта и т.д.

Следующую группу типов данных, которую мы рассмотрим – это группа вещественных типов данных в Т- SQL. И первый тип, который мы рассмотрим из этой группы это тип Float. тип Float можно использовать для числовых данных с плавающей точкой, этот тип является типом приблизительных числовых данных, данных с плавающей точкой. Не все значения из диапазона могут быть отображены точно. Диапазон данных типа Float вы можете видеть на восьмой строке в комментарии. И давайте рассмотрим синтаксис создания переменной типа Float. На 19-й строке мы создаем переменную типа Float и именем @Float и указываем дополнительный параметр. Это параметр N который указывает количество битов используемых для хранения мантиссы числа в формате Float при экспоненциальном представлении. То есть на самом деле этот параметр определяет точность данных и размер для хранения . Значение параметра N должно лежать в диапазоне от 1 до 53. Значение параметра по умолчанию является число 53. При этом если мы будем указывать значение параметра в диапазоне от одного до 24 значит точность нашего числа будет определяться семи знаками и наше число будет занимать 4 байта. Если будем указывать значение параметра в диапазоне от 25 до 53 то точность нашего числа будет определяться 15-ю знаками и наше число будет занимать 15 байт в памяти. Мы создали переменную, присвоили ей значение, вывели её на экран, присвоили новое значение и вывели на экран. Когда мы выполнимся у нас все выводится. Следующий тип который мы рассмотрим это тип Decimal. Тип Decimal может хранить вещественные значения со знаком в диапазоне значений, которые мы видим на 28-й строке нашего кода. При этом, при создании значений типа Decimal мы может указать два доп. Параметра. Первый параметр – Р. Он указывает точность, то есть максимальное количество десятичных разделов числа. Точность может принимать значения от 1 до 38. Второй параметр это масштаб. Масштаб определяет максимальное количество десятичных разрядом справа от десятичной запятой. Масштаб может принимать значения от нуля до значения первого параметра. В нашем случае от 0 до5. То есть первый параметр Р определяет максимальное количество символов из которых может состоять число. Второй параметр определяет какое число символов (цифр) у нас стоит слева от точки. То есть мы отнимем от первого параметра второй то узнаем какое максимальное количество цифр может быть до запятой справа. Давайте использовать переменную этого типа Decimal (5, 3). На 39-й строке созданной нами переменной мы задаем значение 1.42. На 40-й выводим на экран. На 42-й строке присваиваем новое значение этой переменной 2.234654. На 43-й выводим на экран. На 45-й мы хотим присвоить новое значение 41.12345 и на 46-й строке вывести это на экран. Давайте выполним с 35-й по 46-ю строки и выполнимся. И увидим почему этот тип данных является типом данных с фиксированной точкой. Потому что мы указали масштаб 3 и во всех значениях которые мы присвоили переменной Decimal мы видим три символа после точки справа. Что касается последнего значения. Давайте на 45-й строке присваивать какое то число которое содержит более двух цифр перед точкой. Давайте выполним с 35-й по 46-ю строки и мы получим ошибку «Арифметическое переполнение». Почему? Потому что мы указали что точность нашего числа 5 и масштаб 3. Если мы отнимем от 5-ти 3 то получиться 2, а это максимальное количество цифр, которое может быть до точки. Мы используем 3 хотя разрешили использовать только 2. Следующий тип данных это тип SmallMoney и мы не поговорили еще сколько байтов памяти будет занимать значение типа Decimal. Все это будет зависеть от нашей точности. Если будет использовать от 1 до 9-ти то будет резервироваться байт и если от 10-ти до 19-ти то 10 байт; от 20-ти до 28-ми 13 байт и от 29-ти до 38-ми будет резервироваться 15 байт памяти. А теперь давайте наконец-то перейдем к типу SmallMoney. SmallMoney это тип данных который предоставляет денежные значения, то есть валютные значения. Этот тип имеет точность до одной десятичной денежной единицы, которую показывает. Диапазон значений вы видите на 51-й строке. И при использовании такого типа будет резервироваться 4 байта памяти. Давайте выполним блок кода с 53-й по 59-ю строку.

Видим что у нас вводятся значения с фиксированной точкой. То есть после точки у нас есть 2 цифри. Тип Money это еще один тип, который можно использовать для представления денежных значений. У этого типа больший диапазон. И конечно же этот тип использует больше места в памяти. Он будет использовать 10 байт. Так же этот тип предоставляет значение с фиксированной точкой. Если мы выполнимся то увидим что у всех значений, которые мы присваивали переменной этого типа Money у нас идет 2 цифри после точки. Так же давайте рассмотрим категорию типов данных в T-SQL с помощью которых можно хранить строки. Это такие типа как Char, VarChar, NChar и NvarChar. Это 4 основных типа. Типы Charи VarChar символьными типами данных с фиксированной или переменной которая использует кодировка отличимая от кодировки юникод. Что касается типа Char. Тип Char представляет символьные данные с фиксированной длиной не в юникоде, длиной которую мы указываем при указании типа в качестве параметра N. Значение N должно находится в интервале от 1 до 8000 символов. Размер этого типа составляет N байт. То есть если мы создали переменную типа Char на пять символов то значение этой переменной будет занимать 5 байт в памяти. На 13-й строке мы выводим на экран Char, на 15-й мы объявляем переменную типа Char с именем @char на 5 символов и этой переменной присваиваем строковое значение Hello. Выводим это значение на 16-й. На 18-й мы переменной @char присваиваем новое значение, это новое значение, строковой литерал, который имеет больше 5-ти символов и когда мы захотим на 19-й строке вывести значение @char мы увидим что все символы которые идут после пятого будут просто напросто обрезаны. Давайте выполним эту часть кода и видим что у нас вывелось char, так же вывелось Hello и выводиться первых 5 символов из литерала, которой мы присваивали нашу переменную. И тип Char имеет фиксированную длину области памяти, неиспользованная часть которой заполняется пробелами и нулями. ТО есть если мы создадим переменную типа Char с количеством символов например 5 и этой переменной присвоим строковое значение у которого например 2 символа то строка будет содержать два символа, которые вы указали. Все остальные три позиции будут заполнены пробелами.

Следующий тип данных это VarChar. Тип VarChar может хранить в себе символьные данные переменной длины не в юникоде. Так же возможно указание параметра при создании этого типа. Параметр может иметь значение от 1 до 8-ми. Так же возможно значение (max). (max) означает что размер хранения равен 2^31 байт. Размер хранения практически равен длине данных +2 байта. Введенные данные могут иметь длину 0 символов. И вот что касается этой приставке Var. Приставки Var говорят о том что переменная может хранить данные переменной длины. То есть если мы создали переменную типа VarChar на 5 символов и присвоили строковой литерал, который имеет меньше 5-ти символов то эта переменная будет хранить только 2 из этих символов, всех остальных просто не будет. Для использования этих типов есть несколько рекомендаций. Если размер записи данных постоянный то можно использовать тип Char, это первый тип, который мы рассмотрели. Если размеры записей значительно изменяются то используется тип VarChar и если размеры значительно изменяются и может превысить 8000 байт то нужно использовать тип VarChar(max). Следующие типы данных которые мы рассмотрим это NChar и NvarChar. В принципе эти типы данных очень похожи на предыдущие типы данных, то есть Char на NChar и VarChar на NvarChar. Они отличаются диапазоном символов, то есть диапазоном значений, которые можно записать в переменную того или иного типа и отличаются так же тем что все строковые типы данных, которые начинаются с N используют кодировку юникод и одна переменная такого типа будет занимать уже 2 байта.

Один символ в формате юникод занимает 2 байта. Значит диапазон значений NChar от 1 до 4000 символов. И что касается типа NvarChar то можно использовать конкретное значение при указании данного типа при этом максимально значение 4000 символов и можно также использовать тип VarChar(max) при этом будет браться максимальный диапазон символов от 1 до 2^31-1 символов. Также тип NChar предназначен для того чтобы хранить записи постоянной длины в формате юникод. В NvarChar для записей текстового типа переменные длины в формате юникод. В этом примере мы рассмотрим различные типа данных в T-QSL которые позволяют хранить дату и время. Это такие типа как: DateTime, DateTime2, SmallDateTime и DateTimeOffSet, Date, Time. Первый тип который мы рассмотрим из этой группы это будет DateTime. Тип DateTime позволяет хранить позволяет хранить значения от 1 января 1753 года до 31 декабря 9999 года.

Одно значение такого типа будет занимать 4 байта в памяти. И давайте попробуем создать переменную данного типа и присвоить данной переменной какое то значение. На 10-й строке мы выводим строку DateTime на экран, на 15-й строке мы определяем переменную DateTime с именем @datetime, которой присваиваем строковое значение. Вот тут мы используем операцию преобразования типов. Мы понимаем что то значение, которое мы присваиваем нашей переменной это строковое значение, это отдельный тип данных это значение типа данных например типа Char и у нас происходит операция неявного преобразования. При неявном преобразовании мы никаких функций приведения. Так же мы можем использовать и явное преобразование, которое требует использование функции приведения. В T-SQL есть функция приведения, которая называется CAST. Как использовать эту функцию? Мы вызываем нашу функцию и в качестве её параметра мы указываем сперва какое значение мы хотим преобразовать, потом указываем ключевое слово S, и после этого ключевого слова мы указываем какому типу мы хотим преобразовать данное значение. То есть мы явно указываем что нужно взять строковое значение 2007-05-08 12:35:29 .123; нужно взять это значение и преобразовать к типу DateTime. Преобразованное значение нужно вернуть в переменную типа @datetime. На 16-й строке мы выводим на экран значение @datetime. На 18-й строке мы хотим вывести текущую дату и время. Для этого можно пользоваться процедурой CURRENT_TIMESTAMP; Мы вызываем эту процедуру, она возвращает нам значения типа datetime, то есть текущую дату и время. Мы это значение сохраняем в переменной @datetime и на 19-й строке выводим значение данной переменной. Давайте выполнимся.

Выполняемся и видим что действительно что первое значение было преобразовано и выведено на экран. Процедура CURRENT_TIMESTAMP сработала. И можем не использовать явное приведение и у нас так же все будет работать. Не все значения одного типа можно преобразовать к другому типу. Для того что бы знать в каких случаях это можно а в каких нет нам нужно открыть файл нашего урока который называется «Преобразование типов данных». В этой файле нам показано какие типы можно приводить друг к другу а какие нельзя. Тут у нас есть ключ к нашей табличке. Если мы будем видеть зеленый кружек то это будет явное преобразование с помощью функции CAST. Неявное это без использования каких либо функций приведения и т.д. В данном примере, который мы только что рассмотрели, мы преобразовали значение типа Char в значение типа DateTime. Давайте найдем пересечение данных типов. Вот у нас есть DateTime и есть различные строковые типа дынных такие как Char, VarChar, NChar NvarChar. На пересечение всех этих типов мы видим серый кружок. Он говорит о том что можно использовать неявное преобразование что мы и сделали. Кстати есть такие пары типов в которых нельзя производить преобразование. Вот мы видим это такие пары как Time и Date. Нельзя взять время и преобразовать его к дате и наоборот: взять дату и преобразовать ко времени ну и т.д., вы можете пользоваться данной табличкой и посмотреть когда вам нужно узнать какие типы допустимо преобразовывать а какие нет и с помощью каких средств. Давайте вернемся к нашему примеру. И второй тип данных, который мы рассмотрим это тип DateTime2. Этот тип данных определяет дату объединенную со временем в 24-часовом формате. Этот тип данных DateTime2 можно рассматривать как расширение типа DateTime, который мы только что рассматривали. Тип DateTime2 по сравнению с типом DateTime имеет более широкий диапазон дат, более широкую точность и имеет необязательную пользовательскую точность которую можно указывать. Давайте попробуем создать переменную и вывести её на экран. На 29-й строке мы выводим строковое значение DateTime2, на 31-й строке мы создаем переменную типа DateTime2 с именем @datetime2 и указываем параметр для типа, это параметр N, он определяет точность нашего значения, то есть нашего значения времени. Мы создали переменную, взяли строковой литерал, преобразовали в DateTime2 и присвоили значение переменной @datetime2. На 32-й строке вывели на экран значение переменной. На 34-й строке с помощью процедуры CURRENT_TIMESTAMP мы получили текущую дату и время, записали в @datetime2 и на 35-й строке вывели это значение на экран. Давайте выполним с 29-й по 35-ю строки.

Все у нас запускается, все работает и мы видим что у нас 5 десятичных разрядов после точки для указания времени. Следующий тип данных это тип данных SmallDateTime. Тип данных SmallDateTime имеет диапазон значений от 1 января 1900 года до 6 июня 2079 года. Значения этого типа будут занимать 4 байта, точность времени в минутах. На 43-й строке выводим строку SmallDateTime. На 45-й задаем литерал, выводим типа SmallDateTime и сохраняем в переменной с именем @amalldatetime. Тоже самое делаем и с текущей датой и временем и давайте выведем на экран текущее значения даты и времени которые мы получили. Мы получили значения и видим что точность у нас до минут. Следующий тип данных который мы рассмотрим это тип DateTimeOffSet. Этот тип данных определяет дату и время которое записывается с учетом часового пояса в 24-часовом формате. Диапазон значений данного типа от 1 января 1 года до 31 декабря 9999 года. Так же возможно при создании данного типа использовать параметр N, который будет определять точность времени до 100 наносекунд. На 60-й строке выводим значение DateTimeOffSet, на 62-й мы преобразовываем строковой литерал к типу DateTimeOffSet, на 63-й выводим на экран значение переменной @datetimeoffset, на 65-й строке присваиваем текущую дату и время и на 66-й строке выводим это значение на экран. Этот тип данных нужно использовать для приложений, которые должны быть развернуты по всему миру потому как этот тип данных поддерживает часовые пояса которые мы можем указывать как смещение часов и минут. Следующий тип данных это типа данных Date. Этот тип данных может хранить только значения даты в диапазоне от 1 января 1 года до 31 декабря 9999 года. Одно значение данного типа будет занимать 3 байта памяти. Мы создали переменную, задали её значение и вывели её на экран. Давайте выполнимся и увидим что выводится только дата, то есть код (год,месяц,число). А так же есть тип данных, который позволяет хранить только время Time. Этот тип данных записывается с параметром N, который определяет точность до 100 наносекунд. Мы создали значение такого типа, преобразовали строковое значение к типу Time и вывели на экран. Давайте выполнимся и увидим что действительно этот тип данных предоставляет только время без даты. Для хранения произвольных двоичных данных SQL-Server предоставляет два типа данных. Это тип данных Binary и тип данных VarBinary. Столбец или переменная типа Binary может хранить до 8000 байт двоичных данных. Размер столбца указывается явным образом. Пример: Binary(1) как на 15-й строке. Двоичные столбцы всегда заполняются пробелами так что они всегда хранят точное количество байтов определенное для столбца или же переменной. На 13-й строке нашего кода мы выводим строку Binary. На 15-й строке объявляем переменную типа @binary типа Binary на 1 байт и переменной присваиваем значение «16». На 16-й строке выводим на экран значение переменной @binary. Когда мы выполняемся мы видим что действительно в окошко выводится значение этой переменной и оно выводится в 16-тиричном формате. Дальше VarBinary. Столбец или же переменная типа VarBinary хранит двоичные данные с переменной вплоть до заданного размера. Например столбец VarBinary(12) как у нас в примере может хранить любое количество данных в диапазоне от 0 до 12-ти. Тип VarBinary ограничен 8000 байт. Тип данных VarBinary(max) может хранить до 2^31 байт данных. На 27-й строке мы выводим на экран строку VarBinary. На 29-й строке объявляем переменной тип VarBinary(12) на 12 байтов с именем переменной @varbibary. присваиваем нашей переменной некоторое значение и на 30-й строке выводим это значение на экран. В последнем примере нашего урока мы попробуем создать БД, в которой попробуем разместить таблицу в которой будем хранить какие то данные. БД SQL-Server представляют собой группу файлов, которые хранятся на жестком диске. Как правило, даже простейшая БД имеет хотя бы два файла, которые хранятся на жестком диске. Это первичный файл, который содержит сами данные, которые организованы в таблицы. Этот файл имеет расширение *.mdf. Второй файл это файл журнала транзакций. Этот файл имеет расширение *.ldf и он функционирует как постоянное резервное копирование для нашей БД. Теперь давайте попробуем создать собственную БД. Для этого нам потребуется два этих файла. Есть два способа создать БД: использовать визуальные средства Management Studio или же создать скрип T-SQL и выполнить его. Мы не ищем легких путей потому выберем второй вариант.

Для того чтобы создать базу данных нам нужно будет использовать инструкцию CREATE. После слова CREATE на 6-й строке мы указываем что будем создавать базу данных CREATE DATABASE. После чего нам нужно указать имя нашей БД. Наша БД будет иметь имя Shopdb. Дальше нам потребуется задать параметры первичного файла в нашей БД и после чего нам нужно будет указать параметр для файла журнала транзакций. Параметры первичного файла задаются в круглых скобках после ключевого слова ON. Параметр для файла журнала транзакций располагается в круглых скобках после ключевого слова LOG ON. Для наших файлов мы будем задавать следующие параметры: NAME, FILENAME, SIZE, MAXSIZE и FILEGROWTH. NAME это параметр, который который указывает логическое имя БД, которое будет применятся для ссылки на неё из кода T-SQL. FILENAME это имя и путь к БД, которая будет хранится у нас на жестком диске.

SIZE это начальный размер нашей БД. MAXSIZE это максимальный размер до которого может расти наша БД. И FILEGROWTH это параметр который задает значение приращения нашего файла БД. Нашу БД мы будем располагать на диске D в файлах Shopdb.mdf и Shopdb.ldf . Давайте выделим блок кода с 6-й по 23-ю строку, нажмем «EXECUTE» и тем самым мы уже создали БД. Теперь давайте в этой БД создадим таблицу, в которой непосредственно можно хранить какие-то данные. Перед тем как создавать таблицу в БД к ней нужно подключиться. Каким образом проверить к какой БД в данный момент мы подключены? Для этого нужно посмотреть на строку состояния, которую мы видим в нижней части окна Management Studio, это желтая полоса, которая говорит о том что в данный момент мы подключены к БД «master», это системная БД, но мы хотим создавать нашу таблицу в БД Shopdb. Что бы подключиться к БД нужно использовать инструкцию USE Shopdb. Выполняем 43-ю строку и тем самым подключаемся к БД «Shopdb». Дольше мы можем создавать таблицу в нашей БД. Таблица как и любой другой объект БД создается с помощью инструкции CREATE. Мы указываем что мы создаем таблицу с именем MyFriends. Далее мы помним что таблица состоит из столбцов. Столбцы указывают схему нашей таблице и говорят какие данные хранят в таблице. Давайте определим схему для нашей таблицы. В нашей таблице мы будем хранить 5 полей. Это поле FriendId, FirstName, LastName, BirthDate и PhoneNumber. Давайте теперь рассмотрим создание каждого из этих полей. Для создания поле нужно указать его имя, его тип данных и параметр который допускает или не допускает пустых значений. На 59-й строке мы создали поле FriendId, которое будет хранить данные типа SmallInt и также наше поле не может хранить пустых значений что мы указали конструкцией NOT NULL. Так же наше поле будет автоинкрементировано и об этом свидетельствует ключевое слово Identity. Поле с автоинкрементном не предназначении для заполнения пользователем. Это поле будет заполнятся автоматически нашим сервером. Посмотрим это на примере.

Создадим таблицу и попробуем ее заполнить. На 60-й строке мы создаем еще одно поле с именем FIRSTNAME. Это поле VarChar на 20 символов, которое не допускает значений NULL. У нас так же есть LASTNAME типа VarChar на 20 символов, которое допускает пусте значения. На 62-й строке у нас есть поле BirthDate с типом Date, которое также допускает пустое значения. И в конце концов у нас есть поле с именем PhoneNumber типа Char на 10 символов, которое не допускает значений NULL. Давайте создадим нашу табличку MyFriends. Я выполняю блок кода с 55-й по 65-ю строку. Я создал таблицу и давайте это проверим. Для того что бы проверить таблицу в нашей БД нам нужно найти вкладку Object Explorer нашего сервера. Эта вкладка позволяет увидеть какие объекты есть в наших БД. Нас сейчас интересует БД Shopdb. Ее сейчас нет, но на самом деле она есть. Нужно просто обновить каталог нашего сервера. Обновляю этот каталог и у нас появляется БД Shopdb. И в категории Tables нашей БД Shopdb у нас есть таблица с именем MyFriends. Это та табличка, которую я создал. Если развернуть папку colums нашей таблицы я увижу что действительно есть колонки которые я создавал. Теперь давайте попробуем заполнить нашу табличку. Для заполнения таблиц данных можно пользоваться как инструкциями T-SQL так и визуальными средствами MS. Ну пока что мы это сделаем с помощью визуальных средств MS. Для этого нужно выбрать табличку, правый клик по табличке и выбрать пункт меню «Edit Top 200 Rows» и появится окошко, в котором я могу без проблем визуально заполнять мою таблицу. Ну и давайте начнем это делать. Итак, я хочу заполнить поле FriendId.

Я пробую его заполнить но у меня ничего не получается потому что поле с автоинкрементном и сервер сам будет выбирать значения для этого поля. Поэтому я начну с заполнения поля FirstName. Давайте дадим нашему другу имя Alex, фамилию Petrov , дату рождения 01.01.2012 и дадим номер телефона 201245789. Переходим на следующую строку и видим что я добавил эту строку в таблицу при этом в поле FriendId, первой строке моей таблицы автоматически было сгенерировано значение 1 . Давайте добавим еще одну строку для нашей таблицы. Давайте для нашего нового друга Petr Ivanov допустим не будем давать дату рождения. Перехожу к следующей строке и у меня действительно есть друг у которого не указана дата рождения. Почему это возможно? Дело в том что когда мы создавали таблицу мы указали что поле BirthDay может хранить пустые значения что мы и доказали. Давайте создадим еще одного друга которому не будем указывать имя. Я добавляю еще одного друга с фамилией Alexandrov, с датой рождение и с номером телефона 012457856. И у меня не получается добавить эту строку потому что при создании таблицы я указал что у всех моих друзей обязательно должно быть имя. ТО есть я не могу добавить строку в таблицу, у которой в поле FirstName будет пусто поэтому его нужно будет чем то заполнить, а чем серверу в принципе все равно что это не то значение которое должно быть.

© 2017 ITVDN, все права защищены