Scrierea în tabelul sql c. Modifică cererile folosind instrucțiuni SQL

Scrierea în tabelul sql c.  Modifică cererile folosind instrucțiuni SQL
Scrierea în tabelul sql c. Modifică cererile folosind instrucțiuni SQL

Acest articol este dedicat completării tabelelor bazei de date cu date, adică vom studia comenzile SQL pentru inserarea de noi înregistrări. Trebuie spus că înregistrarea într-un tabel se poate face în două moduri:

Metoda numărul 1.
Să încercăm să adăugăm o intrare despre noua țară la tabelul țărilor. Sintaxa de adăugare va fi următoarea:
INSERT INTO table_name (câmp_1, câmp_2, ...) VALUES (Valoare_1, Valoare_2, ...); Pe baza structurii tabelului nostru, interogarea SQL va fi astfel:
INSERT INTO country (nume_țară, nume_acronym) VALUES ("Rusia", "RU"); Așa am adăugat în tabelul nostru o intrare despre țara „Rusia”. Totul aici ar trebui să fie clar și simplu, principalul lucru este să vă uitați cu atenție la ce câmpuri indicați în primele paranteze și să scrieți valorile în aceeași ordine în a doua.

Metoda nr. 2.
A doua metodă, după părerea mea, este puțin mai simplă, din moment ce vezi ce atribuiți și cărui câmp. Credeți-mă, dacă un tabel are un număr mare de coloane, este foarte ușor să confundați sau să treceți cu vederea ordinea câmpurilor din primele și ordinea valorilor din a doua paranteză. Sintaxa celei de-a doua metode este:
INSERT INTO table_name SET câmp_1 = Valoare_1, câmp_2 = Valoare_2, ... ; Să mergem mai departe în acest exemplu Să adăugăm câteva informații la tabel persoane, deoarece există mai multe câmpuri, iar avantajul celei de-a doua metode se va simți imediat:
INSERT INTO persons SET first_name="Ivan", last_name="Dulin", registration_date="2012-06-14", country="1"; Acum tabelul nostru conține următoarele date:


Probabil ați observat că nu am specificat o valoare pentru vârstă, dar s-a dovedit a fi completată... Totul este corect - pt. a acestui domeniu setăm valoarea implicită la 25. Așa că acum Ivan Dulin nostru este listat în baza de date cu o vârstă de 25 de ani. Poate să nu fie cel mai bun exemplu să setați o valoare implicită pentru câmpul de vârstă, dar puteți seta astfel de proprietăți la câmpuri precum, de exemplu, evaluarea utilizatorului site-ului sau numărul de vizualizări ale paginii. Ele sunt setate inițial la 0.

De asemenea, ar trebui să acordați atenție formatului de dată în MySQL: AAAA-LL-ZZ. Dacă nu respectați, atunci intrările dvs. pur și simplu nu vor fi introduse în tabel.

După cum puteți vedea, câmpul de profesie este completat ca NULL, aceasta este o valoare goală. Pentru acest domeniu.

În plus, luați în considerare următoarea comandă:
ÎNCĂRCAȚI DATELE LOCAL INFILE „D:\zapros.txt” ÎN TABEL persoane; Ce crezi că am făcut acum?! Și am făcut următoarele: am adăugat date în tabel persoane din dosar cereri.txt, care se află pe unitatea D. Informațiile din fișier ar trebui să aibă următoarea structură:


Structura de date a fișierului trebuie să îndeplinească următoarele cerințe:
  1. Fiecare intrare nouă trebuie descrisă pe un rând nou
  2. Datele trebuie specificate pentru absolut toate câmpurile. După cum puteți vedea, am specificat valoarea NULL pentru câmpul id, deoarece este auto-incrementare, astfel încât MySQL însuși va introduce valoarea necesară.
  3. Câmpurile sunt separate unul de celălalt printr-un caracter de tab (tasta Tab).
  4. Informațiile pe care le introduceți trebuie să se potrivească cu tipurile de date ale câmpului specific. Adică, de exemplu, o dată în formatul AAAA-LL-ZZ, un număr întreg pentru număr întreg etc.
Astfel, ați învățat cum să introduceți date noi în tabelele bazei de date. Pentru a consolida materialul pe care l-ați studiat, introduceți dvs. următoarele informații:

Tabelul de profesie:

Tabelul persoanelor:

prenume nume vârstă data_înregistrării ţară profesie
Leonid Bilak 45 2012-06-20 2 1
Yuri Nazarov 22 2012-06-21 3 1
Alla Savenko 25 2012-06-22 2 3
Irina Nikolaeva 31 2012-06-22 1 3

Asigurați-vă că adăugați aceste intrări, deoarece vom avea nevoie de ele pentru studiul nostru. instrucțiunea SELECT(selectarea informațiilor din baza de date), pe care o vom lua în considerare în următorul (al patrulea) articol despre studierea interogărilor SQL.

Uneori, programatorii au o dorință arzătoare de a citi ceva din baza de date. Programatorii devin nervoși și iritabili, pierd somnul și își îndreptă frenetic cu degetul spre tastatură. De dragul beneficiului tuturor și al păcii în lume, să ne uităm la o gestionare simplă a bazelor de date din C# folosind ADO.NET și OLE DB. Deși acest mecanism acceptă diferite baze de date precum Oracle, aici și acum vom folosi MS SQL Server.

Două sarcini principale atunci când lucrați cu o bază de date

2. Executarea unei comenzi SQL care face ceva pe server (inserarea, actualizarea, ștergerea, apelarea unei funcții sau a unei proceduri stocate

3. Citire secvenţială din selecţia de selectare linie cu linie. Utilizat în principal în aplicațiile web, în ​​aplicațiile desktop, este mai ușor să descărcați întreaga selecție deodată RAM, economiile din citirea numai a rândurilor necesare sunt neglijabile.

4. Caz rar. Actualizare automată tabele din baza de date pe baza modificărilor din DataTable (de obicei editate printr-o interfață vizuală). În viața reală, datele sunt de obicei citite printr-o interogare sau vizualizare complexă de alăturare heap, astfel încât sincronizarea automată nu este potrivită.

Principalele clase utilizate în aceste scopuri: OleDbConnection - o conexiune la baza de date, creată cu un șir care conține parametrii de conexiune, open, close, OleDbCommand - creat cu o instanță de conexiune și o comandă sql, dacă trebuie doar să efectuați o actualizare sau să obțineți o singură valoare, atunci aceasta este o clasă suficientă, OleDbDataAdapter - creat cu OleDbCommand, specializat în citirea unică a seturi de rânduri dintr-un DataTable, poate crea automat coloane DataTable pe baza unei selecții, transferă modificări din DataTable într-un tabel din baza de date, OleDbDataReader - citirea secvențială a rândurilor din DataTable pe rând (funcționează intern OleDbDataAdapter), DataTable / DataSet - containerul principal pentru date. Enumerarea OleDbType stochează tipurile de date ale bazei de date.

Utilizarea System.Data; folosind System.Data.OleDb; // șir de conexiune, sistem utilizat utilizatorii de Windows

(Securitate integrată=SSPI;) string connString = "Furnizor=SQLOLEDB.1;Securitate integrată=SSPI;Persist Security Info=False;Initial Catalog=databaseName;Data Source=serverName"; // șir de conexiune alternativ folosind autentificare MS SQL Server // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = OleDbConnection nou (connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter ("selectați COLUMNA1, COLONAȚA 2 din TEST_TABLE ORDER BY COLUMN2", dbConn); // structura internă a unui tabel gol va fi creată automat pe baza datelor citite dacă structura tabelului a fost deja specificată (de exemplu, printr-un DataSet tastat), atunci datele vor fi scrise în coloane cu nume potrivite sau noi; coloanele vor fi adăugate dbAdapter.Fill(someDataTable); // o opțiune alternativă pentru completarea unui tabel într-un DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();.

2. Executarea unei comenzi SQL care face ceva pe server (inserarea, actualizarea, ștergerea, apelarea unei funcții sau a unei proceduri stocate De remarcat în special sunt problemele cu datele. Implementarea datelor în .Net este extrem de strâmbă - inițial datele nu pot fi goale, dar în viața reală sunt goale tot timpul. Cel mai mult- utilizați o clasă specială de date care corectează greșelile programatorilor Microsoft. Dezvoltatorii mai leneși păstrează toate datele din cod ca șiruri de caractere și le convertesc în DateTime numai atunci când este necesar, de exemplu atunci când scriu într-o bază de date sau DataTable. Nullable DateTime nu ajută, deoarece ar trebui să arate o dată goală în interfață linie goală, iar atunci când este scris în baza de date ca DBNull.Value - chiar și banalul nul din cod nu este convertit în aceste valori fără dans suplimentar cu o tamburină.

Prima opțiune implică pur și simplu îmbinarea unui șir de interogare. Considerat o practică proastă și mai ales periculos în aplicațiile web, deoarece este vulnerabil la atacurile hackerilor. Problema cu datele goale nu este atât de ușor de rezolvat. În plus, când se lucrează cu date, apare problema suplimentara- formate diferite de șir de date în funcție de setările regionale ale .Net Framework, mediul de dezvoltare și serverul sql. Poate părea suprarealist - aceeași interogare funcționează în SQL Managment Studio, dar se blochează atunci când este executată din cod. Salvat parțial de formatul special al șirului de date. Cu toate acestea, acest lucru se face adesea în programe mici pentru uz intern, a căror existență nu va ști niciodată lumea exterioară.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +""); dbCommand.ExecuteNonQuery();

Opțiunea corectă implică crearea unei comenzi cu un set de parametri puternic tipați. Considerați că paragraful anterior nu a existat.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALORI (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add ("DATETIME_COLUMN", OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add ("DATETIME_COLUMN", OleDbType.DateTime). Convert.ToDateTime(stringDate); dbCommand.ExecuteNonQuery();

Procedura stocată este apelată exact în același mod, de dragul diversității există o altă opțiune pentru scrierea valorilor în parametri (nu are legătură în mod specific cu procedura stocată):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1", OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2", OleDbType.VarChar); someDbComm.Parameters.Value = "Fiecare problemă are întotdeauna o soluție - simplă, convenabilă și, desigur, greșită"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}

O versiune extinsă a descrierii parametrului care indică dimensiunea câmpului și se leagă la o anumită coloană a tabelului.

DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Value = stringVariable;

Dacă nu trebuie să legăm un parametru de comandă la un anumit câmp DataTable, atunci este mai bine să nu specificăm deloc dimensiunea, de exemplu, dacă șirul este mai mic decât lungimea Varchar specificată, atunci cadrul .Net bun va adăuga spații la șir până la lungimea specificată, corupând datele transmise către server.

Valoarea unui singur câmp este citită de metoda ExecuteScalar().

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECTARE TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int rezultat = Convert.ToInt32(dbCommand.ExecuteScalar());

Trebuie remarcat mai ales că ExecuteScalar returnează Object și dacă cererea nu a returnat absolut nimic, atunci rezultatul va fi nul și conversia la un tip de date normal va eșua cu o eroare. Dacă este posibilă o situație în care nu primim nimic ca răspuns, atunci trebuie să facem acest lucru:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECTARE TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; obiect resultObj = dbCommand.ExecuteScalar() int rezultat = -1; // valoarea implicită înseamnă rezultat gol if(resultObj != null) (rezultat = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. Citire secvențială din selectare linie cu linie
Citirea unui rând (mai multe sunt citite în buclă);

OleDbCommand dbCommand = OleDbCommand nou (selectați PERSON_ID, NAME, SURNAME din TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); nume șir = Convert.ToString(dbReader["NUME"]); șir de familie = Convert.ToString(dbReader["SURNAME"]); dbReader.Close();

4. Caz rar. Actualizarea automată a unui tabel din baza de date pe baza modificărilor din DataTable (editat de obicei printr-o interfață vizuală).

Este necesar să scrieți patru comenzi pentru DbAdapter pentru fiecare caz posibil - selectați, inserați, actualizați, ștergeți.

DbAdapter.InsertCommand = new OleDbCommand ("inserați în TEST_TABLE (NUME, FAMILIE, VÂRĂ) valori (?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // pentru tipurile de date cu lungime constantă, lungimea specificată în comandă este ignorată dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // adaugă o comandă de actualizare dbAdapter.UpdateCommand = new OleDbCommand("update TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? unde ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NAME", OleDbType.VarChar,100, "NAME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add(„VÂRSTA”, OleDbType.Integer, 100, „VÂRSTA”); dbAdapter.UpdateCommand.Parameters.Add(„ID”, OleDbType.Integer, 100, „ID”); // adaugă o comandă de ștergere dbAdapter.DeleteCommand = new OleDbCommand("șterge din TEST_TABLE unde ID = ?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add(„ID”, OleDbType.Integer, 100, „ID”); try ( // transferă toate modificările din DataTable în tabelul din baza de date dbAdapter.Update(table); ) catch (Eroare de excepție) ( MessageBox.Show("Eroare la salvarea datelor!" + error.Message); return; ) MessageBox . Show("Modificări salvate!");



Conținutul articolului
1. Cele mai simple interogări MySQL
2. Interogări simple SELECT
3. Interogări simple INSERT (intrare nouă).
4. UPDATE simplă(rescrie, anexează) interogări
5. Interogări simple DELETE (ștergeți înregistrarea).
6. Interogări simple DROP (ștergere tabel).
7. Interogări complexe MySQL
8. Interogări MySQL și variabile PHP

1. Cele mai simple interogări SQL

1. Afișează o listă cu TOATE bazele de date.

SHOW baze de date;
2. Listează TOATE tabelele din baza de date nume_base.

SHOW tabele în baza_name;

2. Interogări simple SELECT la baza de date MySQL

SELECTA– o interogare care selectează datele existente din baza de date. Puteți specifica parametrii de selecție specifici pentru selecție. De exemplu, esența cererii în limba rusă sună astfel: SELECTAȚI astfel de coloane FROM așa sau așa tabel WHERE parametrul unei astfel de coloane este egal cu valoarea.

1. Selectează TOATE datele din tabelul tbl_name.

SELECT * FROM nume_tbl;
2. Afișează numărul de înregistrări din tabelul tbl_name.

SELECT count(*) FROM nume_tbl;
3. Selectează (SELECT) din tabelul (FROM) tbl_name limit (LIMIT) 3 înregistrări, începând de la 2.

SELECT * FROM tbl_name LIMIT 2,3;
4. Selectează (SELECT) TOATE (*) înregistrările din tabelul (FROM) nume_tbl și le sortează (ORDER BY) după câmpul id în ordine.

SELECT * FROM tbl_name ORDER BY id;
5. Selectează (SELECT) TOATE înregistrările din (FROM) tabelul tbl_name și le sortează (ORDER BY) după câmpul id în ordine inversă.

SELECT * FROM tbl_name ORDER BY id DESC;
6. Selectează ( SELECTA) TOATE (*) înregistrările de la ( DIN) tabele utilizatoriiși le sortează ( COMANDA PENTRU) peste câmp idîn ordine crescătoare, limită ( LIMITĂ) primele 5 intrări.

SELECTAȚI * DIN utilizatori COMANDĂ PENTRU ID LIMIT 5;
7. Selectează toate înregistrările din tabel utilizatorii, unde este câmpul fname corespunde valorii Gena.

SELECT * FROM utilizatorii WHERE fname="Gena";
8. Selectează toate înregistrările din tabel utilizatorii, unde valoarea câmpului fnameîncepe cu Ge.

SELECTAȚI * FROM utilizatorii WHERE fname LIKE „Ge%”;
9. Selectează toate înregistrările din tabel utilizatorii, Unde fname se termină cu N / Ași sortează înregistrările în ordine crescătoare a valorii id.

SELECTAȚI * FROM users WHERE fname LIKE „%na” ORDER BY id;
10. Selectează toate datele din coloane fname, numele de la masă utilizatorii.

SELECT fname, lname FROM utilizatori;

11. Să presupunem că aveți o țară în tabelul cu datele utilizatorilor. Deci, dacă doriți să afișați NUMAI o listă de valori care apar (astfel încât, de exemplu, Rusia să nu fie afișată de 20 de ori, ci doar o dată), atunci folosim DISTINCT. Va scoate Rusia, Ucraina, Belarus din masa valorilor repetate. Astfel, de la masă utilizatorii difuzoare ţară Vor fi scoase TOATE valorile UNICE

SELECTAȚI ȚARA DISTINȚĂ FROM utilizatori;
12. Selectează TOATE datele rândului din tabel utilizatorii Unde vârstă are valorile 18,19 și 21.

SELECTAȚI * FROM utilizatorii WHERE age IN (18,19,21);
13. Selectează valoarea MAXIMĂ vârstăîn tabel utilizatorii. Adică dacă ai cea mai mare valoare din tabelul tău vârstă(de la vârsta engleză) este 55, atunci rezultatul interogării va fi 55.

SELECTează max(vârsta) FROM utilizatori;
14. Selectați datele din tabel utilizatorii pe câmpuri numeŞi vârstă UNDE vârstă ia cea mai mică valoare.

SELECT numele, min(vârsta) FROM utilizatori;
15. Selectați datele din tabel utilizatorii peste câmp nume UNDE id NU ESTE EGAL CU 2.

SELECT numele de la utilizatori WHERE id!="2";

3. Interogări simple INSERT (intrare nouă).

INTRODUCE– o interogare care vă permite să inserați INITIAL o înregistrare în baza de date. Adică creează o înregistrare NOUĂ (linie) în baza de date.

1. Face noua intrareîn tabel utilizatorii, în câmp nume inserează Serghei, iar în câmp vârstă inserează 25. Astfel, se adaugă la tabel linie nouă cu aceste valori. Dacă există mai multe coloane, atunci cele rămase vor rămâne fie goale, fie cu valori implicite.

INSERT INTO utilizatori (nume, vârstă) VALUES ("Sergey", "25");

4. Interogări simple UPDATE la baza de date MySQL

UPDATE– o interogare care vă permite să RESERVAȚI valorile câmpurilor sau să ADĂUGAȚI ceva la un rând deja existent în baza de date. De exemplu, există o linie gata făcută, dar parametrul de vârstă trebuie rescris în ea, deoarece s-a schimbat în timp.

1. În tabel utilizatorii vârstă devine 18.

UPDATE utilizatori SET varsta = "18" WHERE id = "3";
2. Totul este la fel ca în prima solicitare, este pur și simplu afișată sintaxa solicitării, unde două sau mai multe câmpuri sunt suprascrise.
În tabel utilizatorii WHERE id este egal cu valoarea a 3 câmpuri vârstăîmplinește 18 ani și ţară Rusia.

UPDATE utilizatori SET varsta = "18", tara = "Rusia" WHERE id = "3";

5. Interogări simple DELETE (șterge înregistrare) în baza de date MySQL

ŞTERGE– o interogare care șterge un rând dintr-un tabel.

1. Îndepărtează un rând din tabel utilizatorii UNDE id este egal cu 10.

DELETE FROM users WHERE id = "10";

6. Interogări simple DROP (ștergere tabel) la o bază de date MySQL

PICĂTURĂ– o interogare care șterge un tabel.

1. Şterge întregul tabel nume_tbl.

DROP TABLE nume_tbl;

7. Interogări complexe către baza de date MySQL

Interogări interesante care pot fi utile chiar și pentru utilizatorii experimentați

SELECTează id, numele, țara FROM utilizatori, administratori WHERE TO_DAYS(NOW()) - TO_DAYS(data_înregistrării)<= 14 AND activation != "0" ORDER BY registration_date DESC;
Această interogare complexă SELECTEAZĂ coloane id, nume, țarăÎN TABELE utilizatori, admini UNDE data_înregistrării(data) nu mai vechi 14 zilele I activare NU EGAL 0 , FILTREAZĂ DUPĂ data_înregistrăriiîn ordine inversă (noul mai întâi).

UPDATE utilizatori SET varsta = "18+" WHERE varsta = (SELECTARE varsta DIN utilizatori WHERE barbat = "barbat");
Mai sus este un exemplu de așa-numitul cerere în cadrul unei cereriîn SQL. Actualizați vârsta utilizatorilor la 18+, unde sexul este masculin. Nu recomand astfel de opțiuni de solicitare. Din experiența personală, voi spune că este mai bine să creați mai multe separate - acestea vor fi procesate mai repede.

8. Interogări de baze de date MySQL și PHP

În interogările MySQL într-o pagină PHP, puteți insera variabile ca valori comparate etc. Câteva exemple

1. Selectează toate înregistrările din tabel utilizatorii, unde este câmpul fname corespunde valorii variabilei $nume.

SELECT * FROM utilizatorii WHERE fname="$nume";
2. În tabel utilizatorii WHERE id este egal cu valoarea a 3 câmpuri vârstă modificări ale valorii variabilei $age.

UPDATE utilizatorii SET age = "$age" WHERE id = "3";

Atenţie! Dacă sunteți interesat de orice alt exemplu, atunci scrieți o întrebare în comentarii!

Ștergerea intrărilor

Pentru a elimina înregistrările dintr-un tabel, utilizați operatorul DELETE:

DELETE FROM Tablename WHERE condiție;

Acest operator elimină înregistrările (nu valorile individuale ale coloanelor) din tabelul specificat care îndeplinesc condiția specificată. O condiție este o expresie logică, ale cărei diferite construcții au fost discutate în laboratoarele anterioare.

Următoarea interogare șterge înregistrările din tabelul Client unde valoarea coloanei LName este „Ivanov”:

ȘTERGERE DE LA Client

WHERE LName = „Ivanov”

Dacă tabelul conține informații despre mai mulți clienți cu numele de familie Ivanov, atunci toți vor fi șterși.

Instrucțiunea WHERE poate conține o subinterogare pentru selectarea datelor (instrucțiunea SELECT). Subinterogările dintr-o instrucțiune DELETE funcționează exact la fel ca într-o instrucțiune SELECT. Următoarea interogare elimină toți clienții din orașul Moscova, în timp ce identificatorul unic al orașului este returnat folosind o subinterogare.

ȘTERGERE DE LA Client

WHERE IdCity IN (SELECTARE IdCity FROM City WHERE CityName = „Moscova”)

Transact-SQL extinde SQL standard, permițându-vă să utilizați o clauză FROM suplimentară într-o instrucțiune DELETE. Această extensie, care specifică o îmbinare, poate fi utilizată în locul unei subinterogări în clauza WHERE pentru a specifica rândurile care urmează să fie șterse. Vă permite să specificați date din a doua FROM și să eliminați rândurile corespunzătoare din tabel din prima clauză FROM. În special, interogarea anterioară poate fi rescrisă după cum urmează

ȘTERGERE DE LA Client

DE LA Client k INNER JOIN

Operația de ștergere a înregistrărilor dintr-un tabel este periculoasă în sensul că este asociată cu riscul pierderii ireversibile a datelor în cazul unor erori semantice (dar nu sintactice) în formularea expresiei SQL. Pentru a evita orice bătaie de cap, înainte de a șterge înregistrările, este recomandat să rulați mai întâi interogarea de selectare corespunzătoare pentru a vedea ce înregistrări vor fi șterse. Deci, de exemplu, înainte de a executa interogarea de ștergere discutată mai devreme, nu ar strica să rulați interogarea de selectare corespunzătoare.

SELECTAȚI *

DE LA Client k INNER JOIN

Orașul c ON k.IdCity = c.IdCity ȘI c.CityName = „Moscova”

Pentru a șterge toate înregistrările dintr-un tabel, utilizați pur și simplu instrucțiunea DELETE fără cuvântul cheie WHERE. În acest caz, tabelul însuși cu toate coloanele definite în el este salvat și este gata pentru introducerea de noi înregistrări. De exemplu, următoarea interogare șterge înregistrările pentru toate produsele.

ȘTERGERE DIN produs

Misiunea pentru muncă independentă: Formulați o interogare în SQL pentru a șterge toate comenzile care nu conțin un singur produs (adică toate comenzile goale).

Instrucțiunea INSERT inserează înregistrări noi într-un tabel. În acest caz, valorile coloanei pot fi constante literale sau pot fi rezultatul executării unei subinterogări. În primul caz, o instrucțiune INSERT separată este folosită pentru a insera fiecare rând; în al doilea caz, vor fi inserate atâtea rânduri câte sunt returnate de subinterogare.

Sintaxa operatorului este următoarea:

    INSERT INTO [(,...)]

    (VALORI(,…))

  1. | (VALORI IMPLICITE)

După cum puteți vedea din sintaxa prezentată, lista de coloane este opțională (parantezele pătrate din descrierea sintaxei indică acest lucru). Dacă lipsește, lista valorilor introduse trebuie să fie completă, adică să furnizeze valori pentru toate coloanele tabelului. În acest caz, ordinea valorilor trebuie să corespundă cu ordinea specificată de instrucțiunea CREATE TABLE pentru tabelul în care sunt inserate rândurile. În plus, aceste valori trebuie să fie de același tip de date ca și coloanele în care sunt introduse. Ca exemplu, luați în considerare inserarea unui rând în tabelul Product creat de următoarea instrucțiune CREATE TABLE:

    Produs CREATE TABLE

    maker char (1) NOT NULL,

    model varchar(4) NOT NULL,

    tastați varchar(7) NOT NULL

Să presupunem că doriți să adăugați modelul PC 1157 de la producătorul B la acest tabel. Acest lucru se poate face cu următoarea afirmație:

    INSERT INTO Product

    VALORI ("B", 1157, "PC");

Dacă specificați o listă de coloane, puteți modifica ordinea „naturală” a acestora:

    INSERT INTO Product (tip, model, producator)

    VALORI ("PC", 1157, "B");

S-ar părea că aceasta este o caracteristică complet inutilă, ceea ce face doar designul mai greoi. Totuși, câștigă dacă coloanele au valori implicite. Luați în considerare următoarea structură a tabelului:

    CREATE TABLE product_D

    maker char (1) NULL,

    model varchar(4) NULL,

    tip varchar (7 ) NOT NULL DEFAULT "PC"

Rețineți că aici valorile tuturor coloanelor au valori implicite (primele două sunt NULL și ultima coloană este de tip - PC). Acum am putea scrie:

    INSERT INTO Product_D (model, producător)

    VALORI(1157, „B”);

În acest caz, valoarea lipsă la inserarea unui rând va fi înlocuită cu valoarea implicită - PC. Rețineți că dacă unei coloane nu i se dă o valoare implicită într-o instrucțiune CREATE TABLE și este specificată o constrângere NOT NULL pentru a interzice utilizarea lui NULL în acea coloană de tabel, atunci se presupune valoarea implicită a NULL.

Se pune întrebarea: este posibil să nu specificați o listă de coloane și, totuși, să folosiți valorile implicite? Răspunsul este da. Pentru a face acest lucru, în loc să specificați în mod explicit valoarea, utilizați cuvântul rezervat DEFAULT :

    INSERT INTO Product_D

    VALORI ("B" , 1158 , IMPLICIT ) ;

Deoarece toate coloanele au valori implicite, pentru a insera un rând cu valori implicite puteți scrie:

    INSERT INTO Product_D

    VALORI(DEFAULT, DEFAULT, DEFAULT);

Cu toate acestea, pentru acest caz există o construcție specială VALORI DEFAULT (vezi sintaxa operatorului), cu care operatorul de mai sus poate fi rescris sub forma

    INSERT INTO Product_D DEFAULT VALUES ;

Rețineți că atunci când introduceți un rând într-un tabel, toate restricțiile impuse acestui tabel sunt verificate. Acestea pot fi constrângeri de cheie primară sau de index unic, constrângeri CHECK sau constrângeri de integritate referenţială. Dacă orice constrângere este încălcată, inserarea rândului va fi respinsă. Să luăm acum în considerare cazul utilizării unei subinterogări. Să presupunem că trebuie să inserăm în tabelul Product_D toate rândurile din tabelul Product legate de modelele de computere personale (tip = „PC”). Deoarece valorile de care avem nevoie sunt deja într-un tabel, generarea manuală a rândurilor inserate este, în primul rând, ineficientă și, în al doilea rând, poate permite erori de introducere. Utilizarea unei subinterogări rezolvă aceste probleme:

Utilizarea simbolului „*” în subinterogare este justificată în acest caz, deoarece ordinea coloanelor este aceeași pentru ambele tabele. Dacă nu ar fi cazul, ar trebui aplicată o listă de coloane fie în instrucțiunea INSERT, fie în subinterogare sau ambele, care să se potrivească cu ordinea coloanelor:

Aici, ca și înainte, puteți specifica nu toate coloanele dacă doriți să utilizați valorile implicite existente, de exemplu:

În acest caz, coloana tip a tabelului Product_D va fi înlocuită cu valoarea implicită PC pentru toate rândurile inserate.

Rețineți că atunci când utilizați o subinterogare care conține un predicat, vor fi inserate numai acele rânduri pentru care valoarea predicatului este TRUE (nu NECUNOSCUT!). Cu alte cuvinte, dacă coloana de tip din tabelul Product ar putea fi NULL și acea valoare a fost prezentă într-un număr de rânduri, atunci acele rânduri nu ar fi inserate în tabelul Product_D.

Tehnica artificială de utilizare a unei subinterogări care formează un rând cu clauza UNION ALL vă permite să depășiți limitarea inserării unui rând în instrucțiunea INSERT atunci când utilizați constructorul de rând în clauza VALUES. Deci, dacă trebuie să inserăm mai multe rânduri folosind o singură instrucțiune INSERT, putem scrie:

    INSERT INTO Product_D

    SELECT "B" AS maker, 1158 AS model, "PC" AS tip

    UNIREA TOȚI

    SELECTAȚI „C”, 2190, „Laptop”

    UNIREA TOȚI

    SELECTAȚI „D” , 3219 , „Imprimantă” ;

Utilizarea UNION ALL este de preferată față de UNION chiar dacă absența rândurilor duplicate este garantată, deoarece în acest caz nu se va efectua nicio verificare pentru eliminarea duplicatelor.

Trebuie remarcat faptul că inserarea mai multor tupluri folosind constructorul de rânduri este deja implementată în Sistem de management al bazelor de date relaționale (DBMS), dezvoltat de Microsoft Corporation.Structured Query Language) este un limbaj de computer universal folosit pentru a crea, modifica și manipula date în baze de date relaționale. SQL Server 2008. Având în vedere această posibilitate, ultima interogare poate fi rescrisă ca:

    INSERT INTO Product_D VALUES

    ("B", 1158, "PC"),

    ("C", 2190, "Laptop"),