SQL в вопросах и задачах
.pdf5. Пр едста влен и я (VIEW)
5.1. П редставл ения – им енованны е з апросы
Д о |
сих п ор |
реч ь шла |
о таблицах, обыч но наз ыв аемых |
баз ов ыми |
|
таблица ми. |
Э то – |
таблицы, |
которые сод ержат д а нные. О д на ко имеется и |
||
д ругой |
в ид |
таблиц, на з ыв аемый VIEW или ПРЕДСТАВЛЕНИЯ. |
Таблицы– |
п ред став ления не сод ержат ника ких собств енных д а нных. Фактич ески
пр едст а в ление –эт о им енов а нна я т а бли ца , со д ер ж и м о е ко т о р о йявляет ся
р езульт а т о м за пр о са , за д а нно го пр и |
о пи са ни и |
пр ед ст а влени я. |
Прич ем |
||
д анный з ап рос в ып олняется |
в сякий |
раз , |
когд а |
таблица-п ред став ление |
|
станов ится объектом кома нд ы |
SQL. Выв од |
з ап роса п ри э том в |
кажд ый |
момент станов итсясод ержаниемп ред став ления. Пред ста в ленияп оз в оляют:
∙огранич ив атьч исло столбцов , из которых п ольз ов ательв ыбирает или в которыев в од ит д а нные;
∙ огранич ив ать ч исло строк, из которых п ольз ов атель в ыбира ет или в которыев в од ит д а нные;
∙в ыв од итьд оп олнительныестолбцы, п реобраз ов анныеиз д ругих столбцов баз ов ой та блицы;
∙в ыв од итьгруп п ы стр ок таблицы.
Б ла год аря этому п р ед ста в ления д а ют в оз можностьгибкой настройки
в ыв од имой из |
таблиц информации |
в соотв етств ии |
с требов аниями |
|
конкретных п ольз ов а телей, |
п оз в оляют обесп еч ив атьз а щ иту информации на |
|||
уров не строк и |
столбцов , |
уп рощ а ют формиров а ние сложных отч етов и |
||
в ыход ных форм. |
|
|
|
CREATE VIEW |
Пред став ление оп ред еляется с |
п омощ ью кома нд ы |
(СОЗДАТЬ ПРЕДСТАВЛЕНИЕ). Н а п ример :
CREATE VIEW MOSC_STUD AS
SELECT *
FROM STUDENT
WHERE CITY = ‘М о сква ’;
|
|
112 |
|
|
|
Д анные из |
баз ов ой |
таблицы, п ред ъяв ляемые |
п ольз ов ателю в |
||
п ред став лении, з а в исят от |
услов ия (п ред иката), |
оп исанного |
SELECT- |
||
з ап росеп ри оп ред елении п р ед ста в ления. |
|
|
|
||
В соз д анную |
в рез ультате п р ив ед енного |
в ыше з а п роса |
таблицу- |
||
п ред став ление MOSC_STUD |
п ер ед аются д анные из |
ба з ов ой |
таблицы |
||
STUDENT, но нев се, а только з ап иси о студ ентах, д лякоторых з на ч ениеп оля |
|||||
CITY ра в но ‘М о сква ’. К таблице MOSC_STUD можно теп ерьобращ аться с |
|||||
п омощ ью з ап росов |
так же, |
как и к любой д ругой таблице баз ы д а нных. |
Н а п ример, з а п рос д ляп росмотра п ред став ленияMOSC_STUD имеет в ид :
SELECT *
FROM MOSC_STUD;
5.2. П редставл ения т абл иц
Раз лич ают п ред став лениятаблиц и п р ед ста в лениястолбцов .
В п ростейшем п ред став лении та блиц в ыбираютсявсе строки и столбцы баз ов ой таблицы.
CREATE VIEW NEW_STUD_TAB AS SELECT *
FROM STUDENT;
Такоеп ред став ление, п о сути, э кв ив алентно п рименению синонима, но яв ляетсяменееэффектив ным, п оэтому п рименяетсяред ко.
5.3. П редставл ения ст ол бц ов
В п ростейшем в ид е п ред ста в ление столбцов в ыбирает в се строки и столбцы, п од обно п ред ста в лению таблиц; кроме того, в кач еств е имен столбцов п рименяютсяп сев д онимы. Н а п ример :
CREATE VIEW NEW_STUDENT
(NEW_STUDENT_ID, NEW_SURNAME, NEW_NAME, NEW_STIPEND, NEW_KURS, NEW_CITY, NEW_BIRTHDAY, NEW_UNIV_ID)
AS SELECT STUDENT_ID, SURNAME, NAME, STIPEND,
113
KURS, CITY, BIRTHDAY, UNIV_ID FROM STUDENT;
Пред став ление столбцов яв ляется п ростым сп особом организ ации общ ей та блицы д ля груп п ы п ольз ов ателей или п риклад ных з ад а ч , которые исп ольз уютсобств енныеимена п олей и таблицы.
5.4. Модиф иц ирование предст авл ений
Д анные, п ред ъяв ляемые п ольз ов ателю ч ерез п ред став ление, могут из менятьсяс п омощ ьюкома нд мод ифика ции DML, но п ри этомфа ктич еская мод ифика цияд а нных буд етосущ еств лятьсянев самой в иртуальной таблице- п ред став лении, а буд ет п ерена п рав лена к соотв етств ующ ей баз ов ой таблице. Н а п ример, з а п рос на обнов лениеп ред став ленияNEW_STUDENT
UPDATE NEW_STUDENT
SET CITY = ‘М о сква ’
WHERE STUDENT_ID = 1004;
экв ив алентен |
в ып олнению |
команд ы UPDATE |
над |
баз ов ой |
та блицей |
|
STUDENT. |
След ует, од нако, обратитьв нима ниена |
то, ч то в общ ем случ ае, |
||||
из -з а того, |
ч то обыч но в п ред став лении отображаются д анные из |
баз ов ой |
||||
таблицы в |
пр ео бр а зо ва нно м |
или усеченно м в ид е, |
п рименение команд |
|||
мод ифика ции |
к таблицам-п ред став лениям имеет некоторые особенности, |
|||||
рассма трив аемыениже. |
|
|
|
|
5.5. Маскирую щ ие предст авл ения
5.5.1. П редст авл ения , м аскирую щ ие ст ол бц ы
Д анный в ид п ред став лений огранич ив ает ч исло столбцов ба з ов ой таблицы, к которымв оз можен д оступ . Н а п ример, п ред став ление
CREATE VIEW STUD AS
SELECT STUDENT_ID, SURNAME, CITY FROM STUDENT;
д ает д оступ п ольз ов ателю к п олям STUDENT_ID, SURNAME, CITY ба з ов ой
114
таблицы STUDENT, п олностью скрыв а я от него как сод ержимое, так и сам факт налич ияв баз ов ой та блицеп олей NAME, STIPEND, KURS, BIRTHDAY и UNIV_ID.
5.5.2.О перац ии м одиф икац ии в предст авл ения х, м аскирую щ их ст ол бц ы
Пред став ления, как ужеотмеч алосьв ыше, могут из менятьсяс п омощ ью
команд |
мод ифика ции |
DML, |
но |
п ри этом |
мод ифика ция д а нных буд ет |
||||||
осущ еств ляться не в |
са мой |
та блице-п ред ста в лении, а |
в соотв етств ующ ей |
||||||||
баз ов ой |
таблице. |
В |
св яз и |
с |
этим, с п ред став лениями, маскирующ ими |
||||||
столбцы, |
функции |
в став ки |
и |
уд а ления работают несколько инач е, ч ем с |
|||||||
обыч ными таблица ми. О п ератор |
INSERT, |
п римененный к п ред став лению, |
|||||||||
фактич ески |
осущ еств ляет в ста в ку строки |
в |
соотв етств ующ ую баз ов ую |
||||||||
таблицу, п р ич емво |
все столбцы этой таблицы нез ав исимо от того, в ид ны они |
||||||||||
п ольз ов ателю ч ерез п ред став лениеили скрыты от него. В св яз и с этим, |
в |
||||||||||
столбцах, |
не в ключ енных |
|
в |
п ред став ление, устана в лив ается NULL- |
|||||||
значение |
или |
з на ч ение |
п о |
умолч а нию. |
Е сли |
не в ключ енный |
в |
п ред став лениестолбец имеет оп цию NOT NULL, то генерируетсясообщ ение об ошибке.
Л юбоеп рименениеоп ер атора DELETE уд а ляет строки баз ов ой таблицы нез а в исимо от их з нач ений.
5.5.3. П редст авл ения , м аскирую щ ие ст роки
Пред став ления могут также огр анич ив ать д оступ к строкам. О хв атыв аемые п ред став лением строки баз ов ой таблицы з ад а ются услов ием
(п ред икатом) в конструкции WHERE п р и |
оп иса нии п ред став ления. Д оступ |
ч ерез п ред став ление в оз можен только |
к строкам, уд ов летв оряющ им |
услов ию. |
|
Н а п ример, п ред став ление |
|
CREATE VIEW MOSC_STUD AS |
|
SELECT * |
|
FROM STUDENT |
|
WHERE CITY = ‘М о сква ’; |
|
115
п оказ ыв ает п ольз ов ателю только тестроки та блицы STUDENT, д лякоторых з нач ениеп оляCITY рав но ‘М о сква ’.
5.5.4. О перац ии м одиф икац ии в предст авл ения х, м аскирую щ их ст роки
К ажд ая в ключ енная в п ред став ление строка д оступ на д ля в ыв од а, обнов ления и уд а ления. Л юба я д оп устима я д ля основ ной таблицы строка в ста в ляетсяв ба з ов уютаблицу нез а в исимо от еев ключ енияв п ред став ление. При этом может в оз никнуть п роблема , состоящ ая в том, ч то з нач ения, в в ед енныеп ольз ов а телем баз ов уютаблицу ч ерез п р ед ста в ление, з нач ений, буд ут отсутств ов атьв п ред став лении, остав а ясьп ри этомв баз ов ой таблице. Рассмотримтакой случ а й:
CREATE VIEW HIGH_RATING AS SELECT *
FROM UNIVERSITY
WHERE RATING = 300;
Э то п р ед ста в ление яв ляется обнов ляемым. О но п росто огранич ив ает
д оступ |
п ольз ов а теля к оп ред еленным столбца м и |
строкам в |
та блице |
|||||
UNIVERSITY. |
Пред п оложим, необход имо в став ить с |
п омощ ью кома нд ы |
||||||
INSERT след ующ уюстроку: |
|
|
|
|
|
|
||
INSERT INTO HIGH_RATING |
|
|
|
|
||||
|
VALUES (180, ‘Н о вы й ун и вер си тет’, 200, ‘Во р о н еж ’); |
|
||||||
К оманд а |
INSERT д оп устима |
этом |
п ред став лении. С |
п омощ ью |
||||
п ред став ления HIGH_RATING строка |
буд ет в став лена |
в баз ов ую таблицу |
||||||
UNIVERSITY. О д нако, п ослеп ояв ления этой строки в |
баз ов ой таблице, и з |
|||||||
са м о го |
пр ед ст а в лени я о на и счезнет , |
п оскольку з нач ениеп оля RATING не |
||||||
рав но |
300, и, |
след ов а тельно, |
эта |
строка |
не уд ов летв оряет |
услов ию |
||
п ред ложения WHERE д ля отбора |
строк в п ред став ление. Д ля п ольз ов ателя |
|||||||
такое исч ез нов ение только |
ч то |
в в ед енной строки яв ляется неожид анным. |
||||||
Д ейств ительно, |
неп онятно, |
п оч ему п ослев в од а строки в та блицу еенельз я |
ув ид етьи, на п ример, тут жеуд а лить. Тем более, ч то п ольз ов ательв ообщ е может нез нать– р аботает он в д анный момент с баз ов ой та блицей или с таблицей-п ред став лением.
А налогич ная ситуа ция в оз никнет, если в ка кой-либо сущ еств ующ ей
116
з ап иси п ред став ления HIGH_RATING из менитьз на ч ение п оля RATING на з нач ение, отлич ноеот 300.
Под обныеп роблемы можно устранитьп утем в ключ енияв оп ред еление
п ред став ления оп ции WITH |
CHECK OPTION. |
Э та |
оп ция расп ространяет |
|
услов иеWHERE д ля з ап р оса |
на оп ера ции обнов ления и в став ки в оп исание |
|||
п ред став ления. Н а п ример : |
|
|
|
|
CREATE VIEW HIGH_RATUNG AS |
|
|
|
|
SELECT * |
|
|
|
|
FROM UNIVERSITY |
|
|
|
|
WHERE RATING = 300 |
|
|
|
|
WITH CHECK OPTION; |
|
|
|
|
В э том случ ае в ышеуп омянутые оп ера ции |
в ста в ки |
строки или |
||
коррекции п оляRATING буд ет отклонены. |
|
|
|
|
О п цияWITH CHECK OPTION п омещ а етсяв |
оп ред елениеп ред став ления, |
|||
а не в кома нд у DML, так ч то все команд ы мод ифика ции в |
п р ед ста в лении |
буд ут п ров еряться. Рекоменд уется исп ольз ов а тьэ ту оп цию в о в сех случ аях, когд а нет п рич ины раз реша тьп ред ста в лению п омещ а тьв та блицу з нач ения, которыев немсамомнемогут бытьв ид ны.
5.5.5.О перац ии м одиф икац ии в предст авл ения х, м аскирую щ их ст роки и ст ол бц ы
Рассмотренная |
в ыше п роблема |
в оз никает |
и п ри |
в став ке строк в |
||||
п ред став ление с |
п ред ика том, |
исп ольз ующ им п оля баз ов ой |
таблицы, |
не |
||||
п рисутств ующ ие |
в |
са мом |
п р ед ста в лении. |
Н ап р имер, |
ра ссмотрим |
|||
п ред став ление |
|
|
|
|
|
|
|
|
CREATE VIEW MOSC_STUD AS |
|
|
|
|
|
|||
SELECT STUDENT_ID, SURNAME, STIPEND |
|
|
|
|||||
FROM STUDENT |
|
|
|
|
|
|
||
WHERE CITY = ‘М о сква ’; |
|
|
|
|
|
|||
Вид но, ч то в |
д а нноеп ред став ление не в ключ ено п оле CITY таблицы |
|||||||
STUDENT. |
|
|
|
|
|
|
|
|
Ч то буд ет |
п роисход ить п ри |
п оп ытка х |
в ста в ки |
строки в |
это |
117 |
|
п ред став ление? Та к как мы не можем указ а ть з нач ение |
CITY в |
п ред став лении как з нач ение п о умолч анию (в в ид у отсутств ия в |
нем этого |
п оля), то этим з нач ением буд ет NULL, и оно буд ет в в ед ено в п оле CITY |
|
баз ов ой таблицы STUDENT (сч итаем, ч то д ляэтого п оляоп цияNOT NULL не |
исп ольз уется). Так ка к в этом случ аез нач ениеп оля CITY баз ов ой таблицы STUDENT небуд ет рав нятьсяз нач ению ‘М о сква ’, в ста в ляемаястр ока буд ет
исключ ена |
из |
самого |
п ред ста в ления |
и, |
п оэтому, не буд ет |
в ид на |
п ольз ов ателю. |
Прич ем так буд ет п р оисход ить д ля любо й в став ляемой в |
|||||
п ред став лениеMOSC_STUD строки. Д ругими слов а ми, п ольз ов ательв ообщ е |
||||||
не сможет |
в ид еть строки, в в од имые им в |
это п ред став ление. |
Д анная |
|||
п роблема нерешается и в |
случ а е, если в |
оп р ед елениеп ред став лениябуд ет |
||||
д обав лена оп ция WITH CHECK OPTION |
|
|
|
|||
CREATE VIEW MOSC_STUD AS |
|
|
|
|||
SELECT STUDENT_ID, SURNAME, STIPEND |
|
|||||
FROM STUDENT |
|
|
|
|
||
WHERE CITY = ‘М о сква ’ |
|
|
|
|||
WITH CHECK OPTION; |
|
|
|
|||
Таким образ ом, в оп р ед еленном ука з анными сп особами п ред став лении, |
||||||
можно мод ифициров а ть з нач ения п олей |
или |
уд а лять строки, но |
нельз я |
вст а влят ь строки. Исход яиз этого, рекоменд уетсяд ажев тех случ аях, когд а этого не требуется п о соображениям п олез ности (и д аже без оп асности) информации, п ри оп ред елении п ред ста в ления в ключ атьв него все п оля, на которыеимеетсяссылка в п ред ика те. Е сли эти п олянед олжны отображаться
в в ыв од е таблицы, в сегд а |
можно |
исключ ить их |
уже в |
з ап росе к |
п ред став лению. Д ругими |
слов ами, |
можно было |
бы |
оп ред елить |
п ред став лениеMOSC_STUD п од обно след ующ ему: |
|
|
CREATE VIEW MOSC_STUD AS
SELECT *
FROM STUDENT
WHERE CITY = ‘М о сква ’
WITH CHECK OPTION;
Э та |
кома нд а з а п олнит в |
п ред став лении п оле CITY |
од инаков ыми |
|
з нач ениями, которые можно |
п росто исключ ить из в ыв од а |
с |
п омощ ью |
|
д ругого |
з ап роса уже к этому |
сформиров анному п ред став лению, |
указ а в в |
з ап росетолько п оля, необход имыед ляв ыв од а.
118
SELECT STUDENT_ID, SURNAME, STIPEND
FROM MOSC_STUD;
5.6. Агрегированны е предст авл ения
Соз д а ниеп ред ста в лений с исп ольз ов а нием а грегиров анных функций и п ред ложения GROUP BY яв ляется уд обным инстр ументом д ля неп рерыв ной
обработки и |
интер п ретации из в лекаемой информации. Пред п оложим, |
необход имо |
след ить з а колич еств ом студ ентов , сд а ющ их экз а мены, |
колич еств ом сд а нных э кз аменов , колич еств ом сд анных п ред метов , сред ним баллом п о кажд ому п ред мету. Д ля этого можно сформиров атьслед ующ ее п ред став ление
CREATE VIEW TOTALDAY AS
SELECT EXAM_DATE, COUNT(DISTINCT SUBJ_ID) AS SUBJ_CNT,
COUNT(STUDENT_ID) AS STUD_CNT, COUNT(MARK) AS MARK_CNT,
AVG(MARK) AS MARK_AVG, SUM(MARK) AS MARK_SUM FROM EXAM_MARKS
GROUP BY EXAM_DATE;
Теп ерьтребуемую информа цию можно ув ид етьс п омощ ью п ростого з ап роса к п ред став лению:
SELECT * FROM TOTALDAY;
5.7.П редставл ения , основанны е на нескол ь ких т абл иц ах
Пред став ленияч а сто исп ольз уютсяд ляобъед инениянескольких таблиц (баз ов ых и/или д ругих п ред став лений) в од ну большую в ир туа льную таблицу. Такоерешениеимеетряд п р еимущ еств :
∙ п ред ста в ление, объед иняющ ее несколько таблиц, может исп ольз ов аться как п ромежуточ ный макет п ри формиров а нии сложных отч етов , скрыв а ющ ий д етали объед инениябольшого колич еств а исход ных таблиц.
∙ п ред в арительно объед иненные п оисков ые и баз ов ые таблицы
|
|
|
119 |
|
|
|
обесп еч ив а ют |
наилуч шие |
услов ия д ля |
транз а кций, п оз в оляют |
|
|
исп ольз ов ать |
комп актные |
схемы |
код ов , |
устраняя необход имость |
|
нап исанияд ляка жд ого отч ета д линных объед иняющ их п роцед ур. |
||||
∙ |
п оз в оляет исп ольз ов ать п ри |
формиров ании |
отч етов более над ежный |
||
|
мод ульный п од ход . |
|
|
|
|
∙ |
п ред в арительно объед иненныеи п ров еренныеп ред ста в ления уменьша ют |
||||
|
в ероятность ошибок, св яз анных с |
неп олным в ып олнением услов ий |
|||
|
объед инения. |
|
|
|
|
М ожно, нап ример, соз д атьп ред став ление, котороеп оказ ыв а ет имена и наз в аниясд анных п ред метов д лякажд ого студ ента :
CREATE VIEW STUD_SUBJ AS
SELECT A.STUDENT_ID, C.SUBJ_ID, A.SURNAME, C.SUBJ_NAME FROM STUDENT A, EXAM_MARKS B, SUBJECT C
WHERE A.STUDENT_ID = B.STUDENT_ID
AND B.SUBJ_ID = C.SUBJ_ID;
Теп ерьв сеп ред меты студ ента или в сех студ ентов д лякажд ого п ред мета можно в ыбра тьс п омощ ью п ростого з ап роса. Н ап р имер, ч тобы ув ид етьв се п ред меты, сд а нныестуд ентомИва н о вы м, п од аетсяз а п рос:
SELECT SUBJ_NAME FROM STUD_SUBJ
WHERE SURNAME = ‘Ива н о в’;
5.8. П редставл ения и подз апросы
При соз д а нии п ред став лений могут такжеисп ольз ов а тьсяи п од з ап р осы, в ключ ая св яз а нные п од з ап росы. Пред п оложим, п ред усматрив ается п ремия д лятех студ ентов , которыеимеют самый в ысокий балл на любую з ад анную д ату. Получ итьтакуюинформациюможно с п омощ ьюп ред став ления:
CREATE VIEW ELITE_STUD
AS SELECT B.EXAM_DATE, A.STUDENT_ID, A.SURNAME FROM STUDENT A, EXAM_MARKS B
WHERE A.STUDENT_ID = B.STUDENT_ID AND B.MARK =
( SELECT MAX (MARK)
120
FROM EXAM_MARKS C
WHERE C.EXAM_DATE = B.EXAM_DATE);
Е сли, с д ругой стороны, п ремия буд ет наз нач аться только студ енту, который имел са мый в ысокий ба лл и неменьше10-ти ра з , то необход имо исп ольз ов атьд р угоеп ред став ление, основ анноена п ер в ом:
CREATE VIEW BONUS
AS SELECT DISTINCT STUDENT_ID, SURNAME
FROM ELITE_STUD A
WHERE 10 < =
( SELECT COUNT(*)
FROM ELITE_STUD B
WHERE A.STUDENT_ID = B.STUDENT_ID);
Из в леч ение из э той таблицы з ап исей о студ ента х, которые буд ут п олуч а тьп ремию, в ып олняетсяп ростымз ап росом:
SELECT * FROM BONUS;
5.9.О граничения прим енения операт ора SELECT дл я соз дания предст авл ений
Имеются некоторые в ид ы з ап росов , не д оп устимые в оп ред елениях
п ред став лений. О д иноч ное |
п ред став ление д олжно |
основ ыв аться |
на |
|
од иноч ном з ап росе, п оэтому |
UNION и |
UNION ALL в |
п ред став лениях |
не |
раз реша ются. Пред ложение ORDER BY |
та кже никогд а |
не исп ольз уется в |
оп ред елении п ред став лений. Пр ед ста в лениеяв ляетсяреляционной таблицейотношением, п оэ тому его строки п о оп ред елению яв ляются неуп оряд оч енными.
5.10. Удал ение предст авл ений
Синта ксис уд аленияп р ед став ленияиз баз ы д анных п од обен синта ксису уд алениябаз ов ых таблиц:
DROP VIEW <и мя п редст а вл ени я>