Intrebari SQL Interviu 1

Posted by anghelvalentin on September 01, 2019

Azi am fost la un interviu la o firma micuta, dar cu oameni misto. Dupa cateva intrebari de C#, unul dintre cei trei baieti pleaca, si ii lasa pe ceilalti doi sa-mi puna intrebari de SQL. Deja tipului cu C# ii placea de mine, eu eram entuziasmat si am zis: Ii dau gata pe baieti cu SQL-ul! Nu a fost chiar asa. Uite ce intrebari mi-au pus.

  1. Care este diferenta dintre DELETE si TRUNCATE ?        TRUNCATE reseteaza coloana de identity, in timp ce DELETE, nu. Adica dupa TRUNCATE, daca faci un insert vei avea id-ul 1. Cand folosim DELETE, Database Management System va loga toate randurile.  TRUNCATE te ajuta sa "resetezi" o tabela la starea initiala.

  2. Care este diferenta dintre @@IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT ? 

  •  @@Identity iti returneaza ultima valoare generata pentru orice tabela, in sesiunea curenta, peste toate scopurile.  Daca dai un insert intr-o tabela, pe care este si un trigger care sa zicem ca insereaza niste date de audit intr-o alta tabela. Atunci cand vei da @@Identity vei primi id-ul din ultima tabela in care s-a inserat, adica cea de audit.

  • SCOPE_IDENTITY iti returneaza ultima valoare generata pentru orice tabela, in sesiunea curenta si in scopul curent. Adica daca apelezi pe acceasi tabela cu trigger un insert, si pe urma scope identity, ti se va returna id-ul in tabela in care ai facut tu insert. In schimb, daca apelezi scope identity in trigger (alt scop), dupa ce ai facut insertul in tabela de audit atunci iti va returna id din tabela de audit. 

  • IDENT_CURRENT iti returneaza valoarea pentru o tabela precizata, in orice sesiune si in orice scop. Practic daca vrei sa stii ultimul id generat pe o tabela si te intereseaza ce e cel mai nou. Apelezi IDENT_CURRENT('NumeTabela') si va returna id-ul generat.

    1. Avand urmatoarele date
CREATE TABLE TBL
( NMBR SMALLINT)


INSERT INTO TBL VALUES (1),(0),(0),(1),(1),(1),(1),(0),(0),(1),(0),(1),(0),(1),(0),(1)

Scrie un SELECT care  sa afiseze doua coloane: prima coloana sa afiseze coloana NMBR, iar cea de a doua coloana sa afiseze NMBR+2 daca NMBR egal cu 0, NMBR+3 daca NMBR egal cu 1, NMBR in restul situatiilor

SELECT 
NMBR,
CASE NMBR 
WHEN 0 THEN NMBR+2 
WHEN 1 THEN NMBR+3
ELSE NMBR END 'SUM'
FROM TBL

4.Cand sa folosim un INDEX si cand nu ?

  Cand avem nevoie sa cautam rapid date intr-o tabela folosim indexi pe coloane. In momentul in care stim ca pe tabela respectiva se executa adesea comenzi de UPDATE, atunci nu este recomandat, intrucat si indexul trebuie recreat.

  1. Ce tipuri de INDEX putem sa avem ? 
  • Index de tip Clustered. Acest index sorteaza si salveaza datele pe baza valorii cheii lor. Putem avea un singur astfel de index pe o tabela, deoarece datele pot fi pastrate intr-o singura ordine. Comenzile de tip insert si update dureaza mai mult, deoarece trebuie sa se asigure ordinea.  Deci folosim clustered index cand avem o ordine a inregistrarilor. 
  • Index de tip NonClustered. Acest index are o structura diferita fata de tupluri. Acest index pastreaza valoriile cheii, iar aceasta valoare pointeaza catre inregistrare. Folosim acest index cand datele nu sunt sortate.