Учебник по языку sql (ddl, dml) на примере диалекта ms sql server. часть первая

Управление параллельной работой

Как вы уже знаете, данные в базе данных обычно используются многими программами пользовательских приложений. Ситуация, при которой несколько программ пользовательских приложений читают и пишут одни и те же данные в одно и то же время, называется конкурентным доступом. Следовательно, каждая СУБД должна иметь некоторый механизм управления для разрешения проблем конкурентного доступа. Высокий уровень конкурентного доступа возможен в системе базы данных, которая может управлять многими активными пользовательскими приложениями без их влияния друг на друга. И наоборот, система базы данных, где различные активные приложения влияют друг на друга, поддерживает низкий уровень конкурентного доступа. Этот раздел начинается с описания двух моделей управления конкурентным доступом, которые поддерживает Database Engine. В следующем разделе объясняется, как проблемы конкурентного доступа могут быть решены с использованием транзакций. Это обсуждение включает вводные сведения в четыре свойства транзакций, известные как свойства ACID (Atomicity, Consistency, Isolation, Durability- атомарность, согласованность, изолированность, устойчивость), обсуждаются связанные с транзакциями операторы Transact-SQL, вводится понятие протокола транзакции. Затем рассматривается блокировка и три основных свойства блокировки: модели блокировки, ресурсы блокировки, длительность блокировки

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

Изменение таблицы

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

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

Для всех этих операций предназначена инструкция переопределения ATER TABLE
.

Чтобы добавить столбец инструкция ALTER TABLE применяется с предложением ADD. Добавим новый столбец к таблице housemates из прошлого раздела:

ALTER TABLE housemates
ADD PhoneNumber nvarchar(12) NULL;

Нужно применить к нему предложение ALTER COLUMN
внутри ALTER TABLE:

ALTER TABLE housemates
ALTER COLUMN PhoneNumber char(25) NOT NULL;

Удаляется столбец применением DROP COLUMN
внутри ALTER TABLE:

ALTER TABLE housemates
DROP COLUMN PhoneNumber;

Первичный или внешний ключ удаляется и добавляется конструкциями ALTER TABLE ADD CONSTRAINT/DROP CONSTRAINT, соответственно:

Снятие ограничения первичного ключа со столбца housemeateID
ALTER TABLE housemates
DROP CONSTRAINT primary_id;
—Назначение столбца housemeateID первичным ключом
ALTER TABLE housemates
ADD CONSTRAINT PK_ID PRIMARY KEY (housemeateID);

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

ALTER TABLE housemates
DROP CONSTRAINT PK_ID;
ALTER TABLE housemates
ADD CONSTRAINT PK_ID,PK_AN PRIMARY KEY (housemeateID,apartmentnumber);

Table-Valued Parameters

The Table-Valued Parameter (TVP) is a special type of  table variable that extends its use. When table variables are passed as parameters, the table is materialized in the TempDB system database as a table variable and passed by reference,  a pointer to the table in the TempDB.

Table-valued parameters have been  used since SQL Server 2008 to send several rows of data to a Transact-SQL routine or to a batch via .. Their particular value to the programmer is that they can be used  within TSQL code as well as in the client application, so they are good for sending client tables to the server.  From TSQL, you can declare table-valued variables, insert data into them, and  pass these variables as table-valued parameters to stored procedures and functions.Their more general usefulness is limited by the fact that they are only passed as  read-only. You can’t do , , or statements on a table-valued parameter in the body of a routine.

You need to create a User-Defined Table Type and define a table structure to use them. Here is a simple example of their use in TSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/* First you need to create a table type. */

CREATETYPENamesASTABLE

(NameVARCHAR(10));

GO
 
/* Next, Create a procedure to receive data for the table-valued parameter, the table of names and select one item from the table*/

CREATEPROCEDUREChooseAName

 @CandidateNamesNamesREADONLY

AS

DECLARE@candidatesTABLE(NAMEVARCHAR(10),

                          theOrderUNIQUEIDENTIFIER)

INSERT INTO@candidates (name,theorder)

       SELECT name,NEWID()

       FROM   @CandidateNames

SELECTTOP1

       NAME

FROM   @Candidates

ORDERBYtheOrder

GO
 
/* Declare a variable that references the type for our list of cows. */

DECLARE@MyFavouriteCowNameASNames;

 
/* Add data to the table variable. */

INSERT INTO@MyFavouriteCowName (Name)

 SELECT’Bossy’UNIONSELECT’Bessy’UNIONSELECT’petal’UNIONSELECT’Daisy’UNIONSELECT’Lulu’UNIONSELECT’Buttercup’UNIONSELECT’Bertha’UNIONSELECT’Bubba’UNIONSELECT’Beauregard’UNIONSELECT’Brunhilde’UNIONSELECT’Lore’UNIONSELECT’Lotte’UNIONSELECT’Rosa’UNIONSELECT’Thilde’UNIONSELECT’Lisa’UNIONSELECT’Peppo’UNIONSELECT’Maxi’UNIONSELECT’Moriz’UNIONSELECT’Marla’

 
/* Pass the table with the list of traditional nemes of cows to the stored procedure. */

EXECchooseAName@MyFavouriteCowName

GO

As with Table Variables, the table-valued parameter ceases to exist once it is out of scope but the type definition remains until it is explicitly  dropped. Like Table Variables they do not acquire locks when the data is being populated from a client, and  statistics aren’t maintained  on columns of table-valued parameters. You cannot use a table-valued parameter as target of a or statement. As you’d expect, a table-valued parameter can be in the clause of or in the string or stored-procedure.

The TVP solves the common problem of wanting to pass a local variable to dynamic SQL that is then executed  by a . It is poorly documented by Microsoft, so I’ll show you a worked example to get you started

1
2
3
4
5
6
7
8
9
10
11
12
13

DECLARE@SeaAreasTABLE(NAMEVarchar(20))

INSERTINTO@SeaAreas (name)

SELECT’Viking’UNIONSELECT’North Utsire’UNIONSELECT’South Utsire’UNIONSELECT’Forties’UNIONSELECT’Cromarty’UNIONSELECT’Forth’UNIONSELECT’Tyne’UNIONSELECT’Dogger’UNIONSELECT’Fisher’UNIONSELECT’German Bight’UNIONSELECT’Humber’UNIONSELECT’Thames’UNIONSELECT’Dover’UNIONSELECT’Wight’UNIONSELECT’Portland’UNIONSELECT’Plymouth’UNIONSELECT’Biscay’UNIONSELECT’Trafalgar’UNIONSELECT’Finisterre’UNIONSELECT’Sole’UNIONSELECT’Lundy’UNIONSELECT’Fastnet’UNIONSELECT’Irish Sea’UNIONSELECT’Shannon’UNIONSELECT’Rockall’UNIONSELECT’Malin’UNIONSELECT’Hebrides’UNIONSELECT’Bailey’UNIONSELECT’Fair Isle’UNIONSELECT’Faeroes’UNIONSELECT’Southeast Iceland’

CREATETYPEseanamesASTABLE(NameVARCHAR(20));

DECLARE@SeaAreaNamesASSeaNames;

INSERT INTO@SeaAreaNames (name)

       SELECT *

       FROM   @SeaAreas

EXECsp_executesqlN’SELECT * FROM @MySeaAreas’,

 N’@MySeaAreas . READONLY’,@MySeaAreas=@SeaAreaNames

 

Before we move on to describe the more traditional  temporary tables and their use, we’ll need to delve into the place where temporary tables are held. TempDB.

Задание псевдонимов для столбцов запроса

ФИО Дата приема Дата рождения ZP
Иванов Иван Иванович 2015-04-08 1955-02-19 5000
Петров Петр Петрович 2015-04-08 1983-12-03 1500
NULL 2015-04-08 1976-06-07 2500
NULL 2015-04-08 1982-04-17 2000
FullName1 FullName2 FullName3
Иванов Иван Иванович Иванов Иван Иванович Иванов Иван Иванович
Петров Петр Петрович Петров Петр Петрович Петров Петр Петрович
NULL Сидоров Сидор Сидоров Сидор
NULL Андреев Андрей Андреев Андрей

Основные арифметические операторы SQL

Оператор Действие
+ Сложение (x+y) или унарный плюс (+x)
Вычитание (x-y) или унарный минус (-x)
* Умножение (x*y)
Деление (x/y)
% Остаток от деления (x%y). Для примера 15%10 даст 5
ID Name Result1 Result2 Result3
1000 Иванов И.И. 2500 2500 2500
1001 Петров П.П. 225 225 225
1002 Сидоров С.С. NULL
1003 Андреев А.А. 600 600 600
1004 Николаев Н.Н. NULL
1005 Александров А.А. NULL
ID Name
1000 Иванов И.И.
1004 Николаев Н.Н.
1002 Сидоров С.С.

Идентификаторы

Идентификаторы – это имена объектов, на которые можно ссылаться в программе, написанной на языке Transact SQL. Первый символ может состоять из букв английского алфавита или «_», »@», »#». В качестве остальных символов идентификатора могут быть дополнительно использованы цифры и символ «$». Имя идентификатора не должно совпадать с зарезервированным словом (среда SQL Server Management Studio подсвечивает зарезервированные слова синим цветом).

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

Здесь надо обратить внимание на параметр QUOTED_IDENTIFIER

Для ограничителей идентификаторов при установленном параметре

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

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

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

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

SQL Server Temp Table

SQL Server allows for two types of temporary tables:

  • Local Temporary Tables are visible only in the current session
  • Global Temporary Tables are visible to all sessions

How to Create a Temporary Table in SQL Server

Creating a temporary table in SQL Server is similar to creating a normal table. There are two ways to create this table:

  • Using CREATE
  • Using SELECT INTO

Here’s an example of using the CREATE statement:

A # character must be provided as a prefix to the table name to mark it as a temporary table. There is no “TEMPORARY” keyword that can be used in SQL Server.

This is also a “local temporary table” because it starts with a single #.

A “global temporary table” starts with two hash characters: ##.

The SQL temp table is now created. To store data in it, you can run an INSERT statement just like with a normal table:

The #temp_customers table will now contain the data from the SELECT query. It can be accessed within the session by the current connection.

Notice that the INSERT statement refers to the table with a # as a prefix. If the # prefix is omitted, then the table will not be found and you’ll get an error.

You can also create a temporary table in SQL Server by using the SELECT INTO syntax:

This will create a temporary table called #temp_customers and insert the results of the SELECT query into it in a single statement. You don’t need to specify the data types as they will be determined from the source table, so this may be an easier way for you to populate the table.

All SQL temp tables are created in the dbo schema. They are dropped when the session ends.

Global Temporary Tables in SQL Server

Global temporary tables are accessible to all connections. They are created in a similar way to local temporary tables, except you use a double # instead of a single # as a prefix.

They can be created in the same way as a local temporary table, using CREATE or SELECT INTO.

Here’s an example using CREATE:

Here’s an example using SELECT INTO:

Notice the syntax is the same, but they have a double # character as a prefix.

Drop a Temporary Table

In SQL Server, a temporary table is deleted or dropped when the connection that created it is closed. This is when you disconnect from the database, or when you close the query window in SSMS (or another IDE) and don’t save the changes.

If you want to drop the temporary table manually, you can do so in the same way as dropping a normal table:

This will drop the temporary table from the database.

The same method can be used on global tables:

Основное использование

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

Общий синтаксис создания временной таблицы MySQL следующий:

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

Например, чтобы создать временную таблицу, см. Запрос ниже:

После создания таблицы пользователь может выполнять основные операции с таблицей, включая INSERT, UPDATE, DELETE, SELECT и DROP.

Например, давайте вставим некоторые данные во временную таблицу, созданную выше:

Основные понятия

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

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

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

Табличные функции помогают решить проблему, с которой разработчики сталкивались в прошлом, — а именно как передать данные, полученные в программе PL/SQL (то есть данные, не хранящиеся в таблицах базы данных), в управляющую среду без поддержки PL/SQL ? Курсорные переменные позволяют легко передать результирующие наборы на базе SQL , допустим, в программу Java, потому что курсорные переменные поддер­живаются в JDBC . Но если сначала нужно провести сложные преобразования в PL/ SQL , как вернуть эти данные вызывающей программе?

Теперь эта проблема решается объединением мощи и гибкости табличных функций с ши­рокой поддержкой курсорных переменных в средах без поддержки PL/SQL . Допустим, я хочу сгенеририровать данные семейства животных (полученные вызовом функции pet_family из предыдущего раздела) и передать строки данных интерфейсному приложению, написанному на Java.

Это делается очень просто:

В этой программе я воспользуюсь преимуществами предопределенного слабого курсор­ного типа SYS_REFCURSOR (появившегося в Oracle9i Database ) для объявления курсорной переменной. Курсорная переменная открывается вызовом OPEN FOR и связывается с за­просом, построенным на базе табличной функции pet_family .

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

DECLARE SQL: описание

T-SQL поддерживает только локальные переменные, которые доступны исключительно в той партии, которая их создала. Пакет — это оператор (или группа операторов), который база данных анализирует как единицу. Каждый клиентский инструмент или интерфейс имеет свой собственный способ указания, где заканчивается пакет. Например, в Query Analyzer вы используете команду GO, чтобы указать, где заканчивается пакет. Если у вас есть синтаксическая ошибка в любом заявлении, пакет не проходит фазу разбора, поэтому клиентский инструмент не отправляет пакет на SQL Server для дальнейшей обработки. Вы можете запустить код, который объявляет переменную таблицы, а затем вставляет строку в таблицу в той же партии.

Пример SQL Declare Table:

DECLARE @mytable table col1 int NOT NULL INSERT INTO @mytable VALUES (1) GO

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

DECLARE @mytable table col1 int NOT NULL INSERT INTO @mytable VALUES (1)GO

Оператор INSERT терпит неудачу, потому что переменная таблицы выходит за пределы области видимости, и появляется следующее сообщение об ошибке: Сервер: Msg 137, уровень 15, состояние 2, строка 2.

Как работать с базой

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

  • SHOW DATABASES — показывает на экране все созданные базы данных SQL;
  • SHOW TABLES — выводит список всех таблиц для текущей базы данных, которые выбираются командой USE;
  • DESCRIBE название_таблицы
    — показывает описание всех столбцов таблицы.
  • ALTER TABLE — позволяет изменять структуру таблицы.

Последняя команда позволяет:

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

Синтаксис этой команды выглядит так: ALTER TABLE название_таблицы
{ | | | | [{ENABLE | DISABLE} CONSTANT имя_ограничения
] | }.

Существуют и другие команды:

  • RENAME — переименование таблицы.
  • TRUNCATE TABLE -удаляет все строки из таблицы. Эта функция может быть нужна, когда необходимо заполнить таблицу заново, а хранить предыдущие данные нет необходимости.

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

Синтаксис команды довольно простой: DROP TABLE название
_таблицы.

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

С помощью CREATE TABLE можно создать пустую таблицу и в дальнейшем заполнить ее данными. Но это еще не все. Также можно сразу создавать таблицу из другой таблицы. Как это? То есть существует возможность определить таблицу и заполнить ее данными другой таблицы. Для этого существует специальное ключевое слово AS.

Синтаксис очень простой:

  • CREATE TABLE название
    _таблицы
    [(определение_столбцов
    )] AS подзапрос;
  • определение_столбцов —
    имена столбцов, правила целостности для столбцов вновь создаваемой таблицы и значения по умолчанию;
  • подзапрос — возвращает такие строки, которые нужно добавить в новую таблицу.

Таким образом, такая команда создает таблицу с определенными столбцами, вставляет в нее строки, которые возвращаются в запросе.

Объявление переменных в DECLARE SQL

Для объявления переменной в T-SQL используется оператор DECLARE ( ). Например, в случае объявления переменной i как целое с использованием данного оператора команда будет выглядеть так: DECLARE @i int.

Хотя Microsoft не документирует эту функцию, T-SQL также поддерживает указание ключевого слова AS между именем переменной и ее типом данных, как в следующем примере: DECLARE @i AS int. Ключевое слово AS упрощает чтение инструкции DECLARE. Единственный тип данных, который не позволяет указать ключевое слово AS, — это тип данных таблицы, который является новым в SQL Server 2000. Он дает возможность определить переменную, содержащую полную таблицу.

Создание базы

Сначала неоходимо запустить сервер MySQL. Для его запуска следует зайти в меню «Пуск», затем в «Программы», далее в MySQL и MySQL Server, выбрать MySQL-Command-Line-Client.

Для создания базы данных применяется команда Create Database. Данная функция имеет следующий формат:

CREATE DATABASE название_базы_данных.

Ограничения на название базы следующие:

  • длина составляет до 64 знаков и может включать буквы, цифры, символы «» и «»;
  • имя может начинаться с цифры, но в нем должны присутствовать буквы.

Нужно помнить и общее правило: любой запрос или команда заканчиваются разделителем (delimiter). В SQL принято в качестве разделителя использовать точку с запятой.

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Вадлейд
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: