Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПониманиС SQLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 16

Автор ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π“Ρ€ΡƒΠ±Π΅Ρ€

Бинтаксис ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для объСдинСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с собой, Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‡Ρ‚ΠΎ ΠΈ для объСдинСния многочислСных Ρ‚Π°Π±Π»ΠΈΡ†, Π² ΠΎΠ΄Π½ΠΎΠΌ экзСмплярС. Когда Π²Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с собой, всС повторяСмыС ΠΈΠΌΠ΅Π½Π° столбца, Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ прСфиксами ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ ΠΊ этим столбцам Π²Π½ΡƒΡ‚Ρ€ΠΈ запроса, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ΠΈ для этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ коррСляции ΠΈΠ»ΠΈ просто - псСвдонимами. Π’Ρ‹ опрСдСляСтС ΠΈΡ… Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ FROM запроса. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ просто: Π²Ρ‹ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, оставляСтС ΠΏΡ€ΠΎΠ±Π΅Π», ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ псСвдоним для Π½Π΅Π΅. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС ΠΏΠ°Ρ€Ρ‹ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ (Π²Ρ‹Π²ΠΎΠ΄ показываСтся Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 9.1):


SQL Execution Log

SELECT first.cname, second.cname, first.rating

FROM Customers first, Customers second

WHERE first.rating=second.rating;


Giovanni

Giovanni

200

Giovanni

Liu

200

Liu

Giovanni

200

Liu

Liu

200

Grass

Grass

300

Grass

Cisneros

300

Clemens

Hoffman

100

Clemens

Clemens

100

Clemens

Pereira

100

Cisneros

Grass

300

Cisneros

Cisneros

300

Pereira

Hoffman

100

Pereira

Clemens

100

Pereira

Pereira

100


Π’Π°Π±Π»ΠΈΡ†Π° 9.1: ОбъСдинСниС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с собой


(ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 9.1, ΠΊΠ°ΠΊ ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΏΠΎΠ»Π½Ρ‹ΠΉ запрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠΊΠ½Π΅ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ.)

Π’ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, SQL Π²Π΅Π΄Π΅Ρ‚ сСбя Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ ΠΎΠ½ соСдинял Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ 'пСрвая' ΠΈ 'вторая'. ОбС ΠΎΠ½ΠΈ - фактичСски, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π—Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°, Π½ΠΎ псСвдонимы Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΈΠΌ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ΠΌΠΈ нСзависимо. ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΈ установлСны Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ FROM запроса, сразу послС ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΏΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ псСвдонимы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ SELECT, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ FROM.

Π­Ρ‚ΠΎ - ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. SQL Π±ΡƒΠ΄Π΅Ρ‚ сначала Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Ρ‚Π°ΠΊΠΈΠ΅ псСвдонимы Π½Π° Π²Π΅Ρ€Ρƒ, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π°Π»Π΅Π΅ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ FROM запроса.

ПсСвдоним сущСствуСт - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° выполняСтся ! Когда запрос заканчиваСтся, псСвдонимы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π½Π΅ΠΌ большС Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π—Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ, SQL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ обьСдинСниС - Π±Π΅Ρ€Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ псСвдонима ΠΈ сравниваСт Π΅Π΅ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкой ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ псСвдонима.

Π£Π‘Π’Π ΠΠΠ•ΠΠ˜Π• Π˜Π—Π‘Π«Π’ΠžΠ§ΠΠžΠ‘Π’Π˜

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ наш Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ псСвдонимС, ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·( симмСтрично) Π² ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ A Π² псСвдонимС сначала выбираСтся Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ B Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ псСвдонимС, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ A Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ псСвдонимС выбираСтся Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ B Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ псСвдонимС. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Hoffman выбрался вмСстС с Clemens, Π° Π·Π°Ρ‚Π΅ΠΌ Clemens выбрался вмСстС с Hoffman. Π’ΠΎΡ‚ ΠΆΠ΅ самый случай с Cisneros ΠΈ Grass, Liu ΠΈ Giovanni, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ каТдая строка Π±Ρ‹Π»Π° сравнСна сама с собой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти строки Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ - Liu ΠΈ Liu. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого состoΠΈΡ‚ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π»Π°Π³Π°Ρ‚ΡŒ порядок Π½Π° Π΄Π²Π° значСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ мСньшС Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π» Π΅ΠΌΡƒ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ассимСтричным, поэтому Ρ‚Π΅ ΠΆΠ΅ самыС значСния Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ снова, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


SELECT tirst.cname, second.cname, first.rating

FROM Customers first, Customers second

WHERE first.rating=second.rating

AND first.cname < second.cname;


Π’Ρ‹Π²ΠΎΠ΄ этого запроса показываСтся Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 9.2.


Hoffman ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Periera Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС, поэтому комбинация удовлСтворяСт ΠΎΠ±Π΅ΠΈΠΌ условиям ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π° ΠΈ появляСтся Π² Π²Ρ‹Π²ΠΎΠ΄Π΅. Когда Ρ‚Π° ΠΆΠ΅ самая комбинация появляСтся Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС - ΠΊΠΎΠ³Π΄Π° Periera Π² псСвдонимС ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ сравнтваСтся с Hoffman Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ псСвдонима - Π²Ρ‚ΠΎΡ€ΠΎΠ΅ условиС Π½Π΅ встрСчаСтся. Аналогично Hoffman Π½Π΅ выбираСтся ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π° Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΠ½ сам ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ имя Π½Π΅ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π΅ΠΌΡƒ самому Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС. Если Π±Ρ‹ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ


SQL Execution Log

SELECT first.cname, second.cname, first.rating FROM Customers first, Customers second

WHERE first.rating=second.rating

AND first.cname < second.cname

cname

cname

rating

Hoffman

Pereira

100

Giovanni

Liu

200

Clemens

Hoffman

100

Pereira

Pereira

100

Gisneros

Grass

300


Π’Π°Π±Π»ΠΈΡ†Π° 9.2: УстранСниС избыточности Π²Ρ‹Π²ΠΎΠ΄Π° Π² обьСдинСнии с собой.


Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ сравнСниС строк с Π½ΠΈΠΌΠΈ ΠΆΠ΅ Π² запросах ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ этому, Π²Ρ‹

ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ <=вмСсто <.

ΠŸΠ ΠžΠ’Π•Π ΠšΠ ΠžΠ¨Π˜Π‘ΠžΠš

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ SQL для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² ошибок. ΠŸΡ€ΠΈ просмотрС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ поля cnum ΠΈ snum Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ связь. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρƒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° появляСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ², ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ нСсогласованности Π² этой области:


SELECT first.onum, tirst.cnum, first.snum,

second.onum, second.cnum,second.snum

FROM Orders first, Orders second

WHERE first.cnum=second.cnum

AND first.snum < > second.snum;


Π₯отя это выглядит слоТно, Π»ΠΎΠ³ΠΈΠΊΠ° этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ достаточно проста. Она Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ², Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎΠ΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ псСвдонимом, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ² ΠΏΠΎΠ΄ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ псСвдонимом, ΠΎΠ΄Π½Ρƒ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Если комбинация строк удовлСтворяСт ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρƒ, ΠΎΠ½Π° выбираСтся для Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ этом случаС ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ эту строку, Π½Π°ΠΉΠ΄Π΅Ρ‚ строку Π³Π΄Π΅ ΠΏΠΎΠ»Π΅ cnum=2008 Π° ΠΏΠΎΠ»Π΅ snum=1007, ΠΈ Π·Π°Ρ‚Π΅ΠΌ рассмотрит ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку с Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ поля cnum. Если ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Ρ‚ΠΎ какая -Ρ‚ΠΎ ΠΈΠ· ΠΈΡ… ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ значСния поля snum, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅Ρ€Π΅Π½, ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ поля ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ строк. Если ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ snum с Π΄Π°Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ cnum Π² наш Ρ‚Π°Π±Π»ΠΈΡ†Π΅ совпадаСт, эта ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°.

Π‘ΠžΠ›Π¬Π¨Π• ΠŸΠ‘Π•Π’Π”ΠžΠΠ˜ΠœΠžΠ’

Π₯отя обьСдинСниС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с собой - это пСрвая ситуация ΠΊΠΎΠ³Π΄Π° понятно Ρ‡Ρ‚ΠΎ псСвдонимы Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, Π²Ρ‹ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π² ΠΈΡ… использовании Ρ‡Ρ‚ΠΎ Π±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒ копию ΠΎΠ΄Π»Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΡ‚ Π΅Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ псСвдонимы Π² любоС врСмя ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° для Π²Π°ΡˆΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ† Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅. НапримСр, Ссли ваши Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΈ слоТныС ΠΈΠΌΠ΅Π½Π°, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ простыС ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ псСвдонимы, Ρ‚ΠΈΠΏΠ° a ΠΈ b, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСсто ΠΈΠΌΠ΅Π½ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ SELECT ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π΅. Они Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с соотнСсСнными подзапросами(обсуТдаСмыми Π² Π“Π»Π°Π²Π΅ 11).

Π•Π©Π• Π‘ΠžΠ›Π¬Π¨Π• ΠšΠžΠœΠŸΠ›Π•ΠšΠ‘ΠΠ«Π₯ ΠžΠ‘ΠͺΠ•Π”Π˜ΠΠ•ΠΠ˜Π™

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС число псСвдонимов для ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² запросС, хотя использованиС Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ SELECT * Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π»ΠΈΡˆΠ΅ΡΡ‚Π²ΠΎΠΌ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΠ»ΠΈ Π²Π°ΡˆΠΈΡ… Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρƒ. Компании Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ‚Ρ€Π΅Ρ… Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ², ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΎΠ²ΠΎΠ³ΠΎ значСния. Π’Ρ‹ Π»ΠΈΡ‡Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ° ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρƒ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ, Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ запрос Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ. (Π’Ρ‹Π²ΠΎΠ΄ показываСтся Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 9.3 ):


SQL Execution Log

SELECT a.cnum, b.cnum, c.cnum

FROM Customers a, Customers b, Customers c

WHERE a.rating=100

AND b.rating=200

AND c.rating=300;

AND c.rating=300;


cnum

cnum

cnum

2001

2002

2004

2001

2002

2008

2001

2003

2004

2001

2003

2008

2006

2002

2004

2006

2002

2008

2006

2003

2004

2006

2003

2008

2007

2002

2004

2007

2002

2008

2007

2003

2004

2007

2003

2008


Π’Π°Π±Π»ΠΈΡ†Π° 9.3 ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ значСниями Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π°

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, этот запрос Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² с трСмя значСниями ΠΎΡ†Π΅Π½ΠΊΠΈ, поэтому ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц состоит ΠΈΠ· Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠΎΠ² с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ 100, Π²Ρ‚ΠΎΡ€ΠΎΠΉ с 200, ΠΈ послСдний с ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ 300. Они ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ Π²ΠΎ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… комбинациях. Π­Ρ‚ΠΎ - сортировка Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° с GROUP BY ΠΈΠ»ΠΈ ORDER BY, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ столбцС Π²Ρ‹Π²ΠΎΠ΄Π°.