Что такое код sqlпочему sql

Содержание

В чем запускать SQL код

21.06.2012, 22:13

Как в SQL Server 2000 запускать тригера по таймеру?
Уважаемые, возможно ли в SQL Server 2000 запускать тригера или хр. процедуры по таймеру в том.

В чем разница SQL и Transct SQL?
Собственно говоря начал постигать SQL server, единственную адекватную литературу нашел — «MS SQL.

Перевести код с SQL 2012 на SQL 2008
Надо перевести код с SQL 2012 на SQL 2008 WITH SalesMonth2007 AS ( SELECT .

Код t-sql (SQL SERVER 2008)
Добрый день! Пожалуйста, помогите написать код t-sql (sql Server 2008) Задача следующая: Есть.

22.06.2012, 01:50 2

1. create database Hotel — Создать база Hotel

2. create table table1 — Создать таблица
(id int not null,
Фамилия char(20) not null,
Имя char(20) not null,
Дата_рожд datetime,
Адрес char(20) not null,
Телефон char(20) not null,

3. select * from table1 — Выбрать все поля из таблицы table1

Там всё понятно , это структурированный язык запросов SQL . почему для нас непонятно ?

22.06.2012, 02:10 3 22.06.2012, 20:18 [ТС] 4

Тебе нужно установить себе СУБД.
Для начала я бы посоветовал MySQL или MsSQL, в них имхо проще разобраться и найти по ним мануалы. (другие варианты можешь посмотреть на раздел выше — все подразделы «Базы данных» это названия различных популярных СУБД)
MySQL можно вобще вместе с каким-нибудь Denver-ом поставить, по моему очень удобно, для разработки онлайн приложений и сайтов.
Собственно СУБД и будет принимать от тебя на обработку запросы со всеми этими криэйтами и селектами.

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

22.06.2012, 20:18
22.06.2012, 20:18

По нажатию комбинации клавиш запускать код
Приветствую! Совсем недавно я перебрался с Windows на Linux. Всё прекрасно, полёт.

Компилировать код который можно запускать без C++ Redistributable
1. Как скомпилировать программу что бы для ее запуска не нужно было дополнительно устанавливать net.

сможет ли груб линукса запускать и макинтошь? И можно ли через загрузчик винды запускать мак?
Скачал сборку хакинтош macos Leopard 10.5.5 для ПК . И собираюсь установить на отдельный раздел.

Внедрение SQL-кода

Внедрение SQL-кода (англ. SQL injection ) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

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

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входящих данных, используемых в SQL-запросах.

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

Принцип атаки внедрения SQL Править

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

Если на сервер передан параметр >

Но если злоумышленник передаст в качестве параметра >

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Внедрение в строковые параметры Править

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):

Сделав запрос вида http://example.org/script.php?search_text=Test мы получим выполнение следующего SQL-запроса:

Но, внедрив в параметр search_text символ кавычки (который используется в запросе), мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ‘)+and+(news_ >

Использование UNION Править

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

Рассмотрим скрипт отображения новости (идентификатор новости, которую необходимо отобразить, передается в параметре id):

Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,username,password,1 FROM admin, это вызовет выполнение SQL-запроса

Так как новости с идентификатором -1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

Экранирование хвоста запроса Править

Зачастую, SQL-запрос, подверженный данной уязвимости, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт

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

В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария(/* или в зависимости от типа СУБД).

В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос

в котором часть запроса ( AND author LIKE (‘a%’)) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса Править

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

Например, если в параметры скрипта

злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin (username, password) VALUES (‘HaCkEr’, ‘foo’); то в одном запросе будут выполнены 2 команды

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.

Методика атак типа внедрение SQL-кода Править

Поиск скриптов, уязвимых для атаки Править

На данном этапе злоумышленником изучается поведение скриптов сервера при манипуляции входными параметрами с целью обнаружения их аномального поведения. Манипуляция происходит всеми возможными параметрами:

  • Данными передаваемыми через методы POST и GET
  • Значениями [HTTP-Cookie]
  • HTTP_REFERER (для скриптов )
  • AUTH_USER и AUTH_PASSWORD (при использовании аутентификации)

Как правило, манипуляция сводится к подстановке в параметры символа одинарной (реже двойной или обратной) кавычки.

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

Наиболее частые примеры аномального поведения:

  • выводится сообщение о различных ошибках;
  • при запросе данных (например, новости или списка продукции) запрашиваемые данные не выводятся вообще, хотя страница отображается

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

Анализ внедрения Править

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

  • примерный вид SQL-запроса, в котором происходит внедрение кода;
  • тип используемой СУБД, а также, возможно, версия СУБД.

Для определения типа СУБД во внедряемый код подставляются SQL-конструкции, специфические для разных СУБД.

Конструкция MySQL MS SQL Oracle MS Access PostgreSQL Sybase IBM DB2 Ingres
Комментирование остатка строки /* . — . — . или /* . Коментирование возможно лишь внедрением в запрос NULL-байта: %00. — . — . — . — .
Получение версии version() @@version select banner from v$version @@version select versionnumber from sysibm.sysversions dbmsinfo(‘_version’)
Конкатенация строк concat(string1,string2) string1+string2 string1ΙΙstring2 или string1+string2 или concat(string1,string2) string1IIstring2 string1+string2 string1ΙΙstring2 или string1 concat string2 string1ΙΙstring2

Защита от атак типа внедрение SQL-кода Править

Для защиты от данного типа атак необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса.

Фильтрация строковых параметров Править

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

Чтобы внедрение кода было невозможно, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \», апостроф на \’, обратную косую черту на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:

Фильтрация целочисленных параметров Править

Возьмём другой запрос:

В данном случае поле id имеет числовой тип, и его нельзя брать в кавычки. Поэтому «закавычивание» и замена спецсимволов на escape-последовательности не проходит. В таком случае помогает проверка типа; если переменная id не является числом, запрос вообще не должен выполняться.

Например, на Delphi для противодействия таким инъекциям помогает код:

В случае ошибки функция StrToInt вызовет исключение EConvertError , и в его обработчике можно будет вывести сообщение об ошибке. Двойное преобразование обеспечивает корректную реакцию на числа в формате $132AB (шестнадцатеричная система счисления). На стандартном Паскале, не умеющем обрабатывать исключения, код несколько сложнее.

Усечение входных параметров Править

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов («1 OR 1=1«). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно «отрезать лишние» символы, оставив не более четырёх:

Использование параметризованных запросов Править

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

10 простых шагов к полному пониманию SQL

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

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

  • Уже работает с SQL, но не до конца его понимает
  • Неплохо знает SQL, но никогда серьезно не задумывался над его структурой
  • Хочет обучать SQL других

В этом руководстве мы сосредоточимся только на операторах SELECT. Другие DML-операторы будут подробно рассмотрены в следующий раз.


Примечание. Этот урок раньше публиковался только на
Tech.Pro (оригинальная версия находится здесь). К сожалению, материал Tech.Pro стал недоступным. С разрешения Tech.Pro мы снова публикуем его контент в блоге jOOQ.

SQL является декларативным

Все понятно. И вас не волнует, откуда эти записи о сотруднике (employee) берутся. Вам лишь нужны те, у которых достойная зарплата (salary).

  • Что мы из этого узнаем?

Если все так просто, в чем же проблема? Проблема в том, что большинство из нас интуитивно мыслит рамками императивного программирования. Вроде: «машина, сделай это, затем то, но сначала проверь то и се.» А значит, нужно хранить временные результаты в переменных, составлять циклы, вызывать функции и т. д. и т. п.

Забудьте обо всем этом. Думайте о том, как объявлять вещи. Не о том, как сказать машине, вычислить что-либо.

2. Код SQL не является упорядоченным

Обычно путаница происходит из-за того, что элементы кода SQL не расположены в том порядке, в каком они выполняются. Лексический порядок выглядит так:

  • SELECT [ DISTINCT ]
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • UNION
  • ORDER BY

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

Три пункта, которые следует отметить:

  1. Первое предложение здесь FROM, а не SELECT. Сначала происходит загрузка данных с диска в память, чтобы с ними можно было работать.
  2. SELECT выполняется после большинства других предложений. Главное, после FROM и GROUP BY. Это важно понимать, если думаете, что можете ссылаться на элементы, которые объявляете в предложении SELECT из предложения WHERE. Следующее невозможно:

Есть два варианта повторно использовать z. Либо повторить выражение:

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

3. UNION ставится перед ORDER BY в лексическом и логическом порядках. Многие думают, что каждый подзапрос UNION можно упорядочить, но по стандарту SQL и в большинстве диалектов SQL это не так. Хотя в некоторых диалектах позволяется упорядочивание подзапросов или производных таблиц, нет никакой гарантии, что такой порядок будет сохранен после выполнения операции UNION.

Обратите внимание, что не все базы данных реализуют вещи одинаковым образом. Правило номер 2, например, не применяется в точности, как описано выше, для MySQL, PostgreSQL, и SQLite.

Что мы из этого узнаем?

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

Конечно, неплохо, если бы язык был спроектирован таким образом, когда лексическая последовательность фактически отражает логический порядок, как это реализовано в Microsoft LINQ.

3. Вся суть SQL заключается в ссылках на таблицы

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

Стандарт SQL определяет предложение FROM следующим образом:

Вывод предложения FROM — это объединенная ссылка на таблицу объединенного значения всех ссылок. Попробуем это переварить.

Указанная выше запись производит комбинированную ссылку на таблицу значений a и b. Если a имеет 3 колонки и b 5 колонок, тогда выходная таблица “output table” будет состоять из 8 (3 + 5) столбцов.

Записи, содержащиеся в этой комбинированной табличной ссылке являются перекрестным / декартовым произведением a x b. Иными словами, каждая запись a образует пару с записью b. Если a имеет 3 записи, а b 5 записей, описанная выше ссылка на таблицу производит 15 записей (3 x 5).

Этот вывод переводится в предложение GROUP BY (после фильтрации в предложении WHERE), где преобразуется в новый вывод. Разберемся с этим позже.

Если мы посмотрим на эти примеры в свете реляционной алгебры / теории множества, то таблица SQL — это отношение или набор кортежей. Каждое предложение SQL преобразует одно или несколько отношений, чтобы создать новые отношения.

Что мы из этого узнаем?

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

4. Ссылки на таблицы SQL могут быть довольно функциональными

Ссылка на таблицу — мощная штука. Примером их силы является ключевое слово JOIN, которое в действительности не является выражением SELECT, а частью специальной ссылки на таблицу. Объединенная таблица, как определено в стандарте SQL (упрощенный):

Вернемся к нашему примеру:

a может по сути быть объединенной таблицей:

Развивая предыдущее выражение, получим:

Хотя не рекомендуется объединять синтаксис, где приводится разделенный запятыми список ссылок на таблицы, с синтаксисом объединенных таблиц, но так можно делать. В результате, объединенная ссылка будет содержать величины a1+a2+b.

Производные таблицы еще мощнее, чем объединенные таблицы. Мы до этого еще дойдем.

Что мы из этого узнаем?

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

И, что важно, понять, JOIN является ключевым словом для построения соединенных таблиц. А не частью оператора SELECT. Некоторые базы данных позволяют использование JOIN в операторах INSERT, UPDATE, DELETE

5. В SQL следует использовать таблицы JOIN, вместо разделенных запятыми

Ранее мы видели это предложение:

Продвинутые разработчики SQL, вероятно, скажут, что не следует вообще использовать список с разделителями-запятыми, и всегда отображать таблицы JOIN. Это улучшит читаемость инструкции SQL, и тем самым предотвратить ошибки.

Одна очень распространенная ошибка заключается в том, чтобы где-то забыть предикат JOIN. Подумайте о следующем:

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

  • Безопаснее, так как предикаты join можно размещать вблизи соединенных таблиц, тем самым предотвращая ошибки.
  • Более выразительные, так как можно различать OUTER JOIN, INNER JOIN и т. д.

Что мы из этого узнаем?

Всегда применяйте JOIN. Никогда не используйте ссылки на таблицы, разделенные запятыми, в предложениях FROM.

6. Различные операции JOIN в SQL

Операции JOIN состоят, в основном, из следующих пяти видов:

  • EQUI JOIN
  • SEMI JOIN
  • ANTI JOIN
  • CROSS JOIN
  • DIVISION

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

EQUI JOIN

Это наиболее распространенная операция JOIN. Содержит два подвида:

  • INNER JOIN (или просто JOIN)
  • OUTER JOIN (далее подразделяется на LEFT, RIGHT, FULL OUTER JOIN)

Разницу лучше объяснить на примере:

SEMI JOIN

Эта реляционная концепция в SQL может быть выражена двумя способами: С помощью предиката IN или с использованием предиката EXISTS. «Semi» на латыни означает «половина». Этот тип соединения используется для объединения только «половины» ссылки на таблицу. Что это значит? Рассмотрим вновь вышеуказанное объединение автора и книги. Представим, что нам не нужны комбинации автор — книга, а только авторы, у которых есть книги. Тогда можно написать:

Хотя нет общего правила, следует предпочесть IN или EXISTS, но можно сказать примерно так:

  • Предикаты IN легче читать, чем предикаты EXISTS
  • Предикаты EXISTS более выразительные, чем предикаты IN (т. е. их проще выразить, чем сложные предикаты SEMI JOIN)
  • В производительности нет какой-либо заметной разницы. Но большая разница в производительности может быть в некоторых базах данных.

Поскольку INNER JOIN также выдают результаты авторов, у которых есть книги, многие начинающие подумают, что можно удалить дубликаты с помощью ключевого слова DISTINCT. Им кажется, что SEMI JOIN можно выразить следующим образом:

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

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

Подробную информацию о злоупотреблении DISTINCT можно найти в этом посте.

ANTI JOIN

Эта реляционная концепция является полной противоположностью SEMI JOIN. Ее можно образовать, просто добавив ключевое слово NOT в предикатах IN или EXISTS. Пример, где мы выберем тех авторов, у которых нет книг:

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

CROSS JOIN

Этот оператор создает перекрестное произведение двух соединенных ссылок на таблицу, комбинируя каждую запись первой ссылки с записью второй ссылки на таблицу. Мы уже видели раньше, что это может быть достигнуто посредством ссылок на таблицы с разделителями-запятыми в предложении FROM. В редких случаях, когда это действительно необходимо, в большинстве диалектов SQL перекрестное соединение CROSS JOIN можно написать явным образом:

DIVISION

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

Что мы из этого узнаем?

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

7. Производные таблицы SQL похожи на табличные переменные

Раньше мы узнали, что SQL является декларативным языком, и не имеет переменных (хотя в некоторых диалектах SQL они существуют). Но можно написать нечто похожее на переменные. Эти звери называются производными таблицами.

Производная таблица — это не что иное, как вложенный запрос, заключенный в круглые скобки.

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

Производные таблицы великолепны, если необходимо обойти проблемы, вызванные логическим упорядочением предложений SQL. Например, если вы хотите повторно использовать выражение столбца в предложении SELECT и WHERE, просто напишите (диалект Oracle):

Обратите внимание, что некоторые базы данных и стандарт SQL:1999 подняли производные таблицы на следующий уровень введением обобщенных табличных выражений. Это позволит повторно использовать одну и ту же производную таблицу несколько раз в одной инструкции SQL SELECT. Приведенный выше запрос будет переведен на (почти) эквивалент:

Очевидно, что «a» можно также вывести в отдельное представление для более широкого использования общих подзапросов SQL. Подробнее о представлениях здесь.

Что мы из этого узнаем?

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

8. SQL GROUP BY преобразует прежние ссылки на таблицу

Давайте вновь обсудим наше предложение FROM:

А теперь к соединенной ссылке (см. выше) применим предложение GROUP BY

Предложение производит новую ссылку на таблицу только с тремя оставшимися столбцами (!). Попробуем это переварить. С применением GROUP BY, уменьшается число доступных столбцов во всех последующих логических предложениях, включая SELECT. Ссылаться только на столбцы из предложения GROUP BY в предложении SELECT можно по синтаксической причине.

  • Обратите внимание, что другие столбцы могут по-прежнему быть доступными в качестве аргументов агрегатных функций:
  • Следует заметить, что MySQL, к сожалению, не придерживается этого стандарта, отчего получается только путаница. Не попадайтесь на уловки в MySQL. GROUP BY преобразует ссылки на таблицу Таким образом, можно ссылаться только на столбцы, также упоминаемые в предложении GROUP BY.

Что мы из этого узнаем?

GROUP BY, опять же, работает с табличными ссылками, преобразовывая их в новую форму.

9. SQL SELECT в реляционной алгебре называется проекцией

Мне лично нравится термин «проекция», так как он используется в реляционной алгебре. После того как вы создали ссылку на таблицу, отфильтровали и преобразовали ее, можете переходить к проецированию в другую форму. Предложение SELECT подобно проектору. Табличная функция использующет выражение значения строки для преобразования каждой записи из ранее созданной ссылки на таблицу в конечный результат.

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

Есть много специальных правил в отношении характера доступных выражений, функций и т.д. Главное, нужно помнить следующее:

  1. Можно использовать только ссылки на столбцы, полученные из ссылки на таблицу в «output».
  2. Если у вас есть предложение GROUP BY, вы можете ссылаться только на столбцы из этого предложения или агрегатные функции.
  3. Если нет предложения GROUP BY вместо агрегатных можно использовать оконные функции.
  4. Если нет предложения GROUP BY, нельзя сочетать агрегатные и неагрегатные функции.
  5. Существуют некоторые правила, касающиеся переноса регулярных функций в агрегатные функции и наоборот.
  6. Есть…

Много сложных правил. Которыми можно заполнить еще один урок. Например, причина почему нельзя комбинировать агрегатные функции с неагрегатными функциями в проекции инструкции SELECT без предложения GROUP BY (правило № 4), такова:

  1. Это не имеет смысла. Интуитивно.
  2. Если не помогает интуиция (например, новичкам в SQL), выручают синтаксические правила. В SQL:1999 реализован оператор GROUPING SETS, а в SQL:2003 — пустой оператор grouping sets: GROUP BY (). Всякий раз, когда присутствует агрегатная функция и нет явного предложения GROUP BY, применяется неявный пустой GROUPING SET (правило №2). Следовательно, исходные правила о логическом упорядочении больше не являются верными, и проекция (SELECT) влияет на результат логически предшествующего, но лексически последовательного предложения (GROUP BY).

Запутались? Да. Я тоже. Давайте вернемся к более простым вещам.

Что мы из этого узнаем?

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

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

10. SQL DISTINCT, UNION, ORDER BY и OFFSET — намного проще

После сложного SELECT мы можем снова вернуться к простым истинам:

  • Операции Set (DISTINCT и UNION)
  • Операции упорядочивания (ORDER BY, OFFSET .. FETCH)

Операции Set

Операции set работают с наборами, которые на самом деле являются таблицами. Почти. Теоретически, это несложно понять.

  • DISTINCT удаляет дубликаты после проекции.
  • UNION объединяет два подзапроса и удаляет дубликаты
  • UNION ALL объединяет два подзапроса, сохраняя дубликаты
  • EXCEPT удаляет записи из первого подзапроса, которые также содержатся во втором подзапросе (и затем удаляет дубликаты)
  • INTERSECT сохраняет только записи, содержащиеся в обоих поздапросах (а затем удаляет дубликаты)

Удаление дубликатов во всех этих случаях не имеет смысла. Для объединения подзапросов чаще всего следует применять UNION ALL.

Операции упорядочивания

Упорядочение не является реляционной функцией. Это функция, предназначенная только для SQL. Она применяется в самом конце лексического упорядочения и логического упорядочения инструкции SQL. Использование ORDER BY и OFFSET.. FETCH — это единственный способ гарантировать, что записи могут быть доступны по индексу надежным способом. Все остальные способы упорядочивания всегда произвольны и случайны, даже если они могут показаться воспроизводимыми.

OFFSET .. FETCH — это только один вариант синтаксиса. Другие варианты включают LIMIT, OFFSET в MySQL и PostgreSQL .. или TOP и START AT в SQL Server и Sybase. Хороший обзор различных способов реализации OFFSET.. FETCH можно увидеть здесь.

Приступаем к работе

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

Что такое база данных и СУБД?

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

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

За многие годы для решения различных видов проблем хранения данных было создано множество СУБД.

Типы баз данных

В 1960-70-х годах разрабатывались базы данных, которые тем или иным способом решали проблему повторяющихся групп. Эти методы привели к созданию моделей систем управления базами данных. Основой для таких моделей, используемых и по сей день, послужили исследования, проводимые в компании IBM.

Одним из основополагающих факторов проектирования ранних СУБД была эффективность. Гораздо легче манипулировать записями базы данных, имеющими фиксированную длину или, по крайней мере, фиксированное количество элементов в записи (столбцов в строке). Так удается избежать проблемы повторяющихся групп. Тот, кто программировал на каком-либо процедурном языке, без труда поймет, что в этом случае можно прочитать каждую запись базы данных в простую структуру C. Однако в реальной жизни такие удачные ситуации встречаются редко, поэтому программистам приходится обрабатывать не так удобно структурированные данные.

База данных с сетевой структурой

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

Рис. 1. Структура записей конвертера валют

Данные загружаются и получается связанный (отсюда и название модели – сетевая) список для языков (рис. 2):

Рис. 2. Связанный список

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

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

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

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

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

Иерархическая модель базы данных

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

Это можно представить как «спецификацию материалов», которая применяется для описания составляющих сложного продукта. Например, машина состоит (скажем) из шасси, кузова, двигателя и четырех колес. Каждый из этих основных компонентов в свою очередь состоит из некоторых других. Двигатель включает в себя несколько цилиндров, головку цилиндра и коленчатый вал. Эти компоненты опять-таки состоят из более мелких; так мы доходим до гаек и болтов, которыми комплектуются любые составляющие автомобиля.

Иерархическая модель базы данных применяется до сих пор. Иерархическая СУБД способна оптимизировать хранение данных в том, что касается некоторых отдельных вопросов, например можно без труда определить, в каком автомобиле используется какая-то конкретная деталь.

Реляционная модель базы данных

Огромный скачок в развитии теории систем управления базами данных произошел в 1970 году, когда был опубликован доклад Е. Ф. Код- да (E. F. Codd) «Реляционная модель для больших разделяемых банков данных» («A Relational Model of Data for Large Shared Data Banks»), см. эту ссылку. В этом поистине революционном труде вводилось понятие отношений и было показано, как использовать таблицы для представления фактов, которые устанавливают отношения с объектами «реального мира» и, следовательно, хранят данные о них.

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

Реляционную систему управления базами данных определяет набор правил. Во-первых, запись таблицы носит название «кортеж», и именно этот термин используется в части документации на PostgreSQL. Кортеж — это упорядоченная группа компонентов (или атрибутов), каждый из которых принадлежит определенному типу. Все кортежи построены по одному шаблону, во всех одинаковое количество компонентов одинаковых типов. Приведем пример набора кортежей:

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

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

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

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

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

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

Последнее правило, определяющее структуру реляционной базы данных, — это ссылочная целостность. Такое требование объясняется тем, что в любой момент времени все записи базы данных должны иметь смысл. Разработчик приложения, взаимодействующего с базой данных, должен быть внимателен, он обязан убедиться, что его код не нарушает целостности базы. Представьте, что происходит при удалении клиента. Если клиент удаляется из отношения CUSTOMER, необходимо удалить и все его заказы из таблицы ORDERS. В противном случае останутся записи о заказах, которым не сопоставлен клиент.

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

Языки запросов SQL и друие

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

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

Одним из первых был реализован язык запросов QUEL, он использовался в созданной в конце 1970х годов базе данных Ingres. Еще один язык запросов, в котором применялся другой метод, назывался QBE (Query By Example — запрос по примеру). Приблизительно в то же самое время группа, работающая в исследовательском центре IBM, разработала язык структурированных запросов SQL (Structured Query Language), это название обычно произносится как «сиквел».

SQL — это стандартный язык запросов, наиболее распространенным его определением является стандарт ISO/IEC 9075:1992, «Information Techno­logy — Database Languages — SQL» (или, проще говоря, SQL92) и его американский аналог ANSI X3.135-1992, отличающийся от первого лишь несколькими страницами обложки. Эти стандарты заменили ранее существовавший SQL89. На самом деле есть и более поздний стандарт, SQL99, но он еще не получил распространения, к тому же большая часть обновлений не затрагивает ядро языка SQL.

Существуют три уровня соответствия SQL92: Entry SQL, Intermediate SQL и Full SQL. Самым распространенным является уровень «Entry», и PostgreSQL очень близок к такому соответствию, хотя есть и небольшие различия. Разработчики занимаются исправлением незначительных упущений, и с каждой новой версией PostgreSQL становится все ближе к стандарту.

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

  • Data Manipulation Language (DML) — язык манипулирования данными. Это та часть SQL, которая используется в 90% случаев. Она состоит из команд добавления, удаления, обновления и, что важнее всего, выборки данных из базы данных.
  • Data Definition Language (DDL) — язык определения данных. Это команды для создания таблиц и управления другими аспектами базы данных, структурированными на более высоком уровне, чем относящиеся к ним данные.
  • Data Control Language (DCL) — язык управления данными

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

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

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

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

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

Здесь мы определили, что таблице необходим идентификатор, который бы действовал как первичный ключ, и что он должен автоматически генерироваться системой управления базой данных. Идентификатор имеет тип serial, а это означает, что каждый раз при добавлении нового элемента item в последовательности будет создан новый, уникальный item_id. Описание (description) — это текстовый атрибут, состоящий из 64 символов. Себестоимость (cost_price) и цена продажи (sell_price) определяются как числа с плавающей точкой, с двумя знаками после запятой.

Теперь используем SQL для заполнения только что созданной таблицы. В этом нет ничего сложного:

Основа SQL — это оператор SELECT . Он применяется для создания результирующих множеств — групп записей (или атрибутов записей), которые соответствуют некоторому критерию. Эти критерии могут быть достаточно сложными. Результирующие множества могут использоваться в качестве целевых объектов для изменений, осуществляемых оператором UPDATE , или удалений, выполняемых DELETE .

Вот несколько примеров использования оператора SELECT :

Эти операторы SELECT перечисляют все заказы клиентов в указанном порядке и подсчитывают количество заказов, сделанных каждым клиентом.

Например, база данных PostgreSQL предоставляет несколько способов доступа к данным, в частности можно:

  • Использовать консольное приложение для выполнения операторов SQL
  • Непосредственно встроить SQL в приложение
  • Использовать вызовы функций API (Application Programming In­terfaces, интерфейсов прикладного программирования) для подготовки и выполнения операторов SQL, просмотра результирующих множеств и обновления данных из множества различных языков программирования
  • Прибегнуть к опосредованному доступу к данным базы PostgreSQL с применением драйвера ODBC (Open Database Connection — открытого интерфейса доступа к базам данных) или JDBC (Java Database Connectivity — интерфейса доступа Java-приложений к базам данных) или стандартной библиотеки, такой как DBI для языка Perl

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

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

  • Создание базы данных. Некоторые системы управляют одним большим файлом и создают одну или несколько баз данных внутри него, другие могут задействовать несколько файлов операционной системы или же непосредственно реализовывать низкоуровневый доступ к разделам диска. Пользователи и разработчики не должны заботиться о низкоуровневой структуре таких файлов, т. к. весь необходимый доступ обеспечивает СУБД.
  • Предоставление средств для выполнения запросов и обновлений. СУБД должна обеспечивать возможность запроса данных, удовлетворяющих некоторому критерию, например возможность выбора всех заказов, сделанных некоторым клиентом, но еще не доставленных. До того как SQL получил широкое распространение в качестве стандартного языка, способы выражения таких запросов менялись от системы к системе.
  • Многозадачность. Если с базой данных работают несколько приложений или к ней одновременно осуществляют доступ несколько пользователей, то СУБД должна гарантировать, что обработка запроса каждого пользователя не влияет на работу остальных. То есть пользователям приходится ждать, только если кто-то другой записывает данные именно тогда, когда им нужно прочитать (или записать) данные в какой-то элемент. Одновременно может происходить несколько считываний данных. На поверку оказывается, что разные базы данных поддерживают разные уровни многозадачности и что эти уровни даже могут быть настраиваемыми.
  • Ведение журнала. СУБД должна вести журнал всех изменений данных за некоторый период времени. Он может использоваться для отслеживания ошибок, а также (может быть, это даже важнее) для восстановления данных в случае сбоя системы, например внепланового выключения питания. Обычно производится резервное копирование данных и ведется журнал транзакций, т. к. резервная копия может быть полезна для восстановления базы данных в случае повреждения диска.
  • Обеспечение безопасности базы данных. СУБД должна обеспечивать контроль над доступом, чтобы только зарегистрированные пользователи могли манипулировать данными, хранящимися в базе, и самой структурой базы данных (атри­бутами, таблицами и индексами). Обычно для каждой базы определяется иерархия пользователей, во главе этой структуры стоит «суперпользователь», который может изменять все что угодно, дальше идут пользователи, которые могут добавлять и удалять данные, а в самом низу находятся те, кто имеет право только на чтение. СУБД должна иметь средства, позволяющие добавлять и удалять пользователей, а также указывать, к каким возможностям базы данных они могут получить доступ.
  • Поддержание ссылочной целостности. Многие СУБД имеют свойства, способствующие поддержанию ссылочной целостности, то есть корректности данных. Обычно, если запрос или обновление нарушает правила реляционной модели, СУБД выдает сообщение об ошибке.

Ошибки SQL-сервера

Содержание статьи:

    • SQL-сервер не найден или недоступен, ошибки соединения с SQL-сервером
      • Ошибка SQL-сервера 26
      • Ошибка SQL-сервера 18456
      • Не удалось запустить SQL-server – код ошибки 3417
    • Повреждена база данных
      • Код ошибки SQL-сервера 945
      • Код ошибки SQL-сервера 5172
      • Ошибка SQL-сервера 823
      • Ошибка SQL-сервера 8946

      SQL-сервер не найден или недоступен, ошибки соединения с SQL-сервером

      • Если SQL-сервер не найден, убедитесь, что ваш экземпляр SQL-сервера действительно установлен и запущен. Для этого зайдите на компьютер, где он установлен, запустите диспетчер конфигурации SQL и проверьте, есть ли там тот экземпляр, к которому вы пытаетесь подключиться и запущен ли он. Нелишним будет также получить отчет об обнаружении компонентов SQL-серверов.
      • Если вы проделали п1. и не обнаружили источник проблемы, возможно, неверно указан IP-адрес компьютера или номер порта TCP. Перепроверьте их настройки.
      • Причиной того, что невозможно подключиться к SQL-серверу, также может быть сеть, убедитесь, что компьютер с SQL-сервером доступен по сети.
      • Проверьте, может ли клиентское приложение, установленное на том же компьютере, что и сервер, подключиться к SQL-серверу. Запустите SQL Server Management Studio(SSMS), в диалоговом окне “Подключиться к серверу” выберите тип сервера Database Engine, укажите способ аутентификации “Аутентификация Windows”, введите имя компьютера и экземпляра SQL-сервера. Проверьте подключение.

      Обратите внимание, что многие сообщения об ошибках могут быть не показаны или не содержат достаточной информации для устранения проблемы. Это сделано из соображений безопасности, чтобы при попытке взлома злоумышленники не могли получить информацию об SQL-сервере. Полные сведения содержатся в логе ошибок, который обычно хранится по адресу C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log\ERRORLOG, или там, куда его поместил администратор системы.

      Ошибка SQL-сервера 26

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

      • в SSMS в настройках SQL-сервера включите аутентификацию Windows
      • для брандмауэра Windows создайте новое правило, которое разрешает подключение для всех программ и протоколов с указанного IP-адреса
      • убедитесь, что запущена служба SQL Server Browser

      Ошибка SQL-сервера 18456

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

      Не удалось запустить SQL-server – код ошибки 3417

      Возникает в случае, если были изменены настройки Windows или перемещена папка с файлами MSSQL.

      • зайдите в C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSqL\Data – Безопасность\Настройки доступа – Учетная запись сетевой службы – добавьте учетную запись сетевой службы
      • проверьте, что MDF-файл не сжимается. Если это не так, отключите “Сжимать содержимое для экономии места на диске” в свойствах файла

      Иногда ни один из этих способов не помогает, это значит, что файлы БД повреждены и ее придется восстанавливать из резервной копии.

      Повреждена база данных

      Код ошибки SQL-сервера 945

      Ошибка 945 возникает, когда БД SQL-сервера помечена как IsShutdown. Проверьте, достаточно ли места на диске, достаточно ли прав у учетной записи для операций с БД, файлы MDF и LDF не должны быть помечены “Только для чтения”.

      Код ошибки SQL-сервера 5172

      SQL-сервер хранит свою физическую БД в первичном файле, в котором информация разбита постранично. Первая страница содержит информацию о заголовке mdf-файла и называется страницей заголовка. Она состоит из разнообразной информации о БД, такой как размер файла, подпись и т.д. В процессе прикрепления MDF на SQL-сервере часто возникает ошибка 5172. Это в основном происходит, если MDF-файл поврежден, информация в его заголовке тоже и соответственно сложно добраться до данных. Причиной может быть вирус, аварийное выключение системы, ошибка оборудования.

      Ошибка SQL-сервера 823

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

      Ошибка SQL-сервера 8946

      Основной причиной ошибки 8946 так же, как и для 5172, является повреждение заголовков страниц БД SQL вследствие сбоя питания, вирусной атаки, отказа оборудования – SQL-сервер больше не может прочесть эти страницы.

      • если у вас есть свежая резервная копия базы – восстановить базу из этой копии
      • можно попробовать использовать специализированное ПО, такое как SQL Recovery Tool, чтобы восстановить поврежденные файлы

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

      Другие ошибки SQL

      Код ошибки SQL-сервера 1814

      SQL-сервер не может создать базу данных tempdb. Убедитесь, что на выделенном под нее диске достаточно места и что у учетной записи хватает прав для записи в указанную директорию.

      Код ошибки SQL-сервера 1067

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

      SQL-сервер запускается, но работает слишком медленно

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

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

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

      Если у вас не получается устранить ошибки сервера SQL-server самостоятельно, если они появляются снова и снова, то скорее всего в основе лежит одна из этих причин. В таком случае – если у вас произошла ошибка с SQL сервером, ваше ПО не видит SQL-сервер, либо нужно развернуть кластер SQL-серверов – вы всегда можете обратиться за консультацией и технической поддержкой к специалистам Интегруса, отправив заявку с сайта, написав на e-mail, либо позвонив в колл-центр нашей компании.

      Зачем аналитику нужно программирование на SQL?

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

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

      Программные конструкции

      Программная конструкция — это часть программы, отвечающая за определенное действие и объясняющая компьютеру как решить задачу. То есть небольшой строительный блок из которых и состоит программный код.

      Переменные

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

      Переменная — это ячейка в памяти компьютера, используемая для временного хранения какой-либо информации (чисел, строк, дат и т.п.).

      У переменной есть три важных атрибута:

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

      Также в SQL у переменной есть три фазы:

      1. Объявление переменной при помощи инструкции DECLARE ;
      2. Инициализация при помощи SET или SELECT ;
      3. Использование переменной при помощи подстановки ее имени в нужное место вашего скрипта.

      Давайте создадим переменную:

      Как переменные могут помочь аналитику?

      Первое что приходит на ум — это создание отчета с динамическими периодами, чтобы не редактировать каждый раз даты отчета в условии WHERE :

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

      Условные операторы

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

      Условный оператор приходит на помощь в тот момент, когда вам нужно выполнить либо одно, либо другое действие в зависимости от заданного условия.

      • Ключевое слово IF ;
      • Условие, в соответствии с которым будет происходить проверка;
      • Необязательное ключевое слово ELSE , указывающее на то, что делать если условие не выполнилось.

      Давайте разберем на примере:

      Чаще всего на практике требуются более сложные составные условия, содержащие различные логические связки.

      Зачем это аналитику?

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

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

      Оператор множественного выбора в зависимости от указанных условий позволяет вернуть одно из множества возможных значений, то есть CASE работает как несколько IF -ов.

      • Ключевое слово CASE ;
      • Ключевое слово WHEN , после которого идет условие проверки;
      • Ключевое слово THEN , после которого идет действие к выполнению;
      • Необязательное ключевое слово ELSE , указывающее на то, что делать если ни одно из условий не выполнилось;
      • Ключевое слово END .

      На практике все гораздо проще:

      Для аналитика польза очевидна, так как при помощи CASE , можно создавать новые параметры отчетах, а также в зависимости от условий рассчитывать показатели.

      Для примера давайте создадим новую группу каналов, ведь часто в отчетах бизнес-пользователи хотят видеть более понятные названия вместо smm_cpc , cpc или organic .

      Циклы

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

      Цикл — это инструкция, позволяющая выполнять один и тот же запрос несколько раз, пока условие истинно.

      • Ключевое слово WHILE ;
      • Условие в соответствии с которым будет выполняться цикл.

      В результате запрос, находящийся в операторных скобках, будет выполнен 4 раза:

      В чем же польза для аналитика?

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

      Программные модули

      Программный модуль — это запрос или скрипт сохраненный на сервере и оформленный в виде объектов.

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

      Представление

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

      Представление — это сохраненный в базе запрос с которым можно работать так, как будто бы это готовая таблица.

      У представления есть несколько ограничений:

      1. В качестве представления можно сохранить не любой запрос, а только SELECT ;
      2. В запросе не должно быть сортировки;
      3. Все столбцы должны иметь имена.
      • Ключевое слово CREATE VIEW использующееся для создания представления;
      • Ключевое слово AS , после которого должен идти текст запроса.

      При создании представления сервер не выполняет запрос, а сохраняет его в базе для последующего использования.

      Давайте разберем на примере:

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

      Чем это полезно аналитику?

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

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

      Табличное выражение

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

      Специально для этого был придуман функционал табличного выражения.

      Табличное выражение — это представление которое не сохраняется в базе, а существует только в момент выполнения SELECT -а и после самоликвидируется.

      • Ключевое слово WITH использующееся для создания табличного выражения;
      • Ключевое слово AS , после которого должен идти псевдоним;
      • В скобочках () указывается текст запроса, который будет выполняться при обращении к псевдониму;
      • После табличного выражения должен идти одиночный SELECT .

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

      Давайте разберем пример из практики практически любого digital-аналитика:

      1. Перед вами поставили задачу — создать отчет для отдела контекстной рекламы с доходом и расходом по рекламным кампаниям.
      2. Данные по расходам хранятся в одной базе, а данные по заказам в другой.
      3. Ключами позволяющими связать данные между собой являются UTM-метки.

      Для нас теперь это раз плюнуть, вооружимся табличными выражениями и напишем запрос:

      Да, конечно, эту задачу можно было решить гораздо меньшим количеством кода.

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

      Процедуры

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

      Основное назначение процедур — это сохранение программных сценариев для выполнения определенных действий в базе данных ( UPDATE , DELETE , INSERT и тп.), в том числе для вызова других процедур и функций.

      Но у процедуры есть ограничения:

      1. Процедуру нельзя использовать в SELECT -е;
      2. Процедуру нельзя усложнять «снаружи», то есть ее нельзя JOIN -ть, отфильтровать, группировать и тп.
      • Ключевое слово CREATE PROCEDURE использующееся для создания процедуры;
      • В процедурах можно использовать параметры, название которых указывается после знака @ ;
      • Ключевое слово AS , после которого должен идти программный код;
      • Для вызова процедуры используется ключевое слово EXECUTE вместе с ее названием.

      И теперь, чтобы вызвать процедуру, достаточно выполнить следующий код:

      Чем процедуры могут помочь аналитику?

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

      А подключая к хранилищу Python или R-скрипты, вы сможете обучать, оценивать и развертывать модели машинного обучения прямо в базе данных.

      Функции

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

      Функции — это конструкции, содержащие исполняемый код и являющиеся основными строительными блоками программы.

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

      1. Функция может быть усложнена как «внутри», так и «снаружи», то есть она поддается сортировке, группировке и JOIN -у.
      2. Функция всегда возвращает результат определенного типа, например, встроенная функция SUM — всегда вернет число. Процедура же может выполниться и ничего не вернуть или вернуть число, строку, дату и даже таблицу в зависимости от того, как она запрограммирована.

      И как тогда определиться что использовать? Все просто.

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

      • Ключевое слово CREATE FUNCTION использующееся для создания функции;
      • Параметры функции указываются в скобках () и после знака @ ;
      • Ключевое слово RETURNS указывает на тип возвращаемых функцией данных;
      • Ключевое слово AS , после которого должен идти программный код;
      • Ключевое слово RETURN , сообщающее функции, что нужно вернуть значение.

      Давайте переделаем процедуру из предыдущего примера в функцию:

      Для вызова созданной функции используем следующий код:

      Как функции могут облегчить жизнь аналитику?

      Помните, чуть выше в блоке про оператор множественного выбора, мы разбирали пример с новой группой каналов?

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

      Чтобы не повторять один и тот же код, можно написать функцию, которая заменит CASE :

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

      Что дальше?

      В следующей статье я расскажу как, используя программные возможности языка SQL, можно создать автообновляемый отчет на основе стека технологий MS SQL Server и Power BI.

      Основы SQL для начинающих с уроками

      Приветствую вас на моем блоге start-luck.ru. Сегодня поговорим про sql запросы для начинающих. У некоторых вебмастеров может возникнуть вопрос. Зачем изучать sql? Разве нельзя обойтись html и css?

      Оказывается, что для создания профессионального интернет-проекта этого будет недостаточно. Sql используется чтобы работать с БД и создания приложений для Вордпресс. Рассмотрим, как использовать запросы подробнее.

      Что это такое

      Sql — язык структурированных запросов. Создан для определения типа данных, предоставления доступа к ним и обработке информации за короткие промежутки времени. Он описывает компоненты или какие-то результаты, которые вы хотите видеть на интернет-проекте.

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

      Что может делать

      Язык sql позволяет:

      • создавать таблицы;
      • изменять получать и хранить разные данные;
      • объединять информацию в блоки;
      • защитить данные;
      • создавать запросы в access.

      Важно! Разобравшись с sql вы сможете писать приложения для Вордпресс любой сложности.

      Какая структура

      БД состоит из таблиц, которые можно представить в виде Эксель файла.

      У нее имеется имя, колонки и ряд с какой-то информацией. Создавать подобные таблицы можно при помощи sql запросов.

      Что нужно знать

      Для полноценной работы необходимо настроить локальный сервер на своем ПК, чтобы протестировать работоспособность блога.

      На хостинге это делать неудобно, или же он вообще не дает такой возможности. Вот тут и понадобится Apache, MySQL и PHP. Настроить их по отдельности сложно. Можно упростить процесс установки локального сервера.

      Рекомендую использовать Open Server. Это отличное решение для начинающих программистов все устанавливается просто и не придется отдельно настраивать локальный сервер и базу данных. Также вам придется изучить PHP.

      Основные моменты при изучении Sql

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

      Create database ‘bazaname’

      В кавычках пишем имя БД на латинице. Старайтесь придумать для нее понятное имя. Не создавайте базу типа «111», «www» и тому подобное.

      После создания БД устанавливаем кодировку windows-1251:

      Это нужно чтобы контент на сайте правильно отображаться.

      Теперь создаем таблицу:

      CREATE TABLE ‘bazaname’ . ‘table’ (

      id INT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,

      Во второй строке мы прописали три атрибута. Посмотрим, что они означают:

      • Атрибут NOT NULL означает, что ячейка не будет пустой (поле обязательное для заполнения);
      • Значение AUTO_INCREMENT — автозаполнение;
      • PRIMARY KEY — первичный ключ.

      Как добавить информацию

      Чтобы заполнить поля созданной таблицы значениями, используется оператор INSERT. Пишем такие строки кода:

      INSERT INTO ‘table’

      (login , pass , date ) VALUES

      (‘Vasa’, ‘87654321’, ‘2020-06-21 18:38:44’);

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

      Важно! Соблюдайте последовательность названий и значений столбцов.

      Как обновить информацию

      Для этого используется команда UPDATE. Посмотрим, как изменить пароль для конкретного пользователя. Пишем такие строки кода:

      UPDATE ‘table’ SET pass = ‘12345678’ WHERE >

      Теперь поменяйте пароль ‘12345678’. Изменения происходят в строке с « >

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

      Как удалить запись

      Если вы написали что-то не так, исправьте это при помощи команды DELETE. Работает так же, как и UPDATE. Пишем такой код:

      DELETE FROM ‘table’ WHERE >

      Выборка информации

      Для извлечения значений из БД используется команда SELECT. Пишем такой код:

      SELECT * FROM ‘table’ WHERE >

      В данном примере в таблице выбираем все имеющиеся поля. Это происходит если прописать в команде звездочку «*». Если нужно выбрать какое-то выборочное значение пишем так:

      SELECT log , pass FROM table WHERE >

      Необходимо отметить, что умения работать с базами данных будет недостаточно. Для создания профессионального интернет-проекта придется научиться добавлять на страницы данные из БД. Для этого ознакомьтесь с языком веб-программирования php. В этом вам поможет классный курс Михаила Русакова .

      Удаление таблицы

      Происходит при помощи запроса DROP. Для этого напишем такие строки:

      DROP TABLE table;

      Вывод записи из таблицы по определенному условию

      Рассмотрим такой код:

      SELECT id, countri, city FROM table WHERE people>150000000

      Он отобразит записи стран где населения больше ста пятидесяти миллионов.

      Объединение

      Связать вместе несколько таблиц возможно используя Join. Как это работает посмотрите подробнее в этом видео:

      PHP и MySQL

      Еще раз хочу подчеркнуть, что запросы при создании интернет-проекта — это обычное дело. Чтобы их использовать в php-документах выполните такой алгоритм действий:

      • Соединяемся с БД при помощи команды mysql_connect();
      • Используя mysql_select_db() выбираем нужную БД;
      • Обрабатываем запрос при помощи mysql_fetch_array();
      • Закрываем соединение командой mysql_close().

      Важно! Работать с БД не сложно. Главное — правильно написать запрос.

      Начинающие вебмастера подумают. А что почитать по этой теме? Хотелось бы порекомендовать книгу Мартина Грабера « SQL для простых смертных ». Она написана так, что новичкам все будет понятно. Используйте ее в качестве настольной книги.

      Но это теория. Как же обстоит дело на практике? В действительности интернет-проект нужно не только создать, но еще и вывести в ТОП Гугла и Яндекса. В этом вас поможет видеокурс « Создание и раскрутка сайта ».

      Видео инструкция

      Остались еще вопросы? Посмотрите подробнее онлайн видео.

      Вывод

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

      Основы Интернет Технологий

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

      Понятие и назначение SQL запроса

      Вступление

      Для работы с различными реляционными базами данных, включая Oracle, MySQL, PostgreSQL, DBase, FoxPro, Clipper, Paradox был создан единый язык запросов к базам данных. Назвали его язык SQL, что означает Structured Query Language — структурированный язык запросов.

      В данной статье используем СУБД MySql. Именно для пользователя, СУБД MySql имеет наибольшее практическое применение, как в управлении различными расширениями, так и в их создании. Как-никак, все локальные сервера, CMS, платформы интернет магазинов работают именно с СУБД MySql.

      Понятие и назначение SQL запроса для администрирования БД

      Реляционная база данных это таблица с информацией, разнесенной по столбцам (поля или атрибуты) и строкам (записи или кортежи) таблицы. Чтобы изменить или удалить данные в столбцах и строках, а также данные в определенных ячейках (пресечение столбца и строки) можно воспользоваться прикладными инструментами (например, phpmyadmin) или сделать SQL запрос к базе данных, по которому выполнится нужное действие.

      Что можно делать с помощью SQL запросов

      При помощи запросов SQL можно:

      • Создавать таблицы БД;
      • Изменять таблицы БД;
      • Удалять таблицы БД;
      • Вставлять записи (строки) в таблицы БД;
      • Редактировать записи в таблицах БД;
      • Извлекать выборочную информацию из таблиц БД;
      • Удалять выборочную информацию из БД.

      Это не полный перечень возможностей SQL запросов, но и он дает представление, что с помощью SQL запросов можно сделать с базой данных всё что необходимо.

      Операторы SQL запроса

      Язык SQL имеет большой список различных операторов, каждый из которых «задает» определенную команду. Справочник по операторам тут: (http://www.mysql.ru/docs/man/Database_Administration.html/CREATE_TABLE.html). В следующих статьях будем рассматривать, как работают основные операторы SQL и как с их помощью управлять базами данных.

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

      • CREATE TABLE – оператор sql для создания таблицы базы данных;
      • ALTER TABLE – оператор sql для изменения таблицы БД;
      • INSERT INTRO – вставка информации (строк) в таблицы БД;
      • UPDATE – оператор для редактирования информации в таблицах БД;
      • SELECT – извлечение информации из таблиц БД;
      • DELET – удаление информации из таблиц БД.

      Что такое код sqlпочему sql?

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

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

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

      Для другого шофера такси вам, возможно, потребуется самому узнать, где демонстрируется нужный фильм и назвать кинотеатр. Тогда водитель должен найти адрес этого кинотеатра. Может случиться и так, что вам придется самому узнать адрес кинотеатра и предложить водителю проехать к нему по таким-то и таким-то улицам. В самом худшем случае вам, может быть, даже придется по дороге давать указания: «Повернуть налево. проехать пять кварталов. повернуть направо. «. (Аналогично больший или меньший уровень детализации запроса приходится создавать пользователю в разных СУБД, не имеющих языка SQL.)

      Появление теории реляционных баз данных и предложенного Коддом языка запросов «alpha», основанного на реляционном исчислении [2, 3], инициировало разработку ряда языков запросов, которые можно отнести к двум классам:

      1. Алгебраические языки, позволяющие выражать запросы средствами специализированных операторов, применяемых к отношениям (JOIN — соединить, INTERSECT — пересечь, SUBTRACT — вычесть и т.д.).
      2. Языки исчисления предикатов представляют собой набор правил для записи выражения, определяющего новое отношение из заданной совокупности существующих отношений. Другими словами исчисление предикатов есть метод определения того отношения, которое нам желательно получить (как ответ на запроc) из отношений, уже имеющихся в базе данных.

      Разработка, в основном, шла в отделениях фирмы IBM (языки ISBL, SQL, QBE) и университетах США (PIQUE, QUEL) [3]. Последний создавался для СУБД INGRES (Interactive Graphics and Retrieval System), которая была разработана в начале 70-х годов в Университете шт. Калифорния и сегодня входит в пятерку лучших профессиональных СУБД. Сегодня из всех этих языков полностью сохранились и развиваются QBE (Query-By-Example — запрос по образцу) и SQL, а из остальных взяты в расширение внутренних языков СУБД только наиболее интересные конструкции.

      В начале 80-х годов SQL «победил» другие языки запросов и стал фактическим стандартом таких языков для профессиональных реляционных СУБД. В 1987 году он стал международным стандартом языка баз данных и начал внедряться во все распро-страненные СУБД персональных компьютеров. Почему же это произошло?

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

      Борясь за покупателя, фирмы, производящие программное обеспечение, стали выпускать на рынок все более и более интеллектуальные и, следовательно, объемные программные комплексы. Приобретая (желая приобрести) такие комплексы, многие организации и отдельные пользователи часто не могли разместить их на собственных ЭВМ, однако не хотели и отказываться от нового сервиса. Для обмена информацией и ее обобществления были созданы сети ЭВМ, где обобществляемые программы и данные стали размещать на специальных обслуживающих устройствах — файловых серверах.

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

      Для исключения указанных и некоторых других недостатков была предложена технология «Клиент-Сервер», по которой запросы пользовательских ЭВМ (Клиент) обрабатываются на специальных серверах баз данных (Сервер), а на ЭВМ возвращаются лишь результаты обработки запроса. При этом, естественно, нужен единый язык общения с Сервером и в качестве такого языка выбран SQL. Поэтому все современные версии профессиональных реляционных СУБД (DB2, Oracle, Ingres, Informix, Sybase, Progress, Rdb) и даже нереляционных СУБД (например, Adabas) используют технологию «Клиент-Сервер» и язык SQL. К тому же приходят разработчики СУБД персональных ЭВМ, многие из которых уже сегодня снабжены языком SQL.

      Бытует мнение: Поскольку большая часть запросов формулируется на SQL, практически безразлично, что это за СУБД — был бы SQL.

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

      • предложения определения данных (определение баз данных, а также определение и уничтожение таблиц и индексов);
      • запросы на выбор данных (предложение SELECT);
      • предложения модификации данных (добавление, удаление и изменение данных);
      • предложения управления данными (предоставление и отмена привилегий на доступ к данным, управление транзакциями и другие). Кроме того, он предоставляет возможность выполнять в этих предложениях:
      • арифметические вычисления (включая разнообразные функциональные преобразования), обработку текстовых строк и выполнение операций сравнения значений арифметических выражений и текстов;
      • упорядочение строк и (или) столбцов при выводе содержимого таблиц на печать или экран дисплея;
      • создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;
      • запоминание выводимого по запросу содержимого таблицы, нескольких таблиц или представления в другой таблице (реляционная операция присваивания).
      • агрегатирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов и т.п.

      В SQL используются следующие основные типы данных, форматы которых могут несколько различаться для разных СУБД:

      INTEGER — целое число (обычно до 10 значащих цифр и знак); SMALLINT — «короткое целое» (обычно до 5 значащих цифр и знак); DECIMAL(p,q) — десятичное число, имеющее p цифр (0 FLOAT — вещественное число с 15 значащими цифрами и целочисленным порядком, определяемым типом СУБД; CHAR(n) — символьная строка фиксированной длины из n символов (0 VARCHAR(n) — символьная строка переменной длины, не превышающей n символов (n > 0 и разное в разных СУБД, но не меньше 4096); DATE — дата в формате, определяемом специальной командой (по умолчанию mm/dd/yy); поля даты могут содержать только реальные даты, начинающиеся за несколько тысячелетий до н.э. и ограниченные пятым-десятым тысячелетием н.э.; TIME — время в формате, определяемом специальной командой, (по умолчанию hh.mm.ss); DATETIME — комбинация даты и времени; MONEY — деньги в формате, определяющем символ денежной единицы ($, руб, . ) и его расположение (суффикс или префикс), точность дробной части и условие для показа денежного значения.

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

      Ориентированный на работу с таблицами SQL не имеет достаточных средств для создания сложных прикладных программ. Поэтому в разных СУБД он либо используется вместе с языками программирования высокого уровня (например, такими как Си или Паскаль), либо включен в состав команд специально разработанного языка СУБД (язык систем dBASE, R:BASE и т.п.). Унификация полных языков современных профессиональных СУБД достигается за счет внедрения объектно-ориентированного языка четвертого поколения 4GL. Последний позволяет организовывать циклы, условные предложения, меню, экранные формы, сложные запросы к базам данных с интерфейсом, ориентированным как на алфавитно-цифровые терминалы, так и на оконный графический интерфейс (X-Windows, MS-Windows).

      Внедрение SQL-кода

      Внедрение SQL-кода относитcя к типу взлома веб-сайтов или веб-приложений, при котором произвольный SQL-код (Structured Query Language — Язык структурированных запросов) внедряется в запрос с целью получения возможности чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

      Что такое внедрение SQL-кода?

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

      Насколько распространены внедрения SQL-кода?

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

      Как распознать внедрение SQL-кода?

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

      Можете ли вы отстранить внедрение SQL-кода?

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

      Как вы можете противостоять данной угрозе?

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

      Илон Маск рекомендует:  Asp contents remove
      Понравилась статья? Поделиться с друзьями:
      Кодинг, CSS и SQL