Anar al contingut

SQL

De L'Enciclopèdia, la wikipedia en valencià
Archiu:SQL ANATOMY wiki.svg
SQL

SQL (per les seues sigles en anglés Structured Query Language; en espanyol llenguage de consulta estructurada) és un llenguage específic de domini, dissenyat per a administrar, i recuperar informació de sistemes de gestió de bases de senyes relacionals.[1] Una de les seues principals característiques és el maneig del àlgebra i el càlcul relacional per a efectuar consultes en la finalitat de recuperar, de forma senzilla, informació de bases de senyes, aixina com realisar canvis en elles.

Originalment basat en l'àlgebra relacional i en el càlcul relacional, SQL consistix en un llenguage de definició de senyes, un llenguage de manipulació de senyes i un llenguage de control de senyes. L'alcanç de SQL inclou l'inserció de senyes, consultes, actualisacions i borrat, la creació i modificació d'esquemes i el control d'accés a les senyes. També el SQL a voltes es descriu com un llenguage declarativo, també inclou elements processals.

SQL va ser un dels primers llenguages comercials per al model relacional d'Edgar Frank Codd com es va descriure en el seu artícul d'investigació de 1970 El model relacional de senyes per a grans bancs de senyes compartides. A pesar de no adherir-se totalment al model relacional descrit per Codd, va passar a ser el llenguage de base de senyes més usat.

SQL va passar a ser l'estàndart del Institut Nacional Nortamericà d'Estàndarts (ANSI) en 1986 i de l'Organisació Internacional de Normalisació (ISO) en 1987. Des de llavors, l'estàndart ha segut revisat per a incloure més característiques. A pesar de l'existència d'abdós estàndars, la majoria dels còdics SQL no són completament portables entre sistemes de bases de senyes diferents sense atres ajusts.

Orígens i evolució

[editar | editar còdic]

Els orígens de SQL estan lligats a les bases de senyes relacionals, específicament les que residien en màquines IBM baix el sistema de gestió System R, desenrollat per un grup de l'IBM en Sant Josep, Califòrnia.

Originalment un acrònim de "Llenguage de consulta estructurat" ("Structured Query Language”), va ser creat per IBM com un llenguage unificat per a definir, consultar, modificar i controlar les senyes en una base de senyes relacional. El seu nom es pronuncia oficialment "ess-cue-ell" (segons el American National Standards Institute).

El model relacional de gestió de bases de senyes va ser propost en 1970 pel Dr. I. F. Codd en el Laboratori d'Investigació d'IBM en Sant Josep, Califòrnia, i es va desenrollar durant la década següent en universitats i laboratoris d'investigació. SQL, un de varis llenguages que varen sorgir d'este treball inicial, ara s'ha apoderat casi per complet del món dels llenguages de bases de senyes relacionals. Els proveïdors de sistemes d'administració de bases de senyes relacionals que inicialment varen elegir atres llenguages han acodit en massa a SQL; Les organisacions de normalisació nacionals i internacionals han propost una versió codificada del llenguage.

En 1970, I. F. Codd propon el model relacional i associat a est un sublenguaje d'accés als senyas basat en el càlcul de predicats.[2] Basant-se en estes idees, els laboratoris d'IBM varen definir el llenguage SEQUEL (Structured English Query Language) que més tart va ser àmpliament implementat pel sistema de gestió de bases de senyes (SGBD) experimental System R, desenrollat en 1977 també per IBM. No obstant, va ser Oracle qui ho va introduir per primera volta en 1979 en un producte comercial.

El SEQUEL va terminar sent el predecessor de SQL, que és una versió evolucionada del primer. SQL passa a ser el llenguage per excelència dels diversos sistemes de gestió de bases de senyes relacionals sorgits en els anys següents i va anar per fi estandardisat en 1986 pel ANSI, donant lloc a la primera versió estàndar d'este llenguage, "SQL-86" o "SQL1". A l'any següent este estàndart és també adoptat per ISO.

No obstant, este primer estàndart no cobria totes les necessitats dels desenrolladors i incloïa funcionalitats de definició d'almagasenament que es va considerar suprimir-les. Aixina que, en 1992, es va llançar un nou estàndart ampliat i revisat de SQL cridat "SQL-92" o "SQL2".

En l'actualitat SQL és l'estàndart de facto de l'immensa majoria dels SGBD comercials. I, encara que la diversitat d'afegitons particulars que inclouen les distintes implementacions comercials del llenguage és àmplia, el soport a l'estàndart SQL-92 és general i molt ampli.

El ANSI SQL va sofrir vàries revisions i agregats a lo llarc del temps:

Any Nom Àlies Comentaris
1986 SQL-86 SQL-87 Primera publicació feta per ANSI. Confirmada per l'Organisació Internacional de Normalisació en 1987.
1989 SQL-89 Revisió menor.
1992 SQL-92 SQL2 Revisió major.
1999 SQL:1999 SQL2000 Es varen agregar expressions regulars, consultes recursivas (per a relacions jeràrquiques), triggers i algunes característiques orientades a objectes.
2003 SQL:2003   Introduïx algunes característiques de XML, canvis en les funcions, estandardisació de l'objecte sequence i de les columnes autonuméricas.[3]
2006 SQL:2006   ISO/IEC 9075-14:2006 Definix les maneres en les quals SQL es pot utilisar conjuntament en XML. Definix maneres d'importar i guardar senyes XML en una base de senyes SQL, manipulant-los dins de la base de senyes i publicant el XML i les senyes SQL convencionals en forma XML. Ademés, proporciona facilitats que permeten a les aplicacions integrar dins del seu còdic SQL l'us de XQuery, llenguage de consulta XML publicat pel W3C (World Wide Web Consortium) per a accés concurrent a senyes ordinàries SQL i documents XML.
2008 SQL:2008   Permet l'us de la clàusula ORDER BY fòra de les definicions dels cursors. Inclou els disparadores del tipo INSTEAD OF. Afig la sentència TRUNCATE.[4]
2011 SQL:2011 Senyes temporals (PERIOD FOR). Millores en les funcions de finestra i de la clàusula FETCH.
2016 SQL:2016 Permet busca de patrons, funcions de taula polimòrfiques i compatibilitat en els fichers JSON.

Característiques generals de SQL

[editar | editar còdic]

SQL és un llenguage d'accés a bases de senyes que explota la flexibilitat i potència dels sistemes relacionals i permet aixina gran varietat d'operacions.[5]

És un llenguage declarativo de "alt nivell" o "de no procediment" que, gràcies a la seua forta base teòrica i la seua orientació al maneig de conjunts de registres —i no a registres individuals— permet una alta productivitat en codificació i l'orientació a objectes. D'esta forma, una sola sentència pot equivaldre a un o més programes que s'utilisarien en un llenguage de baix nivell orientat a registres. SQL també té les següents característiques:

  • Llenguage de definició de senyes: El LDD de SQL proporciona comandos per a la definició d'esquemes de relació, borrat de relacions i modificacions dels esquemes de relació.
  • Llenguage interactiu de manipulació de senyes: El LMD de SQL inclou llenguages de consultes basat tant en àlgebra relacional com en càlcul relacional de tuplas.
  • Integritat: El LDD de SQL inclou comandos per a especificar les restriccions d'integritat que deuen complir les senyes almagasenades en la base de senyes.
  • Definició de vistes: El LDD inclou comandos per a definir les vistes.
  • Control de transaccions: SQL té comandos per a especificar el començ i el final d'una transacció.
  • SQL incorporat i dinàmic: Açò vol dir que es poden incorporar instruccions de SQL en llenguages de programació com: C++, C, Java, PHP, COBOL, Pascal i Fortran.
  • Autorisació: El LDD inclou comandos per a especificar els drets d'accés a les relacions i a les vistes.

Tipos de senyes

[editar | editar còdic]

Alguns dels tipos de senyes bàsiques de SQL són:

Número entero:

  • TINYINT(tamany): -128 a 127 normal. 0 a 255 sense signe. La cantitat màxima de dígits es pot especificar entre paréntesis
  • SMALLINT(tamany): -32768 a 32767 normal. 0 a 65535 sense signe. La cantitat màxima de dígits es pot especificar entre paréntesis
  • MEDIUMINT(tamany): -8388608 a 8388607 normal. 0 a 16777215 sense signe. La cantitat màxima de dígits es pot especificar entre paréntesis
  • INT(tamany): -2147483648 a 2147483647 normal. 0 a 4294967295 sense signe. La cantitat màxima de dígits es pot especificar entre paréntesis
  • BIGINT(tamany): -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sense signe. La cantitat màxima de dígits es pot especificar entre paréntesis

Números en punt flotant:

  • FLOAT (tamany, d): Un chicotet número en un punt decimal flotant. La cantitat màxima de dígits es pot especificar en el paràmetro de tamany. El número màxim de dígits a la dreta del punt decimal s'especifica en el paràmetro d
  • DOBLE (tamany, d): Un número gran en un punt decimal flotant. La cantitat màxima de dígits es pot especificar en el paràmetro de tamany. El número màxim de dígits a la dreta del punt decimal s'especifica en el paràmetro d
  • DECIMAL (tamany, d): Un DOBLE almagasenat com una cadena, lo que permet un punt decimal fix. La cantitat màxima de dígits es pot especificar en el paràmetro de tamany. El número màxim de dígits a la dreta del punt decimal s'especifica en el paràmetro d

Dates i temps

  • DONA'T (): Una data. Format: AAAA-MM-DD Nota: el ranc admés és de '1000-01-01' a '9999-12-31'
  • DATETIME (): * Una combinació de data i hora. Format: AAAA-MM-DD HH: EL MEU: SS Nota: el ranc admés és de '1000-01-01 00:00:00' a '9999-12-31 23:59:59'
  • TIMESTAMP (): * Una marca de temps. Els valors de TIMESTAMP s'almagasenen com el número de segons des de l'época d'Unix ('1970-01-01 00:00:00' UTC). Format: AAAA-MM-DD HH: EL MEU: SS Nota: el ranc admés és de '1970-01-01 00:00:01' UTC a '2038-01-09 03:14:07' UTC
  • CLAVE (): Un temps. Format: HH: EL MEU: SS Nota: el ranc admés és de '-838: 59: 59' a '838: 59: 59'
  • YEAR (): Un any en format de dos o quatre dígits. Nota: Valors permesos en format de quatre dígits: de 1901 a 2155. Valors permesos en format de dos dígits: 70 a 69, que representen els anys de 1970 a 2069

Cadena de caràcters:

  • CHAR (tamany): Té una cadena de llongitut fixa (pot contindre lletres, números i caràcters especials). El tamany fix s'especifica entre paréntesis. Pot almagasenar fins a 255 caràcters
  • VARCHAR (tamany): Té una cadena de llongitut variable (pot contindre lletres, números i caràcters especials). El tamany màxim s'especifica entre paréntesis. Pot almagasenar fins a 255 caràcters. Nota: si agrega un valor major que 255, es convertirà en un tipo de text
  • TINYTEXT: Té una cadena en una llongitut màxima de 255 caràcters
  • TEXT: Té una cadena en una llongitut màxima de 65.535 caràcters
  • BLOB: Per a BLOB (Objectes grans binarios). Almagasena fins a 65.535 bytes de senyes
  • MEDIUMTEXT: Té una cadena en una llongitut màxima de 16,777,215 caràcters
  • MEDIUMBLOB: Per a BLOB (Objectes grans binarios). Té capacitat per a 16.777.215 bytes de senyes
  • LONGTEXT: Té una cadena en una llongitut màxima de 4.294.967.295 caràcters
  • LONGBLOB: Per a BLOB (Objectes grans binarios). Té capacitat per a 4.294.967.295 bytes de senyes

Enum i set:

  • Enum (x, i, z, etc.): Permet ingressar una llista de valors possibles. Pot enumerar fins a 65535 valors en una llista ENUM. Si s'inserta un valor que no està en la llista, s'insertarà un valor en blanc. Nota: els valors s'ordenen en l'orde en que els ingresses. Ingresse els valors possibles en este format: ENUM ('X', 'I', 'Z')
  • Set: Similar a ENUM, excepto que SET pot contindre fins a 64 elements de llista i pot almagasenar més d'una opció

Binarios:

  • bit: Sancer que pot ser 0, 1 o NULL

Optimisació

[editar | editar còdic]

Com ya es va dir abans, i sol ser comuna en els llenguages d'accés a bases de senyes d'alt nivell, SQL és un llenguage declarativo. O siga, que especifica qué és lo que es vol i no cóm conseguir-ho, per lo que una sentència no establix explícitament un orde d'eixecució.

L'orde d'eixecució intern d'una sentència pot afectar sériament a l'eficiència del SGBD, per lo que es fa necessari que este porte a terme una optimisació abans de la seua eixecució. Moltes voltes, l'us d'índexs accelera una instrucció de consulta, pero ralentisa l'actualisació de les senyes. Depenent de l'us de l'aplicació, es priorisarà l'accés indexat o una ràpida actualisació de l'informació. L'optimisació diferix sensiblement en cada motor de base de senyes i depén de molts factors.

Els sistemes de bases de senyes modernes posseïxen un component cridat optimizador de consultes. Est realisa un detallat anàlisis dels possibles plans d'eixecució d'una consulta SQL i elegix aquell que siga més eficient per a dur avant la mateixa.

Existix una ampliació de SQL coneguda com FSQL (Fuzzy SQL, SQL difuso) que permet l'accés a bases de senyes difusas, usant la llògica difusa. Este llenguage ha segut implementat a nivell experimental i està evolucionant ràpidament.

Llenguage de definició de senyes (DDL)

[editar | editar còdic]

El llenguage de definició de senyes (en anglés Data Definition Language, o DDL), és el que s'encarrega de la modificació de l'estructura dels objectes de la base de senyes. Inclou órdens per a modificar, borrar o definir les taules en les que s'almagasenen les senyes de la base de senyes. Existixen quatre operacions bàsiques: CREATE, ALTER, DROP i TRUNCATE.[6]

CREATE (Crear)

[editar | editar còdic]

Este comando permet crear objectes de senyes, com a noves bases de senyes, taules, vistes i procediments almagasenats.

Eixemple (crear una taula)
CREATE TABLE clients;

ALTER (Alterar)

[editar | editar còdic]

Este comando permet modificar l'estructura d'una taula o objecte. Es poden agregar/llevar camps a una taula, modificar el tipo d'un camp, agregar/llevar índexs a una taula, modificar un trigger, etc.

Eixemple (agregar columna a una taula)
ALTER TABLE alumnes ADD edat INT UNSIGNED;

DROP (Eliminar)

[editar | editar còdic]

Este comando elimina un objecte de la base de senyes. Pot ser una taula, vista, índex, trigger, funció, procediment o qualsevol objecte que el motor de la base de senyes soporte. Es pot combinar en la sentència ALTER.

Eixemple
DROP TABLE alumnes;

TRUNCATE (Truncar)

[editar | editar còdic]

Este comando solament aplica a taules i la seua funció és borrar el contingut complet de la taula especificada. La ventaja sobre el comando DELETE, és que si es vol borrar tot el contingut de la taula, és molt més ràpit, especialment si la taula és molt gran. La desventaja és que TRUNCATE solament servix quan es vol eliminar absolutament tots els registres, ya que no es permet la clàusula WHERE. Si be, en un principi, esta sentència semblaria ser DML (Llenguage de Manipulació de Senyes), és en realitat una DDL, ya que internament, el comando TRUNCATE borra la taula i la torna a crear i no eixecuta cap transacció.

Eixemple
 TRUNCATE TABLE nomene_taula;

Llenguage de manipulació de senyes DML (Data Manipulation Language)

[editar | editar còdic]

El llenguage de manipulació de senyes (Data Manipulation Language, o DML en anglés) és el que permet als usuaris portar a terme les tasques de consulta o manipulació de les senyes, organisats pel model de senyes adequat.[6] En SQL inclou órdens per a seleccionar, insertar, actualisar i borrar les senyes. Existixen quatre operacions bàsiques: SELECT, INSERT, UPDATE i DELETE.

SELECT (Seleccionar)

[editar | editar còdic]

La sentència SELECT nos permet consultar les senyes almagasenades en una taula de la base de senyes.

Forma bàsica

[editar | editar còdic]
SELECT [{ALL|DISTINCT}]
    <nomene_camp>[, <nomene_camp>...]

FROM {<nomene_taula>|<nom_vista>}[,
    {<nomene_taula>|<nom_vista>}...]

[WHERE <condició> [{AND|OR} <condició>...]]

[GROUP BY <nomene_camp>[, <nomene_camp>...]]

[HAVING <condició> [{AND|OR} <condició>...]]

[ORDER BY {<nomene_camp>|<indice_camp>} [{ASC|DESC}][,
    {<nomene_camp>|<indice_camp>} [{ASC|DESC}]]];


SELECT Paraula clau que indica que la sentència de SQL que volem eixecutar és una consulta. Selecciona tant els camps que s'enumeren com tots els registres que complixquen en la condició de la part WHERE. Quan els atributs es prenen de distintes taules en la part FROM, també realisa la reunió (join). Per això es diu que és un llenguage ortogonal.

Quan es posa la paraula clau ALL Indica que volem seleccionar tots els valors, és dir que genere un multiconjunto o bossa en lloc d'un conjunt. És el valor per defecte i no sol especificar-se casi mai. Quan es posa la paraula clau DISTINCT Indica que volem seleccionar solament els valors distints. El resultat és un conjunt en lloc d'un multiconjunto o bossa.

FROM Indica la taula (o taules) des de la que volem recuperar les senyes. En el cas de que existixca més d'una taula es denomina a la consulta "consulta combinada" o reunió "join". En les consultes combinades és necessari aplicar una condició de combinació a través d'una clàusula WHERE.
WHERE Especifica una condició que deu complir-se per a que les senyes siguen tornades per la consulta. Admet els operadors llògics AND i OR ademés dels relacionals i uns atres.
GROUP BY Especifica l'agrupació que es dona a les senyes. S'usa sempre en combinació en funcions agregades.
HAVING Especifica una condició que deu complir-se per a que les senyes siguen tornades per la consulta. El seu funcionament és similar al de WHERE pero aplicat al conjunt de resultats tornats per la consulta. Deu aplicar-se sempre junt a GROUP BY i la condició deu estar referida als camps continguts en ella.
ORDER BY Presenta el resultat ordenat per les columnes indicades. L'orde pot expressar-se en ASC (orde ascendent) i DESC (orde descendent). El valor predeterminat és ASC.

Eixemple:

Per a formular una consulta a la taula coches i recuperar els camps matrícula, marca, model, color, número_quilómetros, num_places devem eixecutar la següent consulta. Les senyes seran tornades ordenats per marca i per model en orde ascendent, de menor a major. La paraula clau FROM indica que les senyes seran recuperades de la taula Coches.

SELECT
    matricula,
    marca,
    model,
    color,
    numere_kilometros,
    num_places
FROM
    coches
ORDER BY
    marca,
    model;

Eixemple de consulta simplificada a través d'un comodí de camps (*):

L'us de l'asterisc indica que volem que la consulta torne tots els camps que existixen en la taula i les senyes seran tornades ordenats per marca i per model.

SELECT *
FROM
    coches
ORDER BY
    marca,
    model;

Clàusula WHERE (A on)

[editar | editar còdic]

La clàusula WHERE és l'instrucció que nos permet filtrar el resultat d'una sentència SELECT. Habitualment no desigem obtindre tota l'informació existent en la taula, sino que volem obtindre solament l'informació que nos resulte útil en eixe moment. La clàusula WHERE filtra les senyes abans de ser tornats per la consulta. Quan en la Clàusula WHERE volem incloure un tipo text, devem incloure el valor entre comillas simples.

Eixemples:

En el nostre eixemple, es desija consultar un coche en concret, per a açò es va agregar una clàusula WHERE. Esta clàusula especifica una o vàries condicions que deuen complir-se per a que la sentència SELECT torne les senyes. En este cas la consulta tornarà solament les senyes del coche en matrícula per a que la consulta torne solament les senyes del coche en matrícula MF-234-ZD o be la matrícula FK-938-ZL . Es pot utilisar la clàusula WHERE solament, o en combinació en tantes condicions com vullgam.

SELECT
    matricula,
    marca,
    model,
    color,
    numere_kilometros,
    num_places
FROM
    coches
WHERE
    matricula = 'MF-234-ZD'
    OR matricula = 'FK-938-ZL';

Una condició WHERE pot ser negada a través de l'Operador Llògic NOT. La Següent consulta tornarà totes les senyes de la taula Coches, menys el que tinga la Matrícula MF-234-ZD.

SELECT
    matricula,
    marca,
    model,
    color,
    numere_kilometros,
    num_places
FROM
    coches
WHERE
    NOT matricula = 'MF-234-ZD';

La següent consulta utilisa la condicional DISTINCT, la qual nos tornarà la taula generada en seleccionar únicament els camps marca i model de cada registre, eliminant els renglons repetits. Dit d'una atra manera, el conjunt de models de cada marca que hi ha en coches.

SELECT DISTINCT marca, model FROM coches;

Si s'ometera DISTINCT o s'usara ALL la taula generada tindria renglons repetits perque pot haver varis coches de la mateixa marca i model pero en distinta matrícula. En eixe cas el resultat seria un multiconjunto a on cada rengló en els camps marca i model en la resposta correspon a alguna matrícula de la taula coches que no es mostra en la resposta.

Clàusula ORDER BY (Ordernar per)

[editar | editar còdic]

La clàusula ORDER BY és l'instrucció que nos permet especificar l'orde en el que seran tornats les senyes. Podem especificar l'orde de forma ascendent o descendent a través de les paraules clau ASC i DESC. L'orde depén del tipo de senyes que estiguen definits en la columna, de manera que un camp numèric serà ordenat com a tal, i un alfanumèric s'ordenarà de la A a la Z, encara que el seu contingut siga numèric. El valor predeterminat és ASC si no s'especifica en fer la consulta.

Eixemples:

SELECT
    matricula,
    marca,
    model,
    color,
    numere_kilometros,
    num_places
FROM
    coches
ORDER BY
    marca ASC,
    model DESC;

Este eixemple, selecciona tots els camps matrícula, marca, model, color, numere_kilometros i num_places de la taula coches, ordenant-los pels camps marca i model, marca en forma ascendent i model en forma descendent.

SELECT
    matricula,
    marca,
    model,
    color,
    numere_kilometros,
    num_places
FROM
    coches
ORDER BY 2;

Este eixemple, selecciona tots els camps matrícula, marca, model, color, numere_kilometros i num_places de la taula coches, ordenant-los pel camp marca, ya que apareix en segon lloc dins de la llista de camps que componen la SELECT.

Subconsultas

[editar | editar còdic]

Una subconsulta és una sentència SELECT que està embebida en una clàusula d'una atra sentència SQL. També poden utilisar-se subconsultas en els comandos INSERT, UPDATE, DELETE i en la clàusula FROM.[7]

Les subconsultas poden resultar útils si necessites seleccionar files d'una taula en una condició que depén de les senyes de la pròpia taula o d'una atra taula.

La subconsulta (consulta interna), s'eixecuta abans de la consulta principal; el resultat de la subconsulta és utilisat per la consulta principal (consulta externa).

SELECT c.matricula, c.model
FROM   coches AS c
WHERE  c.matricula IN
    (
        SELECT m.matricula
        FROM   multes AS m
        WHERE  m.import > 100
    );

En este eixemple, se seleccionen les matrícules i els models dels coches les multes dels quals superen els o$s 100.

INSERT (Insertar)

[editar | editar còdic]

Una sentència INSERT de SQL agrega un o més registres a una (i solament una) taula en una base de senyes relacional.

Forma bàsica

[editar | editar còdic]
INSERT INTO
    taula(columnaA, [columnaB, ...])
VALUES
    ('valor1', ['valor2', ...]);

-- O també es pot utilisar com:
INSERT INTO taula VALUES ('valor1', 'valor2');

Les cantitats de columnes i valors deuen ser iguals. Si una columna no s'especifica, li serà assignat el valor per omissió. Els valors especificats (o implícits) per la sentència INSERT deuran satisfer totes les restriccions aplicables. Si ocorre un error de sintaxis o si alguna de les restriccions és violada, no s'agrega la fila i es torna un error.

Eixemple

[editar | editar còdic]
INSERT INTO agenda_telefonica (nom, numere)
VALUES ('Roberto Jeldrez', 4886850);

Quan s'especifiquen tots els valors d'una taula, es pot utilisar la sentència acurtada:

INSERT INTO nomene_taula VALUES ('valor1', ['valor2', ...]);

Eixemple (assumint que 'nom' i 'número' són les úniques columnes de la taula 'agenda_telefonica'):

INSERT INTO agenda_telefonica
VALUES ('Johnny Aguilar', 080473968);

Formes alvançades

[editar | editar còdic]

Una característica de SQL (des de SQL-92) és l'us de constructors de files per a insertar múltiples files al mateix temps, en una sola sentència SQL:

INSERT INTO
    taula(columna1[, columna2, ...])
VALUES
    ('valor1A', ['valor1B', ...]),
    ('value2A', ['value2B', ...]), ...;

Esta característica és soportada per DB2, PostgreSQL (des de la versió 8.2), MySQL, i H2.

Eixemple (assumint que nom i número són les úniques columnes en la taula agenda_telefonica):

INSERT INTO
    agenda_telefonica
VALUES
    ('Roberto Fernández', '4886850'),
    ('Alejandro Moixa', '4556550');

Que podia haver segut realisat per les sentències

INSERT INTO agenda_telefonica VALUES ('Roberto Fernández', '4886850');
INSERT INTO agenda_telefonica VALUES ('Alejandro Moixa', '4556550');

Notar que les sentències separades poden tindre semàntica diferent (especialment sobre els triggers), i pot tindre diferent rendiment que la sentència d'inserció múltiple.

Per a insertar vàries files en MS SQL pot utilisar eixa construcció:

INSERT INTO phone_book
SELECT 'John Doe', '555-1212'
UNION ALL
SELECT 'Peter Doe', '555-2323';

Tinga en conte que no es tracta d'una sentència SQL vàlida d'acort en l'estàndart SQL (SQL: 2003), per la clàusula subselect incompleta.

Per a fer lo mateix en Oracle s'usa la Taula DUAL, sempre que es tracte de solament una simple fila:

INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM DUAL
UNION ALL
SELECT 'Peter Doe','555-2323' FROM DUAL

Una implementació conforme a l'estàndart d'esta llògica es mostra el següent eixemple, o com es mostra dalt (no aplica en Oracle):

INSERT INTO phone_book

SELECT 'John Doe', '555-1212' FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'Peter Doe','555-2323' FROM LATERAL ( VALUES (1) ) AS t(c)
Còpia de files d'atres taules
[editar | editar còdic]

Un INSERT també pot utilisar-se per a recuperar senyes d'uns atres, modificar-la si és necessari i insertar-la directament en la taula. Tot açò es fa en una sola sentència SQL que no implica cap processament intermig en l'aplicació client. Un SUBSELECT s'utilisa en lloc de la clàusula VALUES. El SUBSELECT pot contindre la sentencia JOIN, cridades a funcions, i pot inclús consultar en la mateixa TAULA les senyes que s'inserta. Llògicament, el SELECT s'evalua abans que l'operació INSERT estiga iniciada. Un eixemple es dona a continuació.

INSERT INTO phone_book2

SELECT *
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe');

Una variació és necessària quan alguns de les senyes de la taula font s'està insertant en la nova taula, pero no tot el registre. (O quan els esquemes de les taules no són iguals.)

INSERT INTO phone_book2 ([name], [phoneNumber])

SELECT [name], [phoneNumber]
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe');

El SELECT produïx una taula (temporal), i l'esquema de la taula temporal deu coincidir en l'esquema de la taula a on les senyes són insertades.

UPDATE (Actualisar)

[editar | editar còdic]

Una sentència UPDATE de SQL és utilisada per a modificar els valors d'un conjunt de registres existents en una taula.

Eixemple

[editar | editar còdic]
UPDATE My_table SET field1 = 'updated value' WHERE field2 = 'N';

DELETE (Borrar)

[editar | editar còdic]

Una sentència DELETE de SQL borra un o més registres existents en una taula.

Forma bàsica

[editar | editar còdic]
DELETE FROM taula WHERE columna1 = 'valor1';

Eixemple

[editar | editar còdic]
DELETE FROM la meua_taula WHERE columna2 = 'N';

Recuperació de clau

[editar | editar còdic]

Els dissenyadors de base de senyes que usen una clau suplent com la clau principal per a cada taula, s'eixecutarà en l'ocasional escenari en el que és necessari recuperar automàticament la base de senyes, generant una clau primària d'una sentència SQL INSERT per al seu us en atres sentències SQL. La majoria dels sistemes no permeten sentències SQL INSERT per a retornar fila de senyes. Per lo tant, es fa necessari aplicar una solució en tals escenaris.

Implementacions comunes inclouen:

  • Utilisant un procediment almagasenat específic de base de senyes que genera la clau suplent, realise l'operació INSERT, i finalment torna la clau generada.
  • Utilisant una sentència SELECT especifica de base de senyes, sobre una taula temporal que conté l'última fila insertada. DB2 implementa esta característica de la següent manera:
SELECT *
FROM NEW TABLE (
    INSERT INTO phone_book
    VALUES ('Cristobal Jeldrez','0426.817.10.30')
) AS t
  • Utilisant una sentència SELECT despuix de la sentència INSERT en funció específica de base de senyes, que torna la clau primària generada pel registre insertat més recentment.
  • Utilisant una combinació única d'elements de l'original SQL INSERT en una posterior sentència SELECT.
  • Utilisant un GUID en la sentència SQL INSERT i la recupera en una sentència SELECT.
  • Utilisant la funció de PHP mysql_insert_aneu() de MySQL despuix de la sentència INSERT.
  • Utilisant un INSERT en la clàusula RETURNING para Oracle, que solament es pot utilisar dins d'un PL/SQL bloc, en el cas de PostgreSQL es pot usar també tant en SQL com en PL/SQL.
INSERT INTO phone_book VALUES ('Cristobal Jeldrez', '0426.817.10.30')
RETURNING phone_book_aneu INTO v_pb_aneu
  • En el cas de MS SQL es pot utilisar la següent instrucció:
Set NoCount On;
INSERT INTO phone_book VALUES ('Cristobal Jeldrez', '0426.817.10.30');
Select Identity as aneu

Disparadores

[editar | editar còdic]

Els disparadores, també coneguts com a desencadenants (triggers en anglés) són definits sobre la taula en la que opera la sentència INSERT, i són evaluats en el context de l'operació. Els desencadenants BEFORE INSERT permeten la modificació dels valors que s'insertaran en la taula. Els desencadenants AFTER INSERT no pot modificar les senyes d'ara en avant, pero es pot utilisar per a iniciar accions en atres taules, per eixemple per a aplicar mecanismes d'auditoria Excel.

Sistemes de gestió de base de senyes

[editar | editar còdic]

Els sistemes de gestió de base de senyes en soport SQL més utilisats són, per orde alfabètic:

Interoperabilidad

[editar | editar còdic]

El llenguage de consultes dels diferents sistemes de gestió de bases de senyes són incompatibles entre ells i no necessàriament seguixen completament l'estàndart. En particular, la sintaxis de data i temps, la concatenació de cadenes, nules, i la comparació de texts sobre el tractament de mayúscules i minúscules varien d'un proveïdor a un atre. Una excepció particular és PostgreSQL, que s'esforça per conseguir el compliment de l'estàndart.

Les implementacions populars de SQL ometen comunament soport per a funcions bàsiques de SQL estàndar, com la dels tipos de senya DONA'T o CLAVE. És el cas del manejador de bases de senyes d'Oracle (el tipo de les quals DONA'T es comporta com DATETIME, i carix d'un tipo CLAVE)[8] i MS SQL Server (abans de la versió de 2008). Com a resultat, el còdic SQL rara volta pot ser portat entre els sistemes de base de senyes sense modificacions.

Hi ha vàries raons per a esta falta de portabilitat entre sistemes de bases de senyes:

  • La complexitat i el tamany de l'estàndart SQL comporta a que la majoria de les implementacions de SQL no siguen compatibles en la norma completa.
  • La norma no especifica el comportament de la base de senyes en vàries àrees importants (per eixemple, índexs, almagasenament d'archius, etc.), deixant a les implementacions decidir cóm comportar-se.
  • L'estàndart SQL especifica en precisió la sintaxis que un sistema de base de senyes conforme deu implementar. No obstant, no està tan ben definida l'especificació en l'estàndart de la semàntica de les construccions del llenguage, lo que du a ambigüitat.
  • Molts proveïdors de bases de senyes tenen grans bases de clients existents, per lo que introduir canvis per a adaptar-se l'estàndart podria produir incompatibilitats en les instalacions dels usuaris i el proveïdor pot no estar dispost a abandonar la compatibilitat en versions anteriors.
  • Hi ha poc incentiu comercial per a que un proveïdor facilite als usuaris el canviar de proveïdor de bases de senyes.
  • Els usuaris que evaluen el software de base de senyes tendixen a valorar més atres factors tals com el rendiment més alt en les seues prioritats sobre les conformitat a l'estàndart.

L'estàndart ODBC (Open Database Connectivity) permet accedir a l'informació des de qualsevol aplicació independentment del sistema de gestió de base de senyes (DBMS) en el que estiga almagasenada l'informació, desacoplando aixina l'aplicació de la base de senyes.

Vore també

[editar | editar còdic]

Referències

[editar | editar còdic]

[[Categoria:#Acrònim d'informàtica]]

Referències

[editar | editar còdic]
  1. Morteo, Bocalandro, Francisco, Nicolás (2004). Un enfocament pràctic de SQL, Edicions Cooperatives. ISBN 987-1076-61-4.
  2. EF Codd; A relational model of data for large shared data banks. Comm. ACM, 13 (1970), pp. 377-387.
  3. Eisenberg et al.: SQL:2003 Has Been Published.
  4. Aprovació de SQL 2008.
  5. Chapple, Mike. About.com (ed.): «SQL Fundamentals». Databases. Archivat des d'el original, el 22 de febrer de 2009. Consultat el 17 d'octubre de 2015.
  6. 6,0 6,1 (2011) Course Technology/Cengage Learning (ed.). The language of SQL.
  7. Morteo, Bocalandro., Francisco, Nicolás (2004). Un enfocament pràctic de SQL, Edicions cooperatives. ISBN 987-1076-61-4.
  8. Erro en la cita: L'element <ref> no és vàlit; puix no n'hi ha una referència en text nomenada Ora