Summary: in this tutorial, you will learn how to use the SQL Server CREATE VIEW
statement to create new views.
To create a new view in SQL Server, you use the CREATE VIEW
statement as shown below:
CREATE VIEW [OR ALTER] schema_name.view_name [(column_list)]
AS
select_statement;
Code language: SQL (Structured Query Language) (sql)
In this syntax:
- First, specify the name of the view after the
CREATE VIEW
keywords. Theschema_name
is the name of the schema to which the view belongs. - Second, specify a
SELECT
statement (select_statement
) that defines the view after theAS
keyword. TheSELECT
statement can refer to one or more tables.
If you don’t explicitly specify a list of columns for the view, SQL Server will use the column list derived from the SELECT
statement.
In case you want to redefine the view e.g., adding more columns to it or removing some columns from it, you can use the OR ALTER
keywords after the CREATE VIEW
keywords.
SQL Server CREATE VIEW examples
We will use the orders
, order_items
, and products
tables from the sample database for the demonstration.
Creating a simple view example
The following statement creates a view named daily_sales
based on the orders
, order_items
, and products
tables:
CREATE VIEW sales.daily_sales
AS
SELECT
year(order_date) AS y,
month(order_date) AS m,
day(order_date) AS d,
p.product_id,
product_name,
quantity * i.list_price AS sales
FROM
sales.orders AS o
INNER JOIN sales.order_items AS i
ON o.order_id = i.order_id
INNER JOIN production.products AS p
ON p.product_id = i.product_id;
Code language: SQL (Structured Query Language) (sql)
Once the daily_sales
view is created, you can query data against the underlying tables using a simple SELECT
statement:
SELECT
*
FROM
sales.daily_sales
ORDER BY
y, m, d, product_name;
Code language: SQL (Structured Query Language) (sql)
The following shows the output:
Redefining the view example
To add the customer name column to the sales.daily_sales
view, you use the CREATE VIEW OR ALTER
as follows:
CREATE OR ALTER sales.daily_sales (
year,
month,
day,
customer_name,
product_id,
product_name
sales
)
AS
SELECT
year(order_date),
month(order_date),
day(order_date),
concat(
first_name,
' ',
last_name
),
p.product_id,
product_name,
quantity * i.list_price
FROM
sales.orders AS o
INNER JOIN
sales.order_items AS i
ON o.order_id = i.order_id
INNER JOIN
production.products AS p
ON p.product_id = i.product_id
INNER JOIN sales.customers AS c
ON c.customer_id = o.customer_id;
Code language: SQL (Structured Query Language) (sql)
In this example, we specified the column list for the view explicitly.
The following statement queries data against the sales.daily_sales
view:
SELECT
*
FROM
sales.daily_sales
ORDER BY
y,
m,
d,
customer_name;
Code language: SQL (Structured Query Language) (sql)
Here is the output:
Creating a view using aggregate functions example
The following statement creates a view named staff_sales
those summaries the sales by staffs and years using the SUM()
aggregate function:
CREATE VIEW sales.staff_sales (
first_name,
last_name,
year,
amount
)
AS
SELECT
first_name,
last_name,
YEAR(order_date),
SUM(list_price * quantity) amount
FROM
sales.order_items i
INNER JOIN sales.orders o
ON i.order_id = o.order_id
INNER JOIN sales.staffs s
ON s.staff_id = o.staff_id
GROUP BY
first_name,
last_name,
YEAR(order_date);
Code language: SQL (Structured Query Language) (sql)
The following statement returns the contents of the view:
SELECT
*
FROM
sales.staff_sales
ORDER BY
first_name,
last_name,
year;
Code language: SQL (Structured Query Language) (sql)
The output is:
In this tutorial, you have learned how to create a new view by using the SQL Server CREATE VIEW
statement.
Представления и табличные объекты
Представления
Последнее обновление: 14.08.2017
Представления или Views представляют виртуальные таблицы. Но в отличии от обычных стандартных таблиц в базе данных представления
содержат запросы, которые динамически извлекают используемые данные.
Представления дают нам ряд преимуществ. Они упрощают комплексные SQL-операции. Они защищают данные, так как представления могут дать доступ к
части таблицы, а не ко всей таблице. Представления также позволяют возвращать отформатированные значения из таблиц в нужной и
удобной форме.
Для создания представления используется команда CREATE VIEW, которая имеет следующую форму:
CREATE VIEW название_представления [(столбец_1, столбец_2, ....)] AS выражение_SELECT
Например, пусть у нас есть три связанных таблицы:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Теперь добавим в базу данных, в которой содержатся данные таблицы, следующее представление:
CREATE VIEW OrdersProductsCustomers AS SELECT Orders.CreatedAt AS OrderDate, Customers.FirstName AS Customer, Products.ProductName As Product FROM Orders INNER JOIN Products ON Orders.ProductId = Products.Id INNER JOIN Customers ON Orders.CustomerId = Customers.Id
То есть данное представление фактически будет возвращать сводные данные из трех таблиц. И после его создания мы сможем его увидеть в
узле Views у выбранной базы данных в SQL Server Management Studio:
Теперь используем созданное выше представление для получения данных:
SELECT * FROM OrdersProductsCustomers
При создании представлений следует учитывать, что представления, как и таблицы, должны иметь уникальные имена в рамках той же базы данных.
Представления могут иметь не более 1024 столбцов и могут обращаться не более чем к 256 таблицам.
Также можно создавать представления на основе других представлений. Такие представления еще называют вложенными (nested views). Однако уровень вложенности не может быть больще 32-х.
Команда SELECT, используемая в представлении, не может включать выражения INTO
или ORDER BY (за исключением тех случаев, когда также применяется выражение TOP или OFFSET).
Если же необходима сортировка данных в представлении, то выражение ORDER BY применяется в команде SELECT, которая извлекает данные из представления.
Также при создании представления можно определить набор его столбцов:
CREATE VIEW OrdersProductsCustomers2 (OrderDate, Customer,Product) AS SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName FROM Orders INNER JOIN Products ON Orders.ProductId = Products.Id INNER JOIN Customers ON Orders.CustomerId = Customers.Id
Изменение представления
Для изменения представления используется команда ALTER VIEW. Эта команда имеет практически тот же самый синтаксис, что и CREATE VIEW:
ALTER VIEW название_представления [(столбец_1, столбец_2, ....)] AS выражение_SELECT
Например, изменим выше созданное представление OrdersProductsCustomers:
ALTER VIEW OrdersProductsCustomers AS SELECT Orders.CreatedAt AS OrderDate, Customers.FirstName AS Customer, Products.ProductName AS Product, Products.Manufacturer AS Manufacturer FROM Orders INNER JOIN Products ON Orders.ProductId = Products.Id INNER JOIN Customers ON Orders.CustomerId = Customers.Id
Удаление представления
Для удаления представления вызывается команда DROP VIEW:
DROP VIEW OrdersProductsCustomers
Также стоит отметить, что при удалении таблиц также следует удалить и представления, которые используют эти таблицы.
Summary: this tutorial introduces you to the SQL views concept and shows you how to manage view in the database.
Introduction to the SQL Views
A relational database consists of multiple related tables e.g., employees, departments, jobs, etc. When you want to see the data of these tables, you use the SELECT statement with JOIN or UNION clauses.
SQL provides you with another way to see the data is by using the views. A view is like a virtual table produced by executing a query. The relational database management system (RDBMS) stores a view as a named SELECT
in the database catalog.
Whenever you issue a SELECT
statement that contains a view name, the RDBMS executes the view-defining query to create the virtual table. That virtual table then is used as the source table of the query.
Why do you need to use the views
Views allow you to store complex queries in the database. For example, instead of issuing a complex SQL query each time you want to see the data, you just need to issue a simple query as follows:
SELECT column_list
FROM view_name;
Code language: SQL (Structured Query Language) (sql)
Views help you pack the data for a specific group of users. For example, you can create a view of salary data for the employees for Finance department.
Views help maintain database security. Rather than give the users access to database tables, you create a view to revealing only necessary data and grant the users to access to the view.
Creating SQL views
To create a view, you use the CREATE VIEW
statement as follows:
CREATE VIEW view_name
AS
SELECT-statement
Code language: SQL (Structured Query Language) (sql)
First, specify the name of the view after the CREATE VIEW
clause.
Second, construct a SELECT statement to query data from multiple tables.
For example, the following statement creates the employee contacts view based on the data of the employees
and departments
tables.
CREATE VIEW employee_contacts AS
SELECT
first_name, last_name, email, phone_number, department_name
FROM
employees e
INNER JOIN
departments d ON d.department_id = e.department_id
ORDER BY first_name;
Code language: SQL (Structured Query Language) (sql)
By default, the names of columns of the view are the same as column specified in the SELECT
statement. If you want to rename the columns in the view, you include the new column names after the CREATE VIEW
clause as follows:
CREATE VIEW view_name(new_column_list)
AS
SELECT-statement;
Code language: SQL (Structured Query Language) (sql)
For example, the following statement creates a view whose column names are not the same as the column names of the base tables.
CREATE VIEW payroll (first_name , last_name , job, compensation) AS
SELECT
first_name, last_name, job_title, salary
FROM
employees e
INNER JOIN
jobs j ON j.job_id= e.job_id
ORDER BY first_name;
Code language: SQL (Structured Query Language) (sql)
Querying data from views
Querying data from views is the same as querying data from tables. The following statement selects data from the employee_contacts
view.
SELECT
*
FROM
employee_contacts;
Code language: SQL (Structured Query Language) (sql)
Of course, you can apply filtering or grouping as follows:
SELECT
job,
MIN(compensation),
MAX(compensation),
AVG(compensation)
FROM
payroll
WHERE
job LIKE 'A%'
GROUP BY job;
Code language: SQL (Structured Query Language) (sql)
Modifying SQL views
To modify a view, either adding new columns to the view or removing columns from a view, you use the same CREATE OR REPLACE VIEW
statement.
CREATE OR REPLACE view_name AS
SELECT-statement;
Code language: SQL (Structured Query Language) (sql)
The statement creates a view if it does not exist or change the current view if the view already exists.
For example, the following statement changes the payroll view by adding the department column and rename the compensation column to salary column.
CREATE OR REPLACE VIEW payroll (first_name , last_name , job , department , salary) AS
SELECT
first_name, last_name, job_title, department_name, salary
FROM
employees e
INNER JOIN
jobs j ON j.job_id = e.job_id
INNER JOIN
departments d ON d.department_id = e.department_id
ORDER BY first_name;
Code language: SQL (Structured Query Language) (sql)
SELECT
*
FROM
payroll;
Code language: SQL (Structured Query Language) (sql)
Removing SQL views
To remove a view from the database, you use the DROP VIEW
statement:
DROP VIEW view_name;
Code language: SQL (Structured Query Language) (sql)
The DROP VIEW
statement deletes the view only, not the base tables.
For example, to remove the payroll view, you use the following statement:
DROP VIEW payroll;
Code language: SQL (Structured Query Language) (sql)
In this tutorial, you have learned about SQL views and their practical usages. Now, you should know what views are and how to create, modify, and delete views in the database.
CREATE VIEW Oracle
Представление – это виртуальная таблица. В действительности представление – всего лишь результат выполнения оператора SELECT, который хранится в структуре памяти, напоминающей SQL таблицу, например, Oracle. Для тех, кто работает с представлением, манипулирование его данными ничем не отличается от манипулирования данными таблицы. В некоторых случаях пользователь может вводить данные в представление, как если бы оно было таблицей. Работая с представлением нужно помнить, что:
- Представления добавляют уровень защиты данных (например, можно создать представление для таблицы, где пользователю, выполняющему SELECT над представлением, видны только сведения о зарплате)
- Представления могут скрывать сложность данных, комбинируя нужную информацию из нескольких таблиц
- Представления могут скрывать настоящие имена столбцов, порой трудные для понимания, и показывать более простые имена.
Представление создается с помощью команды CREATE VIEW. После создания представления становятся частью схемы создавшего их пользователя. Переназначить их другому пользователю можно тогда, когда у него имеется системная привилегия CREATE ANY VIEW.
Синтаксис команды CREATE VIEW Oracle
Основные ключевые слова и параметры CREATE VIEW Oracle:
OR REPLACE, FORCE, NOFORCE, Sсhema, View, Alias, AS subquery, WITH CHECK OPTION, Constraint
OR REPLACE — пересоздает представление, если оно уже существует. Можно использовать эту опцию для изменения определения представления без того, чтобы удалять его, создавать заново и вновь назначать все объектные привилегии, которые были назначены по данному представлению;
FORCE — создает представление независимо от того, существуют ли базовые таблицы этого представления, и от того, имеет ли владелец схемы, содержащей представление, привилегии по этим таблицам. Необходимо чтобы оба названных условия были удовлетворены, прежде чем по данному представлению можно будет выдавать любые предложения SELECT, INSERT, UPDATE или DELETE. По умолчанию применяется параметр NOFORCE;
NOFORCE — создает представление только в том случае, если существуют базовые таблицы этого представления, а владелец схемы, содержащей представление, имеет привилегии по этим таблицам;
Sсhema — схема, в которой создается представление. Если СХЕМА опущена, то ORACLE создает представление в схеме пользователя;
View — ключевое слово view это имя создаваемого представления;
Alias — специфицирует имена для выражений, выбираемых запросом представления. Число алиасов должно совпадать с количеством выражений, выбираемых подзапросом. Алиасы должны удовлетворять правилам именования объектов схем. Алиасы должны быть уникальны внутри представления. Если алиасы опускаются, то ORACLE определяет их по именам или алиасам столбцов в запросе представления. Поэтому использовать алиасы нужно, если запрос представления содержит, помимо имен столбцов, выражения;
AS subquery — идентифицирует столбцы и строки таблиц, на которых базируется представление. Запрос представления может быть любым предложением SELECT, не содержащим фраз ORDER BY или FOR UPDATE. Его список выборки может содержать до 254 выражений;
WITH CHECK OPTION — указывает, что вставки и обновления, которые будут осуществляться через этот запрос, должны давать в результате только такие строки, которые могут быть выбраны запросом этого же представления. Опция CHECK OPTION не может гарантировать этого, если существует подзапрос в запросе этого представления или любого представления, на котором базируется данное представление. Другими словами, при указании параметра WITH CHECK OPTION пользователь не может вводить, удалять и обновлять информацию таблицы, из которой он не имеет возможности считать информацию через простое представление (создаваемое из данных одной таблицы). Обновляемое представление, использующее несколько связанных таблиц, нельзя создавать с данным параметром;
Constraint — имя, которое присваивается ограничению CHECK OPTION. Если этот идентификатор опущен, то ORACLE автоматически назначает этому ограничению имя следующего вида:
SYS_Cn , где n — целое, которое делает имя ограничения уникальным внутри базы данных.
Преимущество использования представления вместо базовой таблицы состоит в том, что оно обновляется автоматически при изменении формирующих его таблиц. Содержимое представления не фиксируется, а повторно вычисляется всякий раз, когда вы ссылаетесь на представление в команде.
Если команды обновления DML (INSERT, UPDATE, DELETE) можно применить к представлению, то говорят, что представление является обновляемым (updatable); в противном случае оно является только читаемым (read-only). Представление является обновляемым, если при его создании учитывались следующие критерии:
- представление должно включать первичный ключ таблицы
- не должно содержать полей, полученных в результате применения функций агрегирования
- не должно содержать DISTINCT, GROUP BY, HAVING в своем определении
- может быть определено на другом представлении, но это представление должно быть обновляемым
- не может содержать константы, строки или выражения (например, comm*100) в списке выбираемых выходных полей
SQL CREATE VIEW. Пример 1.
CREATE VIEW Oracle.
Простое представление, которое создается из данных одной таблицы:
CREATE VIEW London_view AS SELECT * FROM Salespeople WHERE city = ‘London’;
SQL CREATE VIEW. Пример 2.
CREATE VIEW Oracle.
При создании представления можно можно задать новые имена полей:
CREATE VIEW Rating_view(rating,number) AS SELECT rating, COUNT(*) FROM Customers GROUP BY rating;
SQL CREATE VIEW. Пример 3.
CREATE VIEW Oracle.
Представления могут получать информацию из любого количества базовых таблиц:
CREATE VIEW Nameorders AS SELECT onum, amt,a.snum, sname, cname FROM Orders a, Customers b, Salespeople C WHERE a.cnum = b.cnum AND a.snum = c.snum;
SQL CREATE VIEW. Пример 4.
CREATE VIEW Oracle.
При создании представлений можно использовать подзапросы, включая и связанные подзапросы:
CREATE VIEW Sales_view AS SELECT b.odate, a.snum, a.sname, FROM Salespeople a, Orders b WHERE a.snum = b.snum AND b.amt = (SELECT MAX(amt) FROMOrders c WHERE c.odate = b.odate);
SQL CREATE VIEW. Пример 5.
CREATE VIEW Oracle.
CREATE VIEW empl_v04 AS SELECT e.eid, e.sname, e.fname, e.otch, p.pname, d.dname FROM posts p, departments d, employees e WHERE e.did = d.did AND e.pid = p.pid;
SQL CREATE VIEW Statement
SQL CREATE VIEW Statement
In SQL, a view is a virtual table based on the result-set of an SQL statement.
A view contains rows and columns, just like a real table. The fields in a view are fields from one or more real tables in the database.
You can add SQL functions, WHERE, and JOIN statements to a view and present the data as if the data were coming from one single table.
SELECT column1, column2, …
Note: A view always shows up-to-date data! The database engine recreates the data, using the view’s SQL statement, every time a user queries a view.
The following SQL creates a view that shows all customers from Brazil:
CREATE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName
WHERE Country = «Brazil»;
We can query the view above as follows:
SELECT * FROM [Brazil Customers];
The following SQL creates a view that selects every product in the «Products» table with a price higher than the average price:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName, Price
WHERE Price > (SELECT AVG(Price) FROM Products);
We can query the view above as follows:
SELECT * FROM [Products Above Average Price];
A view can be updated with the CREATE OR REPLACE VIEW command.
SQL CREATE OR REPLACE VIEW Syntax
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, …
The following SQL adds the «City» column to the «Brazil Customers» view:
The following SQL adds the «City» column to the «Brazil Customers» view:
CREATE OR REPLACE VIEW [Brazil Customers] AS
SELECT CustomerName, ContactName, City
WHERE Country = «Brazil»;
A view is deleted with the DROP VIEW command.
The following SQL drops the «Brazil Customers» view:
The following SQL drops the «Brazil Customers» view:
DROP VIEW [Brazil Customers];
NOTE: ORDER BY clause cannot be used inside a view.
NOTE: ORDER BY clause cannot be used inside a view.