Глава 2. SQL. ОБЗОР.
Эта глава знакомит вас со структурой языка SQL, а также с некоторыми общими понятиями, такими как типы данных, которые поля могут содержать, и некоторыми неоднозначностями, которые существуют в SQL. Она должна обеспечить связь с более конкретной информацией в последующих главах. Вы не должны запоминать каждую подробность, упомянутую в этой главе.
Здесь дан лишь краткий обзор; многие подробности даны, чтобы впоследствии обращаться к ним по мере овладения языком. Мы поместили всё это в начало книги, чтобы ориентировать вас на мир SQL без упрощенного подхода к его проблемам и, в тоже время, дать вам повторяющиеся в дальнейшем места для ссылки на них, когда у вас появятся вопросы. Этот материал может стать более понятным, когда мы перейдём к описанию конкретных команд SQL в Главе 3.
КАК РАБОТАЕТ SQL?
SQL это язык, ориентированный специально на реляционные базы данных (РБД). Он выполняет большую работу, которую вы должны были бы делать, если бы использовали универсальный язык программирования, например C. Чтобы сформировать РБД на C, вам необходимо было бы начать с нуля. Вы должны были бы определить объект, называемый таблицей, которая могла бы увеличиваться, чтобы иметь любое число строк, а затем создавать постепенно процедуры для вставки и извлечения значений.
Если бы вы захотели найти некоторые конкретные строки, вам необходимо было бы выполнить по шагам процедуру, подобную следующей:
- Рассмотреть строку таблицы.
- Выполнить проверку: является ли эта строка одной из строк, которая вам нужна.
- Если это так, сохранить её где-нибудь, пока вся таблица не будет проверена.
- Проверить, имеются ли другие строки в таблице.
- Если имеются, возвратиться на шаг 1.
- Если строк больше нет, вывести все значения, сохранённые в шаге 3.
(Конечно, это не фактический набор C-команд, а только логика шагов, которые должны были бы быть включены в реальную программу.) SQL сделает всё это за вас. Команды в SQL могут работать со всеми группами таблиц как с единым объектом и могут обрабатывать любое количество информации, извлечённой или полученной из них в виде единого модуля.
ЧТО ДЕЛАЕТ ANSI?
Как мы уже сказали во Введении, стандарт SQL определяется с помощью кода ANSI (Американский Национальный Институт Стандартов). SQL не изобретался ANSI. Это, по существу, изобретение IBM. Но другие компании подхватили SQL сразу же. По крайней мере одна компания (Oracle) отвоевала у IBM право на рыночную продажу SQL-продуктов.
После того как появился ряд конкурирующих программ SQL на рынке, ANSI определил стандарт, к которому они должны быть приведены. (Определение таких стандартов и является функцией ANSI). Однако после этого появились некоторые проблемы. Возникли они, в результате стандартизации ANSI, в виде некоторых ограничений. Так как не всегда ANSI определяет то, что является наиболее полезным, то программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. Это, в свою очередь, ведет к случайным несогласованностям. Программы Баз Данных обычно придают ANSI SQL дополнительные особенности и часто ослабляют многие ограничения. Поэтому распространённые разновидности ANSI будут также рассмотрены. Хотя мы, очевидно, не сможем рассмотреть каждое исключение или разновидность, удачные идеи имеют тенденцию к внедрению и использованию в различных программах, даже когда они не определены стандартом ANSI. ANSI это вид минимального стандарта, и вы можете делать больше, чем он позволяет, хотя и должны выполнять его указания при выполнении задач, которые он определяет.
ИНТЕРАКТИВНЫЙ И ВЛОЖЕННЫЙ SQL
Имеются два SQL: Интерактивный и Вложенный. Большей частью обе формы работают одинаково, но используются различно. Интерактивный SQL используется для функционирования непосредственно в базе данных, чтобы производить вывод для использования его заказчиком. В этом SQL — когда вы введёте команду, она сейчас же выполнится, и вы сможете сразу увидеть вывод (если он вообще получится).
Вложенный SQL состоит из команд SQL, помещённых внутри программ, которые обычно написаны на другом языке (типа КОБОЛа или ПАСКАЛя). Это делает такие программы более мощными и эффективным.
Однако, допуская эти языки, приходится иметь дело со структурой SQL и стилем управления данных, который требует некоторых расширений интерактивного SQL. Передача SQL-команд во вложенный SQL является пропускаемой («passed off») для переменных или параметров, используемых программой, в которую они были вложены.
В этой книге мы будем представлять SQL в интерактивной форме. Это даст нам возможность обсуждать команды и их действия, не заботясь о том, как они связаны с помощью интерфейса с другими языками. Интерактивный SQL это форма, наиболее полезная для непрограммистов. Всё, что вы узнаете относительно интерактивного SQL, в основном применимо и к вложенной форме. Изменения, необходимые для использования вложенной формы, будут рассмотрены в последней главе этой книги.
ПОДРАЗДЕЛЫ SQL
И в интерактивной, и во вложенной формах SQL имеются многочисленные части, или подразделы. Так как вы, вероятно, столкнетесь с этой терминологией при чтении SQL, мы дадим некоторые пояснения. К сожалению, эти термины не используются повсеместно во всех реализациях. Они указаны ANSI и полезны на концептуальном уровне, но большинство SQL-программ практически не обрабатывают их отдельно, так что они, по существу, становятся функциональными категориями команд SQL.
DDL (Язык Определения Данных) — так называемый Язык Описания Схемы в ANSI — состоит из команд, которые создают объекты (таблицы, индексы, просмотры и так далее) в базе данных.
DML (Язык Манипулирования Данными) это набор команд, которые определяют, какие значения представлены в таблицах в любой момент времени.
DCD (Язык Управления Данными) состоит из средств, которые определяют, разрешить ли пользователю выполнять определённые действия, или нет. Они являются составными частями DDL в ANSI.
Не забывайте эти названия. Это не различные языки, а разделы команд SQL, сгруппированные по их функциям.
РАЗЛИЧНЫЕ ТИПЫ ДАННЫХ
Не все типы значений, которые могут находиться в полях таблицы, логически одинаковы. Наиболее очевидное различие — между числами и текстом. Вы не можете помещать числа в алфавитном порядке или вычитать одно имя из другого.
Так как системы с РБД базируются на связях между фрагментами информации, различные типы данных должны отличаться друга от друга так, чтобы соответствующие процессы и сравнения могли быть в них выполнены. В SQL это делается с помощью назначения каждому полю типа данных, указывающего тип значения, которое это поле может содержать. Все значения в данном поле должны иметь одинаковый тип. В таблице Заказчиков, например, cname и city содержат строки текста для оценки, а snum и cnum это числа. По этой причине вы не можете ввести значение Highest (Наивысший) или значение None (Никакой) в поле rating, которое имеет числовой тип данных. Это ограничение удачно, так как оно налагает некоторую структурность на ваши данные. Вы часто будете сравнивать некоторые или все значения в данном поле, поэтому вы можете выполнять действие только на определенных строках, а не на всех. Вы не могли бы сделать этого, если бы значения полей имели смешанный тип данных.
К сожалению, определение этих типов данных является основной областью, в которой большинство коммерческих программ БД и официальный стандарт SQL не всегда совпадают. ANSI SQL-стандарт распознаёт только text и number, в то время как большинство коммерческих программ используют другие специальные типы. Такие как DATA (ДАТА) и TIME (ВРЕМЯ) — фактически, почти стандартные типы (хотя точный формат их меняется). Некоторые пакеты также поддерживают такие типы как, например, MONEY (ДЕНЬГИ) и BINARY (ДВОИЧНЫЙ). (MONEY это специальная «валютная» система исчисления, используемая компьютерами.)
Вся информация в компьютере передается двоичными числами, а затем преобразовывается в другие системы, чтобы мы могли легко использовать их и понимать.
ANSI определяет несколько числовых типов, различия между которыми довольно тонки, и иногда их путают. Разрешённые ANSI-типы данных перечислены в Приложении B. Сложность числовых типов ANSI можно, по крайней мере частично, объяснить усилием сделать вложенный SQL совместимым с рядом других языков. Два типа чисел ANSI — INTEGER (ЦЕЛОЕ ЧИСЛО) и DECIMAL (ДЕСЯТЕРИЧНОЕ ЧИСЛО) (которые можно сокращать как INT и DEC, соответственно), будут адекватны для наших целей, так же как и для целей большинства практических деловых прикладных программ. Естественно, что тип ЦЕЛОЕ можно представить как ДЕСЯТЕРИЧНОЕ ЧИСЛО, которое не содержит никаких цифр справа от десятичной точки.
Тип для текста — CHAR (или СИМВОЛ), относящийся к строке текста. Поле типа CHAR имеет длину, определяемую максимальным числом символов, которые могут быть введены в это поле. Большая часть реализаций также имеют нестандартный тип, называемый VARCHAR (ПЕРЕМЕННОЕ ЧИСЛО СИМВОЛОВ), который является текстовой строкой и может иметь любую длину до определённого реализацией максимума (обычно 254 символа). Значения CHARACTER и VARCHAR включаются в одиночные кавычки как ‘текст’. Различие между CHAR и VARCHAR в том, что CHAR должен резервировать достаточное количество памяти для максимальной длины строки, а VARCHAR распределяет память по мере необходимости.
Символьные типы состоят из всех печатных символов, включая числа. Однако число 1 это не то же, что символ «1». Символ «1» — только печатный фрагмент текста, не определяемый системой как числовое значение 1. Например 1 + 1 = 2, но «1» + «1» не равно «2». Символьные значения сохраняются в компьютере как двоичные значения, но показываются пользователю как печатный текст.
Преобразование выполняется по формату, определяемому системой, которую вы используете. Этот формат преобразования будет одним из двух стандартных типов (возможно, с расширениями), используемых в компьютерных системах: ASCII-код (используемый во всех персональных и малых компьютерах) и EBCDIC-код (Расширенном Двоично-Десятеричном Код Обмена Информации) (используемый в больших компьютерах). Определенные операции, такие как упорядочивание в алфавитном порядке значений поля, будет изменяться вместе с форматом. Применение этих двух форматов будет обсуждаться в Главе 4.
Мы должны следить за рынком, а не за ANSI, в использовании типа DATE (ДАТА). (В системе, которая не распознает тип ДАТА, вы, конечно, можете объявить дату как символьное или числовое поле, но это сделает большинство операций более трудоёмкими.)
Вы должны просмотреть свою документацию по пакету программ, который вы будете использовать, чтобы выяснить точно, какие типы данных он поддерживает.
SQL. НЕСОГЛАСОВАННОСТИ.
Вы можете понять из предшествующего обсуждения, что имеются самостоятельные отдельные несоответствия между продуктами мира SQL. SQL появился из коммерческого мира БД как инструмент и был позже превращён в стандарт ANSI. К сожалению, ANSI не всегда определяет наиболее полезное, поэтому программы пытаются соответствовать стандарту ANSI, не позволяя ему ограничивать их слишком сильно. ANSI — вид минимального стандарта — вы можете делать, больше чем он это позволяет, но вы должны быть способны получить те же самые результаты при выполнении той же самой задачи.
ЧТО ТАКОЕ «ПОЛЬЗОВАТЕЛЬ»?
SQL обычно находится в компьютерных системах, которые имеют больше чем одного пользователя и, следовательно, должен различать их (ваше семейство PC может иметь любое число пользователей, но оно обычно не имеет способов, чтобы отличать одного пользователя от другого).
Обычно в такой системе каждый пользователь имеет некий вид кода проверки прав, который идентифицирует его или её (терминология изменяется). В начале сеанса с компьютером пользователь входит в систему (регистрируется), сообщая компьютеру, кто этот пользователь, идентифицируясь с помощью определенного ID (Идентификатора). Любое количество людей, использующих ID доступа, являются отдельными пользователями; и, аналогично, один человек может представлять большое количество пользователей (в разное время), используя различные идентификаторы доступа к SQL. Действия в большинстве сред SQL приведены к специальному Идентификатору доступа, который точно соответствует определённому пользователю. Таблица или другой объект принадлежит пользователю, который имеет над ним полную власть. Пользователь может или может не иметь привилегии на выполнение действия над объектом. Для наших целей мы договоримся, что любой пользователь имеет необходимые привилегии для выполнения любого действия, пока мы не возвратимся специально к обсуждению привилегий в Главе 22. Специальное значение USER (ПОЛЬЗОВАТЕЛЬ) может использоваться как аргумент в команде. Оно указывает на доступный Идентификатор пользователя, выдавшего команду.
УСЛОВНЫЕ ОБОЗНАЧЕНИЯ И ТЕРМИНОЛОГИЯ
Ключевые слова это слова, которые имеют специальное значение в SQL. Они могут быть командами, но не текстом и не именами объектов. Мы будем выделять ключевые слова, печатая их ЗАГЛАВНЫМИ БУКВАМИ. Вы должны быть внимательны, чтобы не путать ключевые слова с терминами.
В SQL есть определённые специальные термины, которые используются для его описания. Среди них такие слова как «запрос», «предложение» и «предикат», которые являются важнейшими в описании и понимании языка, но не означают что-нибудь самостоятельное для SQL.
Команды или предложения являются инструкциями, с помощью которых вы обращаетесь к БД SQL.
Команды состоят из одной или более отдельных логических частей, называемых предложениями.
Предложения начинаются ключевым словом и состоят из ключевых слов и аргументов. Например, предложения, с которыми вы можете сталкиваться, это «FROM Salespeope» и «WHERE city = «London»». Аргументы завершают или изменяют значение предложения. В примерах выше, Salespeople — аргумент, а FROM — ключевое слово предложения FROM. Аналогично «city = «London»» — аргумент предложения WHERE.
Объекты это структуры БД, которым даны имена и которые сохраняются в памяти. Сюда относятся базовые таблицы, представления и индексы.
Чтобы показать вам, как формируются команды, мы будем делать это на примерах. Имеется, однако, более формальный метод описания команд, использующий стандартизированные условные обозначения. Мы будем использовать его в последующих главах для удобства, чтобы понимать эти условные обозначения в случае, если вы столкнетесь с ними в других SQL-документах.
Квадратные скобки ( [ ] ) будут указывать части, которые могут не использоваться, а многоточия ( . ) указывают, что всё, предшествующее им, может повторяться любое число раз. Слова в угловых скобках ( ) — специальные термины, которые объясняют, что они собой представляют. Мы значительно упростили стандартную терминологию SQL, но без ухудшения его понимания.
РЕЗЮМЕ
Мы кратко рассмотрели в этой главе основы. Но нашим намерением и было — бегло рассмотреть основы SQL так, чтобы вы смогли охватить весь объём информации. Когда мы возвратимся к основам в следующей главе, некоторые вещи будут конкретизированы.
Теперь вы знаете кое-что относительно SQL: какова его структура, как он используется, как он представляет данные и как они определяются (и некоторые несогласованности, появляющиеся при этом), некоторые условные обозначения и термины, используемые для их описания. Всё это — слишком большой объём информации для одной главы; мы не ожидаем, что вы запомнили все эти подробности, но вы сможете вернуться к ним позже, если понадобится.
Главе 3 мы будем работать, показывая конкретно, как формируются команды и что они делают. Мы представим вам команду SQL, используемую для извлечения информации из таблиц, которая является наиболее часто используемой командой SQL. К концу главы вы будете способны извлекать конкретную информацию из вашей БД с высокой степенью точности.
Создание определяемых пользователем функций (компонент Database Engine) Create User-defined Functions (Database Engine)
ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server База данных SQL Azure Azure Synapse Analytics (хранилище данных SQL) Parallel Data Warehouse APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse
В этом разделе описывается создание определяемой пользователем функции в SQL Server SQL Server с помощью Transact-SQL Transact-SQL . This topic describes how to create a user-defined function (UDF) in SQL Server SQL Server by using Transact-SQL Transact-SQL .
Перед началом Before You Begin
Ограничения Limitations and restrictions
Определяемые пользователем функции не могут выполнять действия, изменяющие состояние базы данных. User-defined functions cannot be used to perform actions that modify the database state.
Определяемые пользователем функции не могут содержать предложение OUTPUT INTO , целью которого является таблица. User-defined functions cannot contain an OUTPUT INTO clause that has a table as its target.
Определяемые пользователем функции не могут возвращать несколько результирующих наборов. User-defined functions can not return multiple result sets. Используйте хранимую процедуру, если нужно возвращать несколько результирующих наборов. Use a stored procedure if you need to return multiple result sets.
Обработка ошибок в функциях, определяемых пользователем, ограниченна. Error handling is restricted in a user-defined function. UDF не поддерживает тип TRY. CATCH , @ERROR и RAISERROR . A UDF does not support TRY. CATCH , @ERROR or RAISERROR .
Определяемые пользователем функции не могут вызывать хранимую процедуру, но могут вызывать расширенную хранимую процедуру. User-defined functions cannot call a stored procedure, but can call an extended stored procedure.
Определяемые пользователем функции не могут использовать динамический SQL и временные таблицы. User-defined functions cannot make use of dynamic SQL or temp tables. Табличные переменные разрешены к использованию. Table variables are allowed.
Инструкцию SET нельзя использовать в определяемых пользователем функциях. SET statements are not allowed in a user-defined function.
Пустое предложение FOR XML запрещено. The FOR XML clause is not allowed.
Определяемые пользователем функции могут быть вложенными, то есть из одной функции может быть вызвана другая. User-defined functions can be nested; that is, one user-defined function can call another. Уровень вложенности увеличивается на единицу каждый раз, когда начинается выполнение вызванной функции и уменьшается на единицу, когда ее выполнение завершается. The nesting level is incremented when the called function starts execution, and decremented when the called function finishes execution. Вложенность определяемых пользователем функций не может превышать 32 уровней. User-defined functions can be nested up to 32 levels. Превышение максимального уровня вложенности приводит к ошибке выполнения для всей цепочки вызываемых функций. Exceeding the maximum levels of nesting causes the whole calling function chain to fail. Каждый вызов управляемого кода из определяемой пользователем функции Transact-SQL считается одним уровнем вложенности из 32 возможных. Any reference to managed code from a Transact-SQL user-defined function counts as one level against the 32-level nesting limit. Методы, вызываемые из управляемого кода, под это ограничение не подпадают. Methods invoked from within managed code do not count against this limit.
Следующие инструкции компонента Service Broker не могут быть включены в определение пользовательской функции Transact-SQL Transact-SQL : The following Service Broker statements cannot be included in the definition of a Transact-SQL Transact-SQL user-defined function:
BEGIN DIALOG CONVERSATION
GET CONVERSATION GROUP
Permissions Permissions
Требуется разрешение CREATE FUNCTION на базу данных и разрешение ALTER для схемы, в которой создается функция. Requires CREATE FUNCTION permission in the database and ALTER permission on the schema in which the function is being created. Если в функции указан определяемый пользователем тип, требуется разрешение EXECUTE на этот тип. If the function specifies a user-defined type, requires EXECUTE permission on the type.
Скалярные функции Scalar Functions
В следующем примере создается скалярная функция (скалярная UDF) из нескольких инструкций в базе данных AdventureWorks2012 AdventureWorks2012 . The following example creates a multi-statement scalar function (scalar UDF) in the AdventureWorks2012 AdventureWorks2012 database. Функция имеет один входной параметр ProductID и возвращает одно значение — количество указанного товара на складе. The function takes one input value, a ProductID , and returns a single data value, the aggregated quantity of the specified product in inventory.
В следующем примере функция ufnGetInventoryStock используется для получения сведений о количестве товаров с идентификаторами ProductModelID от 75 до 80. The following example uses the ufnGetInventoryStock function to return the current inventory quantity for products that have a ProductModelID between 75 and 80.
Дополнительные сведения см. в разделе CREATE FUNCTION (Transact-SQL). For more information and examples of scalar functions, see CREATE FUNCTION (Transact-SQL).
Функции с табличными значениями Table-Valued Functions
Результатом следующего примера является встроенная функция, возвращающая табличное значение (TVF) , в базе данных AdventureWorks2012 AdventureWorks2012 . The following example creates an inline table-valued function (TVF) in the AdventureWorks2012 AdventureWorks2012 database. Функция имеет один входной параметр — идентификатор клиента (магазина) — и возвращает столбцы ProductID , Name и столбец YTD Total со сведениями о продажах продукта за текущий год. The function takes one input parameter, a customer (store) ID, and returns the columns ProductID , Name , and the aggregate of year-to-date sales as YTD Total for each product sold to the store.
В следующем примере функция вызывается с идентификатором 602. The following example invokes the function and specifies customer ID 602.
Результатом следующего примера является многооператорная встроенная функция, возвращающая табличное значение (MSTVF) , в базе данных AdventureWorks2012 AdventureWorks2012 . The following example creates a multi-statement table-valued function (MSTVF) in the AdventureWorks2012 AdventureWorks2012 database. Функция имеет один входной параметр EmployeeID и возвращает список всех сотрудников, которые напрямую или косвенно отчитываются перед заданным сотрудником. The function takes a single input parameter, an EmployeeID and returns a list of all the employees who report to the specified employee directly or indirectly. Затем функция вызывается с указанием идентификатора сотрудника 109. The function is then invoked specifying employee ID 109.
В следующем примере функция вызывается с идентификатором сотрудника 1. The following example invokes the function and specifies employee ID 1.
Дополнительные сведения и примеры встроенных функций с табличными значениями (встроенные TVF) или многооператорных функций с табличными значениями (MSTVF) см. в разделе CREATE FUNCTION (Transact-SQL). For more information and examples of inline table-valued functions (inline TVFs) and multi-statement table-valued functions (MSTVFs), see CREATE FUNCTION (Transact-SQL).
Рекомендации Best Practices
Если определяемая пользователем функция (UDF) создана без применения предложения SCHEMABINDING , то изменения базовых объектов могут повлиять на определение функции и привести к непредвиденным результатам при вызове функции. If a user-defined function (UDF) is not created with the SCHEMABINDING clause, changes that are made to underlying objects can affect the definition of the function and produce unexpected results when it is invoked. Рекомендуется реализовать один из следующих методов, чтобы обеспечить, что функция не устареет из-за изменения ее базовых объектов. We recommend that you implement one of the following methods to ensure that the function does not become outdated because of changes to its underlying objects:
Укажите при создании функции UDF предложение WITH SCHEMABINDING . Specify the WITH SCHEMABINDING clause when you are creating the UDF. Это обеспечит невозможность изменения объектов, на которые ссылается определение функции, если при этом не изменяется сама функция. This ensures that the objects referenced in the function definition cannot be modified unless the function is also modified.
Выполняйте хранимую процедуру sp_refreshsqlmodule после изменения любого объекта, указанного в определении функции UDF. Execute the sp_refreshsqlmodule stored procedure after modifying any object that is specified in the definition of the UDF.
Если вы создаете определяемую пользователем функцию, не имеющую доступа к данным, укажите параметр SCHEMABINDING . If creating a UDF that does not access data, specify the SCHEMABINDING option. Это не позволит оптимизатору запросов создавать ненужные операторы очередей для планов запроса, содержащих такие определяемые пользователем функции. This will prevent the query optimizer from generating unnecessary spool operators for query plans involving these UDFs. Дополнительные сведения об очередях см. в справочнике по логическим и физическим операторам Showplan. For more information on spools, see Showplan Logical and Physical Operators Reference. Дополнительные сведения о создании функций, привязанных к схеме, см. в соответствующем разделе. For more information on creating a schema bound function, see Schema-bound functions.
Присоединение к MSTVF в предложении FROM возможно, но может привести к снижению производительности. Joining to an MSTVF in a FROM clause is possible, but can result in poor performance. SQL Server SQL Server не может использовать все оптимизированные методы для некоторых инструкций, которые можно включить в функцию MSTVF, и в результате план запроса оказывается неоптимальным. is unable to use all the optimized techniques on some statements that can be included in a MSTVF, resulting in a suboptimal query plan. Чтобы получить наилучшую производительность, по возможности задавайте соединения не между функциями, а между базовыми таблицами. To obtain the best possible performance, whenever possible use joins between base tables instead of functions.
Функции MSTVF имеют фиксированное предполагаемое значение кратности 100 начиная с SQL Server 2014 (12.x) SQL Server 2014 (12.x) и 1 в более ранних версиях SQL Server SQL Server . MSTVFs have a fixed cardinality guess of 100 starting with SQL Server 2014 (12.x) SQL Server 2014 (12.x) , and 1 for earlier SQL Server SQL Server versions.
Начиная с SQL Server 2020 (14.x) SQL Server 2020 (14.x) для оптимизации плана выполнения, который использует функции MSTVF, можно использовать выполнение с чередованием, что обеспечивает фактическую кратность вместо приведенной выше эвристики. Starting with SQL Server 2020 (14.x) SQL Server 2020 (14.x) , optimizing an execution plan that uses MSTVFs can leverage interleaved execution, which results in using actual cardinality instead of the above heuristics.
Дополнительные сведения см. в разделе Выполнение с чередованием для функций с табличным значением с несколькими инструкциями. For more information, see Interleaved execution for multi-statement table valued functions.
Параметры ANSI_WARNINGS не годятся для передачи в хранимые процедуры, пользовательские функции и при объявлении и установке переменных в пакетных инструкциях. ANSI_WARNINGS is not honored when you pass parameters in a stored procedure, user-defined function, or when you declare and set variables in a batch statement. Например, если объявить переменную как char(3) , а затем присвоить ей значение длиннее трех символов, данные будут усечены до размера переменной, а инструкция INSERT или UPDATE завершится без ошибок. For example, if a variable is defined as char(3), and then set to a value larger than three characters, the data is truncated to the defined size and the INSERT or UPDATE statement succeeds.
Команды sql, функциональное оглавление
— A BETWEEN B AND C , ����� ����� �� �������� ��� � — ( A >= B AND ��� �������� A NOT BETWEEN B AND C, ����� ����� �� �������� ��� � NOT ( BETWEEN B AND C). ����� ���� �������� � ������� �������������� ������� ( *nonstandard* ).
[NOT] LIKE [ESCAPE
]
BEGIN DECLARE SECTION (������ ������� ����������)
EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION
CLOSE CURSOR (������� ������)
EXEC SQL CLOSE CURSOR ;
COMMIT (WORK) (�������� (����������))
CREATE INDEX (������� ������)
CREATE [UNIQUE] INDEX
ON ( );
CREATE SYNONYM (*NONSTANDARD*)
(������� �������) ( *������������* )
CREATE IPUBLICl SYNONYM FOR
. ;
CREATE TABLE (������� �������)
CREATE VIEW (������� ��������)
CREATE VIEW
AS
[WITH CHECK OPTION];
DECLARE CURSOR (�������� ������)
EXEC SQL DECLARE CURSOR FOR
DELETE (�������)
DELETE FROM
< [WHERE ]; >
| WHERE CURRENT OF
EXEC SQL (��������� SQL)
FETCH (�������)
EXEC SQL FETCH
INTO
GRANT (�������� �����)
GRANT ALL [PRIVILEGES]
| | INSERT
| DELETE
| UPDATE [( )]
| REFERENCES [( )l > . , . .
ON . , . .
TO PUBLIC | . , . .
[WITH GRANT OPTION];
GRANT DBA
| RESOURCE
| CONNECT . .
TO . , . .
[IDENTIFIED BY > password >
Структура команды SQL. Типы данных и выражения SQL
Каждая команда SQL начинается с действия – ключевого слова или группы слов, описывающих выполняемую операцию. Например, INSERT (добавить), DELETE (удалить), COMMIT (завершить), CREATE TABLE (создать таблицу).
Примечание. В языках программирования ключевое слово – название, зарезервированное для определенных целей, например, названий команд, устройств и т.п.
После действия может следовать одно или несколько предложений. Предложение описывает данные, с которыми работает команда, или содержит уточняющую информацию о действии, выполняемом командой. Каждое предложение начинается с ключевого слова, такого как, например, WHERE (где), FROM (откуда), INTO (куда), HAVING (имеющий). Многие предложения содержат имена таблиц и полей БД; некоторые – константы и выражения.
Имена таблиц, полей и пользователей должны содержать от 1 до 18 символов, начинаться с буквы и не содержать пробелов или специальных символов пунктуации. В качестве имен нельзя использовать ключевые слова SQL.
•Символьный тип данных содержащий буквы, цифры, специальные символы:
CHAR или CHAR (n) – символьные строки фиксированные данные
VARCHAR (n) – символьные строки
INTЕGER или INT – целое для решения которого отводится, как байта
SMALLINT – короткое целое (2 байта)
FLOAT – число плавающих точек
DECIMAL (p) – аналогично FLOAT с числовым значение цифрр
DECIMAL (p, n) – аналогично предыдущим, р – общее количество десятичных чисел
MONEY (p, n) – аналогично типу DECIMAL (p, n)
INTERVAL – временный интервал
DATETIME – момент время
BLOB – хранить данные любого объема в двоичном коде
SERIAL – тип данных на основе INTEGER позволяющий сформировать уникальные значения
AND – логическое умножение
OR – лог сложение
Язык SQL оперирует терминами: таблица, строка, столбец или колонка.
Полное имя таблицы: имя _ владельца.имя_таблицы
Полное имя столбца: имя _ владельца.имя_столбца
Основной яз SQL составляет операции, условно разбитые на несколько групп.
Категории операторов SQL:
•Date Definition Language (DDC)
•Date Manipulation Language (DML)
•Date Control Language (DCL)
•Transaction Control Language (TCL)
•Cursor Control Language (CCL)
Не нашли то, что искали? Воспользуйтесь поиском:
Лучшие изречения: При сдаче лабораторной работы, студент делает вид, что все знает; преподаватель делает вид, что верит ему. 9339 — | 7293 — или читать все.
188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.
Отключите adBlock!
и обновите страницу (F5)
очень нужно
АйТи бубен
Инструменты пользователя
Инструменты сайта
Содержание
SQL (ˈɛsˈkjuˈɛl; англ. structured query language — «язык структурированных запросов») — декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных.
Соответствие стандартам SQL разных БД:
SQL (Structured Query Language — язык структурированных запросов). SQL является, прежде всего, информационно-логическим языком, предназначенным для описания хранимых данных, для извлечения хранимых данных и для модификации данных.
SQL не является языком программирования. В связи с усложнением язык SQL стал более языком прикладного программирования, а пользователи получили возможность использовать визуальные построители запросов.
Язык SQL представляет собой совокупность операторов. Операторы SQL делятся на:
К сожалению, эти термины не используются повсеместно во всех реализациях. Они подчеркиваются ANSI и полезны на концептуальном уровне, но большинство SQL программ практически не обрабатывают их отдельно, так что они по существу становятся функциональными категориями команд SQL.
SQL:2008 — шестая (последняя) версия (ревизия) языка запросов баз данных SQL. Стандарт SQL не является свободно доступным. Полный стандарт можно приобрести у организации ISO как ISO/IEC 9075(1-4,9-11,13,14):2008.
В SQL различаются следующие виды объектов:
Primary Key
Первичный ключ (primary key) — необходим для ОДНОЗНАЧНОГО поиска записи. Строки в реляционной базе данных неупорядочены: в таблице нет «первой», «последней»,»тридцать шестой» и «сорок третьей» строки . Возникает вопрос: каким же образом выбирать в таблице конкретную строку? Для этого в правильно спроектированной базе данных ДЛЯ каждой таблицы создается один или несколько столбцов, значения которых во всех строках различны. Такой столбец называется первичным ключом таблицы (PK — primary key). Никакие из двух записей таблицы не могут иметь одинаковых значений первичного ключа, благодаря чему каждая строка таблицы обладает своим уникальным идентификатором.
По способу задания первичных ключей различают логические (естественные) ключи и суррогатные (искусственные).
Для логического задания первичного ключа необходимо выбрать в таблице столбец, который может однозначно установить уникальность записи. Если подходящих столбцов для естественного задания первичного ключа не находится, пользуются суррогатным ключом. Суррогатный ключ представляет собой дополнительное поле в базе данных, предназначенное для обеспечения записей первичным ключом.
Команда SELECT
Элементы, используемые в команде SELECT
Записки инженера
Доступным языком заметки по IT технологиям
Структура и синтаксис SQL (выжимка)
Данный пост был написан как памятка по основным операторам языка SQL и представляет собой «выжимку» из официальной англоязычной документации. Перед изучением структуры и синтаксиса SQL рекомендую прочесть следующие посты:
Если вы только знакомитесь с БД, то рекомендую прочесть пост:
Теоретические азы БД (введение в SQL)
Для того, чтобы использовать язык SQL необходима СУБД, которая будет его исполнять. В качестве такой СУБД, мы будем рассматривать MySQL, как наиболее популярную в web разработке. Если вам нужна помощь в установки MySQL под Windows или FreeBSD, то рекомендую прочесть пост:
Установка MySQL
После установки любой СУБД, первым делом возникает вопрос, а как собственно с ней работать? С чего и как посылать SQL запросы, как добавить или удалить пользователя, изменить пароль, сделать резервную копию и восстанавливается из неё. Ответы на такого рода вопросы вы найдете в посте:
Как работать с MySQL?
Теперь перейдем к сути поста — «структура и синтаксис SQL».
Если вам лень читать весь пост, то для быстрого поиска, я привел список вопросов на которые вы найдете ответы
Язык SQL (в реализации MySQL)
Начиная описывать SQL под MySQL, хочу сразу обозначить, что данный пост не является единственным верным источником информации (кстати, как любой блог в Интернете). Единственно верным источником информации всегда является официальная документация, для MySQL она располагается по ссылке — http://dev.mysql.com/doc/ (документация к сожалению англоязычная, в левой части сайта вы выбираете версию MySQL, справа оглавление, по середине таблица для удобного ориентирование по разделам документации для: администраторов, разработчиков, интеграторов (Connectors & APIs) и т.п.). Перевод документации на русский, как я понимаю, происходит не переодично, а от случая к случаю и не разработчиками, а сторонними конторами. Могу предложить следующий сайт http://www.mysql.ru/docs/, содержащий как мне кажется, наиболее свежую версию перевода.
p.s. В текущий момент (версия 5.7) MySQL реализует стандарт SQL версии 2003 года (пока существует следующие SQL стандарты SQL-87, SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2006, SQL:2008), если вам вдруг будет интересно в него заглянуть, то я вас огорчу, найти его в открытом доступе вам не удастся (из доступных стандартов бесплатно оказался только SQL-92 — http://www.contrib.andrew.cmu.edu/
shadow/sql/sql1992.txt). Последние версии стандарта SQL языка (2006 и 2008 год), можно купить на сайте ISO (http://www.iso.org/). Стандарты SQL начинаются с «ISO/IEC 9075», введя её в поиске, вы увидите список документов формата ISO/IEC 9075-X:Y, где X– раздел стандарта (про разделы читайте на википедии http://ru.wikipedia.org/wiki/SQL), а Y – год выпуска стандарта.
1. Типы данных в SQL
Типы данных, которыми мы будем манипулировать, могут варьироваться в зависимости от СУБД. В нашем случае в качестве СУБД мы рассматриваем MySQL, т.к. данная система, наиболее часто используемая под web разработку.
Типы данных MySQL можно разделить на группы:
— числовые типы с фиксированной точкой
— TINYINT – целое число (+-128), занимаемый размер 1 байт
— SMALLINT – «малое» целое число (+-32768), занимаемый размер 2 байт
— MEDIUMINT – «среднее» целое чило (+-8388608), занимаемый размер 3 байт
— INTEGER или INT – «обычное» целое число (+-2147483648), занимаемый размер 4 байт
— BIGINT — «большое» целое число (+-9223372036854775808), занимаемый размер 8 байт
— DECIMAL (x,y) — число, в котором x разрядов в числе, y знаков после запятой
— NUMERIC (x,y) в MySQL это тоже самое, что и DECIMAL
Если перед именем типа использовать ключевое слово UNSIGNED, то величина для числового типа будет только положительной, причем максимальное положительное число будет больше в два раза прежнего, т.е. диапазон сдвинется, например INT это от -2147483648 до +2147483647, а UNSIGNED INT от 0 до 4294967295 .
— числовые типы с плавающей точкой
— REAL – вещественное число, размером 8 байт
— DOUBLE PRECISION или DOUBLE — в MySQL такое же вещественное число, как и REAL, размер 8 байт
— FLOAT (x) – вещественное число, точность указывается в скобках в байтах, если ничего не указать то точность — 4 байт, можно также использовать вариант FLOAT (x,y), где x – так же точность в байтах, а y количество знаком после запятой.
При записи чисел большого размера, чем это могу позволить типы с плавающей точкой, значения будут округлены.
— CHAR (x) – строка с длинной x (от 1 до 255), если значения меньше этой длины, то оно заполняется пробелами, если больше урезается, выделяемый размер под данный тип x байт.
— VARCHAR (x) – строка с длинной x (от 1 до 255), длина строки зависит от длины значения, пробелами ничего не заполняется, если значение больше заданной длины x, то оно, как и в CHAR урезается, выделяемый размер под данный тип зависит от длины значения.
— TINYTEXT или TINYBLOB строка c максимальной длиной текста 255, занимаемый размер зависит от длины текста (максимум 255 байт)
— TEXT или BLOB строка c максимальной длиной текста 65535, занимаемый размер зависит от длины текста (максимум 65535 байт)
Отличие TEXT от BLOB заключается только в том, что в TEXT при сравнение не учитывается регистр (заглавная или маленькая буква).
— MEDIUMTEXT или MEDIUMBLO – строка с максимальной длиной текста 16777215, занимаемый размер зависит от длины текста (максимум 16777215 байт)
— LONGBLOB или LONGTEXT – строка с максимальной длиной текста 4294967295, занимаемый размер зависит от длины текста (максимум 4294967295 байт)
— ENUM (‘value1′,’value2’,…) — символьный тип перечисления, может принимать значение из списка допустимых значений, максимум 65535 байт
— SET (‘value1′,’value2’,…) – символьный тип – множество, которое содержит значения указанные в скобках, максимум 64 значения, максимальный занимаемый размер 64.
— DATETIME – дата и время в формате YYYY-MM-DD HH:MM:SS, диапазон допустимых значений от ‘1000-01-01 00:00:00’ до ‘9999-12-31 23:59:59’, занимаемый объем 8 байт.
— DATE – дата в формате YYYY-MM-DD, диапазон допустимых значений от ‘1000-01-01’ до ‘9999-12-31’, занимаемый объем 3 байта.
— TIMESTAMP – дата и время в формате YYYYMMDDHHMMSS, занимаемый объем 4 байт.
— TIME – время в формате HH:MM:SS, диапазон допустимых значений от ‘-838:59:59’ до ‘838:59:59’, занимаемый объем 3 байта.
— YEAR – год в формате YYYY, занимаемый объем 1 байт.
2. Синтаксис языка SQL
Синтаксис языка SQL традиционно делят на три части:
1) Первая часть языка SQL отвечающая за определение данными (Date Definition Language или DDL), в неё входят такие действия, как:
- создать БД;
- удалить БД;
- создать таблицу;
- изменить таблицу;
- удалить таблицу;
- создать первичный/внешний ключ;
- удалить первичный/внешний ключ.
С помощью DDL задают схему БД (Что такое схема БД? — статья в википедии).
2) Вторая часть языка SQL отвечающая за манипуляцию данными (Date Manipulation Language или DML), в неё входят такие действия, как:
- вставить запись (строку) в таблицу;
- выбрать запись в таблице;
- обновить запись в таблице;
- удалить запись в таблице.
3) Третья часть языка SQL отвечающая за управлениями данными (Data Control Language или DCL), в неё входят такие действия, как:
- управление транзакциями;
- управление правами доступа.
Если кратко, то данная часть языка нужна для администрирования БД.
Мы будем рассматривать данные части SQL по очереди, начиная с 1-ой
УЧЕБНИК PHP
Команды SQL
В этом разделе мы изучим основные команды языка SQL. Для этого на компьютере с установленным MySQL необходимо запустить клиента mysql, в окне которого можно вводить команды SQL.
Команды SQL не чувствительны к регистру, но традиционно они набираются прописными буквами.
Типы полей базы данных
Список наиболее часто встречающихся типов приведен в таблицах 13.6 — 13.8. Для многих типов данных задается максимальная ширина отображения, указываемая в скобках, которую мы далее будем обозначать символом max. К примеру, запись INT(2) означает, что значение данного поля не может превышать 100.
К числовым типам относятся целые числа и числа с плавающей точкой. Для чисел с плавающей точкой, кроме максимальной ширины отображения можно также указывать число значащих цифр после запятой, далее обозначаемое символом P.
Таблица 13.6. Числовые типы
Описание
TINYINT[(max)]
Очень маленькие целые числа диапазона -127…128.
SMALLINT[(max)]
Маленькие целые числа диапазона -32768…32767.
MEDIUMINT[(max)]
Средние целые числа.
INT[(max)]
Обычные целые числа.
FLOAT[(max,P)]
Числа с плавающей точкой одинарной точности.
DOUBLE[(max,P)]
Числа с плавающей точкой двойной точности.
DECIMAL[(max,P)]
Числа с плавающей точкой, приведенные к типу char.
Типы даты и времени приведены в таблице 13.7.
Таблица 13.7. Типы даты и времени
Описание
Дата в формате ГГГГ-ММ-ДД.
Время в формате ЧЧ-ММ-СС.
DATETIME
Дата и время в формате ГГГГ-ММ-ДД ЧЧ-ММ-СС.
Год в формате ГГ или ГГГГ.
TIMESTAMP
Метка времени для отсчетов по транзакциям в формате ГГГГ-ММ-ДД ЧЧ-ММ-СС.
Основные строковые типы приведены в таблице 13.8.
Таблица 13.8. Строковые типы
Описание
CHAR (len)[BINARY]
Строки с длиной len, которое не превышает 255 символов. Ключевое слово BINARY указывает на то, что данные должны обрабатываться независимо от регистра.
Синоним CHAR(1).
VARCHAR (len)[BINARY]
Синоним CHAR(len)за исключением того, что строки могут быть произвольной длины.
Строки с максимальной длиной символов равной 65535. Данные этого типа чувствительны к регистру.
Двоичные строки с максимальной длиной символов равной 65535. Тип BLOB (binary large object — большой двоичный объект) предназначен для хранения двоичных данных, в том числе изображений и звуковых последовательностей.
CREATE DATABASE
Эта команда создает новую базу данных:
Здесь db_name является именем создаваемой базы данных. Для того чтобы создать новую базу данных forum , наберите в строке-приглашении клиента MySQL mysql> эту команду и укажите название базы данных:
Каждый запрос MySQL завершается точкой с запятой.
При успешном выполнении команды MySQL выдаст строку, в которой сообщается, что этот запрос выполнен успешно и показано время, затраченное на выполнение запроса:
Далее в тексте строку MySQL с результатом выполнения команды мы будем приводить непосредственно в соответствующем листинге.
Для того, чтобы убедится, что база данных forum успешно создана, можно выполнить команду SHOW DATABASES , которая покажет, какие базы данных существуют на вашем компьютере:
Как видим, среди различных баз данных на компьютере автора присутствует и только что созданная база данных forum:
Команда SHOW DATABASES является внутренней командой MySQL, отсутствующей в стандарте SQL и неподдерживаемой другими базами данных.
Изначально, в МуSQL присутствует только две базы данных: test и mysql . В последней хранится системный каталог, описывающий внутреннюю структуру СУБД MySQL.
Для того чтобы начать работу с таблицами, необходимо сообщить MySQL с какой базой данных вы намерены работать. Это осуществляется при помощи команды USE:
Здесь db_name — название выбираемой базы данных. Выберем созданную базу forum:
CREATE TABLE
Команда CREATE TABLE создает новую таблицу в выбранной базе данных и которая в простейшем случае имеет следующий синтаксис:
Здесь table_name — имя создаваемой таблицы.
Создадим первую таблицу базы данных forum , которая называется authors и содержит различные данные об зарегистрированных посетителях форума: ник ( name ), пароль ( passw ), e-mail ( email ), Web-адрес сайта посетителя ( url ), номер ICQ ( iсq ), сведения об посетителе ( about ), строку содержащую путь к файлу фотографии посетителя ( photo ), время добавления запроса ( time ), последнее время посещения форума ( last_time ), статус посетителя — является ли он модератором, администратором или обычным посетителем ( statususer ). Кроме перечисленных полей в таблице имеется поле id_author , являющийся первичным ключом таблицы. SQL-запрос, создающий эту таблицу приведен в листинге:
Выполнив SQL-команду SHOW TABLES , можно убедиться, что таблица authors успешно создана
Давайте теперь аналогичным образом создадим другие таблицы.
Следующей по порядку идет таблица forums, в которой содержатся данные о разделах форума.
Для удобства на форуме может быть создано несколько различных разделов. К примеру, на форуме по языкам программирования для того, чтобы не смешивать темы, относящиеся к различным языкам, имеет смысл создать следующие разделы: С++, PHP, Java и т. д.
В таблице forums присутствуют следующие поля: первичный ключ ( id_forum ), название раздела ( name ), правила форума ( rule ), краткое описание форума ( logo ), порядковый номер ( pos ), флаг, принимающий значение 1, если форум скрытый и 0, если общедоступный ( hide ).
Вот SQL-запрос, создающий таблицу forums
Структура форума может быть следующей: имеются список разделов, переход по которым приводит посетителя к списку тем раздела. При переходе по теме посетитель приходит к обсуждению этой темы, состоящих из сообщений других посетителей. Теперь создадим таблицу themes , содержащую темы форума:
В таблице themes присутствуют следующие поля: первичный ключ ( id_theme ), название темы ( name ), автор темы ( author ), внешний ключ к таблице авторов ( id_author ), флаг, принимающий значение 1, если тема отмечена скрытой и 0, если отображается ( hide ) — это поле необходимо для модерирования, время добавления темы ( time ), внешний ключ к таблице форумов ( id_forum ), для того чтобы определить к какому разделу форума относится данная тема.
В таблице themes нормализация проведена частично, она содержит два внешних ключа: id_author и id_forum для таблиц посетителей и списка форумов, в тоже время в ней дублируется имя автора author , присутствующее также в таблице посетителей authors под именем name . Этот случай является примером денормализации предназначенной для того, чтобы не запрашивать каждый раз таблицу авторов при выводе списка тем и их авторов, чтобы обеспечить приемлемую скорость работы форума.
Создадим последнюю таблицу posts , в которой хранятся сообщения:
В таблице posts присутствуют следующие поля: первичный ключ ( id_post ), тело сообщения ( name ), необязательная ссылка на ресурс, которую автор сообщения может ввести при добавлении сообщения ( url ), путь к файлу прикрепляемому к сообщению ( file ), имя автора ( author ), внешний ключ к таблице авторов ( id_author ), флаг, принимающий значение 1, если сообщение отмечено как скрытое и 0, если он отображается ( hide ) — это поле необходимо для модерирования, время добавления сообщения ( time ), сообщение ответом на которое является данное сообщение ( parent_post ), если это первое сообщение в теме — это поле равно 0, внешний ключ к тем ( id_theme ), для того чтобы определить к какой теме относится сообщение.
Убедимся, что все таблицы успешно созданы, выполнив команду SHOW TABLES .
DESCRIBE
Команда DESCRIBE показывает структуру созданных таблиц и имеет следующий синтаксис:
Здесь tаble_name — имя таблицы структура которой запрашивается.
Команда DESCRIBE не входит в стандарт SQL и является внутренней командой СУБД MySQL.
Давайте посмотрим, к примеру, структуру таблицы forums , выполнив следующий SQL-запрос:
После выполнения этой команды, интерпретатор mysql выведет следующую таблицу
ALTER TABLE
Команда ALTER TABLE позволяет изменить структуру таблицы. Эта команда позволяет добавлять и удалять столбцы, создавать и уничтожать индексы, переименовывать столбцы и саму таблицу. Команда имеет следующий синтаксис:
Параметр alter_spec имеет значения, представленные в таблице
Синтаксис
Описание команды
ADD create_definition [FIRST|AFTER column_name]
Добавление нового столбца create_definition. create_definition представляет собой название нового столбца и его тип. Конструкция FIRST добавляет новый столбец перед столбцом column_name. Конструкция AFTER добавляет новый столбец после столбца column_name. Если место добавления не указано, по умолчанию столбец добавляется в конец таблицы.
ADD INDEX [index_name] (index_col_name. )
Добавление индекса index_name для столбца index_col_name. Если имя индекса index_name не указывается, ему присваивается имя совпадающее с именем столбца index_col_name.
ADD PRIMARY KEY (index_col_name. )
Делает столбец index_col_name или группу столбцов первичным ключом таблицы.
CHANGE old_col_name new_col_name type
Изменение столбца с именем old_col_name на столбец с именем new_col_name и типом type.
DROP col_name
Удаление столбца с именем col_name.
DROP PRIMARY KEY
Удаление первичного ключа таблицы.
DROP INDEX index_name
Удаление индекса index_name.
Добавим в таблицу forums новый столбец test , разместив его после столбца name .
Выполнив команду DESCRIBE forums , можно увидеть, что столбец test успешно добавлен после столбца name
Давайте переименуем созданный столбец test в текстовый столбец new_test
Как видно из рисунка, столбец успешно переименован:
При изменении только типа столбца, а не его имени, указание имени все-равно необходимо, хотя в этом случае оно будет фактически повторяться.
Результат выполнения этого запроса приведен на рисунке:
Теперь удалим столбец new_test :
Как видно из рисунка, после удаления этого столбца таблица forums приобрела исходную структуру:
DROP TABLE
Команда DROP TABLE предназначена для удаления одной или нескольких таблиц:
К примеру, для удаления таблицы forums нужно выполнить следующий SQL-запрос:
DROP DATABASE
Команда DROP DATABASE удаляет базу данных со всеми таблицами входящими в её состав:
Удалим, например, базу данных forum :
INSERT INTO…VALUES
Команда INSERT…VALUES вставляет новые записи в существующую таблицу. Синтаксис команды:
После оператора VALUES в скобках через запятую перечисляются значения соответствующих полей таблицы в соответствии с их типами.
Давайте вставим в базу данных authors несколько записей, в которых расположена информация об зарегистрированных посетителях форума:
DELETE
Команда DELETE удаляет из таблицы table_name записи, удовлетворяющие заданным в definition условиям, и возвращает число удаленных записей.
Вот как можно удалить все записи из таблицы authors :
Важной частью запросов DELETE , UPDATE и SELECT является оператор WHERE , который позволяет задать условия для выбора записей, на которые будут действовать эти команды. Следующий запрос удаляет из таблицы посетителя, первичный ключ для которого равен 1:
Условия отбора могут быть значительно сложнее, так в листинге 13.16 удаляются все авторы с паролем ‘123’ и первичный ключ которых превышает 10:
Оператор AND является логическим «и». В запросах можно так же применять логическое или «или».
SELECT
Команда SELECT предназначена для извлечения строк данных из одной или нескольких таблиц и имеет в общем случае следующий синтаксис:
Здесь column — имя выбираемого столбца. Можно указать несколько столбцов через запятую. Если необходимо выбрать все столбцы можно просто указать знак звёздочки *. Ключевое слово FROM указывает таблицу table из которой извлекаются записи. Ключевое слово WHERE определяет, так же как и в операторе DELETE определяет условия отбора строк. Ключевое слово ORDER BY сортирует строки запросов по столбцу col_name в прямом ( ASC ) или обратном порядке ( DESC ). Ключевое слово LIMIT сообщает MySQL об выводе только rows запросов начиная с позиции offset .
Давайте вставим в таблицу forums несколько записей, чтобы потом на их примере выполнять различные варианты команды SELECT .
Для того чтобы посмотреть всю таблицу forums выполняется следующий запрос:
Выбираем все столбцы из таблицы forums без ограничений. Результат показан на рисунке:
Можно выбрать не все столбцы таблицы, а лишь часть, для этого необходимо явно задать список выбираемых столбцов:
В этом случае MySQL выведет лишь два столбца с первичным ключом id_forum и названием форума name
Оператор LIMIT используется для ограничения количества строк, возвращенных командой SELECT . К примеру:
В результате этого запроса будет выведено только первые 3 записи из 5
Оператор LIMIT может также принимать два числовых аргумента, которые должны быть целыми числами. В этом случае последний аргумент задает максимальное количество возвращаемых строк, а первый сообщает MySQL начиная с какой по счёту строки производить отсчёт
В этом случае будут возвращены строки 2, 3 и 4
Оператор WHERE применяется в команде SELECT точно так же, как и в команде DELETE . Выберем из таблицы только те записи, у которых значение id_forum больше 2:
Результат показан на слудующем рисунке:
Порядок сортировки выводимых записей можно задавать при помощи оператора ORDER BY:
В этом запросе выводятся все записи со значением поля id_forum не меньше двух, которые при этом сортируются по значению поля pos. Результат такого запроса показан на рисунке:
UPDATE
Команда UPDATE обновляет столбцы таблицы table в соответствии с их новыми значениями в строках существующей таблицы. В выражении SET указывается, какие именно столбцы следует модифицировать и какие величины должны быть в них установлены. В выражении WHERE , если оно присутствует, задается, какие строки подлежат обновлению. В остальных случаях обновляются все строки. Ключевое слово LIMIT позволяет ограничить число обновляемых строк.
В следующим листинге разделу форума с первичным ключом 2 устанавливается новое название (PHP) и устанавливается атрибут hide равным 1, делая форум невидимым.
С этой командой мы уже встречались ранее, когда выполняли запросы вида show databases и show tables для получения списка баз данных и таблиц в выбранной базе данных. Рассмотрим еще несколько вариантов использования этой команды.
Вывести список всех столбцов выбранной таблицы можно при помощи следующего запроса:
Результат приведен на следующем рисунке:
Можно также отобразить информацию обо всех индексах конкретной таблицы:
Выполнив команду SHOW PROCESSLIST можно увидеть список всех выполняющихся в системе запросов:
Функциональные возможности языка SQL
Основные функциональные возможности языка SQL приведены ниже.
Определение данных.Эта функция SQLпредставляет собой описание структуры поддерживаемых данных и организацию реляционных отношений (таблиц). Для ее реализации предназначены операторы создания базы данных, создания таблиц и доступа к данным.
Создание базы данных. Для создания новой базы данных используется оператор CREATE DATABASE. В структуре оператора указывается имя создаваемой базы данных.
Создание таблиц. Базовая таблица создается с помощью оператора CREATE TABLE. В этом операторе указываются имена полей, типы данных для них, длина (для некоторых типов данных). В SQL используются следующие типы данных:
INTEGER – целое число;
CHAR – символьное значение;
VARCHAR – символьное значение, сохраняются только непустые символы;
DECIMAL – десятичное число;
FLOAT – число с плавающей запятой;
DOUBLE PRECISION – удвоенная точность с плавающей точкой;
DATETIME – дата и время;
BOOL – булевое значение.
В операторе создания таблицы указываются ограничения на значения столбцов и на таблицу. Возможные ограничения показаны в табл. 4.8
Таблица 4.8 Ограничения на определяемые данные
Оператор | Пояснение | На значения столбцов | На таблицу |
NOT NULL | Не нулевой | + | |
UNIQUE | Уникальный | + | + |
PRIMARYKEY | Первичный ключ | + | + |
CHECK | Проверка предиката | + | + |
DEFAULT | Значение по умолчанию | + | |
REFERENCES | Ссылка на имя таблицы, имя столбца | + | + |
FOREIGNKEY | Внешний ключ | + |
Для реляционной модели данных существенным является указания внешнего ключа(FOREIGNKEY). При объявлении внешних ключей необходимо наложить соответствующие ограничения на столбец, например, NOT NULL.
В SQL-предложении CHECK обозначает семантические ограничения, обеспечивающие целостность данных, чтобы, например, ограничить множество допустимых значения определенного столбца.
Нельзя использовать оператор создания таблицы несколько раз для одной и той же таблицы. Если после ее создания обнаружились неточности в ее определении, то внести изменения можно с помощью оператора ALTER TABLE. Этот оператор предназначен для изменения структуры существующей таблицы: можно удалить или добавить поле к существующей таблице.
Манипулирование данными.SQL позволяет пользователю или прикладной программе изменять содержимое базы данных путем вставки новых данных, удаления или модификации существующих данных.
Вставка новых данных является процедурой добавления строк в базу данных и выполняется с помощью оператора INSERT.
Модификация данных предполагает изменения значений в одном или нескольких столбцах таблицы и выполняется с помощью оператора UPDATE. Пример:
Удаление строк из таблицы осуществляется с помощью оператора DELETE. Синтаксис оператора имеет вид:
Предложение WHERE не является обязательным, однако, если его не включить, то будут удалены все записи таблицы. Полезно использовать оператор SELECT c тем же синтаксисом, что и оператор DELETE, чтобы предварительно проверить, какие записи будут удалены.
Обеспечение целостности данных.Язык SQL позволяет определить достаточно сложные ограничения целостности, удовлетворение которым будет проверяться при всех модификациях базы данных. Контроль за результатами транзакций, обработка возникающих ошибок и координирование параллельной работы с базой данных нескольких приложений или пользователей обеспечивается операторами COMMIT(фиксирует удачное окончание текущей транзакции и начало новой) и ROLLBACK (необходимость отката – автоматического восстановления состояния базы данных на начало транзакции)
Выборка данных – одна из важнейших функций базы данных, которой соответствует оператор SELECT. Пример использования оператора был рассмотрен в предыдущем разделе.
В SQL можно создавать вложенные последовательности запросов (подзапросы). Существуют определенные типы запросов, которые лучше реализовывать с помощью подзапросов. К таким запросам относятся так называемые проверки существования. Предположим, что требуется получить данные о студентах, которые не имеют оценку «семь баллов». Если будет возвращено пустое множество, то это означает лишь одно – у каждого студента есть, по крайней мере, одна такая оценка.
Связывание таблиц. Операторы языка SQL позволяют извлекать данные более чем из одной таблицы. Одна из возможностей сделать это заключается в связывании таблиц по одному общему полю.
В операторе SELECT должно присутствовать ограничение на совпадение значений определенного столбца (поля). Тогда из связанных таблиц будут извлекаться только те строки, в которых значения заданного столбца совпадают. Название столбца указывается только вместе с названием таблицы; в противном случае оператор будет неоднозначным.
Можно использовать другие типы связывания таблиц: оператор INTER JOIN (внутреннее соединение) обеспечивает присутствие в результирующем наборе записей, совпадающие значения в связанных полях. Внешние соединения (OUTER JOIN) позволяют включить в результат запроса все строки из одной таблицы и соответствующие им строки из другой
Управление доступом.SQL обеспечивает синхронизацию обработки базы данных различными прикладными программами, защиту данных от несанкционированного доступа.
Доступ к данным в многопользовательской среде регулируется с помощью операторов GRANT и REVOKE. В каждом операторе необходимо указать пользователя, объект (таблицу, представление), по отношению к которому задаются полномочия, и сами полномочия. Например, оператор GRANT задает пользователю Х возможность производить выборку данных из таблицы ТОВАР:
GRANT SELECT ON ТОВАР TO X
Оператор REVOKE аннулирует все предоставленные ранее полномочия.
Встраивание SQL в прикладные программы. Реальные приложения обычно написаны на других языках, генерирующих код на языке SQL и передающих их в СУБД в виде текста в формате ASCII.
Стандартом фирмы IBM для SQL-продуктов регламентировано использование встроенного языка SQL. При написании прикладной программы ее текст представляет собой смесь команд основного языка программирования (например, C, Pascal, Cobol, Fortran, Assembler) и команд SQL со специальным префиксом, например. ExecSQL. Структура SQL-предложений расширена для размещения переменных основного языка в SQL-конструкции.
SQL-процессор видоизменяет вид программы в соответствии с требованиями компилятора основного языка программирования. Функция компилятора состоит в трансляции (перевод) программы с исходного языка программирования на язык, близкий к машинному. После компиляции прикладная программа (приложение) представляет собой самостоятельный модуль.
Диалекты языка SQL
В современных реляционных СУБД для описания и манипулирования данными используются диалекты языка SQL. Подмножество языка SQL, позволяющее создавать и описывать БД, называется DDL (Data Definition Language).
Первоначально язык SQL назывался SEQUEL(Structured English Query Language), потом SEQUEL/2, а затем просто – SQL. Сегодня язык SQL –фактический стандарт для реляционных СУБД.
Первый стандарт языка появился в 1989 г. – SQL-89 и поддерживался практически всеми коммерческими реляционными СУБД. Он имел общий характер и допускал широкое толкование. Достоинствами SQL-89 можно считать стандартизацию синтаксиса и семантики операторов выборки и манипулирования данными, а также фиксацию средств ограничения целостности базы данных. Однако в нем отсутствовал такой важный раздел как манипулирование схемой базы данных. Неполнота стандарта SQL-89 привела к появлению в 1992г. следующей версии языка SQL.
SQL2 (или SQL-92) охватывает практически все необходимые проблемы: манипулирование схемой базы данных, управление транзакциями и сессиями, поддерживает архитектуры клиент-сервер или средства разработки приложений.
Дальнейшим шагом развития языка является вариант SQL 3. Эта версия языка дополняется механизмом триггеров, определением произвольного типа данных, объектным расширением.
В настоящее время существует три уровня языка: начальный, промежуточный и полный. Многие производители своих СУБД применяют собственные реализации SQL, основанные как минимум на начальном уровне соответствующего стандарта ANSI, и содержащие некоторые расширения, специфические для той или иной СУБД. В табл. 4.9 приведены примеры диалектов SQL.
Таблица 4.9 Диалекты языка SQL
СУБД | Язык запросов |
СУБД System R | SQL |
DB2 | SQL |
Access | SQL |
SYBASE SQL Anywhere | Watcom-SQL |
SYBASE SQL Server | Transact_SQL |
My SQL | SQL |
Oracle | PL/SQL |
В объектно-ориентированных БД используется язык объектных запросов OQL (Object Query Language). За основу языка OQL была взята команда SELECT языка SQL2 и добавлены возможность направлять запрос к объекту или коллекции объектов, а также возможность вызывать методы в рамках одного запроса.
Совместимость многих используемых диалектов SQL обусловливает совместимость СУБД. Так, СУБД SYBASE SQL Anywhere максимально, насколько это возможно для СУБД такого класса, совместима с СУБД SYBASE SQL Server. Одной из сторон такой совместимости является поддержка в SYBASE SQL Anywhere такого диалекта языка SQL как Transact-SQL. Этот диалект используется в SYBASE SQL Server и может применяться в SYBASE SQL Anywhere наряду с собственным диалектом языка SQL — Watcom-SQL.
Контрольные вопросы
1. Как можно классифицировать СУБД?
2. Какие модели баз данных существуют?
3. Что является основными элементами инфологических моделей?
4. Какие типы связей между сущностями существуют?
5. Что такое ER-диаграммы и для чего они используются?
6. Что позволяет делать процедура нормализации таблиц?
7. Назовите языковые и программные средства СУБД?
8. К каому типу относится СУБД MS Access?
9. Назовите основные объекты СУБД MS Access?
10. Для чего используются основные операторы языка SQL?
SQL команды
Выделяют следующие группы команд SQL:
Команды языка определения данных
Команды языка определения данных DDL (Data Definition Language, язык определения данных) — это подмножество SQL, используемое для определения и модификации различных структур данных.
К данной группе относятся команды предназначенные для создания, изменения и удаления различных объектов базы данных. Команды CREATE (создание), ALTER (модификация) и DROP (удаление) имеют большинство типов объектов баз данных (таблиц, представлений, процедур, триггеров, табличных областей, пользователей и др.). Т.е. существует множество команд DDL, например, CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE TRIGGER, CREATE USER, CREATE ROLE и т.д.
Некоторым кажется, что применение DDL является прерогативой администраторов базы данных, а операторы DML должны писать разработчики, но эти два языка не так-то просто разделить. Сложно организовать аффективный доступ к данным и их обработку, не понимая, какие структуры доступны и как они связаны. Также сложно проектировать соответствующие структуры, не зная, как они будут обрабатываться.
Команды языка управления данными
С помощью команд языка управления данными ( DCL (Data Control Language) ) можно управлять доступом пользователей к базе данных. Операторы управления данными включают в себя применяемые для предоставления и отмены полномочий команды GRANT и REVOKE, а также команду SET ROLE, которая разрешает или запрещает роли для текущего сеанса.
Команды языка управления транзакциями
Команды языка управления транзакциями ( TCL (Тгаnsасtiоn Соntrol Language) ) команды позволяют определить исход транзакции.
Команды управления транзакциями управляют изменениями в базе данных, которые осуществляются командами манипулирования данными.
Транзакция (или логическая единица работы) – неделимая с точки зрения воздействия на базу данных последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что либо результаты всех операторов, входящих в транзакцию, отображаются в БД, либо воздействие всех этих операторов полностью отсутствует.
COMMIT — заканчивает («подтверждает») текущую транзакцию и делает постоянными (сохраняет в базе данных) изменения, осуществленные этой транзакцией. Также стирает точки сохранения этой транзакции и освобождает ее блокировки. Можно также использовать эту команду для того, чтобы вручную подтвердить сомнительную распределенную транзакцию.
ROLLBACK — выполняет откат транзакции, т.е. отменяет все изменения, сделанные в текущей транзакции. Можно также использовать эту команду для того, чтобы вручную отменить работу, проделанную сомнительной распределенной транзакцией.
Понятие транзакции имеет непосредственную связь с понятием целостности базы данных. Очень часто база данных может обладать такими ограничениями целостности, которые просто невозможно не нарушить, выполняя только один оператор изменения БД. Например, невозможно принять сотрудника в отдел, название и код которого отсутствует в базе данных.
В системах с развитыми средствами ограничения и контроля целостности каждая транзакция начинается при целостном состоянии базы данных и должна оставить это состояние целостными после своего завершения. Несоблюдение этого условия приводит к тому, что вместо фиксации результатов транзакции происходит ее откат (т.е. вместо оператора COMMIT выполняется оператор ROLLBACK), и база данных остается в таком состоянии, в котором находилась к моменту начала транзакции, т.е. в целостном состоянии.
В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей, т.е., если с каждым сеансом работы с базой данных ассоциируется транзакция, то каждый пользователь начинает работу с согласованным состоянием базы данных, т.е. с таким состоянием, в котором база данных могла бы находиться, даже если бы пользователь работал с ней в одиночку.
Команды языка манипулирования данными
Команды языка манипулирования данными
Команды языка манипулирования данными DML (Data Manipulation Language) позволяют пользователю перемещать данные в базу данных и из нее:
- INSERT — осуществляет вставку строк в таблицу.
- DELETE — осуществляет удаление строк из таблицы.
- UPDATE — осуществляет модификацию данных в таблице.
- SELECT — осуществляет выборку данных из таблиц по запросу.
Каждый, кто работает с SQL в среде Oracle, должен вооружиться книгами: справочником по языку SQL, таким как «Oracle SQL: The Essential Reference? (O’Reilly), руководством по оптимизации производительности, например «Oracle SQL Tuning Pocket Reference» (O’Reilly).
Вы должны войти, чтобы оставить комментарий.
Вызов пользовательских функций в SQL и PL/SQL
Oracle позволяет вызывать пользовательские функции в коде SQL . Фактически это позволяет адаптировать язык SQL под требования конкретных приложений.
Каждый раз, когда исполнительное ядро SQL вызывает функцию PL/SQL, оно должно «переключаться» на исполнительное ядро PL/SQL. При многократном вызове функции затраты на переключение контекстов могут быть весьма значительными.
Требования к вызываемым функциям
Чтобы определяемую программистом функцию PL/SQL можно было вызывать из команд SQL , она должна отвечать следующим требованиям:
- Все параметры функции должны иметь режим использования IN . Режимы IN OUT и OUT в функциях, встраиваемых в SQL-код, недопустимы.
- Типы данных параметров функций и тип возвращаемого значения должны распознаваться сервером Oracle. PL/SQL дополняет основные типы Oracle, которые пока не поддерживаются базой данных. Речь идет о типах BOOLEAN , BINARY_INTEGER , ассоциативных массивах, записях PL/SQL и определяемых программистом подтипах.
- Функция должна храниться в базе данных. Функция, определенная на стороне клиента, не может вызываться в командах SQL, так как SQL не сможет разрешить ссылку на эту функцию.
По умолчанию пользовательские функции, вызываемые в SQL , оперируют данными одной строки, а не столбца (как агрегатные функции SUM , MIN и AVG ). Чтобы создать агрегатные функции, вызываемые в SQL , необходимо использовать интерфейс ODCIAggregate , который является частью среды Oracle Extensibility Framework . За подробной информацией по этой теме обращайтесь к документации Oracle.
Ограничения для пользовательских функций, вызываемых в SQL
С целью защиты от побочных эффектов и непредсказуемого поведения хранимых процедур Oracle не позволяет им выполнять следующие действия:
- Хранимые функции не могут модифицировать таблицы баз данных и выполнять команды DDL ( CREATE TABLE , DROP INDEX и т. д.), INSERT , DELETE , MERGE и UPDATE . Эти ограничения ослабляются, если функция определена как автономная транзакция. В таком случае любые вносимые ею изменения осуществляются независимо от внешней транзакции, в которой выполняется запрос.
- Хранимые функции, которые вызываются удаленно или в параллельном режиме, не могут читать или изменять значения переменных пакета. Сервер Oracle не поддерживает побочные эффекты, действие которых выходит за рамки сеанса пользователя.
- Хранимая функция может изменять значения переменных пакета, только если она вызывается в списке выборки либо в предложении VALUES или SET . Если хранимая функция вызывается в предложении WHERE или GROUP BY , она не может изменять значения переменных пакета.
- До выхода Oracle8 пользовательские функции не могли вызывать процедуру RAISE_ APPLICATION_ERROR .
- Хранимая функция не может вызывать другой модуль (хранимую процедуру или функцию), не соответствующий приведенным требованиям.
- Хранимая функция не может обращаться к представлению, которое нарушает любое из предшествующих правил. Представлением (view) называется хранимая команда SELECT , в которой могут вызываться хранимые функции.
- До выхода Oracle11g для передачи параметров функциям могла использоваться только позиционная запись. Начиная с Oracle11g, допускается передача параметров по имени и смешанная запись.
Непротиворечивость чтения и пользовательские функции
Модель непротиворечивости чтения в базе данных Oracle проста и понятна: после выполнения запрос «видит» данные в том состоянии, в котором они существовали (были зафиксированы в базе данных) на момент начала запроса, с учетом результатов изменений, вносимых командами DML текущей транзакции. Таким образом, если мой запрос был выполнен в 9:00 и продолжает работать в течение часа, даже если за это время другой пользователь внесет в данные изменения, они не отразятся в моем запросе.
Но если не принять специальных мер предосторожности с пользовательскими функциями в ваших запросах, может оказаться, что ваш запрос будет нарушать (по крайней мере на первый взгляд) модель непротиворечивости чтения базы данных Oracle. Чтобы понять этот аспект, рассмотрим следующую функцию и запрос, в котором она вызывается:
Таблица account содержит 5 миллионов активных строк, а таблица orders — 20 миллионов. Я запускаю запрос в 10:00, на его завершение уходит около часа. В 10:45 приходит некто, обладающий необходимыми привилегиями, удаляет все строки из таблицы orders и закрепляет транзакцию. По правилам модели непротиворечивости чтения Oracle сеанс, в котором выполняется запрос, не должен рассматривать эти строки как удаленные до завершения запроса. Но при следующем вызове из запроса функция total_sales не найдет ни одной строки и вернет NULL — и так будет происходить до завершения запроса.
При выполнении запросов из функций, вызываемых в коде SQL, необходимо внимательно следить за непротиворечивостью чтения. Если эти функции вызываются в продолжительных запросах или транзакциях, вероятно, вам стоит выполнить следующую команду для обеспечения непротиворечивости чтения между командами SQL текущей транзакции: SET TRANSACTION READ ONLY
В этом случае необходимо позаботиться о наличии достаточного табличного пространства отмены.
Определение подпрограмм PL/SQL в командах SQL (12.1 и выше)
Разработчики уже давно могли вызывать свои функции PL/SQL из команд SQL . Допустим, я создал функцию с именем BETWNSTR , которая возвращает подстроку с заданной начальной и конечной позицией:
Функция может использоваться в запросах следующим образом:
Эта возможность позволяет «расширить» язык SQL функциональностью, присущей конкретному приложению, и повторно использовать алгоритмы (вместо копирования). К недостаткам выполнения пользовательских функций в SQL следует отнести необходимость переключения контекста между исполнительными ядрами SQL и P L/SQL . Начиная с Oracle Database 12c вы можете определять функции и процедуры PL/SQL в секции WITH подзапроса, чтобы затем использовать их как любую встроенную или пользовательскую функцию. Эта возможность позволяет консолидировать функцию и запрос в одной команде:
Главное преимущество такого решения — повышение производительности, так как при таком определении функций затраты на переключение контекста с ядра SQL н а ядро PL/SQL существенно снижаются. С другой стороны, за него приходится расплачиваться возможностью повторного использования логики в других частях приложения.
Впрочем, для определения функций в секции WITH есть и другие причины. В SQL можно вызвать пакетную функцию, но нельзя сослаться на константу, объявленную в пакете (если только команда SQL не выполняется внутри блока PL/SQL ), как показано в следующем примере:
Классическое обходное решение основано на определении функции в пакете и ее последующем вызове:
Для простого обращения к значению константы в команде SQL потребуется слишком много кода и усилий. Начиная с версии 12.1 это стало излишним — достаточно создать функцию в секции WITH :
Функции PL/SQL , определяемые в SQL, также пригодятся при работе с автономными базами данных, доступными только для чтения. Хотя в таких базах данных невозможно создавать «вспомогательные» функции PL/SQL , вы можете определять их прямо в запросах.
Механизм WITH FUNCTION стал чрезвычайно полезным усовершенствованием языка SQL. Тем не менее каждый раз, когда вы планируете его использование, стоит задать себе один вопрос: «Потребуется ли эта функциональность в нескольких местах приложения?»
Если вы ответите на него положительно, следует решить, компенсирует ли выигрыш по производительности от применения WITH FUNCTION потенциальные потери от копирования и вставки этой логики в нескольких командах SQL.
Учтите, что в версии 12.1 в блоках PL/SQL невозможно выполнить статическую команду select с секцией with function . Безусловно, это выглядит очень странно, и я уверен, что в 12.2 такая возможность появится, но пока при попытке выполнения следующего кода будет выдана ошибка:
Помимо конструкции WITH FUNCTION, в версии 12.1 также появилась директива UDF для улучшения быстродействия функций PL/SQL, выполняемых из SQL.