SQL — всё по этой теме для программистов


Оглавление (нажмите, чтобы открыть):

Советы по изучению sql для новичка

16.07.2020, 11:49

SQL для новичка
Здравствуйте. Прошу у Вас совета: в SQL я пока полный ноль , но есть желание это исправить ; с чего.

Литература для новичка в SQL
Всем привет! Что можете посоветовать по литературе для новичка в SQL?

Советы по изучению языка для новичка
Всем привет 🙂 Я новичок в C# Вот пришёл за советами; в инете надыбал лекции какого-то автора.

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

С чего начать моделирование, советы для новичка
Здравствуйте товарищи. Столкнулся с проблемой моделирования/построения программы. Что бы не.

16.07.2020, 12:03 2 16.07.2020, 15:10 3

почему не установить EXPRESS?

16.07.2020, 16:25 4

Начни с дедушки Дэйта. «Введение в системы баз данных»
А уж потом лезь в конкретику

Добавлено через 11 минут
Уот-так-вот. Уже и восьмое издание вышло и успешно украдено в pdf на русском

16.07.2020, 16:25
18.07.2020, 03:27 [ТС] 5
18.07.2020, 08:42 6
18.07.2020, 10:09 7

Для освоения лучше установить предпоследнюю версию SQL Server Express 2014 c Advanced Services. Она бесплатна, стабильна и более чем достаточна для изучения.

Из книг могу посоветовать следующую: «Программирование баз данных. MS SQL Server 2005. Базовый курс. Р. Виейра». Мне понравилось.

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

Основные принципы программирования на T-SQL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Преобразование данных является довольно сложным разделом в 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 не должно быть произвольным. Необходимо тщательно взвесить, какие из них задействовать.

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

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

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

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

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

Еще одна проблема, о которой стоит упомянуть — это использование SELECT для инициализации значений переменных. Такой подход позволяет присваивать значения нескольким переменным в одном выражении, чего нельзя сделать с помощью SET . С другой стороны, этот подход не является частью стандартов ANSI , и может ввести разработчика в заблуждение, когда он представлен рядом с другими операторами SELECT и TSQL UPDATE .

Замечательный мир сравнений

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

Предположим, что в вашем экземпляре SQL Server настроена сортировка SQL_Latin1_General_CP1_CI_AS , и затем вы создаете следующие базу данных и таблицу:

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

И это только начало

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

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

Данная публикация представляет собой перевод статьи « The Basics of Good T-SQL Coding Style » , подготовленной дружной командой проекта Интернет-технологии.ру

14 наиболее часто используемых запросов SQL на собеседовании (вопрос/ответ)

Главное меню » Базы данных » Учебное пособие по SQL » 14 наиболее часто используемых запросов SQL на собеседовании (вопрос/ответ)

Эти запросы проверят ваши SQL навыки на работу, как внутреннее и внешнее соединение, фильтрация записей с помощью условий WHERE и HAVING, группировка записей с помощью предложения GROUP BY, вычисление суммы, среднего и подсчета записей с помощью совокупной функции как AVG(), SUM () и COUNT (), поиск записей с помощью символов подстановки в операторе LIKE, поиска записей в связанном с использованием BETWEEN и IN, запросы DATE и TIME и т.д. Если вы столкнулись с каким – либо интересным запросом в SQL или у вас есть какие – либо проблемы и поиск решения, вы можете разместить его здесь на благо каждого.

SQL Query. Вопросы и ответы

Вопрос 1: SQL-запрос, чтобы найти вторую самую высокую зарплату работника

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

См как найти вторую самую высокую зарплату в SQL с большим количеством способов решения этой проблемы.


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

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

Эти вопросы становятся более интересными, если Интервьюер попросит вас напечатать название отдела вместо отдела ID, в этом случае, вам нужно соединить таблицу Employee с Department с использованием внешнего ключа DeptID, убедитесь, что вы используете LEFT or RIGHT OUTER JOIN включая отделов без каких – либо сотрудников. Вот запрос

В этом запросе мы использовали RIGHT OUTER JOIN, потому что нам нужно название отдела из таблицы Department, который находится на правой стороне JOIN, даже если нет никакого упоминания о dept_id в таблице сотрудников.

Вопрос 3: Написать SQL – запрос для отображения текущей даты.

Ответ: SQL имеет встроенную функцию под названием GetDate(), которая возвращает текущую временную метку. Это будет работать в Microsoft SQL Server, другие производители, такие как Oracle и MySQL также имеет эквивалентные функции.


Вопрос 4: Напишите SQL запрос, чтобы проверить дату в передаваемом запросе, является ли дата данного формата или нет .

Ответ: SQL имеет функцию IsDate(), которая используется для проверки переданное значение, является дата или не указанного формата, он возвращает 1 (истина) или 0 (ложь), соответственно. Помните IsDate() является функцией MSSQL и он может не работать на Oracle, MySQL или любой другой базе данных, но не было бы что – то подобное.

Она возвращает 0, потому что прошло дата не в правильном формате.


Вопрос 5: Напишите SQL запрос, чтобы напечатать имя отдельного работника у которого поле DOB составляет от 01/02/1965 до 31/11/1970.


Ответ: Этот SQL-запрос является сложным, но вы можете использовать BETWEEN, чтобы получить все записи, у которых дата выпадает между двумя датами.

Вопрос 6: написать SQL запрос, где найти количество сотрудников в зависимости от пола , чье поле DOB между 01/02/1965 до 31/11/1970.

Вопрос 7: Напишите SQL запрос, чтобы найти сотрудника, чья зарплата равна или превышает 20000.

Вопрос 8: Напишите SQL запрос, чтобы найти имя сотрудника, чье имя начинается с ‘M’

Вопрос 9: Найти все записи о сотрудниках, содержащие слово “Роман”, независимо от того, был ли он, как РОМАН, Роман, или роман.

Вопрос 10: Напишите SQL запрос, чтобы найти год от даты.

Ответ: Вот как вы можете найти год от даты в SQL Server 2008

Вопрос 11: Написать SQL – запрос для поиска дубликатов строк в базе данных? а затем написать SQL запрос, чтобы удалить их?
Ответ: Вы можете использовать следующий запрос для выбора различных записей:

Вопрос 12: Существует таблица, которая содержит два столбца Student и Marks, вам нужно найти всех студентов, чьи оценки являются больше, чем средние оценки, т.е. список студентов выше среднего.

Ответ: Этот запрос можно записать с помощью подзапросов, как показано ниже:


Вопрос 13: Как вы находите всех сотрудников, которые являются также менеджерами?
Вы дали стандартную таблицу сотрудников с дополнительной колонкой mgr_id , которая содержит идентификатор сотрудника менеджера.

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

Запрос покажет имя сотрудника и имя менеджера в два столбца, например

Один из последующих изменит этот запрос, чтобы включать в себя сотрудников, которые не имеют статус менеджера. Для того, чтобы решить, что, вместо этого использовать inner join, просто используйте left outer join, он также будет включать сотрудников без менеджеров.

Вопрос 14: У вас есть композитный индекс из трех колонок, как вы обеспечиваете значение двух столбцов в WHERE на выборку? Будет ли индекс использоваться для этой операции?

Например, если индекс находится на EmpId, EmpFirstName и EmpSecondName и вы пишете запрос типа

Если данные в две колонки являются вторичными индексами столбца, то индекс не будет ссылаться, но если данные 2 колонок содержат первичный индекс (первый столбец при создании индекса), то индекс будет ссылаться. В этом случае индекс будет использоваться, поскольку EmpId и EmpFirstName являются первичные столбцы.

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Основы 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 запросов не так трудно, как кажется, но сделать это нужно любому вебмастеру. В этом помогут видеокурсы, описанные выше. Подпишитесь на мою группу ВКонтакте чтобы первыми узнавать о появлении новой интересной информации.

MySQL

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

Вначале коротенькое вступление.

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

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

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

В результате — большие нагрузки на сервер, неповоротливость и нарушение элементарной безопасности.

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

Существует несколько разновидностей баз данных:

Иерархические, реляционные, объектно-ориентированные, гибридные.


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

Данные в одних таблицах, как правило, связаны с данными других таблиц, отсюда и произошло название «реляционные».

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

Известная всем с детства таблица )

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

Итак, что же такое MySQL?

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

Поддержка MySQL автоматически включается в поставку PHP, что избавляет web-программиста от лишних хлопот.

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

Для наглядности простая схема работы.

Запись в БД:
Php-скрипт отправляет данные в БДБД структурирует их, присваивает адреса и помещает на жёсткий диск.

Чтение из БД:
Php-скрипт запрашивает данные у БДБД очень быстро находит их на жёстком диске, забирает, формирует и отдаёт.

Или на примере странички которую Вы сейчас читаете:

Вы запросили страницу у Web-сервера ⇨ Web-сервер обратился к движку сайта ⇨ Движок запросил данные у БДБД быстро нашла нужный текст и отадала движку, тот сформировал из него html-страничку и отдал Web-серверу и наконец Web-сервер отдал её Вам.

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

Помимо удобства, важнейшим фактором является скорость работы — выборка информации из базы происходит очень быстро. Связано это с тем, что БД написана на языке C++ и соответственно работает с жёстким диском гораздо быстрее чем программы (взаимодействующие с БД) написаные на PHP. Другими словами, вне зависимости от того, с какой скоростью Ваши php-скрипты работают с БД, работа БД с жёстким диском будет происходить быстрее. Тем самым исключаются всякие коллизии.

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

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

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

Скорее всего, у Вас появилось больше вопросов, чем ответов, поэтому давайте перейдём к практическим действиям и разберёмся во всем подробно.

Сервер

Предполагается, что у Вас уже установлен Web-сервер, PHP, MySQL и phpMyadmin. Если это не так, то, пользователи могут прочитать подробную инструкцию по установке всего выше перечисленного вот здесь (nginx ставить не нужно), а поклонники найдут всё необходимое вот тут.

Создание БД

Вначале, все операции по созданию и управлению базами, будем делать с помощью phpMyadmin, а позже, всё то же самое из своей web-странички с помощью SQL-запросов.

Заходим в браузере по адресу — ваш_комп/phpMyadmin (для Win — localhost/tools/phpmyadmin/)

Вводим логин root и пароль, нажимаем ОК

Видим что-то вроде этого:

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

Теперь давайте создадим БД, например, Вашей домашней библиотеки. Шкаф — это у нас будет база данных, а полки будут таблицами.

Нажимаем вверху на вкладку «Базы данных», в поле «Новая база данных» пишем название homelib и нажимаем кнопку «Создать».

Обратите внимание на графу «Сравнение», здесь нужно указать кодировку. Она должна быть та же, что и указаная при установке.
Самый разумный выбор — это UTF-8, поэтому указывайте utf8_general_ci.

В списке появиться только что созданая база.

Теперь создадим пользователя. Нажмите на название базы и увидите это:

Здесь можно создать таблицу в новой базе, но мы это сделаем чуть позже, сейчас нужно создать пользователя для базы homelib.
Стоит заметить, что владельцем новой базы, можно сделать существующего пользователя (например root).

Нажмите вкладку «Привилегии»:

И «Добавить нового пользователя»:

Имя пользователя можно сделать по названию базы — homelib.

Хост — укажите localhost.
Это значит, что БД находится на той же машине, что и web-сервер работающий с ней. Если бы БД находилась на другой машине, то нужно было бы указать путь к ней.

Пароль — например 12345.

Больше ничего трогать не надо.
Нажать внизу кнопку «ОК». (для Win — «Добавить пользователя»)

Обратите внимание на нижний блок «База данных для пользователя». Можно не создавать отдельно базу и пользователя, а сразу же создать пользователя и выбрать пункт «Создать базу данных с именем пользователя в названии и предоставить на нее полные привилегии», будет создан пользователь с одноимённой базой.

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

Всё готово, есть база homelib, её пользователь homelib и пароль, это понадобится в дальнейшем, при обращении к базе из своей html-странички.

Перейдём к созданию таблицы.

Нажмите в левой колонке на homelib и увидите предложение создать таблицу.

Поскольку БД homelib — это у нас шкаф, то предположим, что в нём две полки. То есть в базе будет две таблицы — polka1, polka2.

Имя — polka1, количество столбцов — 4.

В столбцах будут следующие значения:

1. Порядковый номер книги.
2. Автор.
3. Название.
4. И сам текст книги.

Появится форма, в которой надо присвоить значения столбцам:

В реляционных БД строка таблицы называется записью, а столбецполем.

Схема нашей будущей таблицы:

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

Давайте настроим таблицу:

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

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

Номер книги — это целочисленное значение, поэтому тип оставляем int.

Длину не указываем, система сама с этим разберётся.

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

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

Получится вот так:

В следующих двух полях будет храниться фамилия автора и название книги:

author — автор книги.

title — название книги.

ТипVARCHAR, это строка переменной длины от 1 до 255 символов. В нашем случае пятидести символов будет вполне достаточно, вряд ли фамилия или название будет длиннее.
Выбор переменных определяет количиство занимаемой памяти. В «двух словах» их значения не объяснить, поэтому рекомендуется изучить вот этот материал.

В последнем поле, будет храниться непосредственно текст книги:

ТипLONGTEXT может хранить до 4294967295 символов. Этого хватит для любой книги.

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

Нажмите внизу кнопку «Сохранить».

Всё готово, таблица polka1 создана, а таблицу polka2 Вы создадите сами, по той же схеме.

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

Откроется структура таблицы:

Нажмите на вкладку «Вставить» и заполните как в примере:

Первое поле мы не заполняли, так как это происходит автоматически (авто-инкремент).

Нажимаем кнопку «ОК».

Система сообщает о выполненых действиях.

Нажмите вверху на название таблицы (polka1) или на вкладку «Обзор».

Здесь можно изменить или удалить строку.

Добавим в библиотеку других авторов, тем же способом. Получится вот так:

Теперь наша таблица (полка) стала выглядеть как мы и задумывали:

На этом первая часть окончена.

Дальнейшая работа с БД, описана в следующей части.

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. С другой стороны, неплохо учиться также на распространенных ошибках.

SQL для начинающих

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

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

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

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

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

Автор урока пользуется WAMP ом и все скриншоты и примеры будут из этой программы и ее MySQL консоли.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

USE: Выбор БД

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Благодаря хорошей читабельности 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 2 берет только 2 первых результата. LIMIT 1 OFFSET 2 получает 1 результат после первых 2-х. LIMIT 2, 1 означает тоже самое (только обратите внимание сначала идет offset а потом limit ).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.nettuts.com
Перевел: Максим Шкурупий
Урок создан: 10 Марта 2010
Просмотров: 390819
Правила перепечатки

5 последних уроков рубрики «Разное»

Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов

Проект готов, Все проверено на локальном сервере OpenServer и можно переносить сайт на хостинг. Вот только какую компанию выбрать? Предлагаю рассмотреть хостинг fornex.com. Отличное место для твоего проекта с перспективами бурного роста.

Разработка веб-сайтов с помощью онлайн платформы Wrike

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

20 ресурсов для прототипирования

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

Топ 10 бесплатных хостингов

Небольшая подборка провайдеров бесплатного хостинга с подробным описанием.

Быстрая заметка: массовый UPDATE в MySQL

Ни для кого не секрет как в MySQL реализовать массовый INSERT, а вот с UPDATE-ом могут возникнуть сложности. Чтобы не прибегать к манипуляциям события ON_DUPLICATE можно воспользоваться специальной конструкцией CASE … WHEN … THEN.

Обзор заработных плат по позиции: «Программист MS SQL»

Исследовательский центр портала Superjob в июле 2015 года изучил предложения работодателей и ожидания претендентов на позицию «Программист MS SQL» в 15 городах России.

В должностные обязанности программиста MS SQL входит:

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

Заработная плата и требования работодателей

От начинающих программистов MS SQL требуют наличия технического высшего образования (возможно, неполного), понимания реляционной модели данных, знания классических алгоритмов и структур данных, уверенных знаний одного из процедурных языков (PL/SQL,T-SQL, SQL PL), опыта написания скриптов и хранимых процедур на языке запросов, а также знания английского языка на уровне чтения технической документации. Зарплатные предложения для специалистов без опыта работы на данной позиции в Москве начинаются , в Санкт-Петербурге —

От специалистов, имеющих опыт работы программистом MS SQL от года, работодатели ждут знания архитектуры MS SQL и способов оптимизации производительности, понимания принципов работы баз данных (уровней изоляции‚ блокировки данных‚ плана выполнения запроса и пр.), знания средств обеспечения стабильности функционирования БД (технологии репликации, кластеризации, резервного копирования и восстановления) и целостности данных, а также умения разбираться в чужом коде. Дополнительными преимуществами будут знание XML, XSLT и методик организации процесса разработки в команде (Scrum, Kanban, Waterfall). Зарплатные предложения для соискателей, соответствующих указанным требованиям, составляют в Москве, в городе на Неве.

Специалисты, имеющие уверенный опыт разработки архитектуры базы данных, оптимизации сложных запросов и работы с высоконагруженными базами данных, могут претендовать на более высокие зарплаты. От кандидатов требуют знания дополнительных инструментов работы — SQL Management Studio, SQL Server Profiler, SQL Reporting Services, SQL Server Integration Services, SQL Server Analysis Services. В некоторых случаях может понадобиться знание одного или нескольких языков программирования (С++, C#, Python, PHP и др.) и навыки работы с другими базами данных (Oracle, MS Dynamics и т.д.). Минимальный опыт работы с MS SQL — 3 года. Зарплатные предложения в этом диапазоне в Москве достигают , в Северной столице —

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

WEBURSITET.RU

Онлайн-курсы профессиональной разработки ПО

Как программисты SQL от юзеров спасли

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

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

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

Благодаря SQL любой бухгалтер, кадровик, и даже самый бестолковый менеджер получал возможность работать с базой данных с помощью четырёх простых команд, очень похожих на фразы естественного английского языка. Select, Insert, Update, Delete — ought to be enough for anybody, остальное от лукавого. Язык даже назывался тогда не SQL, а SEQUEL: Structured English Query Language.

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

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

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

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

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

Вот лишь некоторые вехи, отмечающие победоносное покорение SQL программистами.

Индексация и контроль целостности. (Всего пара десятков новых ключевых слов — и понимание языка становится недосягаемым для нетехнарей).

Специальные типы для двоичных данных (пусть помнят, кто здесь хозяин!)

Хранимые процедуры. Всё. Теперь это полноценный язык программирования, а не там общения.

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

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

Но всё, поезд ушёл. Современный бухгалтер может помнить наизусть несколько десятков малопонятных функций Excel, но в ответ на предложение самому написать простенький SELECT обиженно заверещит: «Я вам что, программист?!»

И значит, победа программистов в битве за SQL окончательна и бесповоротна.

SQL — всё по этой теме для программистов

Как правильно выбрать летние шины rezina62.ru.

Пособие по Btrieve для SQL-программистов.

Введение . Данный документ — краткая инструкция по использованию в DELPHI прямых обращений к ядру CУБД Btrieve, написанная для людей с SQL-мышлением, которым судьба-индейка подсунула свинью в виде производственной необходимости временно (или, не дай Создатель, постоянно) использовать это чудо Pervasive-вской мысли. Мне самому пришлось долго и больно перестраиваться с незамутненных SQL-понятий работы с данными на суровую логику программирования более низкого уровня. Данная шпаргалка призвана облегчить этот процесс, и содержит параллели между основными SQL-командами (select/insert/update/delete) и вызовами функции BTRVID, описанной по принципу «черного ящика». Сразу скажу, что не являюсь специалистом по Btrievу (т.е. могу путаться в Btrievовских терминах), большая часть информации получена эмпирическим путем, все примеры использовались в жизни, отлажены и работают.

Отдельно замечу следующее . Вообще говоря, в природе существует Pervasive ODBC, его заменитель Titan Btrieve, и, возможно, кое-что еще, что позволяет обращаться к Btrieve-данным через SQL-запросы. Однако во-первых, это дело работает на порядок медленнее, а во-вторых, в определенных ситуациях (например в моей — мне пришлось организовывать перекачку данных из Informix SQL-сервера в программу «Парус», использующую Btrieve. С Informixом, сами понимаете, никаких проблем не было) из-за специфического формата данных, определяемого конкретным программным продуктом, использование ODBC порой оказывается в принципе невозможным. Например, его (ODBC) приводят в смятение нулевые байты в текстовых полях. И последнее. По правильному, для работы с Btrievом нужно устанавливать Btrievовский Engine, пытаться добиться от него стабильной работы, поганить реестр и все такое. (Может, конечно, это со мной что-то не так, но мне пришлось через это пройти. Хотя на моей работе тратить дни на то, чтобы заставить продукт проявить заявленные возможности считается непозволительной роскошью). Вообще говоря, можно ограничиться набором DLL-библиотек из Pervasive.SQL 2000 Workgroup Engine, которые достаточно переписать в директорию с приложением, или в директорию, прописанную в путях, чтобы можно было работать с Btrievом. Ну — удачи!

Необходимое окружение . Прежде всего в директорию, содержащую исходники Delphi-приложения, нужно поместить вышеупомянутые DLL и файлы Btrapi32.pas и BtrConst.pas из Pervasive SDK 2000 и в uses прописать BtrConst и BtrApi32. Если кому интересно назначение этих файлов, может посмотреть сам — там все достаточно прозрачно. Затем в type нужно прописать следующие два типа:

CLIENT_ > networkandnode : array[1..12] of char;
applicationID : array[1..3] of char;
threadID : smallint;
end;

VERSION_STRUCT = packed record
version : smallint;
revision : smallint;
MKDEId : char;
end;

а в var следующие переменные:

Физический смысл большинства из этих переменных мне ясен смутно, но он и не важен. Будем считать их частью черного ящика. Переменные, помеченные комментарием <ВРУЧНУЮ НЕ ПЕРЕИНИЦИАЛИЗИРОВАТЬ!>являются системными, Btrieve сам их как-то заполняет и потом с ними работает. Остальные же несут разную смысловую нагрузку в зависимости от действия.

Подключение к Btrieve-БД (SQL: Database & Connect в одном флаконе) . Чтобы производить любые операции с данными Btrieve, нужно в первую очередь подконнектиться к базе. Чтобы подключиться, нужно выполнить следующий фрагмент кода:

fillchar(keyBuf, sizeof(keyBuf), #0);
keybuf := ‘ ‘ + #0;
fillchar(client.networkAndNode, sizeof(client.networkAndNode), #0);
client.application + #0; <так надо>
сlient.thread >fillchar(versionBuffer, sizeof(versionBuffer), #0);
dataLen := sizeof(versionBuffer);
status := BTRVID(B_VERSION, <системная константа>
posBlock, <системная>
versionBuffer, <системная>
dataLen, <см.выше>
keyBuf[1], <см.выше>
0,
client); <системная>

if status = B_NO_ERROR значит подконнектилось успешно, иначе — по каким-то причинам не получилось. Причины (из известных) могут быть следующие — приложение не нашло необходимые DLL-ки, неправильно указан путь в keybuf, кривой btr-файл. Подробно ошибки описаны в Pervasive SDK 2000 хэлпах.

Желательно в конце работы это делать. Во избежание.

Открытие таблицы(SQL: Аналог отсутствует) . Для выполнения любой операции с таблицей (select/insert/update/delete) необходимо сначала ее открыть. Следующий фрагмент открывает одну отдельно взятую таблицу:

fillchar(keyBuf, sizeof(keyBuf), #0);
keybuf := ‘ ‘ + #0;
fillchar(dataBuffer, sizeof(dataBuffer), #0);
dataLen := 0;
status := BTRVID(B_OPEN, <системная константа>
PosBlock, <системная>
dataBuffer, <см.выше>
dataLen, <см.выше>
keyBuf[1], <см.выше>
0,
client) <системная>

Если status != B_NO_ERROR, значит, что-то не сложилось. Или файл кривой, или путь неправильный, или с ним уже кто-то работает, или таблица уже открыта, или см. ошибки. Вообще говоря, можно открывать сразу несколько таблиц, и одновременно с ними работать. Но в этом случае для корректной работы нужно для каждой таблицы завести свой набор переменных

Наверное, можно даже применить массивы.

Закрытие таблицы(SQL: Аналог отсутствует) . Все то же самое, как в открытии таблицы. Единственное отличие — B_CLOSE вместо B_OPEN. Для вящей корректности после окончания работ с таблицей нужно ее закрыть.

Добавление записи(SQL: INSERT). Для работы с конкретной таблицей необходимо:

1) Чтобы на эту таблицу было наложено заклинание эксклюзивного доступа. (Sorry, пиво. ) Продолжаю на трезвую голову. Так вот: для работы с таблицей на самом деле необходимо следующее-
1) Должна быть описана структура таблицы. Например (таблица хозяйственных операций «Паруса»):

type
OPERHEAD_STRUCT = packed record
ISN : integer;
opDate : array[0..8] of char;
agnFrom : array[0..15] of char;
agnTo : array[0..15] of char;
docType : array[0..5] of char;
docNumb : array[0..12] of char;
docDate : array[0..8] of char;
basType : array[0..5] of char;
basNumb : array[0..12] of char;
basDate : array[0..8] of char; <см. ссылку в тексте>
resSum : double;
spMark : array[0..5] of char;
opCont : array[0..80] of char;
invSign : smallint;
subAgn : array[0..15] of char;
appName : array[0..8] of char;
appIsn : longint;
resMSum : double; <см. ссылку в тексте>
sysNumb : array[0..3] of char;
regNumb : longint;
opMngCnt : array[0..80] of char;
end;

Важно! Для корректной работы должен быть соблюден размер полей в байтах. Через Database Explorer можно посмотреть структуру Btrieve-таблицы, с которой нужно работать. Там мы увидим, что поле resMSum, например, типа FLOAT и размером 8 байт. Этим размером и свойствами в Delphi обладает тип double. Поля типа CHAR в Btrieve имеют две характеристики — логическую длину и физическую (на байт больше). Это также видно в DBE. Поле basDate, например, логически длиной 9 байт, а физически — 10. Нужно исходить из логической длины, и поля типа CHAR описывать как начинающиеся с нуля массивы of char. Поле basDate в этом случае представляется как массив 0..8, т.е. 9 байт.

2) Данная запись должна быть проинициализирована. Вообще Btrieve все аналоги SQL-операций может выполнять только с записью целиком. Поэтому перед каждым «INSERT»ом или «UPDATE»ом нужно, чтобы все поля записи были заполнены нужным образом. Специфика заполнения такова:

б) Числовые поля:
OperheadRecord.resmsum := AsFloat со значением;

Здесь главное — совместимость типов. Достаточно легко определяется.

в) Автоинкременты:
fillchar(OperheadRecord.isn , SizeOf(OperheadRecord.isn), #0);
Независимо от типа. Просто заполняем их нулевыми байтами, Btrieve сам присвоит нужное значене.

Статус, понятно, должен оказаться равен B_NO_ERROR.

Позиционирование/Поиск(SQL: SELECT & FETCH в одном флаконе) . Я для работы обошелся всего тремя опциями — B_GET_EQUAL, B_GET_FIRST, B_GET_NEXT. Вообще их там больше. Но поскольку даже в совокупности они все равно не заменят всю прелесть SQL, лучше потратить силы не на изучение всяких нюансов сомнительной ценности, а на то, чтобы избежать использования Btrieve в принципе :-). Для начала — общая информация. B_GET_EQUAL предназначен для выборки одной записи из таблицы. Если результатом запроса будет выборка из более чем одной записи, он вернет первую и на этом успокоится. B_GET_FIRST инициализирует выборку из более чем одной записи, и возвращает первую из выборки (скажу сразу — сортировка мне была не нужна, насчет нее ничего не знаю.). Если дальше мы будем выполнять B_GET_NEXT, то за каждое выполнение будем получать по одной следующей записи из выборки. Причем если упрется в конец файла, то выдаст status с кодом 9. В противном случае похоже, что просто пойдет дальше по файлу, несмотря на то, что начиная с какой-то записи все последующие уже не будут отвечать условиям выборки. Скажу сразу, что здесь я не уверен до конца в своих знаниях, могу ошибаться. Короче, у меня в программе в WHILE с GET_NEXTами стоит проверка сразу двух условий — чтобы status был B_NO_ERROR и чтобы полученные значения условиям выборки отвечали. Хотя бы одно не выполнилось — из WHILE выхожу. Пока работает. И последнее. Все эти GETы могут искать только по полям, описанным в индексах таблицы. Свое мнение об этом деликатно опускаю. Теперь — собственно описание синтаксиса. Для того, чтобы выполнить B_GET_EQUAL, нужно:

а) Описать структуру индексов. Например, в уже упомянутой таблице OPERHEAD есть следующие индексы:

type
OPERHEAD_INDEX7 = packed record
appIsn : longint;
appName : array[0..8] of char;
end;
OPERHEAD_INDEX0 = packed record
ISN : integer;
end;

var
OperHeadIndex0 : OPERHEAD_INDEX0; <индекс номер 0>
OperHeadIndex7 : OPERHEAD_INDEX7;

Информацию об индексаx можно посмотреть в том же DBE.

OperheadIndex0.isn := значение AsInteger; <присвоение параметров поиска>
fillchar(OperheadRecord , SizeOf(OperheadRecord), #0);
dataLen := sizeof(OPERHEAD_STRUCT);
status := BTRVID(B_GET_EQUAL, <системная константа>
PosBlock, <системная>
OperheadRecord, <сюда будет возвращен результат поиска>
dataLen, <см.выше>
OperheadIndex0, <см.выше>
0, <номер индеска - см.выше>
client);

Если status <> B_NO_ERROR and <> B_KEY_VALUE_NOT_FOUND — значит, чего-то нашлось.

Использование других GETов осуществляется по этой же схеме. Единственная разница — вместо B_GET_EQUAL нужно поставить B_GET_FIRST или B_GET_NEXT. Важно! B_GET_EQUAL может использовать только уникальные индексы! B_GET_FIRST и B_GET_NEXT — любые.

Обновление записи(SQL: UPDATE) . Самое главное — здесь рассмотрен вариант обновления одной записи. У меня сложилось впечатление, что вообще в Btrieve можно обновлять и удалять только по одной записи, но поскольку у меня не хватило терпения изучить HELP до конца, наверняка утверждать не могу. Итак: Непосредственно перед действием обновления у нас должен быть выполнен B_GET_EQUAL, который спозиционирует указатель в таблице именно на ту запись, которую мы будем апдейтить. ( У меня есть подозрение, что информация о позиционировании хранится в PosBlockе. Впрочем, какая разница?) Далее мы должны полностью заполнить запись таблицы (в нашем случае — OperheadRecord). Вообще говоря, поскольку только что выполнился B_GET_EQUAL, OperheadRecord у нас уже заполнен. Мы можем просто переприсвоить те поля, какие хотим изменить. Специфику заполнения см. в разделе, посвященном INSERTу. Далее — код:

Status, сами понимаете, должен оказаться B_NO_ERROR. Если все в порядке.

Удаление записи(SQL: DELETE) . Использование практически совпадает с B_UPDATE. В смысле, сначала должен быть B_GET_EQUAL и все такое. Фрагмент кода немного отличается — B_DELETE вместо B_UPDATE, и DataBuffer вместо OperheadRecord — какой смысл передавать данные, если запись сейчас будет удалена?

fillchar(dataBuffer, sizeof(dataBuffer), #0);
dataLen := SizeOf(OPERHEAD_STRUCT);
Status := BTRVID(B_DELETE, <системная константа>
PosBlock, <системная>
DataBuffer, <см.выше>
dataLen, <см.выше>
KeyBuf, <путь к таблице - см.выше>
-1,
client)

Про status уже и не говорю.

Заключение . Вот, собственно и все, что мне известно. В принципе, в разрозненном виде это все есть и в Pervasive SDK 2000 Help, и в Инете, но мне, например, понадобилось две недели, чтобы вычленить именно эту информацию, абстрагироваться от ненужной, и c прискорбием убедиться в несостоятельности обычного Pervasive ODBC. Может, данный документ кому-то сэкономит время. Хотя лучше всего, если эта информация вам не понадобится вовсе!

Мастер Йода рекомендует:  Книги для программистов
Добавить комментарий