Ricerca…


introduzione

L'istruzione SELECT è al centro della maggior parte delle query SQL. Definisce quale set di risultati deve essere restituito dalla query e viene quasi sempre utilizzato insieme alla clausola FROM, che definisce quale parte del database deve essere interrogata.

Sintassi

  • SELEZIONA [DISTINCT] [column1] [, [column2] ...]
    DA [tavolo]
    [WHERE condition]
    [GROUP BY [column1] [, [column2] ...]

    [HAVING [column1] [, [column2] ...]

    [ORDINA PER ASC | DESC]

Osservazioni

SELECT determina i dati delle colonne da restituire e in quale ordine FROM una determinata tabella (dato che corrispondono agli altri requisiti della tua query specificatamente - dove e avendo filtri e join).

SELECT Name, SerialNumber
FROM ArmyInfo

per esempio restituirà risultati dalle colonne Name e Serial Number , ma non dalla colonna chiamata Rank

SELECT *
FROM ArmyInfo

indica che tutte le colonne saranno restituite. Tuttavia, tieni presente che non è consigliabile selezionare SELECT * poiché stai letteralmente restituendo tutte le colonne di un tavolo.

Utilizzando il carattere jolly per selezionare tutte le colonne in una query.

Considera un database con le seguenti due tabelle.

Tabella dei dipendenti:

Id FName LName deptid
1 Giacomo fabbro 3
2 John Johnson 4

Tabella dei dipartimenti:

Id Nome
1 I saldi
2 Marketing
3 Finanza
4 IT

Semplice affermazione di selezione

* è il carattere jolly utilizzato per selezionare tutte le colonne disponibili in una tabella.

Quando viene utilizzato come un sostituto per i nomi di colonna espliciti, restituisce tutte le colonne in tutte le tabelle che una query sta selezionando FROM . Questo effetto si applica a tutte le tabelle la query accede tramite le sue clausole JOIN .

Considera la seguente query:

SELECT * FROM Employees

Restituirà tutti i campi di tutte le righe della tabella Employees :

Id FName LName deptid
1 Giacomo fabbro 3
2 John Johnson 4

Notazione a punti

Per selezionare tutti i valori da una tabella specifica, il carattere jolly può essere applicato alla tabella con notazione a punti .

Considera la seguente query:

SELECT 
    Employees.*, 
    Departments.Name
FROM 
    Employees
JOIN 
    Departments 
    ON Departments.Id = Employees.DeptId

Ciò restituirà un set di dati con tutti i campi nella tabella Employee , seguito solo dal campo Name nella tabella Departments :

Id FName LName deptid Nome
1 Giacomo fabbro 3 Finanza
2 John Johnson 4 IT

Avvertenze contro l'uso

Si consiglia in genere che l'utilizzo di * venga evitato nel codice di produzione laddove possibile, in quanto può causare una serie di potenziali problemi, tra cui:

  1. Eccesso di I / O, carico di rete, utilizzo della memoria e così via, a causa del fatto che il motore di database non legge i dati necessari e li trasmette al codice di front-end. Questo è particolarmente un problema in cui potrebbero esserci campi grandi come quelli usati per memorizzare note lunghe o file allegati.
  2. Ulteriore sovraccarico di I / O se il database deve eseguire lo spool dei risultati interni sul disco come parte dell'elaborazione per una query più complessa di SELECT <columns> FROM <table> .
  3. Elaborazione extra (e / o anche più IO) se alcune delle colonne non necessarie sono:
    • colonne calcolate nei database che li supportano
    • in caso di selezione da una vista, colonne da una tabella / vista che altrimenti potrebbero essere ottimizzate da Query Optimiser
  4. Il potenziale di errori imprevisti se le colonne vengono aggiunte successivamente alle tabelle e alle viste che risultano in nomi di colonne ambigue. Ad esempio, SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname - se una colonna colonna denominata displayname viene aggiunta alla tabella degli ordini per consentire agli utenti di dare ai loro ordini nomi significativi per riferimenti futuri, il nome della colonna verrà visualizzato due volte nell'output quindi la clausola ORDER BY sarà ambigua e potrebbe causare errori ("nome colonna ambiguo" nelle recenti versioni di MS SQL Server) e, se non in questo esempio, il codice dell'applicazione potrebbe iniziare a visualizzare il nome dell'ordine in cui il nome della persona è inteso perché la nuova colonna è il primo di quel nome restituito e così via.

Quando puoi usare * , tenendo presente l'avvertimento sopra?

Mentre è meglio evitare nel codice di produzione, l'uso di * va bene come una scorciatoia quando si eseguono query manuali sul database per indagini o lavori di prototipazione.

A volte le decisioni di progettazione nella tua applicazione rendono inevitabile (in tali circostanze, preferisci le tablealias.* solo su * dove possibile).

Quando si utilizzano EXISTS , come SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) , non si restituiscono dati da B. Pertanto un join non è necessario e il motore non riconosce valori di B da restituire, quindi nessun risultato di prestazioni per l'utilizzo di * . Allo stesso modo, COUNT(*) va bene, in quanto non restituisce alcuna colonna, quindi è sufficiente leggere ed elaborare quelli utilizzati per scopi di filtraggio.

Selezione con condizione

La sintassi di base della clausola SELECT with WHERE è:

SELECT column1, column2, columnN
FROM table_name
WHERE [condition]

La [condizione] può essere qualsiasi espressione SQL, specificata mediante confronto o operatori logici come>, <, =, <>,> =, <=, LIKE, NOT, IN, BETWEEN ecc.

L'istruzione seguente restituisce tutte le colonne dalla tabella 'Auto' in cui la colonna dello stato è 'PRONTA':

SELECT * FROM Cars WHERE status = 'READY'

Guarda WHERE e HAVING per altri esempi.

Seleziona singole colonne

SELECT 
    PhoneNumber, 
    Email, 
    PreferredContact 
FROM Customers

Questa dichiarazione restituirà le colonne PhoneNumber , Email e PreferredContact da tutte le righe della tabella Customers . Anche le colonne verranno restituite nella sequenza in cui appaiono nella clausola SELECT .

Il risultato sarà:

Numero di telefono E-mail PreferredContact
3347927472 [email protected] TELEFONO
2137921892 [email protected] E-MAIL
NULLO [email protected] E-MAIL

Se più tabelle vengono unite, è possibile selezionare le colonne da tabelle specifiche specificando il nome della tabella prima del nome della colonna: [table_name].[column_name]

SELECT 
    Customers.PhoneNumber, 
    Customers.Email, 
    Customers.PreferredContact,
    Orders.Id AS OrderId
FROM 
    Customers
LEFT JOIN 
    Orders ON Orders.CustomerId = Customers.Id

* AS OrderId significa che il campo Id della tabella Orders verrà restituito come una colonna denominata OrderId . Vedi selezionare con l'alias della colonna per ulteriori informazioni.

Per evitare l'utilizzo di nomi di tabelle lunghe, è possibile utilizzare alias di tabella. Ciò riduce il dolore di scrivere nomi di tabelle lunghe per ogni campo selezionato nei join. Se stai eseguendo un self join (un join tra due istanze della stessa tabella), devi utilizzare gli alias di tabella per distinguere le tue tabelle. Possiamo scrivere un alias di tabella come Customers c o Customers AS c . Qui c funziona come alias per i Customers e possiamo selezionare diciamo Email come questa: c.Email .

SELECT 
    c.PhoneNumber, 
    c.Email, 
    c.PreferredContact,
    o.Id AS OrderId
FROM 
    Customers c
LEFT JOIN 
    Orders o ON o.CustomerId = c.Id

SELEZIONARE Usando Colonna Alias

Gli alias di colonne vengono utilizzati principalmente per abbreviare il codice e rendere più leggibili i nomi di colonna.

Il codice si accorcia quando i nomi delle tabelle lunghi e l'identificazione non necessaria delle colonne (ad esempio, possono esserci 2 ID nella tabella, ma solo uno è utilizzato nell'istruzione) possono essere evitati. Insieme agli alias di tabella, questo consente di utilizzare nomi descrittivi più lunghi nella struttura del database mantenendo al contempo le query su quella struttura concisa.

Inoltre, a volte sono necessari , ad esempio nelle viste, per denominare i risultati calcolati.

Tutte le versioni di SQL

Gli alias possono essere creati in tutte le versioni di SQL usando virgolette doppie ( " ).

SELECT 
    FName AS "First Name", 
    MName AS "Middle Name",
    LName AS "Last Name"
FROM Employees  

Diverse versioni di SQL

È possibile utilizzare virgolette singole ( ' ), doppie virgolette ( " ) e parentesi quadre ( [] ) per creare un alias in Microsoft SQL Server.

SELECT 
    FName AS "First Name", 
    MName AS 'Middle Name',
    LName AS [Last Name]
FROM Employees  

Entrambi si tradurranno in:

Nome di battesimo Secondo nome Cognome
Giacomo John fabbro
John Giacomo Johnson
Michael Marcus Williams

Questa istruzione restituirà le colonne FName e LName con un nome specifico (un alias). Ciò viene ottenuto utilizzando l'operatore AS seguito dall'alias o semplicemente scrivendo alias direttamente dopo il nome della colonna. Ciò significa che la seguente query ha lo stesso risultato di cui sopra.

SELECT 
    FName "First Name", 
    MName "Middle Name",
    LName "Last Name"
FROM Employees 
Nome di battesimo Secondo nome Cognome
Giacomo John fabbro
John Giacomo Johnson
Michael Marcus Williams

Tuttavia, la versione esplicita (cioè, utilizzando l'operatore AS ) è più leggibile.

Se l'alias ha una singola parola che non è una parola riservata, possiamo scriverla senza virgolette singole, virgolette doppie o parentesi:

SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM Employees  
Nome di battesimo Cognome
Giacomo fabbro
John Johnson
Michael Williams

Un'altra variante disponibile in MS SQL Server è <alias> = <column-or-calculation> , ad esempio:

SELECT FullName = FirstName + ' ' + LastName, 
       Addr1    = FullStreetAddress,
       Addr2    = TownName
FROM CustomerDetails  

che è equivalente a:

SELECT FirstName + ' ' + LastName As FullName
       FullStreetAddress          As Addr1,
       TownName                   As Addr2
FROM CustomerDetails  

Entrambi si tradurranno in:

Nome e cognome Addr1 Addr2
James Smith 123 AnyStreet Townville
John Johnson 668 MyRoad Anytown
Michael Williams 999 High End Dr Williamsburgh

Alcuni trovano usando = invece di As più facile da leggere, sebbene molti raccomandino contro questo formato, principalmente perché non è standard quindi non ampiamente supportato da tutti i database. Potrebbe causare confusione con altri usi del carattere = .

Tutte le versioni di SQL

Inoltre, se è necessario utilizzare parole riservate, è possibile utilizzare parentesi o virgolette per evitare:

SELECT
    FName as "SELECT",
    MName as "FROM",
    LName as "WHERE"
FROM Employees

Diverse versioni di SQL

Allo stesso modo, puoi sfuggire le parole chiave in MSSQL con tutti i diversi approcci:

SELECT 
    FName AS "SELECT", 
    MName AS 'FROM',
    LName AS [WHERE]
FROM Employees  
SELEZIONARE A PARTIRE DAL DOVE
Giacomo John fabbro
John Giacomo Johnson
Michael Marcus Williams

Inoltre, un alias di colonna può essere utilizzato una qualsiasi delle clausole finali della stessa query, ad esempio un ORDER BY :

SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM 
    Employees 
ORDER BY 
    LastName DESC

Tuttavia, non si può usare

SELECT
    FName AS SELECT,
    LName AS FROM
FROM 
    Employees
ORDER BY 
    LastName DESC

Per creare un alias da queste parole riservate ( SELECT e FROM ).

Ciò causerà numerosi errori durante l'esecuzione.

Selezione con risultati ordinati

SELECT * FROM Employees ORDER BY LName

Questa dichiarazione restituirà tutte le colonne dalla tabella Employees .

Id FName LName Numero di telefono
2 John Johnson 2468101214
1 Giacomo fabbro 1234567890
3 Michael Williams 1357911131
SELECT * FROM Employees ORDER BY LName DESC

O

 SELECT * FROM Employees ORDER BY LName ASC

Questa affermazione cambia la direzione di smistamento.

Si può anche specificare più colonne di ordinamento. Per esempio:

SELECT * FROM Employees ORDER BY LName ASC, FName ASC

Questo esempio LName i risultati prima per LName e poi, per i record che hanno lo stesso LName , per FName . Questo ti darà un risultato simile a quello che troveresti in una rubrica telefonica.

Per salvare la ridigitazione del nome della colonna nella clausola ORDER BY , è possibile utilizzare invece il numero della colonna. Si noti che i numeri delle colonne iniziano da 1.

SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3

È inoltre possibile incorporare un'istruzione CASE nella clausola ORDER BY .

SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones` THEN 0 ELSE 1 END ASC

Questo LName i risultati per avere tutti i record con il LName di "Jones" in alto.

Seleziona le colonne che prendono il nome da parole chiave riservate

Quando un nome di colonna corrisponde a una parola chiave riservata, SQL standard richiede che lo si racchiuda tra virgolette doppie:

SELECT 
    "ORDER",
    ID 
FROM ORDERS

Si noti che rende il nome della colonna case-sensitive.

Alcuni DBMS hanno modi proprietari di elencare i nomi. Ad esempio, SQL Server utilizza parentesi quadre per questo scopo:

SELECT 
    [Order],
    ID 
FROM ORDERS

mentre MySQL (e MariaDB) utilizzano di default i backtick:

SELECT 
    `Order`,
    id 
FROM orders

Selezione del numero specificato di record

Lo standard SQL 2008 definisce la clausola FETCH FIRST per limitare il numero di record restituiti.

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY

Questo standard è supportato solo nelle versioni recenti di alcuni RDMS. La sintassi non standard specifica del fornitore viene fornita in altri sistemi. Progress OpenEdge 11.x supporta anche la sintassi FETCH FIRST <n> ROWS ONLY .

Inoltre, OFFSET <m> ROWS prima di FETCH FIRST <n> ROWS ONLY consente di saltare le righe prima di recuperare le righe.

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY

La seguente query è supportata in SQL Server e MS Access:

SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC

Per fare lo stesso in MySQL o PostgreSQL, è necessario utilizzare la parola chiave LIMIT :

SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10

In Oracle lo stesso può essere fatto con ROWNUM :

SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC    

Risultati : 10 record.

Id    ProductName               UnitPrice             Package
38    Côte de Blaye             263.50                12 - 75 cl bottles
29    Thüringer Rostbratwurst   123.79                50 bags x 30 sausgs.
9    Mishi Kobe Niku            97.00                 18 - 500 g pkgs.
20    Sir Rodney's Marmalade    81.00                 30 gift boxes
18    Carnarvon Tigers          62.50                 16 kg pkg.
59    Raclette Courdavault      55.00                 5 kg pkg.
51    Manjimup Dried Apples     53.00                 50 - 300 g pkgs.
62    Tarte au sucre            49.30                 48 pies
43    Ipoh Coffee               46.00                 16 - 500 g tins
28    Rössle Sauerkraut         45.60                 25 - 825 g cans

Sfumature del venditore:

È importante notare che il TOP in Microsoft SQL opera dopo la clausola WHERE e restituirà il numero specificato di risultati se esistono in qualsiasi punto della tabella, mentre ROWNUM funziona come parte della clausola WHERE , quindi se altre condizioni non esistono nel numero di righe specificato all'inizio della tabella, otterrai zero risultati quando potrebbero essere trovati altri.

Selezione con alias di tabella

SELECT e.Fname, e.LName 
FROM Employees e

Alla tabella Dipendenti viene assegnato l'alias 'e' direttamente dopo il nome della tabella. Ciò aiuta a rimuovere l'ambiguità in scenari in cui più tabelle hanno lo stesso nome di campo e devi essere specifico su quale tabella vuoi restituire i dati.

SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
    JOIN Managers m ON e.ManagerId = m.Id

Si noti che una volta definito un alias, non è più possibile utilizzare il nome della tabella canonica. vale a dire,

SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
JOIN Managers m ON e.ManagerId = m.Id

genererebbe un errore

Vale la pena notare che gli alias di tabelle - più formalmente "variabili di intervallo" - sono stati introdotti nel linguaggio SQL per risolvere il problema delle colonne duplicate causate da INNER JOIN . Lo standard SQL del 1992 ha corretto questa precedente imperfezione progettuale introducendo NATURAL JOIN (implementato in MySQL, PostgreSQL e Oracle ma non ancora in SQL Server), il cui risultato non ha mai nomi di colonne duplicati. L'esempio sopra è interessante in quanto le tabelle sono unite su colonne con nomi diversi ( Id e ManagerId ) ma non dovrebbero essere unite sulle colonne con lo stesso nome ( LName , FName ), richiedendo la ridenominazione delle colonne da eseguire prima del join:

SELECT Fname, LName, ManagerFirstName 
FROM Employees
     NATURAL JOIN
     ( SELECT Id AS ManagerId, Fname AS ManagerFirstName
       FROM Managers ) m;

Si noti che sebbene una variabile alias / intervallo debba essere dichiarata per la tabella dervied (altrimenti SQL genererà un errore), non ha mai senso usarla effettivamente nella query.

Seleziona le righe da più tabelle

SELECT *
FROM
    table1,
    table2
SELECT
    table1.column1,
    table1.column2,
    table2.column1
FROM
    table1,
    table2

Questo è chiamato prodotto incrociato in SQL è uguale al prodotto incrociato in serie

Queste istruzioni restituiscono le colonne selezionate da più tabelle in una query.

Non esiste una relazione specifica tra le colonne restituite da ciascuna tabella.

Selezione con le funzioni di aggregazione

Media

La funzione di aggregazione AVG() restituirà la media dei valori selezionati.
SELECT AVG(Salary) FROM Employees
Le funzioni aggregate possono anche essere combinate con la clausola where.
SELECT AVG(Salary) FROM Employees where DepartmentId = 1
Le funzioni aggregate possono anche essere combinate con la clausola group by.

Se il dipendente è suddiviso in più reparti e vogliamo trovare uno stipendio medio per ogni reparto, possiamo utilizzare la seguente query.

SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId

Minimo

La funzione di aggregazione MIN() restituirà il minimo dei valori selezionati.
SELECT MIN(Salary) FROM Employees

Massimo

La funzione di aggregazione MAX() restituirà il massimo dei valori selezionati.
SELECT MAX(Salary) FROM Employees

Contare

La funzione di aggregazione COUNT() restituirà il conteggio dei valori selezionati.
SELECT Count(*) FROM Employees
Può anche essere combinato con le condizioni in cui ottenere il conteggio delle righe che soddisfano condizioni specifiche.
SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
È anche possibile specificare colonne specifiche per ottenere il numero di valori nella colonna. Si noti che i valori NULL non vengono conteggiati.
Select Count(ManagerId) from Employees
Il conteggio può anche essere combinato con la parola chiave distinta per un conteggio distinto.
Select Count(DISTINCT DepartmentId) from Employees

Somma

La funzione di aggregazione SUM() restituisce la somma dei valori selezionati per tutte le righe.
SELECT SUM(Salary) FROM Employees

Selezione con null

SELECT Name FROM Customers WHERE PhoneNumber IS NULL

La selezione con valori null richiede una sintassi diversa. Non usare = , utilizzare IS NULL o IS NOT NULL .

Selezione con CASE

Quando i risultati devono avere una logica applicata "al volo", è possibile utilizzare l'istruzione CASE per implementarla.

SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold
FROM TableName 

anche può essere incatenato

SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         WHEN Col1 > 50 AND Col1 <100 THEN 'between' 
         ELSE 'over' 
    END threshold
FROM TableName 

uno può anche avere CASE in un'altra istruzione CASE

SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         ELSE 
            CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1 
            ELSE 'over' END 
    END threshold
FROM TableName 

Selezionare senza bloccare la tabella

A volte quando le tabelle vengono utilizzate principalmente (o solo) per le letture, l'indicizzazione non aiuta più e ogni piccolo bit conta, si potrebbe usare selects senza LOCK per migliorare le prestazioni.


server SQL

SELECT * FROM TableName WITH (nolock)

MySQL

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Oracolo

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;

DB2

SELECT * FROM TableName WITH UR;

dove UR sta per "lettura non salvata".


Se utilizzato su una tabella con modifiche ai record in corso potrebbe avere risultati imprevedibili.

Seleziona distinto (solo valori unici)

SELECT DISTINCT ContinentCode
FROM Countries;

Questa query restituirà tutti i valori DISTINCT (unici, diversi) dalla colonna ContinentCode dalla tabella Countries

ContinentCode
OC
Unione Europea
COME
N / A
AF

Demo di SQLFiddle

Selezionare con condizione di più valori dalla colonna

SELECT * FROM Cars  WHERE status IN ( 'Waiting', 'Working' )

Questo è semanticamente equivalente a

SELECT * FROM Cars  WHERE ( status = 'Waiting' OR status = 'Working' )

cioè il value IN ( <value list> ) è una scorciatoia per disgiunzione ( OR logico).

Ottieni risultati aggregati per i gruppi di righe

Conteggio delle righe in base a un valore di colonna specifico:

SELECT category, COUNT(*) AS item_count
FROM item
GROUP BY category;

Ottenere un reddito medio per dipartimento:

SELECT department, AVG(income)
FROM employees
GROUP BY department;

L'importante è selezionare solo le colonne specificate nella clausola GROUP BY o utilizzate con funzioni di aggregazione .


La clausola WHERE può essere utilizzata anche con GROUP BY , ma WHERE filtra i record prima di ogni raggruppamento:

SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department;

Se è necessario filtrare i risultati dopo aver eseguito il raggruppamento, ad esempio per visualizzare solo i dipartimenti il ​​cui reddito medio è superiore a 1000, è necessario utilizzare la clausola HAVING :

SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department
HAVING avg(income) > 1000;

Selezione con più di 1 condizione.

La parola chiave AND viene utilizzata per aggiungere più condizioni alla query.

Nome Età Genere
Sam 18 M
John 21 M
peso 22 M
Maria 23 F
SELECT name FROM persons WHERE gender = 'M' AND age > 20;

Questo ritornerà:

Nome
John
peso

usando la parola chiave OR

SELECT name FROM persons WHERE gender = 'M' OR age < 20;

Questo ritornerà:

nome
Sam
John
peso

Queste parole chiave possono essere combinate per consentire combinazioni di criteri più complessi:

SELECT name
FROM persons
WHERE (gender = 'M' AND age < 20)
   OR (gender = 'F' AND age > 20);

Questo ritornerà:

nome
Sam
Maria


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow