/* выборка данных с формированием вычисляемого столбца Стоимость */
SELECT Товар.Наименование, Товар.Цена, Заказ.Количество,
Товар.ЕдиницаИзм, Товар.Цена * Заказ.Количество AS Стоимость
FROM Товар
INNER JOIN Заказ ON Товар.КодТовара = Заказ.КодТовара
ORDER BY Стоимость
/* подсчет итоговых данных для столбца Количество в таблице Заказ */
SELECT
SUM(Количество) AS [Общее кол-во], AVG(Количество) AS Среднее,
MAX(Количество) AS Максимум, MIN(Количество) AS Минимум
FROM Заказ
/* выборка данных с их группировкой по столбцу КодТовара и подсчетом для
каждой группы итоговых данных */
SELECT КодТовара,
SUM(Количество) AS [Общее кол-во], AVG(Количество) AS Среднее,
MAX(Количество) AS Максимум, MIN(Количество) AS Минимум
FROM Заказ
GROUP BY КодТовара
/* предыдущая операция выборки данных c группировкой, дополненная условием отбора данных (предложение WHERE) и условием отбора итоговых данных (предложение HAVING) */
SELECT КодТовара,
SUM(Количество) AS [Общее кол-во], AVG(Количество) AS Среднее,
MAX(Количество) AS Максимум, MIN(Количество) AS Минимум
FROM Заказ
WHERE Количество > 5
GROUP BY КодТовара
HAVING SUM(Количество) < 30
/* выборка данных из представления Запрос1 */
SELECT *
FROM Запрос1
WHERE ЕдиницаИзм = 'штука'
Примеры выборки некоторых системных данных:
/* Список учетных записей, которым разрешен доступ к серверу */
USE master -- переключаемся на системную базу данных master
SELECT name, dbname, password, language
FROM syslogins
USE Склад_ХХХ -- переключаемся обратно на базу данных Склад_ХХХ
/* Список учетных записей, включенных в фиксированные роли сервера */
EXEC sp_helpsrvrolemember
/* Список пользователей базы данных Склад_ХХХ */
EXEC sp_helpuser
/* Список ролей (как фиксированных, так и пользовательских) базы данных Склад_ХХХ */
EXEC sp_helprole
/* Членство ролей и пользователей в ролях базы данных Склад_ХХХ */
EXEC sp_helprolemember
Синтаксис команды обновления данных в таблице или представлении (см. [1], стр. 1130):
UPDATE { table_name WITH ( < table_hint_limited > [ ...n ] ) | view_name | rowset_function_limited } SET { column_name = { expression | DEFAULT | NULL } | @variable = expression | @variable = column = expression } [ ,...n ] { { [ FROM { < table_source > } [ ,...n ] ] [ WHERE < search_condition > ] } | [ WHERE CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } [ OPTION ( < query_hint > [ ,...n ] ) ]
< table_source > ::= table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ] | view_name [ [ AS ] table_alias ] | rowset_function [ [ AS ] table_alias ] | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] | < joined_table >
< joined_table > ::= < table_source > < join_type > < table_source > ON < search_condition > | < table_source > CROSS JOIN < table_source > | < joined_table >
< join_type > ::= [ INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } ] [ < join_hint > ] JOIN
< table_hint_limited > ::= { FASTFIRSTROW | HOLDLOCK | PAGLOCK | READCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK }
< table_hint > ::= { INDEX ( index_val [ ,...n ] ) | FASTFIRSTROW | HOLDLOCK | NOLOCK | PAGLOCK | READCOMMITTED | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK }
< query_hint > ::= { { HASH | ORDER } GROUP | { CONCAT | HASH | MERGE } UNION | {LOOP | MERGE | HASH } JOIN | FAST number_rows | FORCE ORDER | MAXDOP | ROBUST PLAN | KEEP PLAN }
Например, в таблице Клиент можно заменить все значения NULL в столбце КодРегиона на значение 301 с помощью следующей команды:
UPDATE Клиент SET КодРегиона = 301 WHERE КодРегиона IS NULL
Синтаксис команды удаления данных из таблицы или представления (см. [1], стр. 1134):
DELETE [ FROM ] { table_name WITH ( < table_hint_limited > [ ...n ] ) | view_name | rowset_function_limited } [ FROM { < table_source > } [ ,...n ] ]
[ WHERE { < search_condition > | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( < query_hint > [ ,...n ] ) ]
< table_source > ::= table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ] | view_name [ [ AS ] table_alias ] | rowset_function [ [ AS ] table_alias ] | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] | < joined_table >
< joined_table > ::= < table_source > < join_type > < table_source > ON < search_condition > | < table_source > CROSS JOIN < table_source > | < joined_table >
< join_type > ::= [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ < join_hint > ] JOIN
< table_hint_limited > ::= { FASTFIRSTROW | HOLDLOCK | PAGLOCK | READCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK }
< table_hint > ::= { INDEX ( index_val [ ,...n ] ) | FASTFIRSTROW | HOLDLOCK | NOLOCK | PAGLOCK | READCOMMITTED | READPAST | READUNCOMMITTED | REPEATABLEREAD | ROWLOCK | SERIALIZABLE | TABLOCK | TABLOCKX | UPDLOCK }
< query_hint > ::= { { HASH | ORDER } GROUP | { CONCAT | HASH | MERGE } UNION | FAST number_rows | FORCE ORDER | MAXDOP | ROBUST PLAN | KEEP PLAN }
Например, в таблице Заказ можно удалить все строки, в которых значение поля СрокПоставки не относится к текущему году, следующим образом:
SET DATEFORMAT dmy -- задаем привычный формат даты: день.месяц.год
DELETE FROM Заказ WHERE СрокПоставки < '01.01.2013' GO
Синтаксис команды изменения структуры таблицы (см. [1], стр. 970):
ALTER TABLE table { [ ALTER COLUMN column_name { new_data_type [ ( precision [ , scale ] ) ] [ COLLATE < collation_name > ] [ NULL | NOT NULL ] | {ADD | DROP } ROWGUIDCOL } ] | ADD { [ < column_definition > ] | column_name AS computed_column_expression } [ ,...n ] | [ WITH CHECK | WITH NOCHECK ] ADD { < table_constraint > } [ ,...n ] | DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] | { CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [ ,...n ] } | { ENABLE | DISABLE } TRIGGER { ALL | trigger_name [ ,...n ] } }
< column_definition > ::= { column_name data_type } [ [ DEFAULT constant_expression ] [ WITH VALUES ] | [ IDENTITY [ (seed , increment ) [ NOT FOR REPLICATION ] ] ] ] [ ROWGUIDCOL ] [ COLLATE < collation_name > ] [ < column_constraint > ] [ ...n ]
< column_constraint > ::= [ CONSTRAINT constraint_name ] { [ NULL | NOT NULL ] | [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] [ WITH FILLFACTOR = fillfactor ] [ ON { filegroup | DEFAULT } ] ] | [ [ FOREIGN KEY ] REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] ] | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) }
< table_constraint > ::= [ CONSTRAINT constraint_name ] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] { ( column [ ,...n ] ) } [ WITH FILLFACTOR = fillfactor ] [ ON {filegroup | DEFAULT } ] ] | FOREIGN KEY [ ( column [ ,...n ] ) ] REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] | DEFAULT constant_expression [ FOR column ] [ WITH VALUES ] | CHECK [ NOT FOR REPLICATION ] ( search_conditions ) }
Примеры использования команды изменения структуры таблицы:
/* Добавление новых полей ГОСТ и Размер в таблицу Товар */
ALTER TABLE Товар ADD ГОСТ VARCHAR(20) NULL
ALTER TABLE Товар ADD Размер INT NULL
GO
/* Изменение типа данных поля Размер в таблице Товар с INT на TINYINT */
ALTER TABLE Товар ALTER COLUMN Размер TINYINT NULL
GO
/* Установка проверочного ограничения для поля Размер в таблице Товар */
ALTER TABLE Товар ADD CONSTRAINT CK_Товар_Размер
CHECK (Размер BETWEEN 36 AND 46)
GO
/* Удаление столбца ГОСТ из таблицы Товар */
ALTER TABLE Товар DROP COLUMN ГОСТ
GO
/* Удаление столбца Размер из таблицы Товар (сначала удаляется проверочное
ограничение) */
ALTER TABLE Товар DROP CONSTRAINT CK_Товар_Размер
ALTER TABLE Товар DROP COLUMN Размер
GO
/* Удаление ограничения внешнего ключа FK_Товар_Валюта из таблицы Товар */
ALTER TABLE Товар DROP CONSTRAINT FK_Товар_Валюта
/* Добавление ограничения внешнего ключа FK_Товар_Валюта в таблицу Товар */
ALTER TABLE Товар ADD CONSTRAINT FK_Товар_Валюта FOREIGN KEY
(КодВалюты) REFERENCES Валюта ON UPDATE CASCADE
GO