Команды SQL-запросов. Основные команды SQL, которые должен знать каждый программист Что делает команда create в sql
История SQL
Стандарты SQL
Основные команды SQL
Обработка команд SQL сервером Oracle
Стадии выполнения команды SQL
Выполнение команды DML
Выполнение команды SELECT
Выполнение команд DDL
Литература
Все операции над данными реляционной базы данных выполняются посредством языка доступа к данным, являющимся стандартным языком для систем управления реляционными базами данных. Таким стандартным языком является SQL – Structured Query Language (структурированный язык запросов).
Язык структурированных запросов SQL
История SQL
Статья Кодда в 1970 году вызвала большой поток исследований, связанных с реляционными базами данных. Для реализации реляционной модели, фирма IBM в 1974 году начала разработку большого исследовательского проекта, названного System/R. Цель этого проекта заключалась в том, чтобы доказать работоспособность реляционной модели и приобрести опыт реализации реляционной СУБД.
В 1974 – 1975 годах на первом этапе выполнения проекта System/R был создан минимальный прототип реляционной системы управления базами данных. В это же время вышла первая статья с описанием языка запросов к базе данных, названного SEQUEL – Structured English Query Language (структурированный английский язык запросов).
В 1978 – 1979 годах на втором этапе выполнения проекта полностью переделанная реализация System/R была установлена на компьютерах нескольких заказчиков фирмы IBM для опытной эксплуатации. Эта эксплуатация принесла первый опыт работы с реляционной СУБД и с языком базы данных, который был переименован в SQL – Structured Query Language (структурированный язык запросов). Несмотря на изменение названия, произношение «сиквел» сохранилось и по сегодняшний день.
В 1979 году исследовательский проект System/R закончился, и IBM сделала заключение, что реляционные базы данных не только работоспособны, но и могут служить для создания коммерческих продуктов.
Стандарты SQL
В 1982 году началась работа над официальным стандартом SQL. В 1986 году стандарт был утвержден Американским институтом национальных стандартов (American National Standards Institute – ANSI) под номером X3.135, а в 1987 году – как стандарт Международной организации по стандартам (International Standards Organization – ISO). Этот стандарт, пересмотренный в 1989 году, обычно называют стандартом «SQL-89» или «SQL1».
Многие из членов комитетов ANSI и ISO представляли различные фирмы – разработчики СУБД, в каждой из которых был реализован собственный диалект SQL. Эти диалекты были, в основном, похожи друг на друга, однако несовместимы в деталях. Поэтому комитет не стандартизовал некоторые части языка, определив, что они реализуются по усмотрению разработчика. Это позволило объявить большую часть реализаций SQL совместимой со стандартом, но сделало сам стандарт относительно слабым.
Чтобы исправить эту ситуацию, комитет ANSI создал проект более жесткого стандарта «SQL2» и «SQL3». Эти стандарты оказались более противоречивыми, чем исходный стандарт, т.к. предусматривали возможности, выходящие за рамки уже существующих программных продуктов, использующих SQL. Тем не менее, стандарт «SQL2», был окончательно принят комитетом ANSI в 1992 году.
Все существующие коммерческие продукты поддерживают, несмотря на стандарт SQL2, собственный диалект языка SQL. Однако ядро SQL стандартизировано достаточно жестко, и поставщики СУБД пытаются привести свои продукты в соответствие со стандартом.
Основные команды SQL
Итак, SQL – структурированный язык команд для взаимодействия с сервером реляционных баз данных из любого инструментального пакета или приложения. Администратор базы данных использует язык запросов для формирования и обслуживания баз данных, а пользователь – для доступа к данным.
Возможности SQL:
§ Подходит разным пользователям, включая пользователей с самым малым опытом программирования, т.к. является достаточно простым и наглядным языком
§ Является непроцедурным языком. Пользователи описывают с помощью языка SQL то, что они хотят сделать, а компилятор SQL автоматически генерирует процедуры для навигации по базе данных и выполнения требуемой задачи
§ Сокращает время, необходимое для создания и сопровождения систем, т.к. является единым языком и для определения объектов, и для манипулирования данными
Несмотря на то, что Oracle SQL совместим со стандартом, некоторые свойства SQL2 не поддерживаются Oracle или отличаются от стандарта.
Команды SQL можно разделить на несколько категорий:
Команды |
Описание |
Язык манипулирования данными (
DML) |
|
Извлекает данные из одной или более таблиц или представлений |
|
Добавляет новые строки в таблицу |
|
Изменяет значения колонок в существующих строках таблицы |
|
Удаляет строки из таблиц |
|
Накладывает блокировку на таблицу или представление, временно ограничивая доступ к объекту других пользователей |
|
Позволяет просмотреть план выполнения SQL-утверждения |
|
Язык определения данных (DDL) базы данных Определяют, изменяют определение или удаляют из словаря определение объектов базы данных |
|
Используются для создания структур данных. |
|
Используются для изменения структур данных. |
|
Используются для удаления структур данных. |
|
Изменяет имена объектов |
|
Усекает объекты (удаляет все строки, оставляя определение объекта) |
|
Собирает статистики об объектах, проверяет структуру объектов |
|
Добавляет комментарии объектам в словарь данных |
|
Команды управления транзакциями Управляют изменениями, сделанными командами DML и группируют команды DML в одну транзакцию |
|
Подтверждает изменения |
|
Отменяет изменения до состояния данных на начало транзакции или до точки сохранения |
|
Устанавливает точки сохранения, до которых можно отменить изменения |
|
SET TRANSACTION * |
Устанавливает свойства транзакции |
Язык управления доступом ( DCL) Предоставляют или отменяют права доступа к базе данных Oracle и ее структурам |
|
Предоставляет права доступа к базе данных Oracle и ее структурам |
|
Отменяет права доступа к базе данных Oracle и ее структурам |
|
Программный SQL Позволяет выполнять команды SQL из программных модулей |
|
Определяет явный курсор |
|
Открывает курсор |
|
Выбирает строку из курсора |
|
Закрывает курсор |
|
Извлекает данные из одной или более таблиц в программные переменные |
|
EXECUTE IMMEDIATE * |
Динамически выполняет оператор SQL |
* - Не являются частью стандарта ANSI/ISO, но используются в СУБД Oracle
Обработка команд SQL сервером Oracle
Команды SQL проходят несколько стадий при обработке сервером Oracle. В процессе обработки задействованы различные процессы и структуры памяти Oracle (Рисунок 1).
Рисунок 1 Процессы и структуры памяти, участвующие в обработке команд SQL
· Команды SQL обрабатываются серверным процессом
· Идентичные команды SQL (дерево разбора и план выполнения) хранятся в одних и тех же разделяемых областях SQL разделяемого пула . Разделяемый пул располагается всегда в системной глобальной области . Команды SQL считаются идентичными, если:
o Их текст полностью идентичен, вплоть до регистра и количества пробелов
o Они ссылаются на одни и те же объекты
o Типы и имена используемых переменных совпадают
SQL - Структурированный Язык Запросов.
В данном обзоре мы рассмотрим наиболее часто встречающиеся виды SQL-запросов.
Стандарт SQL определяется ANSI
(Американским Национальным Институтом Стандартов
).
SQL — это язык, ориентированный специально на реляционные базы данных.
Разделение SQL:
DDL
(Язык Определения Данных
)
— так называемый Язык Описания Схемы в ANSI, состоит из команд, которые создают объекты (таблицы, индексы, просмотры, и так далее) в базе данных.
DML
(Язык Манипулирования Данными
) — это набор команд, которые определяют, какие значения представлены в таблицах в любой момент времени.
DCD
(Язык Управления Данными
) состоит из средств, которые определяют, разрешить ли пользователю выполнять определенные действия или нет. Они являются составными частями DDL в ANSI. Не забывайте эти имена. Это не различные языки, а разделы команд SQL сгруппированных по их функциям.
Типы данных:
SQL Server - Типы данных |
Описание |
bigint (int 8 ) |
bigint (int 8 ) |
binary (n) |
binary (n) или image |
character
|
national character или ntext |
character varying (синоним char varying varchar ) |
national character varying или ntext |
Datetime |
datetime |
decimal |
он же numeric |
double precision |
double precision |
integer (int 4 ) (синоним:int ) |
integer (int 4 ) |
national character (синоним: national character , nchar ) |
national character |
Numeric (сининимы: decimal , dec ) |
|
national character varying (синонимы: national char varying , nvarchar ) |
National character varying |
Smalldatetime |
datetime |
smallint (int 2 ) |
smallint (int 2 ) |
Smallmoney |
|
sql_variant |
Больше не поддреживается |
Ntext
|
|
Timestamp |
Не поддреживается |
tinyint (int 1 ) |
tinyint (int 1 ) |
Uniqueidentifier |
uniqueidentifier |
varbinary (n) |
varbinary (n) или image |
smalldatetime |
datetime |
smallint (int 2 ) |
smallint (int 2 ) |
smallmoney |
|
sql_variant |
Не поддерживается |
timestamp |
Не поддерживается |
tinyint (int 1 ) |
tinyint (int 1 ) |
uniqueidentifier |
uniqueidentifier |
varbinary (n) |
varbinary (n) или image |
Таблица типов данных в SQL Server 2000
ЧТО ТАКОЕ ЗАПРОС?
Запрос
— команда, которую вы даете вашей программе базы данных. Запросы это часть языка DML. Все запросы в SQL состоят из одиночной команды. Структура этой команды обманчиво проста, потому что вы должны расширять ее так, чтобы выполнить высоко сложные оценки и обработки данных.
Команда SELECT:
SELECT
“Выбор” - самая часто используемая команда, с помощью её идет выборка данных из таблицы.
Вид запроса с применением SELECT:
SELECT id, user_name, city, birth_day FROM users_base;
Такой запрос выведет из таблицы users_base все значения столбцов указанных через запятую после команды SELECT. Также, можно выводить все столбцы одним символом, * т.е. SELECT * FROM users_base
; - такой запрос выведет все данные из таблицы.
Структура команды SELECT:
SELECT {Имена столбцов через запятую которые необходимо вывести в запросе} FROM {имя таблицы в базе данных}
- это простейший вид запроса. Существуют дополнительные команды для удобства извлечения данных (см. далее “Функции”)
DML команды:
Значения могут быть помещены и удалены из полей, тремя командами языка DML (Язык Манипулирования Данными):
INSERT
(Вставка)
UPDATE
(Обновление, модификация),
DELETE
(Удаление)
Команда INSERT:
INSERT INTO users_base (user_name, city, birth_day) VALUES (‘Александр’, ‘Ростов’, ’20.06.1991’);
Команда INSERT идет вместе с приставкой INTO (in to - в), далее в скобках идут имена столбцов, в которые мы должны вставить данные, далее идет команда VALUES (значения) и в скобках по очереди идут значения (обязательно нужно соблюдать очередность значений со столбцами, значения должны идти в той же очередности, как и столбцы указанные вами).
Команда UPDATE:
UPDATE users_base SET user_name = ‘Алексей’;
Команда UPDATE обновляет значения в таблице. Сначала идет сама команда UPDATE затем имя таблицы, после команда SET (установит) далее имя столбца и его значение в кавычках (кавычки ставятся в том случае если значение имеет string формат, если это числовое значение и столбец не привязан к типу данных vchar и любых других строковых типов, то кавычки не имеют смысла.)
Команда DELETE:
DELETE FROM users_base WHERE user_name = ‘Василий’;
Команда DELETE удаляет строку целиком, определяет строку по критерию WHERE (Где). В данном случае этот запрос удалил бы все строки, в которых значение столбца user_name было бы Василий. О критерии WHERE и других мы поговорим немного позже.
Критерии, функции, условия и т.п. что помогает нам в SQL:
WHERE- предложение команды SELECT и других DML команд, которое позволяет вам устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы, для которых такое утверждение верно.
Пример:
SELECT id, city, birth_day FROM users_base WHERE user_name = ‘Алексей’;
- такой запрос выведет только те строки, которые будут соответствовать условию WHERE, а именно все строки в которых столбец user_name имеет значение Алексей.
ORDER BY - условие для сортировки выбранных строк. Имеет 2 критерия ASC и DESC. ASC (сортировка от А до Я или от 0 до 9)
DESC (противоположно от ASC).
Пример:
SELECT id, city, birth_day FROM users_base ORDER BY user_name ASC; - такой запрос выведет значения отсортированные по столбцу user_name от А до Я (A-Z; 0-9)
Также это условие можно использовать совместно с условием WHERE.
Пример:
SELECT id, city, birth_day FROM users_base WHERE user_name = ‘Алексей’ ORDER BY id ASC;
DISTINCT (Отличный) — аргумент, который обеспечивает вас способом устранять двойные значения из вашего предложения SELECT. Т.е. если у вас имеются повторные значения в столбце, допустим, user_name то DISTINCT выведет вам только одно, например у вас в базе есть 2 человека по имени Алексей то запрос с использованием функции DISTINCT выведет вам только 1 значение, которое встретит первым...
Пример:
SELECT DISTINCT user_name FROM users_base;
- такой запрос выведет нам значения всех записей в столбце user_name но они не будут повторяться, т.е. если вы имели бесконечное число повторяющихся значений, то они показаны не будут…
AND - берет два Буля (в форме A AND B) как аргументы и оценивает их по отношению к истине, верны ли они оба.
Пример:
SELECT * FROM users_base WHERE city = ‘Ростов’ AND user_name = ‘Александр’;
- выведет все значения из таблицы где в одной строке встречается название города (в данном случае Ростов и имя пользователя Александр.
OR - берет два Буля (в форме A OR B) как аргументы и оценивает на правильность, верен ли один из них.
SELECT * FROM users_base WHERE city = ‘Ростов’ OR user_name = ‘Александр’; - выведет все значения из таблицы где в строке встречается название города Ростов или Имя пользователя Александр.
NOT - берет одиночный Булев (в форме NOT A) как аргументы и заменяет его значение с неверного на верное или верное на неверное.
SELECT * FROM users_base WHERE city = ‘Ростов’ OR NOT user_name = ‘Александр’;
- выведет все значения из таблицы где в одной строке встретится имя города Ростов или имя пользователя не будет ровно Александр.
IN - определяет набор значений в которое данное значение может или не может быть включено.
SELECT * FROM users_base WHERE city IN (‘Владивосток’, ‘Ростов’);
- такой запрос выведет все значения из таблицы в которых встретятся наименования указанных городов в столбце city
Between - похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным.
SELECT * FROM users_base WHERE id BETWEEN 1 AND 10;
- выводит все значения из таблицы которые будут находиться в диапазоне от 1 до 10 в столбце id
COUNT - производит номера строк или не NULL значения полей, которые выбрал запрос.
SELECT COUNT (*) FROM users_base ;
- выведет количество строк в данной таблице.
SELECT COUNT (DISTINCT user_name) FROM users_base ;
- выведет кол-во строк с именами пользователей (не повторяющихся)
SUM - производит арифметическую сумму всех выбранных значений данного поля.
SELECT SUM (id) FROM users_base ;
- выведет сумму значений всех строк столбца id.
AVG - производит усреднение всех выбранных значений данного поля.
SELECT AVG (id) FROM users_base ;
- выведет среднее значение всех выбранных значений столбца id
MAX - производит наибольшее из всех выбранных значений данного поля.
MIN - производит наименьшее из всех выбранных значений данного поля.
Создание таблиц:
CREATE TABLE users_base (id integer, user_name text, city text, birth_day datetime); - выполнение такой команды приведёт к созданию таблицы, по которой я приводил примеры… Тут всё просто, пишем команду CREATE TABLE далее имя таблицы, которую хотим создать, далее в скобках через запятую имена столбцов и их тип данных. Это стандартный вид создания таблицы в SQL. Сейчас я приведу пример создания таблиц в SQL Server 2005:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N".") AND type in (N"U"))
BEGIN
CREATE TABLE .(
NOT NULL,
NOT NULL,
NOT NULL,
PRIMARY KEY CLUSTERED
ASC
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N".") AND type in (N"U"))
BEGIN
CREATE TABLE .(
IDENTITY(1,1) NOT NULL,
NULL,
NULL,
PRIMARY KEY CLUSTERED
ASC
)WITH (IGNORE_DUP_KEY = OFF) ON
) ON TEXTIMAGE_ON
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N".") AND type in (N"U"))
BEGIN
CREATE TABLE .(
IDENTITY(1,1) NOT NULL,
NULL,
NULL,
PRIMARY KEY CLUSTERED
ASC
)WITH (IGNORE_DUP_KEY = OFF) ON
) ON
END
Синтаксис в SQL Server 2005 это уже другая тема, я просто хотел показать что я описал основы SQL программирования, до вершин вы сможете дойти сами зная основы.
При вознекновении вопросов по этой теме, пишите мне на мыло
3.1 Общие положения
Изложенные выше механизмы РМД легли в основу языков манипулирования данными. Заметим, что крайне редко РА или РИ принимаются в качестве полной основы какого-либо языка РБД. Обычно язык основывается на некоторой смеси алгебраических и логических конструкций.
Реализация концепции операций, ориентированных на табличное представление данных, позволило создать компактный язык с небольшим набором предложений – SQL. Этот язык может использоваться как интерактивный для выполнения запросов и как встроенный для построения прикладных программ.
В современных СУБД обычно поддерживается единый интегрированный язык SQL, содержащий разнообразные средства для обеспечения базового пользовательского интерфейса при работе с БД. В нем можно выделить следующие группы команд:
1) команды определения данных (Data Definition Commands), которые служат для создания, изменения, удаления таблиц и индексов, а также для определения схемы БД;
2) команды манипулирования данными (Data Manipulation Commands) для изменения данных (редактирование существующих данных, добавление и удаление записей);
3) команды выборки данных (Data Query Commands) для выборки существующих данных;
4) команды управления транзакциями (Transaction Control Commands) для сохранения или отката изменений в БД;
5) команды управления данными (Data Control Commands) для проверки целостности БД, предоставления и отмены привилегий на доступ к данным.
При этом SQL предоставляет и другие возможности, например, выполнение вычислений и преобразований, упорядочение записей и группировку данных.
Особенность команд SQL cостоит в том, что они ориентированы в большей степени на конечный результат обработки данных, чем на процедуру этой обработки. SQL сам определяет, где находятся данные, какие индексы и последовательности операций следует использовать для их эффективного выполнения.
Рассмотрим синтаксис основных команд SQL. При изложении материала будем использовать следующие обозначения:
– звездочка (*) означает "все" и употребляется в обычном для программирования смысле, т.е. "все случаи, удовлетворяющие определению";
– квадратные скобки () означают, что конструкции, заключенные в эти скобки, являются необязательными, т.е. могут быть опущены;
– фигурные скобки ({}) означают, что конструкции, заключенные в эти скобки, должны рассматриваться как целые синтаксические единицы; эти скобки позволяют уточнить порядок разбора синтаксических конструкций, заменяя обычные скобки, используемые в синтаксисе SQL;
– многоточие (...) указывает на то, что непосредственно предшествующая ему синтаксическая единица факультативно может повторяться один или более раз;
– прямая черта (|) означает наличие выбора из двух или более возможностей; например, конструкция [термин_1 | термин_2] означает, что можно выбрать один из двух терминов (или термин_1, или термин_2); при этом термин_1 выбирается по умолчанию; отсутствие всей этой конструкции будет восприниматься как выбор термин_1;
– точка с запятой (;) завершающий элемент предложений SQL; этот знак должен присутсвовать после каждой команды;
– запятая (,) используется для разделения элементов списков;
– пробелы () могут вводиться для повышения наглядности между любыми синтаксическими конструкциями предложений SQL;
– прописные латинские буквы и символы используются для написания конструкций языка SQL и должны записываться без изменений;
– строчные буквы используются для написания конструкций, которые должны заменяться конкретными значениями, выбранными пользователем, причем для определенности отдельные слова этих конструкций связываются между собой символом подчеркивания (_);
В этом приложении содержатся сокращённые описания различных команд SQL. Цель состоит в том, чтобы дать вам быструю и точную справку и определение SQL.
Первый раздел этого приложения определяет элементы, используемые для создания команд SQL; второй - подробности синтаксиса и предложения с кратким описанием самих команд.
Вот стандартные условные обозначения (они называются BNF-условиями):
Кроме того, мы будем использовать следующую последовательность (.,..) чтобы указывать, что предшествующее этому может повторяться любое число раз, с индивидуальными событиями, отделяемыми запятыми. Атрибуты, которые не являются частью официального стандарта, будут отмечены в описании как (*нестандартные*).
ОБРАТИТЕ ВНИМАНИЕ: Терминология которую мы используем здесь - не является официальной терминологией ANSI. Официальная терминология может вас сильно запутать, поэтому мы несколько ее упростили.
По этой причине мы иногда используем условия, отличающиеся от ANSI, или используем те же самые условия, но несколько по-иному. Например, наше
определение Отличается от используемой в ANSI комбинации стандартного определения С .
ЭЛЕМЕНТЫ SQL
Этот раздел определяет элементы команд SQL.
Они разделены на две категории: Основные элементы языка и Функциональные элементы языка .
Основные элементы
- это создаваемые блоки языка; когда SQL исследует команду, то он сначала оценивает каждый символ в тексте команды в терминах
этих элементов. Разделитель
Функциональные элементы
- это разнообразные элементы, отличающиеся от ключевых слов, которые могут интерпретироваться как модули. Это части команды,
отделяемые с помощью разделителей
Перечисленные здесь являются общими элементами для всех описываемых команд.
Функциональные элементы могут определяться в терминах друг друга или даже в собственных терминах. Например, предикат
БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА
ЭЛЕМЕНТ ОПРЕДЕЛЕНИЕ