Mysql
 sql >> база данни >  >> RDS >> Mysql

Разбиране на изгледите в SQL

От Манодж Дебнат

Таблиците в SQL база данни може да съдържат огромно количество данни, но те не винаги са в полезен формат, за да бъдат лесно използвани. Обемът на данните трябва да се филтрира въз основа на определени критерии за ефективно използване. Поради съображения за сигурност може да искаме да направим публични само определено количество данни, докато останалите може да са достъпни за привилегированите потребители. SQL DML операциите са разширяеми и се използват за филтриране през една или повече таблици, използвайки сложни изрази на заявка. Възползвайки се от идеята, можем да създадем виртуални таблици от постоянни базови таблици, използвайки SQL, които ще съдържат точните данни, от които се нуждаем. Това е причината стандартът SQL:2006 да въведе използването на таблици или изгледи. Дефиницията на изглед или виртуална таблица съществува като обект на схема. Тази статия представя концепцията за изгледи в SQL, как работи и показва как се прилага с някои примери.

Въведение в SQL изгледи

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

Примерите по-долу са тествани с базата данни MySQL. Започнете със създаване на няколко таблици:

моята_компания база данни:

CREATE DATABASE my_company;

CREATE TABLE Employee(
    empId INT(11) UNSIGNED CHECK (empId > 0),
    empName VARCHAR(20),
    birthDate DATE,
    address TEXT(128),
    gender VARCHAR(1),
    salary DECIMAL(15,2),
    managerId INT(11) UNSIGNED,
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(empId)
);
 
CREATE TABLE Department(
    deptId INT(11) UNSIGNED CHECK (empId > 0),
    deptName VARCHAR(20),
    deptMgrId INT(11) UNSIGNED,
    mgrStartDate DATE,
    PRIMARY KEY(deptId)
);

CREATE TABLE Project(
    projId INT(11) UNSIGNED CHECK (empId > 0),
    projName VARCHAR(20),
    projLocation TEXT(128),
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(projId)
);
 
CREATE TABLE EmpWorksOnProj(
    empId INT(11) UNSIGNED,
    projId INT(11) UNSIGNED,
    hoursWorked DECIMAL(4,2)
);  
 
ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId);
ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId);
ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);

Изгледите могат да се разглеждат като референтна таблица и можем да я използваме толкова често, колкото искаме, въпреки че може да не съществува физически. Например, често може да се наложи да се позоваваме на моята_компания база данни и намерете Служител и Проект информация. Имайте предвид, че има много към много отношения между Служител и Проект тъй като един човек може да работи по много проекти и също така един проект има много служители. Следователно, вместо да посочвате обединяването на три таблици:Служител , EmpWorksOnProj и Проект всеки път, когато имаме нужда от информация за съвместна работа и издадем заявка, ние дефинираме изглед, който е посочен като резултат от обединяването между тези таблици. Изгледът формира виртуалната таблица, създадена от резултата от заявката. Предимството е, че заявката сега може да извлича от единична резултатна таблица, вместо да се налага да извлича от три свързани таблици. Колекцията от таблици:Служител , Проект , Отдел и т.н. по този начин формират базовите таблици или дефиниращата таблица на изгледа.

Нека създадем някои изгледи въз основа на схемата, дадена по-горе.

CREATE VIEW V1
AS
SELECT
   empName, projName, hoursWorked
FROM
   Employee, Project, EmpWorksOnProj
WHERE
   Employee.empId=EmpWorksOnProj.empId
AND
   Project.projId=EmpWorksOnProj.projId;
 

Начинът за определяне на SQL заявки в изглед или виртуална таблица е същият като указването на заявки, включващи базови таблици. Можете да използвате SQL SELECT за изгледи, за да получите данните, както следва:

ИЗБЕРЕТЕ * ОТ V1;

EmpName

Име на проекта

Отработени часове

Мики Маус

ClubHouse

6,50

Доналд Дък

Земеделие

7.0

Следното създава втори изглед:

CREATE VIEW V2 КАТО ИЗБЕРЕТЕ DeptName, COUNT(*), SUM(заплата) ОТ отдел, Employee WHERE Employee.deptId=Department.deptId ГРУПА BY deptName;

SQL SELECT води до

SELECT * FROM V1;

Име на отдел

БРОЙ(*)

SUM(заплата)

Музика

5

56000.00

Драма

2

25400,00

Имайте предвид, че в изглед V1 имената на атрибути са получени от основната таблица. Във V2 имената на новите атрибути се посочват изрично, като се използва съответствие едно към едно между посочените атрибути на клаузата CREATE VIEW и тези, посочени в клаузата SELECT. Клаузата SELECT с изгледа е решаваща за дефиницията на изгледа.

Предполага се, че информацията, която се вижда, винаги е актуална. Това означава, че винаги трябва да отразява промените, направени в базовите таблици, на които е дефиниран. Това е интересно, тъй като означава, че изгледът всъщност не се материализира в момента на дефинирането му, а по-късно, когато към него е посочена заявка. Системата за управление на базата данни във фонов режим е отговорна за поддържането на изгледа актуален.

АКТУАЛИЗИРАНЕ, ВМЕСВАНЕ и ИЗТРИВАНЕ на изгледи

В SQL, възможно е да се създават обновяеми изгледи, които могат да се използват за промяна на съществуващи данни или вмъкване на нови редове в изгледа, което от своя страна вмъква или променя записа в основната таблица . Изгледът може да се актуализира или не се определя от израза SELECT, дефиниран в дефиницията на изгледа. Няма специална клауза за определяне на изглед, който да може да бъде актуализиран. Обикновено дефиницията на изгледа трябва да е проста и не трябва да съдържа никакви агрегатни функции като SUM, AVG, MAX, MIN, COUNT. Всякакъв вид групиране или клауза DISTINCT или JOIN също прави изгледа неподлежащ на актуализиране. Вижте съответното ръководство за база данни на конкретната RDBMS за това какво прави изгледа неподлежащ на актуализация.

Нека създадем изглед, който може да се актуализира:

CREATE VIEW v3_ch_dept_name
AS
SELECT
   deptId, deptName, deptMgrId, mgrStartDate
FROM
   Department;

Заявката SELECT при изглед:

SELECT * FROM v3_ch_dept_name;

DeptId

Име на отдел

DeptMgrId

MgrStartDate

1

Музика

123456789

01.01.2020

5

Драма

987654321

05.03.2018

Сега актуализирайте изгледа, като промените името на отдела (deptName).

UPDATE
   v3_ch_dept_name
SET
   deptName = 'Security'
WHERE
   deptId = 5;

Ред може да бъде вмъкнат в изгледа, както следва:

INSERT
   INTO v3_ch_dept_name
VALUES (7,'Logistics',666884444,'1982-07-07');

Също така можем да ИЗтрием ред от изгледа, както следва:

DELETE FROM v3_ch_dept_name WHERE deptId = 7;

В MySQL можете лесно да намерите изгледите в база данни, които могат да се актуализират или не, като използвате следната команда SELECT.

SELECT
   table_name
FROM
   information_schema.views
WHERE
   is_updatable like 'YES'
AND
   table_schema like 'my_company';

ОТПУСКАНЕ на изгледи от базата данни

Изглед винаги може да бъде изхвърлен с DROP VIEW команда.

DROP VIEW V1;

Имайте предвид, че когато изпълним командата drop view, тя премахва дефиницията на изглед. Основните данни, съхранявани в базовите таблици, от които е получен този изглед, остават непроменени. Веднъж изпуснат изглед може да бъде пресъздаден със същото име.

Изявлението ALTER VIEW

Изгледите обикновено не могат да се променят според стандарта SQL:2006, което означава, че изразът ALTER VIEW не работи с изгледи. Въпреки това, има RDBMS като MySQL или SQL Server, които поддържат този вид изявление. Оракулът вярва, че първо трябва да изпусне изгледа, след което да го пресъздаде, вместо да го променя. Следователно функциите, поддържани от изгледите от RDBMS, варират от продукт до продукт.

Заключение

SQL изгледите също са полезен инструмент за достъп до множество типове данни. Сложните заявки могат да се съхраняват в дефиницията на изглед. Това използва повторно използване, защото можем да извикаме изгледа, вместо да пресъздаваме заявките всеки път, когато имаме нужда от тях. Това е удобен начин да представим информация на потребителя, криейки много информация, която не искаме да излагаме на всички. Това е важно и от гледна точка на сигурността. Сложните структури могат да бъдат синтезирани и представени в лесен формат за крайния потребител.

Препратки:

Елмасри, Рамез и Шамкант Б. Нават. Основи на системите за бази данни . Pearson Education.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Балансиране на натоварването с ProxySQL за Percona XtraDB Cluster

  2. SQL:избиране на редове, където стойността на колоната е променена от предишния ред

  3. Полетата за дата и час в MySQL и лятно часово време – как да направя справка с допълнителния час?

  4. JSON_CONTAINS() Примери в MySQL

  5. MySql сумира елементи на колона