Bitte helfen Sie mir SQL vs C wie Programmierung zu verstehen?

8

Insbesondere versuche ich zu verstehen, wie sich SQL-Anweisungen von der normalen C-Stil-Programmierung unterscheiden. Ich kann anscheinend nicht verstehen, wie man "für jede Benutzer-ID in dieser Tabelle, die eine andere Spalte von Daten hat, führe diese gespeicherte Prozedur aus, "die bei der Programmierung eine for-Schleife wäre, wie zum Teufel machst du sowas?

Oder, für jede Zeile in Tabelle A, die eine contentID von 11 hat, fügen Sie eine neue Zeile zu tableB hinzu, die diese Daten enthält, und die userID aus der Zeile von tableA, die contentID von 11 ...

enthält

Würde es Ihnen etwas ausmachen, ein bisschen darüber zu schreiben, wie ich SQL-Anweisungen im Vergleich zur Programmierung verstehen sollte? Ich habe das Gefühl, ich könnte es besser handhaben, wenn ich verstehen würde, wie ich darüber nachdenken sollte ...

    
BigOmega 11.03.2009, 14:35
quelle

14 Antworten

17

Sie nähern sich der Welt aus verschiedenen Blickwinkeln. Bei C geht es darum, Aktionen auszuführen. Bei SQL geht es um das Speichern von Daten und das Manipulieren von Daten. Die einzigen "Aktionen", an denen es gut ist, sind das Ziehen und Ändern von Daten.

Denken Sie an all Ihre Daten wie ein Venn-Diagramm - Mit SQL können Sie jeden Teil dieses Diagramms "sehen" will.

Wenn Sie etwas mit diesen Daten tun möchten, dann könnten Sie in C sagen "Gehe zu jedem Benutzer und führe diese Aktion für sie aus", wie in

%Vor%

In SQL könnten Sie nach der Liste der Benutzer fragen, wie in:

%Vor%

Oder Sie können Daten bezüglich dieser Kunden ändern, wie in:

%Vor%

Beachten Sie, dass dieses UPDATE eine beliebige Anzahl von Zeilen beeinflussen kann, aber es gibt keine Schleife ... Sie sagen einfach: "Suchen Sie diese Datensätze und ändern Sie sie auf diese Weise".

Aber wenn Sie ihnen eine Erinnerung schicken wollten, nun, das ist einfach zu schade ... Sie müssen C oder eine gespeicherte Prozedur dafür verwenden.

Sie erhalten wirklich das Beste aus beiden Welten, wenn Sie eine traditionelle Sprache mit SQL kombinieren. Wenn Sie das frühere Beispiel in C durch dieses ersetzen können (Disclaimer: Ich weiß, dass das Pseudo-Code ist, ist es nur ein Beispiel):

%Vor%

Jetzt ist der Code besser lesbar und alle werden zur Laufzeit auf dieselbe Datenquelle verwiesen. Sie vermeiden auch den möglicherweise unordentlichen Code in C, der beim Erstellen Ihrer Kundenliste beteiligt gewesen wäre - jetzt ist es nur ein Datensatz.

Genau wie SQL bei imperativen Aktionen saugt, saugt C Datenmengen an. Zusammen können sie leicht Daten erhalten, sie manipulieren und Aktionen ausführen.

    
JosephStyons 11.03.2009, 15:00
quelle
6

Lass mich einen Riss machen. Ich nehme den langen Weg hier, also ertragen Sie mit mir.

Letztendlich bestehen alle Programme, Daten usw. auf einem Computer aus demselben Material: Einsen und Nullen. Nicht mehr, nicht weniger. Wie also weiß ein Computer, eine Menge von Einsen und Nullen als Bild und eine andere als eine ausführbare Datei zu behandeln?

Die Antwort ist Kontext. Es ist etwas, wofür die Menschen furchtbar gut sind, und es ist daher nicht verwunderlich, dass dies die Grundlage für vieles ist, was ein Computer tut. Die Mechanismen sind komplex, aber der Endergebnis ist ein Computer, der ständig die Perspektive wechselt, um unglaublich flexible Dinge mit einem unglaublich begrenzten Datensatz zu tun.

Ich bringe das auf, weil Computersprachen ähnlich sind. Am Ende enden ALLE Computersprachen, während eine Reihe von Op-Codes durch den Prozessor läuft. Mit anderen Worten, es ist Assemblersprache ganz unten. Alle Computersprachen sind Assemblersprachen, einschließlich jeglicher SQL-Implementierung.

Der Grund, warum wir uns darum kümmern, ist folgender: Programmiersprachen erlauben uns, eine nützliche Illusion zu schaffen, Probleme aus einer neuen Perspektive zu betrachten. Sie geben uns die Möglichkeit, ein Problem zu lösen und die Lösung neu zu gestalten.

Auf die Gefahr hin, Klischee zu sein, wenn uns die Antwort auf ein Problem nicht gefällt, erlaubt uns eine andere Programmiersprache, eine andere Frage zu stellen.

Wenn Sie sich also einer Sprache nähern, sei es eine Abfragesprache oder eine objektorientierte Sprache oder eine prozedurale Sprache, lautet Ihre erste Frage: "Was ist die Perspektive dieser Sprache? Wie sieht sie die Problemlösung aus? " Ich würde so weit gehen zu behaupten, dass eine Sprache ohne eine klare Vorstellung von sich selbst mehr Mühe macht, als sie wert ist.

Mit C würde ich vorschlagen, dass die Perspektive dies ist: "Sogar die Operationen auf tiefster Ebene von sehr unterschiedlichen Prozessoren können in einer einfachen, gemeinsamen Sprache beschrieben werden." C ist so konstruiert, dass es auf dem Fahrersitz eines beliebigen Prozessors sitzt, während das alte Lenkrad, die Pedale und der Armaturenbord immer noch dasselbe sind.

Also, mit C machst du alles. Deshalb wird es als "High-Level Assembly Language" bezeichnet. Oder, um einen Freund von mir zu zitieren: "C ist das Latein der Computersprachen. Die Sprache der Versammlung ist das Grunzen der Affen in den Bäumen."

SQL ist ein ganz anderes Biest mit einer ganz anderen Perspektive ... oder? SQL-Perspektive ist dies: "Selbst die komplexesten Befehle von sehr unterschiedlichen Datenbanken können in einer einfachen, gemeinsamen Sprache beschrieben werden."

Klingt vertraut, oder? SQL ist so konzipiert, dass Sie in den Fahrersitz einer Datenbanksoftware gelangen und das gleiche Lenkrad, Pedale, etc.

haben

Zusammenfassend ist C eine Sprache, die verwendet wird, um einer beliebigen CPU allgemein verständliche Befehle zu geben, während SQL eine Sprache ist, die verwendet wird, um jedem beliebigen Datenbank-Backend allgemein bekannte Befehle zu geben.

Nun, wo kreuzen sich die Wege? Es ist eigentlich ziemlich einfach.

Was macht eine CPU? Es empfängt, transformiert und sendet Informationen. Wenn Sie also Daten interpretieren und präsentieren oder Befehle von einem Endbenutzer akzeptieren möchten, arbeiten Sie in C. C ist für die Prozeduren , die Sie über den Computer automatisieren müssen.

>

Was macht eine Datenbank? Es speichert, gruppiert und ruft große Informationssätze ab. Wenn Ihr C-Programm zu irgendeinem Zeitpunkt einen großen Datensatz oder Teilmengen eines großen Datensatzes speichern, gruppieren oder abrufen muss, werden Sie wahrscheinlich mit einer Datenbank interagieren.

Wie? Indem Sie Ihr C-Programm natürlich SQL-Befehle an die Datenbank senden lassen. ;)

Ich hoffe, dass dies die Dinge etwas erleuchtet, denn sonst sehe ich nur aus wie ein pompöses So-und-was auch immer für diese lange, weitschweifige Antwort. :-P

    
Jason L 11.03.2009 15:04
quelle
5

SQL ist eine Abfragesprache, die für die Arbeit mit Datensätzen entwickelt wurde. Ich habe bemerkt, dass einige Programmierer den Fehler gemacht haben, eine große Ergebnismenge aus SQL zu erhalten und dann die Menge in C zu durchlaufen, um die Daten zu filtern. Der optimale Entwurf würde die Filterung in SQL so weit festlegen, dass die Datenbank den Satz auf den kleinsten Datensatz abschneidet, den Sie für Ihre Schleifen oder andere Geschäftslogik benötigen. Also im Grunde die Antwort auf Ihre Frage ist SQL verwenden, um Sie den kleinsten Datensatz zu erhalten, dann verwenden Sie C, um den Datensatz entsprechend der Geschäftslogik zu manipulieren.

    
webguyblake 11.03.2009 15:10
quelle
3

SQL-Operationen sind auf SETZEN von Daten. Sie können also solche Aktionen ausführen, um alle übereinstimmenden Datensätze zu bearbeiten.

%Vor%

Um eine FOR EACH-Operation auszuführen, müssen Sie einen Looping-Mechanismus verwenden. In SQL Server (Transact-SQL) Die am häufigsten verwendete solche Schleife wird als CURSOR bezeichnet und ermöglicht es Ihnen, jeweils in einer Ergebniszeile zu arbeiten. Hier ist ein Beispiel. Beachten Sie, dass Cursor im Vergleich zu set-Operationen schrecklich ineffizient sind benutze sie vorsichtig.

    
Chris Nava 11.03.2009 15:30
quelle
2

SQL wird das alles nicht für Sie tun. Sie müssen etwas wie T-SQL oder PL / SQL oder was auch immer Ihr Geschmack der Datenbank hat verwenden.

Ich fand dies , um ein ausgezeichneter Einstieg in Oracle PL zu sein / SQL. Verwenden Sie einen Trigger, um Ihren Prozess jedes Mal auszulösen, wenn ein INSERT oder UPDATE auftritt.

    
belgariontheking 11.03.2009 14:40
quelle
2

Der Hauptunterschied zwischen SQL und Sprachen wie C ist dies:

In SQL geben Sie an, wie Ihre Ergebnissätze aussehen sollen - dies macht es sehr gut zum Ausführen von Abfragen und zum Festlegen von Operationen. Beispiel:

"Gib mir alle Rechnungen mit einem Betrag & gt; 10" = & gt; SQL ermittelt, wie die Ergebnismenge erstellt und an Sie zurückgegeben wird,

In C geben Sie an, was Ihr Programm tun soll, um die Ergebnismenge abzurufen. Beispiel: "

  1. Listenelement
  2. Erstellen Sie eine Ergebnisliste,
  3. Holen Sie sich alle Rechnungen,
  4. Nimm die oberste Rechnung,
  5. Wenn Betrag & gt; 10, lege es in die Ergebnisliste, ansonsten entferne es,
  6. Wenn es mehr Rechnungen gibt, gehen Sie zu Schritt 4,
  7. Geben Sie die Ergebnismenge zurück. "

Die Frage ist dann: "Wie formuliere ich meine Frage in SQL, damit sie genau das macht, was ich will?", was etwas schwieriger ist.

    
Lennaert 11.03.2009 15:00
quelle
2

Im Wesentlichen ist SQL eine Set-basierte Sprache. Es arbeitet mit Datensätzen und unterscheidet sich stark davon, wie eine instruktionsbasierte Sprache funktioniert. In etwas wie C spezifizieren Sie die genauen Schritte, wie etwas funktionieren sollte. In einer Set-basierten Abfragesprache wie SQL müssen Sie Ihre Ansicht etwas ändern. Sie versuchen nicht, eine Operation auszuführen, die leicht in einfachen Schritten beschrieben werden kann. Sie versuchen, ein Ergebnis basierend auf der Beziehung zwischen den Datenmengen zu erstellen.

    
Alex Fort 11.03.2009 15:05
quelle
1

Erstens möchten Sie bei der Verwendung von SQL Schleifen um jeden Preis vermeiden. Schleifen ist in Datenbankbegriffen schlecht.

Sie möchten mit Datensätzen arbeiten und alle in einer Aktion beeinflussen.

"Führen Sie diese gespeicherte Prozedur für jede Benutzer-ID in dieser Tabelle aus, die über eine andere Spalte von Daten verfügt, die dieser oder jener entspricht." Dies wäre in SQl eine schlechte Sache. Im Allgemeinen möchten Sie eine neue Prozedur schreiben, die auf einem Set basiert. Nehmen Sie zum Beispiel an, dass Ihr sp eine einfache Einfügung ausführt, wobei @test und @ test2 Eingabevariablen sind.

%Vor%

Um auf eine Gruppe von Werten angewendet zu werden, ist es besser, die Wertegruppe in eine temporäre Tabelle oder Tabellenvariable zu stellen (oder sie können tatsächlich Werte sein, die Sie aus einer vorhandenen Datentabelle ziehen können)

Ihre neue Einfügung wird jetzt etwas wie

%Vor%

Der Grund dafür ist, dass set-basierte Operationen viel schneller sind als zeilenweise.

Die ersten Dinge, mit denen Sie sich im Umgang mit SQL vertraut machen müssen, sind Joins, set-basierte Operationen, die Anweisung insert, die Update-Anweisung, delate stament und die select-Anweisung. Stellen Sie sicher, dass Sie wissen, wie Joins in allen Action-Anweisungen und Selects effektiv verwendet werden können. Hier ist ein Link, der Ihnen hilft, Joins zu verstehen Ссылка

Sie können Jahre damit verbringen, SQl zu schreiben, ohne jemals einen Cursor oder eine Schleife zu verwenden.

Um den Unterschied zwischen einer Sprache wie C und SQL zu erkennen, ist SQL im Grunde eine spezielle Art von Sprache, die sich mit Datenbankoperationen beschäftigt. C kümmert sich weniger um den Zugriff auf die Daten als darum, wie die gesamte Anwendung funktioniert. Da sie unterschiedliche Zwecke haben, nähern sie sich den Dingen sehr unterschiedlich an. Sehr wenig von dem, was Sie von C wissen, gilt für SQL. Sie sind wirklich Äpfel und Orangen.

Eine Sache, über die Programmierer gerne meckern, ist, dass SQL nicht objektorientiert ist. Versuchen Sie nicht, es objektorientiert oder objektorientiert zu machen. Das ist, als würde man einem Schwein Lippenstift aufsetzen. Es bringt nichts und es ärgert das Schwein (d. H. Es macht die Datenbank weniger als optimal).

    
HLGEM 11.03.2009 15:03
quelle
1

Beide sind Programmiersprachen (beide Turing sind abhängig von Ihrem genauen SQL-Dialekt), jedoch ...

C (C ++, C #, Java, Visual Basic) sind Prozedurale Programmiersprachen. Sie geben eine Abfolge von Schritten für den Computer an. Der Computer versteht das Ziel nicht, es tut nur, was Sie ihm sagen. Betrachten Sie dies als einen Bottom-Up-Ansatz für die Programmierung.

SQL (Haskell, LISP, wenn es sich anfühlt) sind funktionale Programmiersprachen. Sie geben ein Ziel an, und der Computer ermittelt die beste Abfolge von Ereignissen, um ihn zu erreichen. Stellen Sie sich dies als einen Top-down-Ansatz für die Programmierung vor.

Beide Ansätze haben ihre Vor- und Nachteile.

Funktionale Sprachen leiden unter der Tatsache, dass es schwierig ist, eine Sprache zu erstellen, die alle Arten von Problemen versteht - wenn dies möglich wäre, wären alle Programmiersprachen funktionsfähig und wir würden nur beschreiben, was wir tun müssen. Stattdessen konzentrieren sich die meisten funktionalen Sprachen auf eine kleine Problemmenge, wie Mathematik, oder im Fall von SQL, Lesen und Schreiben eines relationalen Datensatzes.

Verfahrenssprachen leiden unter der Tatsache, dass der Programmierer alles mikromanagen muss. Während der Compiler sich um die Registerzuweisung und andere kleine Optimierungen kümmert, kann er keine größeren Dinge tun, wie das gesamte Programm neu organisieren, um es besser an das Dataset anzupassen, oder es automatisch so umstrukturieren, dass es auf mehreren parallelen CPUs läuft.

    
David 11.03.2009 17:36
quelle
0

SQL kann nicht tun, was Sie wollen, es ist eine Sprache, um Daten basierend auf bestimmten Kriterien wie Datensätze nach einer bestimmten Zeit oder mit einer bestimmten Textzeichenfolge zu erhalten. Datenbanken haben Erweiterungen in der SQL-Sprache, die es Ihnen ermöglichen, nach der Rückgabe Ergebnisse zu bearbeiten. Bei Oracle ist es PL / SQL und bei SQL Server ist es T-SQL.

    
Jared 11.03.2009 14:49
quelle
0

Der Trick besteht darin, dass SQL am besten für Mengenoperationen, nicht für Schleifen, verwendet wird. Sie möchten, dass die gespeicherte Prozedur eine Funktion ist, und dann einen Apply-Operator verwenden, um die Funktion auf die entsprechenden Zeilen anzuwenden und eine Menge von Ausgaben der Funktion zu erzeugen.

Der APPLY-Operator ist hier dokumentiert: Ссылка . Leider ist das Beispiel zu komplex, aber hier ist ein Beispiel für die Verwendung:

%Vor%

Dies erzeugt ein Rowset der Spalten aus den Abteilungen und ruft dann die Funktion für jede Zeile auf, wobei die Spalte depntmgrid übergeben wird. Für jeden Funktionsaufruf, der ein Ergebnis zurückgibt, wird dieses Ergebnis zur endgültigen Ergebnismenge hinzugefügt.

Beachten Sie, dass es alle Sätze sind - keine Schleifen.

    
John Saunders 11.03.2009 14:39
quelle
0

SQL ist eine Sprache, um eine Datenbank nach Datensätzen abzufragen. Obwohl Sie sie für andere Operationen verwenden können, sollten Sie sie nur für schwere Operationen verwenden, die mit großen Teilen verwandter Daten arbeiten. Trotz seiner S (Standard) in seinem Namen, ist es nicht standardmäßig in allen Funktionen für verschiedene DBMSs. Die Implementierung für MS SQL Server ist Transact SQL oder T-SQL.

C ist eine Allzwecksprache. Sie können Programme für alles schreiben, was Sie wollen, aber Sie sollten damit nicht machen, was Sie mit SQL tun können (obwohl Sie das können).

>

Tatsächlich sind sie komplementär .

Sie können viele Informationen mit einer einfachen Suche in Google finden. Sie können den Wikipedia-Artikel dazu lesen oder ein Tutorial .

    
eKek0 11.03.2009 14:57
quelle
0

Auf der Definitionsebene ist C eine prozedurale Sprache und SQL ist weitgehend eine deklarative Sprache. Sie kennen prozedurale Sprachen - der Programmierer sagt dem Computer, was er tun soll. Oder anders gesagt, der Programmierer definiert eine Prozedur, der der Computer folgt, um (hoffentlich) irgendeine Art von Aufgabe auszuführen.

Im Gegensatz dazu sagt eine deklarative Sprache dem Computer, was er produzieren soll. Anstatt eine Prozedur zu definieren, definiert der Programmierer das Ergebnis, das er zu erreichen versucht. Die Sprache selbst wurde vorprogrammiert, um das richtige Verfahren zum Erzeugen des definierten Ergebnisses zu finden.

Es gibt viele deklarative Computersprachen, von denen SQL wahrscheinlich am bekanntesten ist. Im Allgemeinen basieren sie auf Mathematik, einer verallgemeinerten deklarativen Sprache. Wie andere bereits festgestellt haben, basiert SQL auf der Mengenlehre. Genauer gesagt basiert es auf dem sehr effektiven relationalen Modell , das von Edgar Codd definiert wurde. Es gibt zwar eine Menge über die Theorie hinter SQL (und RDBMS im Allgemeinen) zu sagen, aber es geht um die einfache Idee, Tabellen zu verwenden, um die Beziehungen zwischen Daten zu definieren.

Die einzige Wendung in der Idee, dass SQL eine deklarative Sprache ist, ist, dass jede Anweisung auch ein prozedurales Element hat. Zur Veranschaulichung:

%Vor%

SELECT x ist eine Prozedur zum Auswählen (oder Auswählen) einer Teilmenge. FROM table definiert, auf welche Beziehungen (oder Tabellen) zugegriffen werden soll. WHERE y = 0 ist der deklarative Teil der Anweisung. Es definiert eine Teilmenge der Daten, die bearbeitet werden.

Inzwischen hat C einige deklarative Merkmale. Zum Beispiel:

%Vor%

In diesem Fall teilen Sie dem Computer nicht mit, wie zwei Zahlen zu multiplizieren sind. Stattdessen fragen Sie den Computer nach einem Ergebnis und der C-Compiler definiert die Prozedur, um die Aufgabe auszuführen.

    
Jon Ericson 11.03.2009 17:51
quelle
0

Wie oben erwähnt, ist SQL eine deklarative Sprache, C ist prozedural. Eine SQL-Anweisung deklariert was zu tun ist, der Compiler entscheidet wie . In einer 'normalen' Sprache wie C spezifiziert eine Funktion oder Methode was und wie Manipulationen mit Daten ausgeführt werden müssen. Es gibt einige Aufgabenarten, die nicht nur mit SQL gelöst werden können. Es gibt Aufgaben, die viel einfacher mit "normalen" Programmiersprachen, zum Beispiel Rekursion, implementiert werden können. Moderne DBMS (Oracle, MS SQL, PostgreSQL und andere unterstützen rekursive Abfragen, aber solche Lösungen sind weniger intuitiv und oft schwer zu verstehen im Vergleich zu Implementierungen in 'normalen' Sprachen.

    
Andrushenko Alexander 22.08.2016 21:05
quelle

Tags und Links