Файл: SQL в вопросах и задачах.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 02.04.2021

Просмотров: 1459

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

61 

ему

 

з на ч ение

 

UNKNOWN

Поэ тому

 

в

 

рез ульта те

 

в ып олнения

 

п од з а п роса

 

не

 

буд ет

 

п олуч ено

 

ни

 

од ного

 

з на ч ения

 

и

 

п од з а п рос

 

п римет

 

з на ч ение

 

ло ж ь

Э то

 

в

 

св ою

 

оч еред ь

 

сд ела ет

 

NOT

 

EXISTS

 

истинным

и

след ов а тельно

строка

 

с

 

NULL

 

з на ч ением

 

в

 

п оле

 

RATING

 

п оп а д ет

 

в

 

в ыход ные

 

д а нные

По

 

смыслу

 

з а п роса

 

та кой

 

результа т

 

яв ляется

 

неп рав ильным

та к

 

ка к

 

на

 

са мом

 

д еле

 

рейтинг

 

унив ерситета

оп исыв а емого

 

д а нной

 

строкой

 

может

 

быть

 

и

 

больше

 

рейтинга

 

ка кого

-

либо

 

москов ского

 

унив ерситета

  (

он

 

п росто

 

неиз в естен

). 

У ка з а нна я

 

п роблема

 

св яз а на

 

с

 

тем

ч то

 

з на ч ение

 

EXISTS

 

в сегд а

 

п р инима ет

 

з на ч ения

 

и ст и на

 

или

 

ло ж ь

и

 

никогд а

 

 

UNKNOWN

Э то

 

яв ляется

 

д ов од ом

 

д ля

 

исп ользов а ния

 

в

 

та ких

 

случ а ях

 

оп ер а тора

 

ANY

 

в место

 

EXISTS

.

 

 

2.14. 

И спол ь з ование

 

COUNT 

вм есто

 EXISTS

 

При

 

отсутств ии

 

NULL

-

з на ч ений

 

оп ера тор

 

EXISTS

 

может

 

быть

 

исп ользов а н

 

в место

 

ANY

 

и

 

ALL

Та кже

 

в место

 

EXISTS

 

и

 

NOT

 

EXISTS

 

могут

 

быть

 

исп ользов а ны

 

те

 

же

 

са мые

 

п од з а п росы

но

 

с

 

исп ользов а нием

 

COUNT

(*) 

в

 

п ред ложении

 

SELECT

Н а п ример

з а п рос

 

SELECT

  * 

 

FROM

 

UNIVERSITY

 

A  

 

WHERE

 

NOT

 

EXISTS

 

 

 

(

SELECT

 * 

 

 

 FROM

 

UNIVERSITY

 

B

 

 

 

 WHERE

 

A

.

RATING

 > = 

B

.

RATING

 

 

 

 AND

 

B

.

CITY

 = 

М о ск

ва

); 

может

 

быть

 

п ред ста в лен

 

и

 

в

 

след ующ ем

 

в ид е

  

SELECT

  * 

 

FROM

 

UNIVERSITY

 

A

 

 

WHERE

 1 > 

 

 

(

SELECT

 

COUNT

(*) 

 

 

 FROM

 

UNIVERSITY

 

B

 

 

 

 WHERE

 

A

.

RATING

 > = 

B

.

RATING

 

 

 

 

 AND

 

B

.

CITY

 = 

М о сква

); 


background image

 

62 

УП Р АЖ НЕ НИ Я

 

37.

 

Н а п ишите

 

з а п рос

в ыбира ющ ий

 

д а нные

 

о

 

на з в а ниях

   

унив ерситетов

р ейтинг

 

которых

 

ра в ен

 

или

 

п рев осход ит

 

рейтинг

 

Воронежского

 

госуд а рств енного

 

унив ер ситета

38.

 

Н а п ишите

 

з а п рос

исп ользующ ий

 

ANY

 

или

 

ALL

в ып ол няющ ий

 

в ыборку

 

д а нных

 

о

 

студ ента х

у

 

которых

 

в

 

город е

 

их

 

п остоянного

 

местожительств а

 

нет

 

унив ерситета

39.

 

Н а п ишите

 

з а п рос

в ыбира ющ ий

 

из

 

та блицы

 

EXAM

_

MARKS

 

д а нные

 

о

 

на з в а ниях

 

п ред метов

 

обуч ения

д ля

 

которых

 

з на ч ение

 

п олуч енных

 

на

 

э кз а мене

 

оценок

  (

п оле

 

MARK

п рев ыша ет

 

любое

 

з на ч ение

 

оценки

 

д ля

 

п ред мета

имеющ его

 

ид ентифика тор

 

рав ный

 105. 

40.

 

Н а п ишите

 

э тот

 

же

 

з а п рос

 

с

 

исп ользов а нием

 

MAX

 

 

2.15. 

О перат ор

 

объ единения

 UNION

 

О п ера тор

 

UNION

 

исп ользуется

 

д л я

 

объед инения

 

в ыход ных

 

д а нных

 

д в ух

 

или

 

более

  SQL-

з а п росов

 

в

 

ед иное

 

множеств о

 

строк

 

и

 

столбцов

Н а п ример

д ля

 

того

ч тобы

 

п олуч ить

 

в

 

од ной

 

та блице

 

фа милии

 

и

 

ид ентифика торы

 

студ ентов

 

и

 

п реп од а в а телей

 

из

 

М оскв ы

можно

 

исп ользов а ть

 

след ующ ий

 

з а п рос

SELECT

 

С туден т

______

SURNAME

,

 

STUDENT

_

ID 

 

FROM

 

STUDENT 

 

WHERE

 

CITY

 = 

М о ск

ва

 

UNION 

SELECT

 

Пр епо да ва тель’

SURNAME

,

 

LECTURER

_

ID 

 

FROM

 

LECTURER

  

 

WHERE

 

CITY

 = 

М о ск

ва ’

О братите

 

в нима ние

 

на

 

то

ч то

 

симв олом

 

;

  (

точ ка

 

с

 

з а п ятой

ока нч ив а ется

 

только

 

п ослед ний

 

з а п рос

О тсутств ие

 

э того

 

симв ола

 

в

 

конце

 

SELECT-

з а п роса

 

оз на ч а ет

ч то

 

след ующ ий

 

з а

 

ним

 

з а п рос

 

та кже

ка к

 

и

 

он

 

са м

яв ляется

 

ч а стью

 

общ его

 

з а п роса

 

с

 

UNION

Исп ользов а ние

 

оп ера тора

 

UNION

 

в оз можно

 

только

 

п р и

 

объед инении

 


background image

 

63 

з а п росов

соотв етств ующ ие

 

столбцы

 

которых

 

со в м ест и м ы

 

по

 

о бъ ед и нени ю

То

 

есть

соотв етств ующ ие

 

ч ислов ые

 

п оля

 

д олжны

 

иметь

 

п олностью

 

сов п а д а ющ ие

 

тип

 

и

 

р а з мер

симв ольные

 

п оля

 

д олжны

 

иметь

 

точ но

 

сов п а д а ющ ее

 

колич еств о

 

симв олов

Е сли

 

NULL-

з на ч ения

 

з а п рещ ены

 

д ля

 

столбца

 

хотя

 

бы

 

од ного

 

любого

 

п од з а п роса

 

объед инения

то

 

они

 

д олжны

 

быть

 

з а п рещ ены

 

и

 

д ля

 

в сех

 

соотв етств ующ их

 

столбцов

 

в

 

д ругих

 

п од з а п р оса х

 

объед инения

 

2.16. 

Устранение

 

дубл ирования

 

в

 

UNION

 

В

 

отлич ие

 

от

 

обыч ных

 

з а п росов

 

UNION

 

а в тома тич ески

 

исключ а ет

 

из

 

в ыход ных

 

д а нных

 

д ублика ты

 

строк

на п ример

в

 

з а п р осе

  

SELECT

 

CITY 

 

FROM

 

STUDENT 

UNION 
SELECT

 

CITY 

 

FROM

 

LECTURER

сов п а д а ющ ие

 

на именов а ния

 

гор од ов

 

буд ут

 

исключ ены

Е сли

 

в се

 

же

 

необход имо

 

в

 

ка жд ом

 

з а п росе

 

в ыв ести

 

в се

 

строки

 

неза в исимо

 

от

 

того

имеются

 

ли

 

та кие

 

же

 

строки

 

в

 

д ругих

 

объед иняемых

 

з а п роса х

то

 

след ует

 

исп ользов а ть

 

в о

 

множеств енном

 

з а п росе

 

конструкцию

 

с

 

оп ератором

 

UNION

 

ALL

Та к

 

в

 

з а п росе

 

 

SELECT

 

CITY 

 

FROM

 

STUDENT 

UNION ALL 
SELECT

 

CITY 

 

FROM

 

LECTURER

д ублика ты

 

з на ч ений

 

город ов

в ыв од имые

 

в тор ой

 

ч а стью

 

з а п роса

не

 

буд ут

 

исключ а ться

.  

Прив ед ем

 

ещ е

 

од ин

 

п р имер

 

исп ользов а ния

 

оп ера тора

 

UNION

Пусть

 

необход имо

 

соста в ить

 

отч ет

сод ержа щ ий

 

д ля

 

ка жд ой

 

д а ты

 

сд а ч и

 

э кз а менов

 

св ед ения

 

п о

 

ка жд ому

 

студ енту

п олуч ив шему

 

ма ксима льную

 

или

 

минима льную

 

оценки

.  

SELECT

  

ма к

с

 

о ц

A

.

STUDENT

_

ID

SURNAME

MARK

EXAM

_

DATE 


background image

 

64 

 

FROM

 

STUDENT

 

A

EXAM

_

MARKS

 

 

WHERE

 (

A

.

STUDENT

_

ID

 = 

B

.

STUDENT

_

ID 

 

 

AND

 

B

.

MARK

 =            

 

 

 

(

SELECT

 

MAX

(

MARK

 

 

 

FROM

 

EXAM

_

MARKS

 

 

 

 

WHERE

 

C

.

EXAM

_

DATE

 = 

B

.

EXAM

_

DATE

)) 

UNION ALL 

SELECT

 

ми н

 

о ц

 

A

.

STUDENT

_

ID

SURNAME

MARK

EXAM

_

DATE 

 

FROM

 

STUDENT

 

A

EXAM

_

MARKS

 

 

 

WHERE

 (

A

.

STUDENT

_

ID

 = 

B

.

STUDENT

_

ID 

 

 

 

AND

 

B

.

MARK

 =  

 

 

 

 

(

SELECT

 

MIN

(

MARK

 

 

 

 

FROM

 

EXAM

_

MARKS

 

 

 

 

 

WHERE

 

C

.

EXAM

_

DATE

 = 

B

.

EXAM

_

DATE

)); 

Д ля

 

отлич ия

 

строк

в ыв од имых

 

п ерв ой

 

и

 

в торой

 

ч а стями

 

з а п роса

в

 

них

 

в ста в лены

 

текстов ые

 

конста нты

 

ма кс

 

о ц

 

и

 

ми н

 

о ц

 

В

 

п рив ед енном

 

з а п росе

 

а грегирующ ие

 

функции

 

исп ользуются

 

в

 

п од з а п роса х

Э то

 

яв ляется

 

нерациона льным

 

с

 

точ ки

 

з рения

 

в ремени

з а тр ач ив а емого

 

на

 

в ып олнение

 

з а п роса

  (

см

раз д ел

  2.9). 

Б олее

 

э ффектив на

 

форма

 

з а п роса

в оз в ращ а ющ его

 

а на логич ный

 

рез ульта т

SELECT

  

ма к

с

 

о ц

A

.

STUDENT

_

ID

SURNAME

E

.

MARK

E

.

EXAM

_

DATE 

 

FROM 

STUDENT A

,

  

 

 

(

SELECT 

B

.

STUDENT

_

ID

B

.

MARK

B

.

EXAM

_

DATE

 

 

 

 

FROM 

EXAM

_

MARKS B

,

 

 

 

 

 

(

SELECT MAX

(

MARK

)

 AS 

MAX

_

MARK

C

.

EXAM

_

DATE

 

 

 

 

 

 

FROM 

EXAM

_

MARKS C

 

 

 

 

 

GROUP

 

BY 

C

.

EXAM

_

DATE

)

 

D

 

 

 

 

WHERE 

B

.

EXAM

_

DATE=D

.

EXAM

_

DATE

  

 

 

 

 

 

AND 

B

.

MARK=MAX_MARK

)

 E 

 

WHERE 

A

.

STUDENT

_

ID=E

.

STUDENT

_

ID

 

UNION

 

ALL 

SELECT

 

ми н

 

о ц

 

A

.

STUDENT

_

ID

SURNAME

E

.

MARK

E

.

EXAM

_

DATE 

 

FROM 

STUDENT A

,

  

 

 

(

SELECT  

B

.

STUDENT

_

ID

B

.

MARK

B

.

EXAM

_

DATE

 

 

 

 

FROM 

EXAM

_

MARKS B

,

 

 

 

 

 

(

SELECT MIN

(

MARK

)

 AS 

MIN

_

MARK

C

.

EXAM

_

DATE

 

 

 

 

 

 

FROM 

EXAM

_

MARKS C 

 

 

 

 

GROUP

 

BY 

C

.

EXAM

_

DATE

)

 D 


background image

 

65 

 

 

 

WHERE 

B

.

EXAM

_

DATE=D

.

EXAM

_

DATE  

 

 

AND 

B

.

MARK=MIN

_

MARK

)

 E 

 

WHERE 

A

.

STUDENT

_

ID=E

.

STUDENT

_

ID 

2.17. 

И спол ь з ование

 

UNION

 

с

 

ORDER

 

BY

 

Пред ложение

 

ORDER

 

BY

 

п рименяется

 

д ля

 

уп оряд оч ения

 

в ыход ных

 

д а нных

 

объед инения

 

з а п росов

 

та к

 

же

ка к

 

и

 

д ля

 

отд ельных

 

з а п росов

Послед ний

 

п ример

п р и

 

необход имости

 

уп оряд оч ения

 

в ыход ных

 

д а нных

 

з а п роса

 

п о

 

фа милиям

 

студ ентов

 

и

 

д а та м

 

э кз а менов

может

 

в ыгляд еть

 

та к

SELECT

  

ма к

с

 

о ц

A

.

STUDENT

_

ID

SURNAME

E

.

MARK

E

.

EXAM

_

DATE 

 

FROM 

STUDENT A

,

  

 

 

(

SELECT 

B

.

STUDENT

_

ID

B

.

MARK

B

.

EXAM

_

DATE

 

 

 

 

FROM 

EXAM

_

MARKS B

,

 

 

 

 

 

(

SELECT MAX

(

MARK

)

 AS 

MAX

_

MARK

C

.

EXAM

_

DATE

 

 

 

 

 

 

FROM 

EXAM

_

MARKS C

 

 

 

 

 

 

GROUP

 

BY 

C

.

EXAM

_

DATE

)

 

D

 

 

 

 

WHERE 

B

.

EXAM

_

DATE=D

.

EXAM

_

DATE

  

 

 

 

 

 

AND 

B

.

MARK=MAX_MARK

)

 E 

 

WHERE 

A

.

STUDENT

_

ID=E

.

STUDENT

_

ID

 

UNION ALL 

SELECT

 

ми н

 

о ц

 

A

.

STUDENT

_

ID

SURNAME

E

.

MARK

E

.

EXAM

_

DATE 

 

FROM 

STUDENT A

,

  

 

 

(

SELECT  

B

.

STUDENT

_

ID

B

.

MARK

B

.

EXAM

_

DATE

 

 

 

 

FROM 

EXAM

_

MARKS B

,

 

 

 

 

 

(

SELECT MIN

(

MARK

)

 AS 

MIN

_

MARK

C

.

EXAM

_

DATE

 

 

 

 

 

FROM 

EXAM

_

MARKS C 

 

 

 

 

GROUP BY 

C

.

EXAM

_

DATE

)

 D 

 

 

 

WHERE 

B

.

EXAM

_

DATE=D

.

EXAM

_

DATE  

 

 

AND 

B

.

MARK=MIN

_

MARK

)

 E 

 

WHERE 

A

.

STUDENT

_

ID=E

.

STUDENT

_

ID 

ORDER BY 

SURNAME

E

.

EXAM

_

DATE

;