Где применяется sql. SQL: универсальный язык для работы с базами данных. Выбор базы данных для использования

У всех есть мнение относительно того, как писать код TSQL: по форматированию, присвоению переменных, системным функциям, стандартам ANSI или любым другим вопросам. И эти мнения могут существенно отличаться друг от друга, о чем свидетельствует множество сообщений на форумах и горячих дискуссий в комментариях к статьям. Но большинство согласится с тем, что хорошо читаемый и высокопроизводительный код является лучшим решением для всех. Конечно, вся загвоздка в том, как достичь этого.

Лучше всего начать с создания набора стандартов, которые помогут определиться разработчикам T-SQL , а затем ссылаться на них при построении решений. Таким образом, стандарты помогают устранить различия и работать в направлении общей цели.

В этой статье я детально остановлюсь на общих принципах, которые могут применяться к коду, независимо от типов операторов T-SQL . В ней охватываются такие вопросы, как форматирование, системные функции, устаревшие элементы языка и определяемые пользователем переменные.

Читаемость и другие аспекты

О форматировании TSQL написано немало статей. Иногда в определенный момент нужно просмотреть большую часть кода, понять, что делает код, не говоря уже о выявлении потенциальных проблем.

В качестве примера возьмем операторы USE и SELECT , которые написаны строчными буквами, без разделителей строк или пробелов, кроме тех случаев, когда это необходимо:

use adventureworks2014 go select emp.businessentityid empid,psn.firstname,psn.lastname,emp.sickleavehours sickleave,emp.nationalidnumber natid,emp.JobTitle from humanresources.employee emp inner join person.person psn on emp.businessentityid=psn.businessentityid where emp.jobtitle="production technician - wc60" or emp.jobtitle="production technician - wc50" order by emp.JobTitle desc,EmpID asc

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

USE ADVENTUREWORKS2014 GO SELECT EMP.BUSINESSENTITYID EMPID,PSN.FIRSTNAME,PSN.LASTNAME,EMP.SICKLEAVEHOURS SICKLEAVE,EMP.NATIONALIDNUMBER NATID,EMP.JOBTITLE FROM HUMANRESOURCES.EMPLOYEE EMP INNER JOIN PERSON.PERSON PSN ON EMP.BUSINESSENTITYID=PSN.BUSINESSENTITYID WHERE EMP.JOBTITLE="PRODUCTION TECHNICIAN - WC60" OR EMP.JOBTITLE="PRODUCTION TECHNICIAN - WC50" ORDER BY EMP.JOBTITLE DESC,EMPID ASC

Это вполне допустимо. Но невозможно прочесть. Представьте, что вам нужно просмотреть скрипт, содержащий сотни строк такого кода.

Даже код TSQL convert , который намного лучше этого, может быть сложен для понимания, если он непоследователен или организован случайным образом. Но посмотрите, что происходит, когда мы разбиваем оператор TSQL SELECT на несколько строк, вставляем отдельные элементы, ключевые слова пишем заглавными буквами и добавляем комментарии для пояснения оператора:

/* Извлекаем данные технических сотрудников WC60 и WC50. */ USE AdventureWorks2014; GO SELECT emp.BusinessEntityID AS EmpID, psn.FirstName, psn.LastName, emp.SickLeaveHours AS SickLeave, emp.NationalIDNumber AS NatID, emp.JobTitle FROM HumanResources.Employee AS emp INNER JOIN Person.Person AS psn ON emp.BusinessEntityID = psn.BusinessEntityID WHERE (emp.JobTitle = "Production Technician - WC60") OR (emp.JobTitle = "Production Technician - WC50") ORDER BY emp.JobTitle DESC, EmpID ASC;

Этот код намного легче рассматривать, чем тот, который был приведен в примерах выше. Продуманное использование разрывов строк, пробелов, заглавных букв и отступов облегчает понимание кода T-SQL , особенно когда все следуют тем же стандартам.

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

Принимая решение, как быть с этими элементами, необходимо тщательно все взвесить. В зависимости от конкретного случая могут быть веские доводы как за, так и против использования определенного подхода. Убедитесь, что вы принимаете во внимание все эти мелкие детали. Например, нужно ли добавлять пробел по обе стороны от оператора сравнения, когда и как делать отступ или где поместить запятые в выборке.

Перейдем к комментариям, которые представляют собой простой и эффективный механизм для описания того, что происходит в коде. В том числе и в TSQL case . Размещенные надлежащим образом комментарии могут сэкономить время и даже указать на несоответствия. Даже если вы просматриваете собственный код, то оцените комментарии, оформленные надлежащим образом, особенно если вы написали этот код несколько лет назад.

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

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

Лучшей практикой считается добавление точки с запятой в конце операторов. Хотя в большинстве случаев для SQL Server она не обязательна, в Microsoft предупреждают, что точка с запятой нужна. Это уже стало частью стандартов ANSI .

Старайтесь избегать использования команд GOTO . Это может затруднить проверку кода, особенно если много.

Наша задача состоит в том, чтобы разработать способ последовательного форматирования и представления кода T-SQL , сделать его читаемым, понятным и поддерживаемым.

Написание правильного кода

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

Часто встречающийся пример устаревшего кода — это объединение, основанное на стандарте SQL-92 , в котором условие объединения определено в выражении WHERE , как показано в следующем примере:

SELECT emp.BusinessEntityID AS EmpID, psn.FirstName, psn.LastName, emp.NationalIDNumber AS NatID FROM HumanResources.Employee emp, Person.Person psn WHERE emp.BusinessEntityID = psn.BusinessEntityID AND emp.JobTitle = "Production Technician - WC60";

Хотя SQL Server по-прежнему поддерживает такой подход, но все равно необходимо придерживаться новой модели, которая должна включать условие объединения в выражении FROM :

Гораздо легче выбрать условие объединения, если оно не спрятано в выражении WHERE с несколькими другими условиями.

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

Другой пример устаревшего кода, когда оператор T-SQL включает выражение TOP . В прошлом мы указывали числовое выражение без круглых скобок, как в этом примере:

SELECT TOP 10 Title, FirstName, LastName FROM Person.Person; Хотя это все еще работает в SQL Server, правильный синтаксис теперь включает в себя круглые скобки: SELECT TOP(10) Title, FirstName, LastName FROM Person.Person;

Команда, занимающаяся базой данных, должна активно работать над заменой устаревшего кода. Многие T-SQL и ANSI SQL-элементы уже устарели или могут устареть в будущем. С учетом того, как быстро меняются стандарты, скорее всего, у вас есть устаревшие элементы в коде. Например, в SQL Server 2016 параметр SET ROWCOUNT устарел для операторов TSQL INSERT , UPDATE и DELETE . Так же есть типы данных text , ntext и image . Даже такие операторы, как CREATE DEFAULT и DROP DEFAULT когда-нибудь устареют.

Когда вы определяете стандарты кодирования, не забудьте указать, как поступать с устаревшими элементами. Легко сказать, что разработчики должны их избегать, но этого тяжело добиться. Поэтому нужно объяснить, когда и как их следует удалять. К счастью, Microsoft предоставляет сведения о том, что устаревает с выходом каждой новой версии SQL Server . Вы найдете список этих элементов в разделе Deprecated Database Engine Features in SQL Server 2016 .

Теперь посмотрим на другой пример сомнительного кода. Следующий оператор выбора делает то, что не должен — оператор сравнения (не равно ) использован для значения NULL :

Несмотря на то, что таблица содержит строки со значением Title NULL , этот оператор не возвращает строки и не возвращает ошибку. Если вы не будете внимательны, то можете получить неверные результаты. По этой причине следует избегать такого типа конструкции и вместо них использовать оператор IS NULL или IS NOT NULL для возвращения правильных строк:

Это всего лишь один пример из множества, в которых разработчики могут столкнуться с проблемами при работе со значениями NULL и TSQL проверке на NULL . Возможно, вы захотите описать более распространенные ошибки в своих стандартах.

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

SELECT EmpID = emp.BusinessEntityID, psn.FirstName, psn.LastName, NatID = emp.NationalIDNumber FROM HumanResources.Employee emp INNER JOIN Person.Person psn ON emp.BusinessEntityID = psn.BusinessEntityID WHERE emp.JobTitle = "Production Technician - WC60";

Другой подход заключается в добавлении псевдонима в конце через необязательное ключевое слово AS :

SELECT emp.BusinessEntityID AS EmpID, psn.FirstName, psn.LastName, emp.NationalIDNumber AS NatID FROM HumanResources.Employee emp INNER JOIN Person.Person psn ON emp.BusinessEntityID = psn.BusinessEntityID WHERE emp.JobTitle = "Production Technician - WC60";

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

Еще один вопрос, который стоит рассмотреть, использование недокументированных хранимых процедур. Например, следующий оператор SELECT используется хранимой процедурой sp_mstablespace для возврата количества строк и объема дискового пространства, используемого таблицей Person . Пример TSQL exec :

EXECUTE sp_mstablespace "person.person";

Хранимые процедуры прекрасно работают и могут быть очень удобны. Но нет никакого способа узнать, когда Microsoft изменит или выведет их полностью. Созданный вами код может быть сломан, а вы даже не узнаете об этом.

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

Несоответствие функций

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

Например, функция ISNUMERIC печально известна тем, что возвращает непредсказуемые результаты, что продемонстрировано в приведенном ниже примере:

DECLARE @a TABLE(ColA VARCHAR(10)); INSERT INTO @a VALUES ("abc"), ("123"), ("$456"), ("22:35:27"); SELECT ColA, CASE WHEN ISNUMERIC(ColA) = 1 THEN CAST(ColA AS INT) END AS TestResults FROM @a;

Мы создаем переменную таблицы TSQL и заполняем ее разными типами значений, которые передаются в виде строк. Затем используем функцию ISNUMERIC для проверки, является ли значение числовым. Если это так (функция возвращает 1 ), пытаемся преобразовать значение в тип данных INT . Но в данном случае, когда ядро базы данных достигает значения $456 , оно сбрасывается и возвращается сообщение об ошибке:

Conversion failed when converting the varchar value "$456" to data type int.

Проблема заключается в том, что функция ISNUMERIC иногда вызывает числовое значение, которое не может быть преобразовано в числовой тип данных, как для $456 . Она даже интерпретирует такие значения, как 7e9 и $. , как числовые. Лучшим решением данной проблемы является использование функции TRY_CONVERT :

DECLARE @a TABLE(ColA VARCHAR(10)); INSERT INTO @a VALUES ("abc"), ("123"), ("$456"), ("22:35:27"); SELECT ColA, CASE WHEN TRY_CONVERT(int, ColA) IS NOT NULL THEN CAST(colA AS INT) END AS TestResults FROM @a;

Преобразование данных является довольно сложным разделом в SQL Server , поэтому вы должны быть внимательны.

При работе с системными функциями вам придется иметь дело с различными функциями, которые могут использоваться для выполнения аналогичных операций или могут возвращать похожие типы информации. Например, можно использовать функцию CAST или CONVERT для преобразования типа данных значения. Функция CAST является частью стандартов ANSI , но имеет ограниченные возможности.

Функция TSQL CONVERT не предусмотрена стандартами, но она предоставляет ряд параметров для форматирования значений даты и времени. Хотя во многих случаях лучше оставить форматирование на уровне приложений. Независимо от этого нужно будет принять решение, какие из функций использовать, и насколько важно для вас соответствие кода стандартам ANSI .

Другим примером взаимозаменяемых функций являются COUNT и EXISTS , когда они используются для подтверждения существования определенных данных. Например, следующий оператор IF проверяет, содержит ли таблица Person строки, имеющие значение EM в столбце PersonType :

Хотя этот оператор работает отлично, можно увеличить производительность, использовав функцию EXISTS , особенно для больших наборов данных:

Неправильное использование функции — это не всегда проблема функции. Например, в зависимости от ситуации использование функции SCOPE_IDENTITY() выдает более точную информацию, чем системная переменная @@IDENTITY . В обоих случаях возвращается последнее значение идентификатора, сгенерированное для таблицы в текущей сессии. Но функция SCOPE_IDENTITY() применяется только к определенной области, а переменная @@ IDENTITY этого не делает, что может влиять на правильность возвращаемого значения. Дополнительные сведения об этой проблеме вы найдете в разделе документации SQL Server SCOPE_IDENTITY (Transact-SQL) .

Использование системных функций TSQL не должно быть произвольным. Необходимо тщательно взвесить, какие из них задействовать.

Переменные и параметры

Рассмотрим простой пример, демонстрирующий некоторые из проблем, которые могут возникнуть:

DECLARE @a INT, @b VARCHAR(25), @c VARCHAR(2), @d VARCHAR, @e MONEY; SET @a = 25; SET @b = "twenty-five"; SELECT @c = "EM", @e = 25; SELECT @a AS "@a", @c AS "@c", @d AS "@d", @e AS "@e", @f AS "@f";

В этом коротком наборе операторов T-SQL нам удалось зафиксировать ряд ошибок:

  • Мы объявляем переменную @b и присваиваем ей значение, но никогда не используем ее в операторе SELECT ;
  • Мы объявляем @c с типом данных VARCHAR(2) , а не с типом CHAR(2) ;
  • Мы объявляем @d как VARCHAR , без указания длины, и не присваиваем переменной значение. Затем мы используем переменную в операторе SELECT ;
  • Мы используем @f в выражении SELECT , хотя не объявили ее и не присвоили ей значение.

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

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

  • Основы реляционных баз данных

    В этой главе… | Организация информации | Что такое база данных | Что такое СУБД | Сравнение моделей баз данных | Что такое реляционная база данных

  • Основы SQL

    В этой главе… | Что такое SQL | Заблуждения, связанные с SQL | Взгляд на разные стандарты SQL | Знакомство со стандартными командами и зарезервированными словами SQL | Представление чисел, символов, дат, времени и других типов данных | Неопределенные значения и ограничения

  • Компоненты SQL

    В этой главе… | Создание баз данных | Обработка данных | Защита баз данных | SQL - это язык, специально разработанный, чтобы создавать и поддерживать данные в реляционных базах. И хотя компании, поставляющие системы для управления такими базами, предлагают свои реализации SQL, развитие самого языка определяется и контролируется стандартом ISO/ANSI.

  • Создание и поддержка простой базы данных

    В этой главе… | Создание, изменение и удаление таблицы из базы данных с помощью инструмента RAD. | Создание, изменение и удаление таблицы из базы данных с помощью SQL. | Перенос базы данных в другую СУБД.

  • Создание многотабличной реляционной базы данных

    В этой главе… | Что должно быть в базе данных | Определение отношений между элементами базы данных | Связывание таблиц с помощью ключей | Проектирование целостности данных | Нормализация базы данных | В этой главе будет представлен пример создания многотабличной базы данных.

  • Манипуляции данными из базы

    В этой главе… | Работа с данными | Получение из таблицы нужных данных | Вывод информации, выбранной из одной или множества таблиц | Обновление информации, находящейся в таблицах и представлениях | Добавление новой строки в таблицу

  • Определение значений

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

  • Сложные выражения со значением

    В этой главе… | Использование условных выражений case | Преобразование элемента данных из одного типа данных в другой | Экономия времени ввода данных с помощью выражений со значением типа запись | В главе 2 SQL был назван подъязыком данных.

  • "Пристрелка" к нужным данным

    В этой главе… | Указание требуемых таблиц | Отделение нужных строк от всех остальных | Создание эффективных предложений where | Как работать со значениями null | Создание составных выражений с логическими связками | Группирование вывода результата запроса по столбцу

  • Реляционные операторы

    В этой главе… | Объединение таблиц, имеющих похожую структуру | Объединение таблиц, имеющих разную структуру | Получение нужных данных из множества таблиц | SQL - это язык запросов, используемый в реляционных базах данных.

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

    В этой главе… | Извлечение данных из множества таблиц с помощью одного оператора SQL | Поиск элементов данных путем сравнения значения из одной таблицы с набором значений из другой | Поиск элементов данных путем сравнения значения из одной таблицы с выбранным с помощью оператора select единственным значением из другой

  • Рекурсивные запросы

  • Обеспечение безопасности базы данных

    В этой главе… | Управление доступом к таблицам базы данных | Принятие решения о предоставлении доступа | Предоставление полномочий доступа | Аннулирование полномочий доступа | Предотвращение попыток несанкционированного доступа

  • Защита данных

    В этой главе… | Как избежать повреждения базы данных | Проблемы, вызванные одновременными операциями | Решение этих проблем с помощью механизмов SQL | Задание требуемого уровня защиты с помощью команды set transaction

  • Использование SQL в приложениях

    В этой главе… | SQL в приложении | Совместное использование SQL с процедурными языками | Как избежать несовместимости | Код SQL, встроенный в процедурный код | Вызов модулей SQL из процедурного кода | Вызов SQL из RAD-инструмента | В предыдущих главах мы в основном рассматривали SQL-команды в отдельности, т.е. формулировалась задача обработки данных, и под нее создавался SQL-запрос.

  • ODBC и JDBC

    В этой главе… | Определение ODBC | Описание частей ODBC | Использование ODBC в среде клиент/сервер | Использование ODBC в Internet | Использование ODBC в локальных сетях | Использование JDBC | С каждым годом компьютеры одной организации или нескольких различных организаций все чаще соединяются друг с другом. Поэтому возникает необходимость в налаживании совместного доступа к базам данных по сети.

  • SQL:2003 и XML

    В этой главе… | Использование SQL с XML | XML, базы данных и Internet | Одной из самых существенных новых функциональных возможностей языка SQL:2003 является поддержка файлов XML (extensible Markup Language - расширяемый язык разметки), которые все больше становятся универсальным стандартом обмена данными между разнородными платформами.

  • Курсоры

    В этой главе… | Определение области действия курсора в операторе declare | Открытие курсора | Построчная выборка данных | Закрытие курсора | SQL отличается от большинства наиболее популярных языков программирования тем, что в нем операции производятся одновременно с данными всех строк таблицы, в то время как процедурные языки обрабатывают данные построчно.

  • Всем привет! Сегодня я максимально просто, специально для начинающих, попытаюсь рассказать Вам о том, что такое SQL , и для чего он нужен. Из данного материала Вы также узнаете, что такое база данных и система управления базами данных, а также что такое диалект языка SQL, ведь вся статья будет построена на том, чтобы плавно подвести Вас к пониманию того, что же такое SQL.

    Я думаю, Вы уже представляете себе, что SQL — это некий язык, связанный с какими-то там базами данных, однако для того, чтобы лучше понимать, что же такое SQL, необходимо понять, для чего нужен SQL, для чего нужен этот язык, т.е. его назначение.

    Поэтому сначала я дам Вам немного вводной информации, из которой будет ясно назначение языка SQL, и для чего он вообще нужен.

    Что такое база данных

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

    Реляционная база данных – это упорядоченная информация, связанная между собой определёнными отношениями. Представлена она в виде таблиц, в которых и лежит вся эта информация. И это очень важно, так как теперь Вы должны представлять себе современную базу данных просто в виде таблиц (если говорить в контексте SQL ), т.е. в общем смысле база данных – это набор таблиц. Безусловно, это сильно упрощенное определение, но оно дает некое практическое понимание базы данных.

    Что такое SQL

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

    И тут возникает главный вопрос: а как к ней обратиться и получить необходимую нам информацию?

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

    SQL (Structured Query Language ) — язык структурированных запросов, с помощью него пишутся специальные запросы (так называемые SQL инструкции ) к базе данных с целью получения данных из базы данных или для манипулирования этими данными.

    Также обязательно стоит отметить и то, что база данных, и в частности реляционная модель, основана на теории множеств, которая подразумевает объединение разных объектов в одно целое, под одним целым в базе данных как раз и имеется в виду таблица. Это важно, так как язык SQL работает именно со множеством, с набором данных, т.е. с таблицами.

    Полезные материалы по теме:

    • Создание базы данных в Microsoft SQL Server – инструкция для новичков ;
    • Добавление данных в таблицы в Microsoft SQL Server – инструкция INSERT INTO .

    Что такое СУБД

    У Вас может возникнуть вопрос, если база данных это некая информация, которая хранится в таблицах, то как она выглядит физически? Как на нее посмотреть в целом?

    Если очень коротко, то это просто файл, созданный в специальном формате, именно так и выглядит база данных (в большинстве случаев БД включает несколько файлов, но сейчас на этом уровне это не так важно ).

    Идем дальше, если база данных это файл в специальном формате, то как его создать или открыть? И тут возникает сложность, ведь просто так, без каких-либо инструментов создать такой файл, т.е. реляционную базу данных, нельзя, для этого нужен специальный инструмент, который мог бы создавать и управлять базой данных, иными словами, работать с этими файлами.

    Таким инструментом как раз и выступает СУБД – это система управления базами данных , сокращенно СУБД.

    Какие СУБД бывают

    На самом деле, существует достаточно много различных СУБД, некоторые из них платные и стоят немалых денег, если говорить о полнофункциональных версиях, но даже у самых, так скажем, «крутых» есть бесплатные редакции, которые, кстати, отлично подходят для обучения.

    Среди всех по своим возможностям и популярности можно выделить следующие системы:

    • Microsoft SQL Server – это система управления базами данных от компании Microsoft. Она очень популярна в корпоративном секторе, особенно в крупных компаниях. И это не просто СУБД – это целый комплекс приложений, позволяющий хранить и модифицировать данные, анализировать их, осуществлять безопасность этих данных и многое другое;
    • Oracle Database – это система управления базами данных от компании Oracle. Это также очень популярная СУБД, и также среди крупных компаний. По своим возможностям и функциональности Oracle Database и Microsoft SQL Server сопоставимы, поэтому являются серьезными конкурентами друг другу, и стоимость их полнофункциональных версий очень высока;
    • MySQL – это система управления базами данных также от компании Oracle, но только она распространяется бесплатно. MySQL получила очень широкую популярность в интернет сегменте, т.е. именно на MySQL работают чуть ли не все сайты в интернете, иными словами, большинство сайтов в интернете используют эту СУБД как средство хранения данных;
    • PostgreSQL – эта система управления базами данных также является бесплатной, и она очень популярна и функциональна.

    Полезные материалы по теме:

    • Установка Microsoft SQL Server 2016 Express – пример установки бесплатной редакции Microsoft SQL Server на Windows;
    • Установка Microsoft SQL Server 2017 Express на Ubuntu Server – пример установки бесплатной редакции Microsoft SQL Server на Linux;
    • Установка PostgreSQL 11 на Windows – пример установки PostgreSQL на Windows;
    • Установка MySQL на Windows – пример установки MySQL на Windows;
    • Установка и настройка MySQL на Linux Mint – пример установки MySQL на Linux;
    • Установка Oracle Database Express Edition 11g – пример установки бесплатной редакции Oracle на Windows (статья писалась давно, но все равно будет полезной ).

    Диалекты языка SQL (расширения SQL)

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

    Вот некоторые диалекты языка SQL:

    • Transact-SQL (сокращенно T-SQL) – используется в Microsoft SQL Server;
    • PL/SQL (Procedural Language / Structured Query Language) – используется в Oracle Database;
    • PL/pgSQL (Procedural Language/PostGres Structured Query Language) – используется в PostgreSQL.

    Таким образом, от СУБД зависит, на каком расширении Вы будете писать SQL инструкции. Если говорить о простых SQL запросах, например,

    SELECT ProductId, ProductName FROM Goods

    то, безусловно, во всех СУБД такие запросы работать будут, ведь SQL — это стандарт.

    Примечание! Это простой SQL запрос на выборку данных из одной таблицы, выводятся два столбца.

    Однако если Вы собираетесь программировать, использовать все внутренние возможности СУБД (разрабатывать процедуры, использовать встроенные функции, получать системную информацию и т.д. ), то Вам необходимо изучать конкретный диалект SQL и практиковаться соответственно в той СУБД, в которой используется этот диалект. Это важно, ведь синтаксис многих конструкций различается так же, как различаются возможности и многое другое. И если, допустим, Вы запустите SQL инструкцию, в которой использованы возможности определенного расширения SQL, на другой СУБД, то такая инструкция, конечно же, не выполнится.

    Например, лично я специализируюсь на языке T-SQL, и соответственно, работаю с Microsoft SQL Server, вот уже более 8 лет!

    Хотя, конечно же, с другими СУБД я также работал, одно время я сопровождал два приложения, одно из которых работало с PostgreSQL, ну а второе, наверное, уже понятно, с Microsoft SQL Server.

    С MySQL я работал, как, наверное, и многие, в рамках сопровождения сайтов и сервисов. Ну а с Oracle Database мне приходилось работать в рамках других проектов.

    Весь свой накопленный опыт в части языка T-SQL я сгруппировал в одном месте и оформил в виде книг, поэтому, если у Вас есть желание изучить язык Transact-SQL (T-SQL), рекомендую почитать мои книги:

    • Путь программиста T-SQL – самоучитель по языку Transact-SQL для начинающих. В ней я подробно рассказываю обо всех конструкциях языка и последовательно перехожу от простого к сложному. Подходит для комплексного изучения языка T-SQL;
    • Стиль программирования на T-SQL – основы правильного написания кода. Книга, направленная на повышение качества T-SQL кода (для тех, кто уже знаком с языком T-SQL, т.е. знает хотя бы основы ).

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

    В предыдущих двух статьях данного цикла, опубликованных в № 6 и 7 нашего журнала, мы рассмотрели различные механизмы доступа к данным, включая ADO, BDE и их альтернативы. Теперь мы знаем, как выбрать технологию доступа к данным для той или иной пары «СУБД - средство разработки».

    Располагая технологией доступа к данным, можно наконец подумать и о том, каким образом следует манипулировать самими данными и метаданными. Способы манипуляции могут быть специфичными для данной СУБД (например, использование объектов клиентской части этой СУБД для доступа к объектам баз данных) или для данного механизма доступа к данным. Тем не менее существует более или менее универсальный способ манипуляции данными, поддерживаемый почти всеми серверными реляционными СУБД и большинством универсальных механизмов доступа к данным (в том числе при использовании их совместно с настольными СУБД). Этот способ - применение языка SQL (Structured Query Language - язык структурированных запросов). Ниже мы рассмотрим назначение и особенности этого языка, а также изучим, как с его помощью извлекать и суммировать данные, добавлять, удалять и модифицировать записи, защищать данные от несанкционированного доступа, создавать базы данных. Для более подробного изучения SQL мы можем порекомендовать книги Мартина Грабера «Введение в SQL» (М., Лори, 1996) и «SQL. Справочное руководство» (М., Лори, 1997).

    Введение

    Structured Query Language представляет собой непроцедурный язык, используемый для управления данными реляционных СУБД. Термин «непроцедурный» означает, что на данном языке можно сформулировать, что нужно сделать с данными, но нельзя проинструктировать, как именно это следует сделать. Иными словами, в этом языке отсутствуют алгоритмические конструкции, такие как метки, операторы цикла, условные переходы и др.

    Язык SQL был создан в начале 70-х годов в результате исследовательского проекта IBM, целью которого было создание языка манипуляции реляционными данными. Первоначально он назывался SEQUEL (Structured English Query Language), затем - SEQUEL/2, а затем - просто SQL. Официальный стандарт SQL был опубликован ANSI (American National Standards Institute - Национальный институт стандартизации, США) в 1986 году (это наиболее часто используемая ныне реализация SQL). Данный стандарт был расширен в 1989 и 1992 годах, поэтому последний стандарт SQL носит название SQL92. В настоящее время ведется работа над стандартом SQL3, содержащим некоторые объектно-ориентированные расширения.

    Существует три уровня соответствия стандарту ANSI - начальный, промежуточный и полный. Многие производители серверных СУБД, такие как IBM, Informix, Microsoft, Oracle и Sybase, применяют собственные реализации SQL, основанные на стандарте ANSI (отвечающие как минимум начальному уровню соответствия стандарту) и содержащие некоторые расширения, специфические для данной СУБД.

    Более подробную информацию о соответствии стандарту версии SQL, используемой в конкретной СУБД, можно найти в документации, поставляемой с этой СУБД.

    Как работает SQL

    Давайте рассмотрим, как работает SQL. Предположим, что имеется база данных, управляемая с помощью какой-либо СУБД. Для извлечения из нее данных используется запрос, сформулированный на языке SQL. СУБД обрабатывает этот запрос, извлекает запрашиваемые данные и возвращает их. Этот процесс схематически изображен на рис. 1 .

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

    Обратите внимание на то, что SQL сам по себе не является ни СУБД, ни отдельным продуктом. Это язык, применяемый для взаимодействия с СУБД и являющийся в определенном смысле ее неотъемлемой частью.

    Data Definition Language (DDL)

    Data Definition Language содержит операторы, позволяющие создавать, изменять и уничтожать базы данных и объекты внутри них (таблицы, представления и др.). Эти операторы перечислены в табл. 1.

    Таблица 1

    Оператор

    Описание

    Применяется для добавления новой таблицы к базе данных

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

    Применяется для изменения структуры имеющейся таблицы

    Применяется для добавления нового представления к базе данных

    Применяется для удаления представления из базы данных

    Применяется для создания индекса для данного поля

    Применяется для удаления существующего индекса

    Применяется для создания новой схемы в базе данных

    Применяется для удаления схемы из базы данных

    Применяется для создания нового домена

    Применяется для переопределения домена

    Применяется для удаления домена из базы данных

    Data Manipulation Language (DML)

    Data Manipulation Language содержит операторы, позволяющие выбирать, добавлять, удалять и модифицировать данные. Обратите внимание на то, что эти операторы не обязаны завершать транзакцию, внутри которой они вызваны. Операторы DML представлены в табл. 2.

    Таблица 2

    Иногда оператор SELECT относят к отдельной категории, называемой Data Query Language (DQL).

    Cursor Control Language (CCL)

    Операторы Cursor Control Language используются для определения курсора, подготовки SQL-предложений для выполнения, а также для некоторых других операторов. Операторы CCL представлены в табл. 5.

    Таблица 5

    Оператор

    Описание

    Применяется для определения курсора для запроса

    Применяется для описания плана запроса. Этот оператор представляет собой расширение SQL для Microsoft SQL Server 7.0. Он не обязан выполняться в других СУБД. Например, в случае Oracle следует использовать оператор EXPLAIN PLAN

    Применяется для открытия курсора при получении результатов запроса

    Применяется для получения строки из результатов запроса

    Применяется для закрытия курсора

    Применяется для подготовки оператора SQL для выполнения

    Применяется для выполнения оператора SQL

    Применяется для описания подготовленного запроса

    Все операторы SQL имеют вид, показанный на рис. 2 .

    Каждый оператор SQL начинается с глагола, представляющего собой ключевое слово, определяющее, что именно делает этот оператор (SELECT, INSERT, DELETE...). В операторе содержатся также предложения, содержащие сведения о том, над какими данными производятся операции. Каждое предложение начинается с ключевого слова, такого как FROM, WHERE и др. Структура предложения зависит от его типа - ряд предложений содержит имена таблиц или полей, некоторые могут содержать дополнительные ключевые слова, константы или выражения.

    С помощью чего можно выполнить SQL-операторы

    Все современные серверные СУБД (а также многие популярные настольные СУБД) содержат в своем составе утилиты, позволяющие выполнить SQL-предложение и ознакомиться с его результатом. В частности, клиентская часть Oracle содержит в своем составе утилиту SQL Plus, а Microsoft SQL Server - утилиту SQL Query Analyzer. Именно этой утилитой мы воспользуемся для демонстрации возможностей SQL, а в качестве базы данных, над которой мы будем «экспериментировать», возьмем базу данных NorthWind, входящую в комплект поставки Microsoft SQL Server 7.0. В принципе, можно использовать другую базу данных и любую другую утилиту, способную выполнять в этой базе данных SQL-предложения и отображать результаты (или даже написать свою, используя какое-либо средство разработки - Visual Basic, Delphi, C++Builder и др.). Однако на всякий случай рекомендуется сделать резервную копию этой базы данных.

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

    Что Вам потребуется?

    SQL (Structured Query Language) язык специально разработанный для взаимодействия с системами управления баз данных, таких как MySQL, Oracle, Sqlite и прочие... Для выполнения SQL запросов в этой статье я советую Вам установить MySQL на локальный компьютер. Также я рекомендую использовать phpMyAdmin в качестве визуального интерфейса.

    Все это имеется во всеми любимом Денвере. Думаю, каждый должен знать, что это и где это взять:). Можно еще использовать WAMP или MAMP.

    В денвере есть встроенная MySQL консоль. Ей мы и будем пользоваться.

    CREATE DATABASE: создание базы данных

    Вот и наш первый запрос. Мы создадим нашу первую БД для дальнейшей работы.

    Для начала, откройте MySQL консоль и залогиньтесь. Для WAMP пароль по умолчанию пустой. То есть ничего:). Для MAMP - "root". Для Денвера необходимо уточнить.

    После логина введите следующую строку и нажмите Enter:

    CREATE DATABASE my_first_db;

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

    Также команды в SQL чувствительны к регистру. Пишем их большими буквами.

    Опци онально: Character Set и Collation

    Если Вы хотите установить character set (набор символов ) и collation (сравнение ) можно написать следующую команду:

    CREATE DATABASE my_first_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    Находится список наборов символов, которые поддерживаются в MySQL.

    SHOW DATABASES: выводит список всех БД

    Эта команда используется для вывода всех имеющихся БД.

    DROP DATABASE: удаление БД

    Вы можете удалить существующую БД с помощью этого запроса.

    Будьте осторожны с этой командой, так как она выполняется без предупреждения. Если в Вашей БД есть данные, они будут все удалены.

    USE: Выбор БД

    Технически это не запрос, а оператор и он не требует точки с запятой в конце.

    Он сообщает MySQL выбрать БД для работы по умолчанию для текущей сессии. Теперь мы готовы создавать таблицы и делать прочие вещи с БД.

    Что же такое таблица в БД?

    Вы можете представить таблицу в БД в виде Excel файла.

    Также как и на картинке, у таблиц есть названия колонок, ряды и информация. С помощью SQL запросов мы можем создавать такие таблицы. Мы также можем добавлять, считывать, вносить обновления и удалять информацию.

    CREATE TABLE: Создание таблицы

    C помощью этого запроса мы можем создавать таблицы в БД. К сожалению, документация MySQL не очень понятна для новичков по этому вопросу. Структура этого типа запросов может быть очень сложной, но мы начнем с легкой.

    Следующий запрос создаст таблицу с 2-мя колонками.

    CREATE TABLE users (username VARCHAR(20), create_date DATE);

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

    Первая строка простая. Мы просто создаем таблицу с названием "users ". Далее в скобках, через запятую, идет список всех колонок. После каждого названия колонки у нас идут типы информации, такие как VARCHAR или DATE.

    VARCHAR(20) означает, что колонка имеет тип строки и может быть максимум 20 символов в длину. DATE также тип информации, который используется для хранения дат в таком формате: "ГГГГ - ММ-ДД ".

    PRIMARY KEY ( первичный клю ч)

    Перед тем как мы выполним следующий запрос, мы также должны включить колонку для "user_id ", которая будет нашим первичным ключом. Вы можете воспринимать PRIMARY KEY как информацию, которая используется для идентифицирования каждого ряда таблицы.

    CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20), create_date DATE);

    INT делает 32 битный целый тип (например, числа). AUTO_INCREMENT автоматически генерирует новое значение ID каждый раз, когда мы добавляем новые ряды информации. Это не обязательно, но делает весь процесс проще.

    Эта колонка не обязательна должна быть целым значением, но оно чаще всего используется. Наличие Первичного Ключа также не является обязательным, однако рекомендуется для архитектуры и производительности БД.

    Давайте выполним запрос:

    SHOW TABLES: показать все таблицы

    Этот запрос позволяет получить список таблиц, которые находятся в БД.

    EXPLAIN: Показать структуру таблиц

    Для показа структуры существующей таблицы Вы можете пользоваться этим запросом.

    Колонки отображаются со всеми свойствами.

    DROP TABLE: удалить таблицу

    Также как и DROP DATABASES, этот запрос удаляет таблицу и ее содержание без предупреждения.

    ALTER TABLE: изменить таблицу

    Этот запрос также может содержать сложную структуру из-за большего количестве изменений, который он может сделать с таблицей. Давайте посмотрим на примеры.

    (если Вы удалили таблицу в прошлом шаге, создайте ее снова для тестов)

    ДОБАВЛЕНИЕ КОЛОНКИ

    ALTER TABLE users ADD email VARCHAR(100) AFTER username;

    Благодаря хорошей читабельности SQL, я думаю, что нет смысла ее подробно объяснять. Мы добавляем новую колонку "email " после "username ".

    УДАЛЕНИЕ КОЛОНКИ

    Это было также очень легко. Используйте этот запрос с осторожностью, так как можно удалить данные без предупреждения.

    Восстановите только что удаленную колонку для дальнейших экспериментов.

    ВНЕСЕНИЕ ИЗМЕНЕНИЯ В КОЛОНКУ

    Иногда Вы можете захотеть внести изменения в свойства колонки, и Вам не надо ее полностью удалять для этого.

    Этот запрос переименовал колонку пользователь в "user_name " и изменил ее тип с VARCHAR(20) на VARCHAR(30). Такое изменение не должны изменить данные в таблице.

    INSERT: Добавление информации в таблицу

    Давайте добавим некоторую информацию в таблицу используя следующий запрос.

    Как Вы можете увидеть, VALUES () содержит список значений, разделенных запятыми. Все значения заключены в одинарные колонки. И значения должны быть в порядке колонок, которые были определены при создании таблицы.

    Заметьте, что первое значение NULL для поля PRIMARY KEY под названием "user_id ". Мы делаем это для того, чтобы ID было сгенерировано автоматически, так как колонка имеет свойство AUTO_INCREMENT. Когда информация добавляется первый раз ID будет 1. Следующий ряд - 2, и так далее...

    АЛЬТЕРНАТИВНЫЙ ВАРИАНТ

    Есть еще один вариант запроса для добавления рядов.

    В этот раз мы используем ключевое слово SET вместо VALUES, и у него нет скобок. Есть несколько нюансов:

    Колонку можно пропустить. К примеру, мы не присвоили значение для "user_id ", которое по умолчанию получит свое AUTO_INCREMENT значение. Если Вы пропустите колонку с типом VARCHAR, тогда будет добавлено пустая строка.

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

    АЛЬТЕРНАТИВНЫЙ ВАРИАНТ 2

    Вот еще вариант.

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

    LAST_INSERT_ID()

    Вы можете использовать этот запрос для получения ID, которое было AUTO_INCREMENT для последнего ряда текущей сессии.

    NOW()

    Теперь настало время показать, как Вы можете использовать функцию MySQL в запросах.

    Функция NOW() выводит текущую дату. Так что Вы можете использовать ее для автоматического установления даты колонки на текущую при вставке нового ряда.

    Заметьте, что мы получили 1 предупреждение, но не обращайте на него внимания. Причина этому то, что NOW() также служит для вывода временной информации.

    SELECT: Чтение данных из таблицы

    Если мы добавляем информацию в таблицу значит логично было бы научиться ее оттуда считывать. Именно в этом нам и поможет запрос SELECT.

    Ниже представлен самый простой возможный запрос SELECT для чтения таблицы.

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

    Условие WHERE

    Чаще всего мы заинтересованы не во всех колонках, а только в некоторых. К примеру, давайте предположим, что нам необходимы только электронный адрес для пользователя "nettuts ".

    WHERE позволяет устанавливать условия в запросе и делать подробные выборки.

    Заметьте, что для равенства использоваться один знак равно (=), а не два, как в программировании.

    Вы можете также использовать сравнения.

    AND или OR могут быть использованы для объединения условий:

    Заметьте, что числовые значения не должны находиться в кавычках.

    IN()

    Это полезно для выборки по нескольким значениям

    LIKE

    Позволяет делать "wildcard" запросы

    Значок % используется в качестве "wildcard". То есть на его месте может быть что-угодно.

    Условие ORDER BY

    Если Вы хотите получить результат в упорядоченном виде по какому либо критерию

    Порядок по умолчанию ASC (от меньшегок большему). Для обратного используется DESC.

    LIMIT ... OFFSET ...

    Вы можете ограничить количество полученных результатов.

    LIMIT 2 берет только 2 первых результата. LIMIT 1 OFFSET 2 получает 1 результат после первых 2-х. LIMIT 2, 1 означает тоже самое (только обратите внимание сначала идет offset а потом limit ).

    UPDATE: Внести изменения в информацию в таблице

    Этот запрос используется для изменения информации в таблице.

    В большинстве случаев он используется вместе с условием WHERE, так как Вы скорее всего захотите внести изменения в определенные колонки. Если не будет условия WHERE изменения затронут все ряды.

    Вы также можете использовать LIMIT для ограничения количества рядов, в которые необходимо внести изменения.

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

    Также как и UPDATE, этот запрос используется с WHERE:

    Для удаления содержания таблицы можно сделать просто так:

    DELETE FROM users;

    Но лучше использовать TRUNCATE

    Кроме удаления этот запрос также сбрасывает значения AUTO_INCREMENT и при добавлении рядов снова, отсчет начнется с нуля. DELETE такого не делает и отсчет продолжается.

    Отключение Строчных Значений и Специальных Слов

    Строчные значения

    Некоторые символы необходимо отключать (escape), или же могут быть проблемы.

    Для этого используется задний слеш (\).

    Специальные слова

    Поскольку в MySQL есть много специальных слов (SELECT или UPDATE), чтобы избежать ошибок при их использовании необходимо использовать кавычки. Но не обычные кавычки, а вот такие (`).

    То есть Вам необходимо будет добавить колонку с именем " delete", это необходимо сделать так:

    Заключение

    Спасибо, что дочитали до конца. Надеюсь, Вам эта статья была полезна. Это еще не конец! Будет продолжение:).