2016-11-05 4 views
0

Ich habe eine - vielleicht einfache - Frage darüber, wie und select ... from viewname ausgewertet wird. Ich weiß, wie man Ansichten erstellt und sie verwendet, aber ich muss die Vorgehensweise dieser beiden Befehle grafisch und mit Text für meine Schule erklären.Wie wird "create view" in SQL ausgewertet?

Nun, ich folgendes (ich bin mit Microsoft SQL Server 2012 im Moment, aber das sollte keine Rolle spielen, tut es Ich möchte es für MySQL wissen, ob es Unterschiede?):

-- create a Schema for the test 
create schema TEMP 
go 

-- create the view 
create view TEMP.VLT as 
select LNR,TNR,MENGE 
from LTP.LTP 
go 

-- select the data from the view 
select * from TEMP.VLT 

Ein view ist so etwas wie ein Alias ​​für eine Select-Abfrage, die in etwa wie eine Unterabfrage ausgewertet wird, oder? Wenn ja, bin ich richtig, dass

select * from TEMP.VLT 

das gleiche ist wie

select * from (select LNR,TNR,MENGE from LTP.LTP) as VLT 

?

Ich meine, ich weiß, dass es das gleiche Ergebnis gibt, aber ist es tatsächlich auf die gleiche Weise ausgewertet, oder liege ich falsch?

Vielen Dank für die Antwort! eisenbahnfan

+0

Ich entfernte das mysql-Tag, weil der Code eindeutig SQL Server ist. –

+0

Danke - aber, wie gesagt, ich wollte auch für mysql wissen, ob es Unterschiede gibt. Also dachte ich, es könnte ok sein, auch dieses Tag zu benutzen ... – eisenbahnfan

Antwort

0

Ihr Verständnis ist auf einem sehr hohen Niveau korrekt enthält. Erstens können die Ansichten in den Datenbanken unterschiedlich sein. Vor allem MySQL hat eine Reihe von Einschränkungen, wie z. B. keine Unterabfragen in der Klausel FROM. Aber tatsächlich arbeitet MySQL so, wie Sie es beschreiben.

Sie haben das richtige Verständnis im Allgemeinen. Der Code der Sicht wird in die Abfrage zusammengeführt, auf die verwiesen wird. Hier ist eine spezifische Sprache in der documentation:

Wenn eine SQL-Anweisung, um eine nicht indizierte Sicht verweist, den Parser und Abfrageoptimierer analysieren die Quelle sowohl der SQL-Anweisung und die Ansicht und dann lösen sie zu einem einzigen Ausführungsplan . Es gibt keinen einen Plan für die SQL-Anweisung und einen separaten Plan für die Ansicht.

Es gibt eine Art von Ansicht namens "indizierte Ansichten", die tatsächlich die Daten materialisieren. In diesem Fall wird der Code für die Ansicht nicht tatsächlich ausgeführt, aber die Ergebnisse werden in der Abfrage verwendet.

+0

Vielen Dank für Ihre Antwort! ...........Aber ich habe die Unterabfrage in der from-Klausel in MySQL ausprobiert, und es hat funktioniert ('mysql> wähle * aus (wähle * aus test) als X;') – eisenbahnfan

+0

@eisenbahnfan. . .Das funktioniert nicht in einer Ansicht. Sie können die Einschränkung hier überprüfen: http://dev.mysql.com/doc/refman/5.7/en/view-restrictions.html. –

0

Sie haben Recht. In SQL ist a.view nur eine logische Abstraktion. Nicht zu verwechseln mit materialisierten Ansichten (in Oracle, andere DB haben unterschiedliche Namen), die stattdessen replizierte Daten über eine Abfrage in festen Zeitintervallen

+0

Vielen Dank für diese sehr schnelle Antwort! Also meinst du, in Oracle sind die Daten so etwas wie eine Kopie, die etwa in einem Cronjob oder nach einem Insert/Update-Trigger aktualisiert wird? (Ich weiß, dass dies ein bisschen off-topic ist, als ich nach MS SQL-Svr und MySQL gefragt habe, aber das interessiert mich jetzt ;-)) – eisenbahnfan

+0

Nein. In Orakel ist eine Ansicht eine logische Struktur, die "versteckt". eine Anfrage. Außerdem gibt es eine Struktur namens materialisierte Ansicht, die sich so verhalten, wie Sie gerade gesagt haben – Massimo