Разное

Синтаксис ms sql: Учебник по языку SQL (DDL, DML) на примере диалекта MS SQL Server. Часть вторая / Хабр

Содержание

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), и база данных остается в таком состоянии, в котором находилась к моменту начала транзакции, т.е. в целостном состоянии.
В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей, т.е., если с к

SQL Server 2012 и Transact-SQL

1012

Работа с базами данных в .NET Framework — SQL Server 2012 и Transact-SQL

Система управления базами данных (СУБД) SQL Server, в состав которой входит компонент Database Engine, службы анализа Analysis Services, службы отчетов Reporting Services, интеграционные службы Integration Services и расширение SQLXML — является наилучшим выбором для широкого диапазона конечных пользователей и программистов баз данных, работающих над созданием бизнес-приложений, по двум причинам:

  1. SQL Server — несомненно, наилучшая система для операционных систем Windows, вследствие ее тесной интеграции с ними (а также вследствие низкой стоимости). Благодаря огромному и все возрастающему количеству установленных систем Windows, SQL Server является широко применяемой системой управления базами данных.

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

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

Transact-SQL (T-SQL) — язык реляционной базы данных системы SQL Server, который обладает несколькими нестандартными свойствами, которые неизвестны пользователям, знакомым только с языком SQL. В приведенных ниже статьях мы опишем возможности языка T-SQL.

SQL — SQL — qaz.wiki

Язык для управления и использования реляционных баз данных

SQL ( SQL , я к ж əl / «продолжение», Structured Query Language ) является языком предметно-ориентированный используется для программирования и предназначена для управления данными , проводимых в система управления реляционными базами данных (СУБД) или для потоковой обработки в системе управления реляционными потоками данных (RDSMS). Это особенно полезно при обработке структурированных данных , т. Е. Данных, включающих отношения между сущностями и переменными.

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

Первоначально основанный на реляционной алгебре и реляционном исчислении кортежей , SQL состоит из множества типов операторов, которые можно неформально классифицировать как подъязыки , обычно: язык запросов данных (DQL), язык определения данных (DDL), язык управления данными (DCL). ) и язык манипулирования данными (DML). Сфера применения SQL включает запрос данных, манипулирование данными (вставка, обновление и удаление), определение данных ( создание и изменение схемы ) и управление доступом к данным. Хотя SQL по сути является декларативным языком ( 4GL ), он также включает в себя процедурные элементы.

SQL был один из первых коммерческих языков использовать Кодд «s реляционную модель . Эта модель была описана в его влиятельной статье 1970 года «Реляционная модель данных для больших общих банков данных». Несмотря на то, что он не полностью придерживался реляционной модели, описанной Коддом , он стал наиболее широко используемым языком баз данных.

SQL стал стандартом в Американском национальном институте стандартов (ANSI) в 1986 году, и в Международных организациях по стандартизации (ИСО) в 1987 г. С тех пор стандарт был пересмотрен с целью включения более широкий набора функций. Несмотря на наличие стандартов, большая часть кода SQL требует по крайней мере некоторых изменений перед переносом в другие системы баз данных.

История

SQL был первоначально разработан в IBM по Дональд Д. Чемберлин и Рэймонд Бойс , узнав о реляционной модели от Кодд в начале 1970 — х годов. Эта версия, первоначально называвшаяся SEQUEL ( Structured English Query Language ), была разработана для управления и извлечения данных, хранящихся в оригинальной квазиреляционной системе управления базами данных IBM , System R , которую группа из исследовательской лаборатории IBM в Сан-Хосе разработала в 1970-х .

Первой попыткой Чемберлина и Бойса создать язык реляционных баз данных был Square, но его было трудно использовать из-за обозначения индекса. После перехода в исследовательскую лабораторию Сан-Хосе в 1973 году они начали работу над SEQUEL. Акроним SEQUEL было изменено на SQL , потому что «ПРОДОЛЖЕНИЕ» был торговой маркой в британской Hawker Siddeley компании Dynamics Engineering Limited.

После тестирования SQL на тестовых сайтах заказчиков для определения полезности и практичности системы IBM начала разрабатывать коммерческие продукты на основе своего прототипа System R, включая System / 38 , SQL / DS и DB2 , которые были коммерчески доступны в 1979, 1981 и 1983 г. соответственно.

В конце 1970 — х годов, Relational Software, Inc. (теперь Oracle Corporation ) увидел потенциал концепций , описанных Коддом, Чемберлин и Бойс и разработали свои собственные SQL на основе СУБД с устремлениями его продажи в ВМС США , Центрального разведывательного управления Agency и другие правительственные агентства США . В июне 1979 года компания Relational Software, Inc. представила первую коммерчески доступную реализацию SQL, Oracle V2 (Version2) для компьютеров VAX .

К 1986 году группы стандартов ANSI и ISO официально приняли стандартное определение языка «Database Language SQL». Новые версии стандарта были опубликованы в 1989, 1992, 1996, 1999, 2003, 2006, 2008, 2011 и, совсем недавно, в 2016 году.

Синтаксис

UпDАТE cлатыsе{UпDАТE cотыптрySEТ cлатыsе{SEТ поптылатяопзнак равно поптылатяоп+1⏞еИкспреssяопWЧАСEрE cлатыsе{WЧАСEрE памезнак равно′USА′⏞еИкспреssяоп⏟преdяcате;}заявление{\ displaystyle \ left. {\ begin {array} {rl} \ textstyle {\ mathtt {UPDATE ~ clause}} & \ {{\ mathtt {UPDATE \ country}} \\\ textstyle {\ mathtt {SET ~ clause} } & \ {{\ mathtt {SET \ Population = ~}} \ overbrace {\ mathtt {Population + 1}} ^ {\ mathtt {expression}} \\\ textstyle {\ mathtt {WHERE ~ clause}} & \ { {\ mathtt {WHERE \ \ underbrace {{name =} \ overbrace {‘USA’} ^ {expression}} _ {predicate};}} \ end {array}} \ right \} {\ textstyle {\ texttt {инструкция }}}}

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

Язык SQL подразделяется на несколько языковых элементов, в том числе:

  • Предложения , которые являются составными компонентами утверждений и запросов. (В некоторых случаях это необязательно.)
  • Выражения , которые могут создавать либо скалярные значения, либо таблицы, состоящие из столбцов и строк данных.
  • Предикаты , которые задают условия, которые могут быть оценены с помощью трехзначной логики SQL (3VL) (истина / ложь / неизвестно) или логических значений истинности и используются для ограничения эффектов операторов и запросов или для изменения потока программы.
  • Запросы , которые извлекают данные на основе определенных критериев. Это важный элемент SQL .
  • Операторы , которые могут иметь постоянное влияние на схемы и данные или могут управлять транзакциями , потоком программы, соединениями, сеансами или диагностикой.

    • Операторы SQL также включают в себя терминатор оператора точка с запятой («;»). Хотя он не требуется на каждой платформе, он определен как стандартная часть грамматики SQL.
  • Незначительные пробелы обычно игнорируются в операторах и запросах SQL, что упрощает форматирование кода SQL для удобства чтения.

Процедурные расширения

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

ИсточникСокращенное названиеФИО
Стандарт ANSI / ISO SQL / PSMМодули SQL / Persistent Stored
Interbase / Firebird PSQLПроцедурный SQL
IBM DB2 SQL PLПроцедурный язык SQL (реализует SQL / PSM)
IBM InformixSPLСохраненный процедурный язык
IBM NetezzaNZPLSQL(на основе Postgres PL / pgSQL)
ИзобретательныйPSQLInvantive Procedural SQL (реализует SQL / PSM и PL / SQL )
MariaDB SQL / PSM , PL / SQLSQL / Persistent Stored Module (реализует SQL / PSM), процедурный язык / SQL (на основе Ada )
Microsoft / Sybase T-SQLTransact-SQL
Mimer SQL SQL / PSMSQL / Persistent Stored Module (реализует SQL / PSM)
MySQL SQL / PSMSQL / Persistent Stored Module (реализует SQL / PSM)
MonetDB SQL / PSMSQL / Persistent Stored Module (реализует SQL / PSM)
NuoDBSSPХранимые процедуры Старки
Oracle PL / SQLПроцедурный язык / SQL (на основе Ada )
PostgreSQL PL / pgSQLПроцедурный язык / язык структурированных запросов PostgreSQL (на основе сокращенного PL / SQL )
SAP R / 3 ABAPРасширенное программирование бизнес-приложений
SAP HANASQLScriptSQLScript
SybaseWatcom-SQLSQL Anywhere Watcom-SQL Диалект
ТерадатаSPLСохраненный процедурный язык

В дополнение к стандартным расширениям SQL / PSM и проприетарным расширениям SQL на многих платформах SQL доступно процедурное и объектно-ориентированное программирование через интеграцию СУБД с другими языками. Стандарт SQL определяет расширения SQL / JRT (процедуры и типы SQL для языка программирования Java) для поддержки кода Java в базах данных SQL. Microsoft SQL Server 2005 использует SQLCLR (общеязыковая среда выполнения SQL Server) для размещения управляемых сборок .NET в базе данных, в то время как предыдущие версии SQL Server были ограничены неуправляемыми расширенными хранимыми процедурами, в основном написанными на C. PostgreSQL позволяет пользователям писать функции в широком диапазоне. множество языков, включая Perl , Python , Tcl , JavaScript (PL / V8) и C.

Совместимость и стандартизация

Обзор

Реализации SQL несовместимы между поставщиками и не обязательно полностью соответствуют стандартам. В частности, синтаксис даты и времени, конкатенация строк, NULLs и чувствительность к регистру при сравнении варьируются от поставщика к поставщику. Конкретными исключениями являются PostgreSQL и Mimer SQL, которые стремятся к соответствию стандартам, хотя PostgreSQL не придерживается стандарта в том, как выполняется сворачивание имен без кавычек. Сворачивание имен без кавычек в нижний регистр в PostgreSQL несовместимо со стандартом SQL, согласно которому имена без кавычек следует переводить в верхний регистр. Таким образом, Fooдолжно быть эквивалентно тому, что FOOне fooсоответствует стандарту.

Популярные реализации SQL обычно не поддерживают базовые функции стандартного SQL, такие как типы данных DATEили TIME. Наиболее очевидными из таких примеров и, кстати, наиболее популярными коммерческими и проприетарными СУБД SQL являются Oracle (которая DATEведет себя как тип DATETIMEи не имеет TIMEтипа) и MS SQL Server (до версии 2008 года). В результате код SQL редко может быть перенесен между системами баз данных без изменений.

Причины несовместимости

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

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

История стандартизации

SQL был принят в качестве стандарта Американским национальным институтом стандартов (ANSI) в 1986 году как SQL-86 и Международной организацией по стандартизации (ISO) в 1987 году. Он поддерживается ISO / IEC JTC 1, Информационные технологии, Подкомитетом SC 32, Управление данными и обмен .

До 1996 года программа стандартов управления данными Национального института стандартов и технологий (NIST) сертифицировала соответствие СУБД SQL стандарту SQL. Поставщики теперь самостоятельно подтверждают соответствие своей продукции.

Оригинальный стандарт объявил , что официальное произношение «SQL» была аббревиатура : ( «ESS кий эль»). Несмотря на это , многие говорящие на английском языке профессионалов базы данных ( в том числе Дональд Чемберлин сам) использовать аббревиатуру -как произношении ˙I K ш əl / ( «продолжение»), зеркальное имя развития пре-релиз на языке в «SEQUEL».
Стандарт SQL претерпел ряд изменений:

ГодназваниеПсевдонимКомментарии
1986 г.SQL-86SQL-87Впервые оформлено ANSI.
1989 г.SQL-89 FIPS 127-1Незначительная редакция, добавляющая ограничения целостности, принята как FIPS 127-1.
1992 г. SQL-92SQL2, FIPS 127-2Основная версия (ISO 9075), начальный уровень SQL-92 принят как FIPS 127-2.
1999 г. SQL: 1999SQL3Добавлено сопоставление регулярных выражений, рекурсивные запросы (например, транзитивное замыкание ), триггеры , поддержка процедурных операторов и операторов управления потоком, нескалярных типов (массивов) и некоторых объектно-ориентированных функций (например, структурированных типов ). Поддержка встраивания SQL в Java ( SQL / OLB ) и наоборот ( SQL / JRT ).
2003 г. SQL: 2003Введены функции, связанные с XML ( SQL / XML ), оконные функции , стандартизованные последовательности и столбцы с автоматически сгенерированными значениями (включая столбцы идентификаторов).
2006 г. SQL: 2006ISO / IEC 9075-14: 2006 определяет способы использования SQL с XML. Он определяет способы импорта и хранения данных XML в базе данных SQL, управления ими в базе данных и публикации как XML, так и обычных данных SQL в форме XML. Кроме того, он позволяет приложениям интегрировать запросы в свой код SQL с помощью XQuery , языка запросов XML, опубликованного Консорциумом World Wide Web ( W3C ), для одновременного доступа к обычным данным SQL и XML-документам.
2008 г. SQL: 2008Легализует определения ORDER BY за пределами курсора. Добавляет триггеры INSTEAD OF, оператор TRUNCATE, предложение FETCH.
2011 г. SQL: 2011Добавляет временные данные (PERIOD FOR) (дополнительная информация: Temporal database # History ). Улучшения оконных функций и предложения FETCH.
2016 г. SQL: 2016Добавляет сопоставление шаблонов строк, полиморфные табличные функции, JSON .
2019 г.SQL: 2019Добавляет Часть 15, многомерные массивы (тип и операторы MDarray).

Текущий стандарт

Стандарт обычно обозначается шаблоном: ISO / IEC 9075-n: yyyy Part n: title , или, сокращенно, ISO / IEC 9075 .

ISO / IEC 9075 дополняется ISO / IEC 13249: SQL Multimedia and Application Packages (SQL / MM), который определяет интерфейсы и пакеты на основе SQL для широко распространенных приложений, таких как видео, аудио и пространственные данные . Заинтересованные стороны могут приобрести документы стандартов SQL в ISO, IEC или ANSI. Черновик SQL: 2008 находится в свободном доступе в виде zip- архива.

Анатомия стандарта SQL

Стандарт SQL разделен на десять частей. Имеются пробелы в нумерации из-за вывода устаревших деталей.

  • ISO / IEC 9075-1: 2016, часть 1: Framework (SQL / Framework). Он предоставляет логические концепции.
  • ISO / IEC 9075-2: 2016 Часть 2: Foundation (SQL / Foundation). Он содержит наиболее важные элементы языка и состоит как из обязательных, так и из дополнительных функций.
  • ISO / IEC 9075-3: 2016 Часть 3: Интерфейс уровня вызовов ( SQL / CLI ). Он определяет сопрягающие компоненты (структуры, процедуры, привязки переменных), которые могут использоваться для выполнения операторов SQL из приложений, написанных на Ada, C соответственно C ++, COBOL, Fortran, MUMPS, Pascal или PL / I. (Для Java см. Часть 10.) SQL / CLI определен таким образом, что операторы SQL и вызовы процедур SQL / CLI обрабатываются отдельно от исходного кода вызывающего приложения. Open Database Connectivity — это хорошо известная надмножество SQL / CLI. Эта часть стандарта состоит исключительно из обязательных функций.
  • ISO / IEC 9075-4: 2016 Часть 4: Постоянно хранимые модули ( SQL / PSM ). Он стандартизирует процедурные расширения для SQL, включая поток управления, обработку условий, сигналы условий оператора и отмены, курсоры и локальные переменные, а также присвоение выражений переменным и параметрам. Кроме того, SQL / PSM формализует объявление и обслуживание постоянных подпрограмм языка баз данных (например, «хранимых процедур»). Эта часть стандарта состоит исключительно из дополнительных функций.
  • ISO / IEC 9075-9: 2016 Часть 9: Управление внешними данными ( SQL / MED ). Он предоставляет расширения для SQL, которые определяют оболочки сторонних данных и типы каналов данных, позволяющие SQL управлять внешними данными. Внешние данные — это данные, которые доступны СУБД на базе SQL, но не управляются ею. Эта часть стандарта состоит исключительно из дополнительных функций.
  • ISO / IEC 9075-10: 2016 Часть 10: Привязки объектного языка ( SQL / OLB ). Он определяет синтаксис и семантику SQLJ , который является SQL, встроенным в Java (см. Также часть 3). Стандарт также описывает механизмы, обеспечивающие двоичную переносимость приложений SQLJ, и определяет различные пакеты Java и содержащиеся в них классы. Эта часть стандарта состоит исключительно из дополнительных функций. В отличие от SQL / OLB JDBC определяет API и не является частью стандарта SQL.
  • ISO / IEC 9075-11: 2016 Часть 11: Схемы информации и определений ( SQL / Schemata ). Он определяет информационную схему и схему определения, предоставляя общий набор инструментов для самоописания баз данных и объектов SQL. Эти инструменты включают идентификатор объекта SQL, ограничения структуры и целостности, спецификации безопасности и авторизации, функции и пакеты ISO / IEC 9075, поддержку функций, предоставляемых реализациями СУБД на основе SQL, информацию о реализации СУБД на основе SQL и элементы определения размеров, а также значения, поддерживаемые реализациями СУБД. Эта часть стандарта содержит как обязательные, так и дополнительные функции.
  • ISO / IEC 9075-13: 2016 Часть 13: Процедуры и типы SQL с использованием языка программирования Java TM ( SQL / JRT ). Он определяет возможность вызывать статические методы Java в качестве подпрограмм из приложений SQL («Java-in-the-database»). Это также требует возможности использовать классы Java в качестве структурированных пользовательских типов SQL. Эта часть стандарта состоит исключительно из дополнительных функций.
  • ISO / IEC 9075-14: 2016 Часть 14: Спецификации, связанные с XML ( SQL / XML ). Он определяет расширения на основе SQL для использования XML в сочетании с SQL. Представлен тип данных XML , а также несколько процедур, функций и сопоставлений типов данных XML-SQL для поддержки обработки и хранения XML в базе данных SQL. Эта часть стандарта состоит исключительно из дополнительных функций.
  • ISO / IEC 9075-15: 2019 Часть 15: Многомерные массивы (SQL / MDA). Он определяет тип многомерного массива (MDarray) для SQL, а также операции с MDarrays, срезами MDarray, ячейками MDarray и связанными функциями. Эта часть стандарта состоит исключительно из дополнительных функций.
Расширения стандарта ISO / IEC

ISO / IEC 9075 дополняется мультимедийными и прикладными пакетами ISO / IEC 13249 SQL . Этот тесно связанный, но отдельный стандарт разработан тем же комитетом. Он определяет интерфейсы и пакеты на основе SQL. Целью является унифицированный доступ к типичным приложениям баз данных, таким как текст, изображения, интеллектуальный анализ данных или пространственные данные .

  • ISO / IEC 13249-1: 2016 Часть 1: Структура
  • ISO / IEC 13249-2: 2003 Часть 2: Полнотекстовый
  • ISO / IEC 13249-3: 2016 Часть 3: Пространственные
  • ISO / IEC 13249-5: 2003 Часть 5: Неподвижное изображение
  • ISO / IEC 13249-6: 2006 Часть 6: Интеллектуальный анализ данных
  • ISO / IEC 13249-7: 2013 Часть 7: История
  • ISO / IEC 13249-8: xxxx, часть 8: MRA доступа к реестру метаданных (в стадии разработки)
Технические отчеты

ISO / IEC 9075 также сопровождается серией технических отчетов, опубликованных как ISO / IEC TR 19075 в 8 частях. В этих технических отчетах объясняется обоснование и использование некоторых функций SQL, а при необходимости приводятся примеры. Технические отчеты не являются нормативными; если есть какие-либо расхождения с 9075, текст в 9075 остается в силе. В настоящее время доступны 19075 технических отчетов:

  • ISO / IEC TR 19075-1: 2011 Часть 1: Поддержка регулярных выражений XQuery в SQL
  • ISO / IEC TR 19075-2: 2015 Часть 2: Поддержка SQL для информации, связанной со временем
  • ISO / IEC TR 19075-3: 2015 Часть 3: SQL, встроенный в программы с использованием языка программирования Java
  • ISO / IEC TR 19075-4: 2015 Часть 4: SQL с подпрограммами и типами с использованием языка программирования Java
  • ISO / IEC TR 19075-5: 2016 Часть 5: Распознавание строк в SQL
  • ISO / IEC TR 19075-6: 2017 Часть 6: Поддержка SQL для нотации объектов JavaScript (JSON)
  • ISO / IEC TR 19075-7: 2017 Часть 7: Полиморфные табличные функции в SQL
  • ISO / IEC TR 19075-8: 2019 Часть 8: Многомерные массивы (SQL / MDA)

Альтернативы

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

  • .QL : объектно-ориентированный журнал данных
  • Язык 4D запросов (4D QL)
  • Datalog : критики предполагают, что Datalog имеет два преимущества перед SQL: он имеет более чистую семантику, которая облегчает понимание и обслуживание программ, а также более выразительный, особенно для рекурсивных запросов.
  • HTSQL : метод запроса на основе URL
  • IBM Business System 12 (IBM BS12): одна из первых полностью реляционных систем управления базами данных, представленная в 1982 году.
  • ISBL
  • jOOQ : SQL, реализованный на Java как внутренний предметно-ориентированный язык
  • Java Persistence Query Language (JPQL): язык запросов, используемый Java Persistence API и библиотекой сохраняемости Hibernate.
  • JavaScript : MongoDB реализует свой язык запросов в API JavaScript.
  • LINQ : запускает операторы SQL, написанные как языковые конструкции, для запроса коллекций непосредственно из кода .Net .
  • Язык объектных запросов
  • QBE ( Query By Example ), созданный Moshè Zloof, IBM 1977
  • Quel был представлен в 1974 году в рамках проекта UC Berkeley Ingres.
  • Учебник D
  • XQuery

Распределенная обработка SQL

Архитектура распределенных реляционных баз данных (DRDA) была разработана рабочей группой IBM в период с 1988 по 1994 год. DRDA позволяет реляционным базам данных, подключенным к сети, взаимодействовать друг с другом для выполнения запросов SQL.

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

Сообщения, протоколы и структурные компоненты DRDA определяются архитектурой управления распределенными данными .

Критика

дизайн

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

Критики утверждают, что SQL следует заменить языком, который строго возвращается к исходной основе: например, см . Третий манифест . Однако не существует известных доказательств того, что такую ​​уникальность нельзя добавить к самому SQL или, по крайней мере, к его разновидности. Другими словами, вполне возможно, что SQL можно «исправить» или, по крайней мере, улучшить в этом отношении, так что отрасли, возможно, не придется переключаться на совершенно другой язык запросов для получения уникальности. Дебаты по этому поводу остаются открытыми.

Другая критика

Чемберлин обсуждает четыре исторических критических замечания SQL в статье 2012 года:

Ортогональность и полнота

Ранние спецификации не поддерживали основные функции, такие как первичные ключи. Наборы результатов не могут быть названы, а подзапросы не определены. Они были добавлены в 1992 году.

Значение NULL

Концепция Null является предметом некоторых дискуссий . Маркер Null указывает на отсутствие значения, даже 0 для целочисленного столбца или строки длины 0 для текстового столбца. Концепция Nulls обеспечивает 3- значную логику в SQL , которая является конкретной реализацией общей 3-значной логики .

Дубликаты

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

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

Несоответствие импеданса

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

Категории целостности данных

Основные категории целостности данных каждой СУБД.

Целостность сущности

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

Целостность домена

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

Ссылочная целостность

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

Определенная пользователем целостность

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

Типы данных SQL

Стандарт SQL определяет три типа типов данных:

  • предопределенные типы данных
  • построенные типы
  • определяемые пользователем типы.

Предопределенные типы данных

  • Типы персонажей
  • Символ (СИМВОЛ)
  • Изменение характера (VARCHAR)
  • Большой объект персонажа (CLOB)
  • Двоичные типы
  • Двоичный (BINARY)
  • Двоичное изменение (VARBINARY)
  • Двоичный большой объект (BLOB)
  • Числовые типы
  • Точные числовые типы (NUMERIC, DECIMAL, SMALLINT, INTEGER, BIGINT)
  • Приблизительные числовые типы (FLOAT, REAL, DOUBLE PRECISION)
  • Типы даты и времени (DATE, TIME, TIMESTAMP)
  • Тип интервала (ИНТЕРВАЛ)
  • Булево
  • XML
  • JSON

Построенные типы

Сконструированные типы — это ARRAY, MULTISET, REF (значение) или ROW.
Типы, определяемые пользователем , сопоставимы с классами объектно-ориентированного языка со своими собственными конструкторами, наблюдателями, мутаторами, методами, наследованием, перегрузкой, перезаписью, интерфейсами и т. Д.

Смотрите также

Примечания

Ссылки

Источники

Документы стандартов SQL

Общедоступные стандарты и технические отчеты ITTF

ISO / IEC Информационные технологии Целевая группа публикует общедоступные стандарты , включая SQL. Здесь публикуются Технические исправления (исправления) и Технические отчеты (документы для обсуждения).

SQL — Часть 1: Фреймворк (SQL / Framework)

Проекты документов

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

внешние ссылки

  • 1995 Воссоединение SQL: люди, проекты и политика , Пол МакДжонс (ред.) : Стенограмма встречи, посвященной личной истории реляционных баз данных и SQL.
  • Американский национальный институт стандартов. X3h3 Records, 1978–1995 Коллекция Института Чарльза Бэббиджа документирует разработку комитетом h3 стандартов NDL и SQL.
  • Устное историческое интервью с Дональдом Д. Чемберлином Институт Чарльза Бэббиджа В этой устной истории Чемберлин рассказывает о своей молодости, своем образовании в колледже Харви Мадда и Стэнфордском университете , а также о своей работе в области технологии реляционных баз данных. Чемберлин был членом исследовательской группы System R и вместе с Раймондом Ф. Бойсом разработал язык баз данных SQL. Чемберлин также кратко рассказывает о своих последних исследованиях языков запросов XML.
  • Сравнение различных реализаций SQL. Это сравнение различных реализаций SQL призвано служить руководством для тех, кто заинтересован в переносе кода SQL между различными продуктами СУБД, и включает сравнения между SQL: 2008, PostgreSQL, DB2, MS SQL Server, MySQL, Oracle, и Informix.
  • Обработка потока событий с помощью SQL — введение в обработку потоковых данных в реальном времени с помощью непрерывных SQL-запросов.
  • Грамматика BNF для ISO / IEC 9075: 2003, часть 2 SQL / Framework

Transact-SQL, Создание и удаление базы данных

Управление базой данных

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

Итак, в этой главе нам предстоит узнать:

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

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

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

Операторы по описанию объектов базы данных выделают в отдельный язык (подязык SQL) — DDL (Data Definition Language, Язык Объявления Данных). Именно этот язык будет рассматриваться в этой главе, ведь нам предстоит научиться описывать данные таблицы.

Создание и удаление базы данных

Информация о каждой базе данных в SQL Server хранится в таблице sysdatabases базы данных master. Поэтому желательно (но не обязательно) использовать базу данных master, во время создания базы. К тому же, после изменения любой пользовательской базы данных создавать резервную копию базы данных master. О резервном копировании и восстановлении мы поговорим в разделе 4.10.
Объявление базы данных – это процесс указания имени и указания размера и расположения файлов.

В Transact-SQL для создания базы данных есть команда CREATE DATABASE. Эта команда может выполняться только с сервером SQL Server. При использовании базы данных MS Access команда не доступна, потому что базой данных является файл с расширением .mdb, который создается в программе Access и к которому мы подключены.

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

Синтаксис команды создания базы данных показан в листинге 1.1.

Листинг 1.1. Создание базы данных


CREATE DATABASE имя
[ ON 
    [< filespec > [ ,...n ] ] 
    [ , < filegroup > [ ,...n ] ] 
] 
[ LOG ON { < filespec > [ ,...n ] } ] 
[ COLLATE имя_раскладки ]
[ FOR LOAD | FOR ATTACH ] 

< filespec > ::= 
[ PRIMARY ]
( [ NAME = логическое_имя_файла , ] 
    FILENAME = 'имя_файла_в_ОС' 
    [ , SIZE = размер ] 
    [ , MAXSIZE = { максимальный_размер | UNLIMITED } ] 
    [ , FILEGROWTH = увеличение ] ) [ ,...n ]

< filegroup > ::= 
FILEGROUP файловая_группа < filespec > [ ,...n ]

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


CREATE DATABASE имя

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

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


CREATE DATABASE Имя

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


CREATE DATABASE [Тестовая база]

Очень интересной является следующая строка:


[ FOR LOAD | FOR ATTACH ]

Здесь в квадратных скобках указано два значения, разделенных вертикальной чертой. Это значит, что эти значения являются не обязательными, а вертикальная черта соответствует слову «или», т.е. в запросе можно будет указывать или FOR LOAD, или FOR ATTACH, или вообще ничего. Оба параметра указывать нельзя.

В угловых скобках указываются имена секций. Например, в описании оператора CREATE DATABASE есть два указания на < filespec >. Эта секция может идти после ключевого слова ON и после LOG ON. Описание самой секции идет после:


< filespec > ::=

Не понятно? Попробуем еще раз. Описание оператора CREATE DATABASE выглядит так:


CREATE DATABASE имя
[ ON 
    [< filespec > [ ,...n ] ] 
    [ , < filegroup > [ ,...n ] ] 
] 
[ LOG ON { < filespec > [ ,...n ] } ] 
[ COLLATE имя_раскладки ]
[ FOR LOAD | FOR ATTACH ] 

Далее идут описания секций < filespec > и < filegroup >:


< filespec > ::= 
[ PRIMARY ]
( [ NAME = логическое_имя_файла , ] 
    FILENAME = 'имя_файла_в_ОС' 
    [ , SIZE = размер ] 
    [ , MAXSIZE = { максимальный_размер | UNLIMITED } ] 
    [ , FILEGROWTH = увеличение ] ) [ ,...n ]

и


< filegroup > ::= 
FILEGROUP файловая_группа < filespec > [ ,...n ]

Теперь, заменяем в описании CREATE DATABASE название секции < filespec > на саму секцию. Если вы имеете опыт программирования на одном из высокоуровневых языков, то в секциях вы уже наверно увидели аналогию с процедурами. Название секции < filespec > аналогично имени процедуры, а после < filespec > ::= идет сам код процедуры.

Следующая интересная запись:


[ < filespec > [ ,...n ] ]

Запись < filespec > — описание файла, а [ ,…n ] указывает на то, что возможно несколько описаний.

С помощью круглых скобок параметры объединяются в группу, например:


( [ NAME = логическое_имя_файла , ] 
    FILENAME = 'имя_файла_в_ОС' 
    [ , SIZE = размер ] 
    [ , MAXSIZE = { максимальный_размер | UNLIMITED } ] 
    [ , FILEGROWTH = увеличение ] ) [ ,...n ]

В данном случае в группу объединены параметры NAME, FILENAME, SIZE, MAXSIZE и FILEGROWTH. Все эти параметры описывают файл, поэтому и объединены в группу. Из всей группы только параметр FILENAME является обязательным. После круглых скобок идет снова можно увидеть [ ,…n ], значит может быть несколько описаний файлов (для каждого файла базы данных свое описание).

Параметр FILENAME интересен еще и тем, что его значение задается с помощью знака равенства, после которого идет текст в одинарных кавычках:


FILENAME = 'имя_файла_в_ОС'

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


SIZE = 'Размер'

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

  • PRIMARY. Этот параметр указывает файл в основной файловой группе. Эта файловая группа содержит все системные базы данных. Она также содержит все объекты, не назначенные другим файловым группам. Каждая база данных содержит один основной файл данных. Основной файл – это стартовая точка базы данных и указывает на место ее нахождения. Рекомендуемое файловое расширение для основного файла .mdf. Если вы не укажите этого параметра, первый файл списка описания будет использован как основной.
  • FILENAME. Этот параметр указывает имя и путь к файлу в операционной системе. Путь должен указывать на папку на сервере, где установлен SQL Server. Нельзя использовать сетевые диски с других компьютеров.
  • SIZE. Этот параметр указывает размер файла данных или журнала. Вы можете указать размер в мегабайтах MB (значение по умолчанию) или в килобайтах KB. Минимальный размер – 512KB для обоих файлов – журнала транзакций и файла данных. Размер, указанный для основного файла базы данных должен быть больше или равен размеру основного файла базы данных model. Мы уже говорили, что база model копируется во все новые базы данных, поэтому размер новой, не может быть меньше размера model, иначе копирование станет невозможным. Когда вы добавляете новый файл базы данных или журнала без указания размера – то сервер использует значение размера по умолчанию = 1МБ.
  • MAXSIZE. Этот параметр указывает максимальный размер, до которого файл может увеличиваться. Вы можете указать размер в мегабайтах MB (значение по умолчанию) или в килобайтах KB. Если вы не укажите максимальный размер, файл будет увеличиваться, пока диск не будет заполнен полностью.
  • FILEGROW. Этот параметр указывает размер приращения файла. Значение этого параметра для файла не может превышать значение MAXSIZE. Значение 0 указывает на запрет увеличения. Значение может быть указано в мегабайтах (по умолчанию), килобайтах или процентах. Значение по умолчанию, если этот параметр не указан — 10%, а минимальный размер – 64кб. Указанный размер округляется до ближайшего числа, кратному 64кб.
  • COLLATION. Этот параметр указывает значение по умолчанию для сопоставления в базе данных. Сопоставления (кодировка или раскладка) включают роли контролирующие использование символов для языка и алфавита.

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

  1. Все базы данных имеют основной файл данных, определяемый именем файла с расширением .mdf, и один или более файлов журнала определяемый именем файла с расширением .ldf. База данных может также иметь вторичные файлы данных, которые определяются по имени файла с расширением .ndf. Файлы могут объединяться в группы, о чем мы поговорим в разделе 1.1.1.
  2. Физические файлы имеют двойное именование – имя ОС и имя, которые вы можете использовать в операторах Transact-SQL (логическое имя, которое указывается в параметре NAME).
  3. Когда вы создаете базу данных, в нее копируется содержимое базы данных model, которая включает системные таблицы и может содержать пользовательские таблицы, созданные вами. Минимальный размер создаваемой базы данных должен быть равен или больше размера базы данных model.
  4. Сервер SQL хранит, читает и записывает данные блоками по 8кб, эти блоки называются страницами. База данных может хранить 128 страниц на мегабайт (1 мегабайт или 1048576 байт разделить 8 килобайт или 8192 байт). Все страницы хранятся в пространстве. Пространство – это 8 последовательных страниц, или 64кб. Поэтому база данных имеет 16 пространств в мегабайте.

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

Сервер SQL использует два типа пространств:

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

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

Страница свободного пространства (PFS) – это выделенная страница, содержащая информацию о свободном пространстве доступном в файле. Эта информация хранится в странице 1. Каждая такая страница может простираться на 8000 смежных страниц, что приблизительно 64мб данных.

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

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


DROP DATABASE имя

Нельзя удалять базу данных если она:

  • Базу данных, которая открыта для чтения или записи любым пользователем, поэтому при удалении вы также не должны быть к ней подключены. Лучше всего подключиться к базе данных master;
  • Базу данных, которая опубликовала любую свою таблицу как часть репликации SQL Server
  • Системную базу данных

Давайте рассмотрим простейший пример создания и удаления базы данных. Для создания базы данных достаточно написать:


CREATE DATABASE имя

Все остальные параметры являются не обязательными. Попробуем создать базу данных с именем TestDatabase и удалить. Сначала создадим базу:


CREATE DATABASE TestDatabase

И тут же ее удалим:


DROP DATABASE TestDatabase

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

Теперь посмотрим, какие еще возможности дает нам команда создания базы данных. Но сначала вы должны знать, что имя базы данных может иметь не более 128 символов, если вы явно указываете логическое имя файла журнала. Я считаю, это вполне достаточно. Если логическое имя журнала не задано, то размер сокращается до 123 символов. Это связано с тем, что логическое имя журнала также имеет ограничение в 128 символов и если оно не указано, то в качестве имени используется имя базы плюс суффикс _log. Самое интересное, что суффикс занимает четыре символа, а 128-4=124. Почему Microsoft ограничивает имя до 123, для меня остается загадкой. Быть может, составители документации разучились считать?

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

  • Первый символ должен быть буква a-z, A-Z.
  • После первого символа может быть буква, цифра или символ _, @, или #.
  • Идентификаторы, начинающиеся с символов, имеют специальное назначение:

Учимся работать с SQLCMD | Windows IT Pro/RE

Постоянные читатели журнала, возможно, заметили, что я стал чаще писать о сценариях и некоторых развивающихся платформах и инструментах для взаимодействия с Microsoft SQL Server. Тому есть объяснение, но пока я не могу вдаваться в подробности. Достаточно сказать, что нас ждет дивный новый мир SQL Server на Linux, в котором взаимодействие с нашими экземплярами не ограничено средой Microsoft SQL Server Management Studio.

В этой статье речь пойдет об SQLCMD — инструменте командной строки, который используется для взаимодействия с Microsoft SQL Server.

Это не новый инструмент, он появился несколько десятков лет назад. Вы можете запускать SQLCMD не только из приложения командной строки Command, встроенного в Windows, но и из среды SQL Server Management Studio (SSMS).

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

  1. Запуск SQLCMD из командной строки.
  2. Основной синтаксис для подключения к Microsoft SQL Server с использованием SQLCMD.
  3. Основной синтаксис для передачи запросов в экземпляр Microsoft SQL Server с помощью SQLCMD.
  4. Выполнение запросов с использованием SQLCMD из среды SQL Server Management Studio.

Запуск SQLCMD из командной строки

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

Итак, нажмите комбинацию клавиш Windows + R, чтобы открыть окно выполнения, введите cmd, чтобы запустить приложение Command, а затем введите sqlcmd в ответ на приглашение и следом одну из многочисленных возможных комбинаций строк подключения, которые описаны ниже.

После успешного подключения вы получите приглашение вида «1>», чтобы начать взаимодействие с SQLCMD. При необходимости можно предоставить запрос как часть начального подключения для немедленной обработки, в соответствии с описанием, приведенным далее в статье.

Базовый синтаксис SQLCMD для установки подключения SQL Server

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

Параметр сервера

  • -S: указывает имя сервера или имя сервера/экземпляра в случае именованного экземпляра.

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

  • -U: указывает имя пользователя при использовании проверки подлинности SQL Server;
  • -P: пароль для пользователя, указанного в параметре -U;
  • -E: обозначает использование доверенной проверки подлинности (Active Directory). Этот параметр выбран по умолчанию и не обязательно вводится при использовании доверенной проверки подлинности. Ниже приведены два примера инструкций подключения с помощью SQLCMD.

Сначала выполняется доверенная проверка подлинности для экземпляра по умолчанию с последующим именованным экземпляром:

sqlcmd -S 
sqlcmd -S \
   

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

sqlcmd -S  -U
    -P 
sqlcmd -S \
   
   -U  -P 

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

Параметры ввода

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

  • -Q или -q: текст запроса, передаваемого в экземпляр SQL Server;
  • -i: предоставляет полный путь и имя файла, обрабатываемого экземпляром SQL Server.

Параметры вывода

  • -o: предоставляет полный путь и имя файла для публикации результатов запроса.

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

sqlcmd -?

Две команды, на которые следует обратить внимание, управляют запуском скрипта и выходом из SQLCMD.

  • GO: в отличие от знакомого вам аналога T-SQL, GO — не просто инструкция завершения пакета, а команда, выполняющая команду в SQLCMD.
  • EXIT: эта команда завершает текущий сеанс SQLCMD. Впоследствии, чтобы установить активный сеанс, вам потребуется повторно ввести сведения о подключении.

Помните, что для всех перечисленных параметров используется синтаксис, обеспечивающий одновременный запуск SQLCMD и подключение к экземпляру SQL Server. Если вы уже запустили SQLCMD и получили приглашение «1>», то можно избавиться от инструкции sqlcmd в начале всех приведенных выше фрагментов программного кода.

Базовый синтаксис SQLCMD для выполнения запросов

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

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

sqlcmd -S  -U
    -P 
   -i  "SELECT name FROM master;"
   -o c:\temp\db.txt

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

sqlcmd -S \
    -i
   C:\temp\sqlscript.sql -o c:\temp\db.txt

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

sqlcmd -S -i
   «SELECT name FROM master;»

Использование SQLCMD из среды SQL Server Management Studio

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

Откройте новое окно запроса в среде SQL Server Management Studio. Необходимо поставить SSMS в известность, что этот запрос будет выполняться с помощью SQLCMD. Для этого перейдите к строке меню в верхней части экрана и выберите Query («Запрос»), а затем SQLCMD Mode («Режим SQLCMD»).

Выполним простое подключение к серверу. Сделать это можно с использованием доверенной проверки подлинности и простой команды:

: CONNECT 

Запрос немедленно отключается от экземпляра SQL после завершения выделенного вами текста запроса при его выполнении или полного содержимого запроса.

Нечто подобное приведенному ниже варианту демонстрирует возможность подключиться к экземпляру SQL Server (в данном случае используется локальный экземпляр SQL Server) и возвратить имя сервера и список всех баз данных на экземпляре:

: Connect.
SELECT @@SERVERNAME, name
FROM master.sys.databases
ORDER BY name;

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

Итак, теперь вы можете использовать SQLCMD из приложения Command операционной системы Windows или из среды SQL Server Management Studio. Кроме того, вы можете организовать подключение всего с несколькими необходимыми параметрами, знакомыми каждому, кто хотя бы немного работал с SQL Server, и передать запрос в SQL Server через SQLCMD для обработки.

Поделитесь материалом с коллегами и друзьями

Базовые команды SQL часть 1.

Все инструкции SQL начинаются с ключевых слов, таких как SELECT, SHOW, USE, INSERT, DELETE, CREATE. Так же все инструкции обязаны заканчиваться точкой с запятой (;). Именовать инструкции заглавными буквами — это признак хорошего тона при работе с SQL, MYSQL и другими базами данных. В то же время, операторы и инструкции SQL нечувствительны к регистру. Это означает, что SHOW и show имеют одинаковый смысл в операторах SQL. Однако нужно помнить, что регистр имеет значение в названиях таблиц. Поэтому, если вы работаете с MySQL, вам нужно указывать названия таблиц так, как они заданы в базе данных.

Рассмотрим некоторые базовые команды(инструкции) SQL

Инструкция USE

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

USE data_base_name;

MariaDB [(none)]> USE lexone.ru;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

MariaDB [(none)]> USE lexone.ru;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

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

Инструкция SHOW

Как узнать содержимое той или иной базы данных? Или содержимое конкретной таблицы? Для этого используется инструкция SHOW.

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

SHOW DATABASES

Например, команда SHOW DATABASES выводит список баз данных, которые находятся под управлением конкретного сервера.

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

Самый простой способ создания сервера MySQL — установить бесплатные инструменты, такие как XAMPP или WAMP, которые включают в себя все необходимые утилиты. Но так же можно установить всё вручную.

SHOW TABLES

Для того, чтобы посмотреть все доступные таблицы в выбранной базе данных, используется команда SHOW TABLES. Она нужна для отображения всех таблиц в текущей выбранной базе данных MySQL.

SHOW COLUMNS

SHOW COLUMNS отображает информацию о столбцах в данной таблице.

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

SHOW COLUMNS отображает следующие значения для каждого столбца таблицы:

  • Field: имя столбца
  • Type: тип данных столбца
  • Key: указывает, индексирован ли столбец
  • Default: значение по умолчанию для столбца
  • Extra: может содержать любую дополнительную информацию о данном столбце

Столбцы для таблицы wp_comments были автоматически созданы WordPress, как и вся база данных моего сайта.

Инструкция Select

Оператор SELECT используется для выбора данных из базы данных.

Результат хранится в таблице результатов, которая называется результирующим набором.

Запрос может извлекать информацию из выбранных столбцов или из всех столбцов таблицы.

Чтобы создать простую инструкцию SELECT, укажите имена столбцов из таблицы.

Синтаксис инструкции SQL SELECT:

SELECT column_list

FROM table_name

— аргумент column_list включает один или несколько столбцов, из которых извлекаются данные

table-name имя таблицы, из которой извлекается информация

Приведем пример:

> SELECT comment_ID, comment_post_ID, comment_author, comment_author_email FROM wp_comments;

В этом примере мы формируем таблицу — результирующий набор (такой таблицы не существует, это необходимый нам запрос, составленный с помощью инструкций), состоящую из столбцов  comment_ID, comment_post_ID, comment_author, comment_author_email,  которые содержит таблица  wp_comments.

На этом хотелось бы закончить первую часть. Часть 2.

Различия синтаксиса SQL между MSSQL и MySQL

Вот различия в синтаксисе SQL между MSSQL и MySQL

В
MSSQL имена таблиц и столбцов заключаются в двойные кавычки или
квадратные скобки, тогда как в MySQL имена таблиц и имена столбцов заключены
с обратной кавычкой («»)

Пример

MSSQL

СОЗДАТЬ ТАБЛИЦУ «Сотрудники» («Empno» VARCHAR (10), «EmpName» Varchar (100)
……

ВЫБЕРИТЕ [Empno], [EmpName] из «Сотрудники»……

MySQL

СОЗДАТЬ ТАБЛИЦУ `Сотрудники` (` Empno` VARCHAR (10), `EmpName` Varchar (100)
……

ВЫБЕРИТЕ `Empno`,` EmpName` из `Employees` ……

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

Например,
следующий оператор можно записать так:

MSSQL

СОЗДАТЬ ТАБЛИЦУ «Сотрудники» («Empno»
VARCHAR (10), «EmpName» Varchar (100)……

MySQL

СОЗДАТЬ ТАБЛИЦУ `Сотрудники` (` Empno`
VARCHAR (10), `EmpName` Varchar (100) ……

или без включения
персонаж вроде этого.

MSSQL

СОЗДАТЬ ТАБЛИЦУ сотрудников (Empno
VARCHAR (10), EmpName Varchar (100) ……

MySQL

СОЗДАТЬ ТАБЛИЦУ сотрудников (Empno
VARCHAR (10), EmpName Varchar (100) ……

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

MSSQL

CREATE TABLE «Таблица сотрудников» («Emp No»
VARCHAR (10), «EmpName» Varchar (100)……

MySQL

СОЗДАТЬ ТАБЛИЦУ `Таблица сотрудников` (` Emp No`
VARCHAR (10), `EmpName` Varchar (100) ……

ты не можешь так писать

MSSQL

CREATE TABLE Таблица сотрудников (Emp No
VARCHAR (10), EmpName Varchar (100) ……

MySQL

CREATE TABLE Таблица сотрудников (Emp No
VARCHAR (10), EmpName Varchar (100) ……

В MySQL, если вы включите опцию режима ANSI_QUOTES SQL с
следующая команда

mysql> УСТАНОВИТЬ sql_mode = ‘ANSI_QUOTES’;

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

С учетом регистра

В MS SQL, если база данных создана с СБОРКОЙ с учетом регистра, то
имена таблиц и столбцы чувствительны к регистру в противном случае, если база данных
создается с помощью сортировки без учета регистра, тогда имена идентификаторов — регистр
нечувствительный

Например,

Если вы создали таблицу в базе данных сортировки с учетом регистра, например,

создать таблицу Сотрудник (SNo int, Name Varchar (100), Sal money)

Обратите внимание на заглавную букву E в tablename

Затем, если вы дадите следующую команду

выберите * от сотрудника

выдаст ошибку

Недопустимое имя объекта «сотрудник».

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

выберите * от сотрудника

MySQL

В MySQL нет чувствительности к регистру в именах схем

TOP ‘n’ Rows

MSSQL

В MS SQL Server для просмотра первых n строк мы должны указать ключевое слово TOP после
предложение SELECT. Например, чтобы просмотреть 5 самых высоких зарплат сотрудников, у нас есть
чтобы дать такой запрос

ВЫБЕРИТЕ ТОП 5 [Empno]
, [Name]
, [Salary]
, [Jdate]
FROM
[Скотт].[dbo]. [Emp] упорядочить по зарплате desc

MySQL

В MySQL эквивалент TOP n строк может быть получен с помощью LIMIT n
ключевое слово.
Например, эквивалентный запрос для вышеуказанного запроса MSSQL
будет

выберите * из заказа emp по sal desc limit 5

Распространенных синтаксических ошибок SQL и способы их устранения

В SQL Server Management Studio ошибки можно легко отследить с помощью встроенной панели Error List .Эту панель можно активировать в меню Просмотр или с помощью сочетаний клавиш Ctrl + \ и Ctrl + E

Панель «Список ошибок» отображает синтаксические и семантические ошибки, обнаруженные в редакторе запросов. Чтобы перейти непосредственно к синтаксической ошибке SQL в редакторе сценариев, дважды щелкните соответствующую ошибку, отображаемую в списке ошибок

.

Ошибки ключевого слова SQL

Ошибки ключевых слов SQL возникают, когда одно из слов, которые язык запросов SQL резервирует для своих команд и предложений, написано с ошибкой.Например, если вы напишите «UPDTE» вместо «UPDATE», это приведет к ошибке

.

В этом примере ключевое слово «ТАБЛИЦА» написано неправильно:

Как показано на изображении выше, выделено не только слово «TBLE», но и слова вокруг него. На изображении ниже показано, что эта простая ошибка приводит к выделению большого количества слов

.

Фактически всего 49 ошибок было зарегистрировано только из-за неправильного написания одного ключевого слова

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

Также возможно, что все ключевые слова SQL написаны правильно, но их порядок неправильный.Например, инструкция «FROM Table_1 SELECT *» сообщит об ошибке синтаксиса SQL

.

Порядок команд

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

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

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

Как указано в сообщении об ошибке, команда CREATE SCHEMA должна быть первой заданной командой.Правильный способ выполнения этих команд вместе выглядит так:

В кавычках

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

Замена кавычек на правильные, устраняет ошибку

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

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

Поскольку внутри этой кавычки есть апостроф, он ошибочно используется как конец строки. Все остальное считается ошибкой

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

Поиск синтаксических ошибок SQL

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

Еще один способ помочь, это правильно отформатировать код

Это может улучшить читаемость кода, тем самым облегчая поиск ошибок

Милена — специалист по SQL Server с более чем 20-летним опытом работы в ИТ.Она начала с компьютерного программирования в средней школе и продолжила обучение в университете.

Она работает с SQL Server с 2005 года и имеет опыт работы с SQL 2000 по SQL 2014.

Ее любимые темы SQL Server — это аварийное восстановление SQL Server, аудит и мониторинг производительности.

Посмотреть все сообщения от Milena «Millie» Petrovic

Последние сообщения от Milena Petrovic (посмотреть все)

Освоение общего табличного выражения или CTE в SQL Server

Резюме : в этом руководстве вы узнаете об общем табличном выражении или CTE в SQL Server с помощью предложения WITH .

Введение в CTE в SQL Server

CTE означает общее табличное выражение. CTE позволяет вам определить временный именованный набор результатов, который временно доступен в области выполнения оператора, такого как SELECT , INSERT , UPDATE , DELETE или MERGE .

Ниже показан общий синтаксис CTE в SQL Server:

 

WITH имя_выражения [(имя_столбца [, ...])] В КАЧЕСТВЕ (CTE_definition) SQL_statement;

В этом синтаксисе:

  • Сначала укажите имя выражения ( имя_выражения ), на которое вы можете ссылаться позже в запросе.
  • Затем укажите список столбцов, разделенных запятыми, после имени_выражения. Количество столбцов должно быть таким же, как количество столбцов, определенное в CTE_definition .
  • Затем используйте ключевое слово AS после имени выражения или списка столбцов, если список столбцов указан.
  • После определите инструкцию SELECT , набор результатов которой заполняет общее табличное выражение.
  • Наконец, обратитесь к общему табличному выражению в запросе ( SQL_statement ), например SELECT , INSERT , UPDATE , DELETE или MERGE .

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

SQL Server Примеры CTE

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

A) Простой пример CTE SQL Server

В этом запросе используется CTE для возврата сумм продаж по продажам в 2018 г .:

 

WITH cte_sales_amounts (персонал, продажи, год) AS ( ВЫБРАТЬ first_name + '' + last_name, SUM (количество * list_price * (1 - скидка)), ГОД (заказ_дата) ИЗ продажи.приказы о ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ sales.order_items i ON i.order_id = o.order_id ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ к sales.staffs s НА s.staff_id = o.staff_id ГРУППА ПО first_name + '' + last_name, год (заказ_дата) ) ВЫБРАТЬ штат сотрудников, продажи ИЗ cte_sales_amounts ГДЕ год = 2018;

На следующем рисунке показан набор результатов:

В этом примере:

  • Сначала мы определили cte_sales_amounts как имя общего табличного выражения.CTE возвращает результат, состоящий из трех столбцов: , персонал, , , год, , и , продажи, , полученный из запроса определения.
  • Во-вторых, мы построили запрос, который возвращает общую сумму продаж по торговому персоналу и году путем запроса данных из таблиц заказов, , элементов заказа, и сотрудников, .
  • В-третьих, мы ссылались на CTE во внешнем запросе и выбираем только строки с 2018 годом.

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

B) Использование общего табличного выражения для получения средних значений отчета на основе счетчиков

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

 

С cte_sales AS ( ВЫБРАТЬ Staff_id, COUNT (*) order_count ИЗ заказы на продажу ГДЕ ГОД (order_date) = 2018 ГРУППА ПО Staff_id ) ВЫБРАТЬ AVG (количество заказов) average_orders_by_staff ИЗ cte_sales;

Вот результат:

 

average_orders_by_staff ----------------------- 48 (Затронута 1 строка)

В этом примере:

Во-первых, мы использовали cte_sales как имя общего табличного выражения.Мы пропустили список столбцов CTE, поэтому он является производным от оператора определения CTE. В этом примере он включает столбцов staff_id и order_count .

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

 

ВЫБРАТЬ Staff_id, COUNT (*) order_count ИЗ заказы на продажу ГДЕ ГОД (order_date) = 2018 ГРУППА ПО Staff_id;

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

 

ВЫБРАТЬ AVG (количество заказов) average_orders_by_staff ИЗ cte_sales;

C) Использование нескольких CTE SQL Server в одном примере запроса

В следующем примере используются два CTE cte_category_counts и cte_category_sales , чтобы получить количество продуктов и продаж для каждой категории продуктов. Внешний запрос объединяет два CTE с использованием столбца category_id .

 

С cte_category_counts ( category_id, category_name, product_count ) В КАЧЕСТВЕ ( ВЫБРАТЬ c.category_id, c.category_name, COUNT (p.product_id) ИЗ production.products p ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.categories c ВКЛ c.category_id = p.category_id ГРУППА ПО c.category_id, c.category_name ), cte_category_sales (идентификатор_категории, продажи) AS ( ВЫБРАТЬ p.category_id, СУММ (i.quantity * i.list_price * (1 - i.discount)) ИЗ sales.order_items i ВНУТРЕННЕЕ СОЕДИНЕНИЕ production.products p На стр.product_id = i.product_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ sales.orders o ВКЛ o.order_id = i.order_id ГДЕ order_status = 4 - завершено ГРУППА ПО p.category_id ) ВЫБРАТЬ c.category_id, c.category_name, c.product_count, s.sales ИЗ cte_category_counts c ВНУТРЕННИЙ ПРИСОЕДИНЯЙТЕСЬ cte_category_sales s ВКЛ s.category_id = c.category_id СОРТИРОВАТЬ ПО c.category_name;

Вот результат:

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

mssql: вставить в синтаксис — Microsoft SQL Server

П: н / д

Привет
Может ли кто-нибудь помочь мне перевести это из доступа, чтобы он мог работать в mssql
(мне нужно получить следующее значение, но я не могу использовать идентификатор, как если бы строка была удалена,
другой должен получить новый номер следующего столбца, который будет таким же, как удаленный)
Доступ;
ВСТАВИТЬ В таблицу
ВЫБРАТЬ
(IIF (codeNull, MAX (код) +1,1) Код AS,
0 AS код пользователя
ИЗ таблицы

Я пробовал это в mssql, но не сработал:
INSERT INTO table
SELECT
CASE
WHEN code IS NULL THEN 1
ELSE MAX (code) +1
END
AS code,
0 AS usercode
FROM table

Поделитесь этим вопросом


П: н / д

Привет,

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

Джон
«Андре» написал в сообщении новости: de ********** @ ss405.t-com.hr …

Привет
Кто-нибудь может помочь я перевожу это из доступа, чтобы он мог работать в mssql
(мне нужно получить следующее значение, но я не могу использовать идентификатор, как если бы строка была удалена,
другой должен получить новый номер следующего столбца, который будет таким же, как удаленный
)
Доступ ;
INSERT INTO table
SELECT
(IIF (code <> Null, MAX (code) +1,1) AS code,
0 AS usercode
FROM table

Я пробовал это в mssql, но не работал:
INSERT INTO table
ВЫБЕРИТЕ
СЛУЧАЙ
КОГДА код НУЛЬ ТО 1
ИНАЧЕ МАКС (код) +1
КОНЕЦ
Код AS,
0 Код пользователя
ИЗ таблицы


П: н / д

ВС, 21 августа 2005 г. 11:02:42 +0200, Андре написал:

(фрагмент)

Доступ;
INSERT INTO table
SELECT
(IIF (code <> Null, MAX (code) +1,1) AS code,
0 AS usercode
FROM table

Hi Andre,

Как говорит Джон: рассмотрите возможность использования IDENTITY ( SQL Server эквивалент того, что
Access называет «autonumber»).

Если есть причина, по которой вы не можете использовать IDENTITY, используйте

SELECT COALESCE (MAX (код), 0) + 1 AS code
FROM table

Best, Hugo

(Удалите _NO_ и _SPAM_ чтобы получить мой адрес электронной почты)


П: н / д

попробую это
thx

(кстати, я упомянул, что не могу использовать идентичность, так как это не сохранит правильный порядок
, если средняя строка будет удалена
, и это не позволит конечному пользователю изменить ее)
«Hugo Kornelis» написал в сообщении
новость: 6f ******************************** @ 4ax.com …

ВС, 21 августа 2005 г. 11:02:42 +0200, Андре писал:

Если есть причина, по которой вы не можете использовать ИДЕНТИФИКАЦИЮ, используйте

SELECT COALESCE (MAX (код), 0) + 1 AS код
FROM стол


П: н / д

ВС, 21 августа 2005, 14:19:39 +0200, Андре писал:

попробует этот
thx

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

Привет, Андре,

Это логический результат «смысла существования» атрибута IDENTITY
.IDENTITY следует использовать только для генерации уникального числового значения
, которое можно использовать вместо «реального» ключа в отношениях внешнего ключа
. Например, если Foo идентифицируется комбинацией
FooName, FooDate и FooWeight, таблицы Foo и Bar * могут * выглядеть
следующим образом:

CREATE TABLE Foo
(FooName varchar (35) NOT NULL,
FooDate datetime NOT NULL,
FooWeight numeric (15,7) NOT NULL,
— другие столбцы,
PRIMARY KEY (FooName, FooDate, FooWeight)
)
CREATE TABLE Bar
(BarNo int NOT NULL,
FooName varchar (35) NOT NULL,
FooDate datetime NOT NULL,
FooWeight numeric (15,7) NOT NULL,
— другие столбцы,
PRIMARY KEY (BarNo),
FOREIGN KEY (FooName, FooDate, FooWeight)
ССЫЛКИ Foo (FooDate, FooDate, FooDate FooWeight)
ON UPDATE CASCADE
ON DELETE NO ACTION
)

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

CREATE TABLE Foo
(FooID int var NOT NULL IDENTITY,
FooName (35) NOT NULL,
FooDate datetime NOT NULL,
FooWeight numeri c (15,7) NOT NULL,
— другие столбцы,
PRIMARY KEY (FooID),
UNIQUE (FooName, FooDate, FooWeight)
)
CREATE TABLE Bar
(BarNo int NOT NULL,
FooID int NOT NULL IDENTITY ,
— другие столбцы,
PRIMARY KEY (BarNo),
FOREIGN KEY (FooID) ССЫЛКИ Foo (FooID)
ON DELETE NO ACTION
)

Это дает Bar меньше занимаемой площади и ускоряет присоединение te (но
за счет большего количества требуемых соединений).Обратите внимание, что Foo — это
, все еще идентифицируемый по «настоящему» ключу. Также обратите внимание, что вы можете точно так же, как
, оставить «настоящий» ключ как PRIMARY KEY и объявить столбец идентификаторов
UNIQUE (это повлияет на внешний вид ваших индексов, поэтому это вариант
, который влияет на производительность).

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

Ваше упоминание о сохранении порядка при удалении строк заставляет меня думать,
, что вы хотите использовать IDENTITY для получения рейтинга. В таком случае: не надо. Единственное, что MS гарантирует в отношении IDENITY
, это то, что это будет уникальное значение
в своей таблице (при условии, что вы никогда не переопределите сгенерированные значения или
сбросите начальное значение). Если вам нужен рейтинг, вы можете:
a) Вычислять его всякий раз, когда вы запрашиваете данные. Используйте представление, если вы не хотите, чтобы
повторно набирал одну и ту же логику запроса снова и снова, или
b) Вычислить и сохранить ее; пересчитывать ранги после каждой модификации; этот
опасен (одна неконтролируемая модификация может разрушить схему), а
может замедлить операции модификации — используйте его только в том случае, если вы запрашиваете данные
(включая ранг) гораздо чаще, чем модифицируете данные.

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

Best, Hugo

(Удалите _NO_ и _SPAM_, чтобы получить мой адрес электронной почты)


П: н / д

У меня есть бухгалтерская программа, которую я перехожу на mssql.
Теперь у меня есть таблицы, содержащие различные документы (счета, входы / выходы
так далее).
Каждый документ в своей группе должен быть в порядке
1,2,3 ….
пропусков быть не может.
Теперь я должен разрешить некоторым пользователям удалять документы (если это были
введено по ошибке), но и разрешить
им изменить свои номера. Но эти номера должны быть уникальными в их
соответствующие таблицы.
И, когда пользователь создает новый документ, программа должна дать ему следующий номер
.
(серийный номер, если хотите).

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

Мои программы в настоящее время работают с доступом и mysql. Я добавляю mssql, но
не ожидал таких проблем с синтаксисом sql.
Coalesce упоминалось в предыдущем посте: он не работает
Мне нужен простой

INSERT INTO table SELECT ISNULL (MAX (fieldvalue) +1,1) AS fieldvalue FROM
table
or
INSERT INTO table SELECT MAX (fieldvalue) +1 AS fieldvalueFROM table

if this is not possible on mssql, I will be to create on insert trigger or
lock table while create new entry and first get value , затем вставьте его в таблицу
(1 запрос, 1 вставка — блокировка, поскольку два пользователя могут одновременно создать новый
: в то время как значение поля информации + 1 перемещается к первому пользователю, второй
выполняет тот же запрос и получает тот же номер
, что и первый еще не сделал вставку)


П: н / д

Хуго Корнелис (hugo @ pe_NO_rFact.in_SPAM_fo) пишет:

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

Эх, Андр говорит, что не хочет использовать IDENTITY, так что вы скажете ему не использовать его
?

В любом случае, если вы скажете:

INSERT tbl (…)
SELECT …
ORDER BY …

и tbl имеет столбец IDENTITY, у меня есть сообщение, действительно, что
— это гарантия что значения IDENTITY будут отражать предложение ORDER BY.

Однако это не относится к SELECT INTO.

В любом случае, из описания Андре
своей бизнес-проблемы очевидно, что ему следует держаться подальше от ИДЕНТИЧНОСТИ.

Эрланд Соммарског, SQL Server MVP, es****@sommarskog.se

Электронная документация по SQL Server SP3 на
http://www.microsoft.com/sql/techinf…2000/books. asp


П: н / д

Андре (sp ** @ spam.com) пишет:

Coalesce упоминалось в предыдущем посте: не работает

Пожалуйста, определите «не работает». У вас появляется сообщение об ошибке, у вас
неожиданный результат, на вас упало небо или что?

В любом случае, похоже, это работает:

CREATE TABLE andre (id int NOT NULL PRIMARY KEY,
somedata varchar (230) NOT NULL)
go
INSERT andre (id, somedata)
SELECT coalesce (MAX (id) , 0) + 1, ‘Это некоторые данные’
FROM andre
INSERT andre (id, somedata)
SELECT coalesce (MAX (id), 0) + 1, ‘This is some other data’
FROM andre
INSERT andre (id, somedata)
SELECT coalesce (MAX (id), 0) + 1, ‘This is any data’
FROM andre
go
SELECT * FROM andre ORDER BY id
go
DROP TABLE andre
I need simple

INSERT INTO table SELECT ISNULL (MAX (fieldvalue) +1,1) AS fieldvalue FROM

Поскольку isnull () является собственностью SQL Server, а coalesce () —
ANSI-SQL, и вы поддерживаете другие СУБД, coalesce () будет быть лучшим выбором
.

Эрланд Соммарског, SQL Server MVP, es****@sommarskog.se

Электронная документация по SQL Server SP3 на
http://www.microsoft.com/sql/techinf…2000/books. asp


П: н / д

Привет, Андре

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

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

Джон


П: н / д

Спасибо всем за помощь.

Проблема была где-то в другом месте:

Я попробовал
INSERT INTO table x AS fieldx, y AS fieldy FROM table
, хотя правильный (для MSSQL, очевидно):
INSERT table (fieldx, fieldy) SELECT x, y FROM table

снова , спасибо за уделенное время
р.s .: Интересно, почему существуют такие различия между синтаксисом sql для различных баз данных
(например, в чем заключается стандарт, который игнорируется)


П: н / д

Андре (sp**@spam.com) пишет:

Всем спасибо за помощь.

Проблема была где-то в другом месте:

Я пробовал
INSERT INTO table x AS fieldx, y AS fieldy FROM table
, хотя правильный (для MSSQL, очевидно):
INSERT table (fieldx, fieldy) SELECT x, y FROM table

Насколько мне известно, последний также соответствует стандартам ANSI.
(За исключением того факта, что ANSI требует INTO, в то время как это необязательно в
MS SQL Server.) Первый синтаксис — это то, чего я никогда раньше не видел.
А где нибудь работает?
ps: Интересно, почему существуют такие различия между синтаксисом sql для
различных баз данных (например: какая точка стандарта игнорируется
)

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

Эрланд Соммарског, SQL Server MVP, es****@sommarskog.se

Электронная документация по SQL Server SP3 на
http://www.microsoft.com/sql/techinf…2000/books. asp


П: н / д

Вс, 21 августа 2005 г., 23:34:40 +0200, Андре писал:

У меня есть бухгалтерская программа, которую я перехожу на mssql.
Теперь у меня есть таблицы, которые содержат различные документы (счета, входы / выходы
и т. Д.).
Каждый документ в своей группе должен быть упорядочен.
1,2,3 ….
, пропусков быть не должно.
Теперь я должен разрешить некоторым пользователям удалять документы (если они были введены по ошибке
), но также разрешить
им изменять свои номера. Но эти числа должны быть уникальными в соответствующих таблицах
.
И, когда пользователь создает новый документ, программа должна дать ему следующий номер
(серийный номер, если хотите).
(snip)

Привет, Андре,

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

Кроме того, если вы разрешите пользователям изменять номер документа, вы фактически гарантированно получите
пропусков. Рано или поздно кто-нибудь наберет
номер 42, потому что он фанат Дугласа Адамса.

Если фактическое требование состоит в том, чтобы использовать номер, который ДОЛЖНО возрастать на
и без пробелов, и что пользователи могут при желании изменить на
повторно использовать номер удаленного документа, я бы сказал: выполните SELECT MAX (..)
запрос во внешнем интерфейсе; увеличьте на единицу и заранее заполните числовое поле
в вашем интерфейсе этим номером. Пользователь может принять это значение по умолчанию
или ввести другой номер. Число, которое находится в поле, когда
пользователь отправляет свои данные, отправляется в базу данных в операторе INSERT …
VALUES.

(snip) Я мог бы установить личность, чтобы разрешить изменение, но я
не хочу.

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

(snip) Coalesce упоминалось в предыдущем посте: он не работает
Мне нужен простой

INSERT INTO table SELECT ISNULL (MAX (fieldvalue) +1,1) AS fieldvalue FROM
table

Это должно работать.Если вы замените ISNULL на COALESCE, все равно
должно работать. Если нет, предоставьте дополнительную информацию.

Best, Hugo

(Удалите _NO_ и _SPAM_, чтобы получить мой адрес электронной почты)


П: н / д

На самом деле важно только получить новую запись таблицы как CODE + 1
Пробелы в порядке, если пользователь их делает.Номер заказа пропуска КОДА пользователем —
тоже ОК.
Но программа всегда должна возвращать CODE + 1 при добавлении новой строки.
Пользователь может изменить номер на любой (кроме существующего) и номер
.
следующая новая строка будет +1
Это, конечно, не моя идея. Я бы запретил удалять документы (даже закон
требует, чтобы они были недействительными, а не удалены — мы говорим о бухгалтерии
программа)
но тогда мою программу никто не покупал.

«Хуго Корнелис» написал в сообщении
новости: ip ******************************** @ 4ax.com …

Вс, 21 августа 2005 23:34:40 +0200, Андре написал:

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

Кроме того, если вы разрешите пользователям изменять номер документа, вы фактически гарантированно получите
пропусков. Рано или поздно кто-нибудь наберет
номер 42, потому что он фанат Дугласа Адамса.

Если фактическое требование состоит в том, чтобы использовать номер, который ДОЛЖНО возрастать на
и без пробелов, и что пользователи могут при желании изменить на
повторно использовать номер удаленного документа, я бы сказал: выполните SELECT MAX (..)
запрос в интерфейсе пользователя; увеличьте на единицу и заранее заполните числовое поле
в вашем интерфейсе этим номером. Пользователь может принять это значение по умолчанию
или ввести другой номер. Число, которое находится в поле, когда
пользователь отправляет свои данные, отправляется в базу данных в виде INSERT…
ЗНАЧЕНИЯ заявление.


П: н / д

Вторник, 23 августа 2005 г., 13:28:57 +0200, Андре написал:

На самом деле, важно только получить новую запись в таблице как CODE + 1
Пробелы в порядке, если пользователь их делает. Номер заказа пропуска КОДА пользователем —
, тоже ОК.
Но программа всегда должна возвращать CODE + 1 при добавлении новой строки.
Пользователь может изменить номер на любой, какой пожелает (кроме существующего), и следующая новая строка
будет +1
Это, конечно, не моя идея. Я бы запретил удалять документы (даже закон
требует, чтобы они были недействительными, а не удаленными — речь идет о бухгалтерской программе
)
, но тогда мою программу никто не купит.

Привет, Андре,

Я придерживаюсь своей предыдущей рекомендации.

1. Получите MAX (код) +1 с неблокирующим запросом при открытии экрана.
Отобразите его как значение по умолчанию в поле кода или оставьте поле кода
пустым.

2. После ввода данных попытайтесь вставить строку с кодом
, введенным на экране; если значение не введено, используйте MAX (код) +1 из
предыдущего вызова.

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

3a. Если ключ был введен пользователем: сообщение об ошибке.
3б. Если пользователь не изменил значение по умолчанию, повторно вставьте строку с MAX (код) +1
в качестве нового кода; показать предупреждающее сообщение о том, что код был изменен.

Best, Hugo

(Удалите _NO_ и _SPAM_, чтобы получить мой адрес электронной почты)

Эта ветка обсуждения закрыта

Ответы на это обсуждение отключены.

Статистика вопросов

  • Просмотрено: 36526
  • ответов: 14
  • дата вопроса: 21 августа 2005 г.

Синтаксис SQL

Синтаксис SQL

Следующие операторы доступны при использовании драйвера OracleDI
для LDAP. Они позволяют управлять реляционной структурой данных и
данные через стандартный синтаксис SQL.

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

Важное примечание: OracleDI
Драйвер для LDAP работает однозначно в режиме «автофиксации». Нет явного
управление транзакциями с «фиксацией» или «откатом»
команды разрешены.

Важное примечание: при использовании
внешняя база данных для хранения данных дерева LDAP, операторы DDL могут
выполняться на временных таблицах.

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

Тип колонки

Вставка

Обновление

Удалить

Внешний ключ

Обратите внимание на реляционные ограничения главной таблицы и упорядоченную таблицу
заполнить операции.

Не допускается

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

Первичный ключ

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

Не допускается

Обратите внимание на ссылочные ограничения ведомой таблицы и упорядоченное удаление
запросы

IS_xxx

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

Не допускается

ОК

Key_Column

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

Добавить комментарий

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

2024 © Все права защищены. Карта сайта