Ir al contenido
Menú principal
Menú principal
mover a la barra lateral
ocultar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Buscar
Buscar
español
Apariencia
Crear una cuenta
Acceder
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Editando
SQL
(sección)
Página
Discusión
español
Leer
Editar
Editar código
Ver historial
Herramientas
Herramientas
mover a la barra lateral
ocultar
Acciones
Leer
Editar
Editar código
Ver historial
General
Lo que enlaza aquí
Cambios relacionados
Información de la página
Apariencia
mover a la barra lateral
ocultar
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
== Lenguaje de manipulación de datos DML (Data Manipulation Language) == El lenguaje de manipulación de datos (''Data Manipulation Language'', o ''DML'' en inglés) es el que permite a los usuarios llevar a cabo las tareas de consulta o manipulación de los datos, organizados por el modelo de datos adecuado.<ref name="Rockoff"/> En SQL incluye órdenes para seleccionar, insertar, actualizar y borrar los datos. Existen cuatro operaciones básicas: SELECT, INSERT, UPDATE y DELETE. === SELECT (Seleccionar) === La sentencia '''SELECT''' nos permite consultar los datos almacenados en una tabla de la base de datos. ==== Forma básica ==== <syntaxhighlight lang="sql"> SELECT [{ALL|DISTINCT}] <nombre_campo>[, <nombre_campo>...] FROM {<nombre_tabla>|<nombre_vista>}[, {<nombre_tabla>|<nombre_vista>}...] [WHERE <condición> [{AND|OR} <condición>...]] [GROUP BY <nombre_campo>[, <nombre_campo>...]] [HAVING <condición> [{AND|OR} <condición>...]] [ORDER BY {<nombre_campo>|<indice_campo>} [{ASC|DESC}][, {<nombre_campo>|<indice_campo>} [{ASC|DESC}]]]; </syntaxhighlight><br /> {| |'''SELECT''' |Palabra clave que indica que la sentencia de SQL que queremos ejecutar es una consulta. Selecciona tanto los campos que se enumeran como todos los registros que cumplan con la condición de la parte WHERE. Cuando los atributos se toman de distintas tablas en la parte FROM, también realiza la reunión (join). Por eso se dice que es un lenguaje ortogonal. Cuando se pone la palabra clave '''ALL''' Indica que queremos seleccionar todos los valores, es decir que genere un [[multiconjunto]] o bolsa en lugar de un conjunto. Es el valor por defecto y no suele especificarse casi nunca. Cuando se pone la palabra clave '''DISTINCT''' Indica que queremos seleccionar solo los valores distintos. El resultado es un conjunto en lugar de un [[multiconjunto]] o bolsa. |- |'''FROM''' |Indica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que exista más de una tabla se denomina a la consulta "consulta combinada" o reunión "join". En las consultas combinadas es necesario aplicar una condición de combinación a través de una cláusula '''WHERE'''. |- |'''WHERE''' |Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Admite los operadores lógicos '''AND''' y '''OR''' además de los relacionales y otros. |- |'''GROUP BY''' |Especifica la agrupación que se da a los datos. Se usa siempre en combinación con funciones agregadas. |- |'''HAVING''' |Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es similar al de '''WHERE''' pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a '''GROUP BY''' y la condición debe estar referida a los campos contenidos en ella. |- |'''ORDER BY''' |Presenta el resultado ordenado por las columnas indicadas. El orden puede expresarse con '''ASC''' (orden ascendente) y '''DESC '''(orden descendente). El valor predeterminado es '''ASC.''' |} Ejemplo: Para formular una consulta a la tabla coches y recuperar los campos matrícula, marca, modelo, color, número_kilómetros, num_plazas debemos ejecutar la siguiente consulta. Los datos serán devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor. La palabra clave '''FROM''' indica que los datos serán recuperados de la tabla Coches. <syntaxhighlight lang="sql"> SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches ORDER BY marca, modelo; </syntaxhighlight> Ejemplo de consulta simplificada a través de un comodín de campos (*): El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla y los datos serán devueltos ordenados por marca y por modelo. <syntaxhighlight lang="sql"> SELECT * FROM coches ORDER BY marca, modelo; </syntaxhighlight> ==== Cláusula WHERE (Donde) ==== La cláusula'' WHERE'' es la instrucción que nos permite filtrar el resultado de una sentencia '''SELECT'''. Habitualmente no deseamos obtener toda la información existente en la tabla, sino que queremos obtener solo la información que nos resulte útil en ese momento. La cláusula '''WHERE''' filtra los datos antes de ser devueltos por la consulta. Cuando en la Cláusula WHERE queremos incluir un tipo texto, debemos incluir el valor entre comillas simples. Ejemplos: En nuestro ejemplo, se desea consultar un coche en concreto, para esto se agregó una cláusula '''WHERE'''. Esta cláusula especifica una o varias condiciones que deben cumplirse para que la sentencia '''SELECT''' devuelva los datos. En este caso la consulta devolverá solo los datos del coche con matrícula para que la consulta devuelva solo los datos del coche con matrícula <code>MF-234-ZD </code>o bien la matrícula <code>FK-938-ZL</code> . Se puede utilizar la cláusula '''WHERE''' solamente, o en combinación con tantas condiciones como queramos. <syntaxhighlight lang="sql"> SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches WHERE matricula = 'MF-234-ZD' OR matricula = 'FK-938-ZL'; </syntaxhighlight> Una condición WHERE puede ser negada a través del Operador Lógico NOT. La Siguiente consulta devolverá todos los datos de la tabla Coches, menos el que tenga la Matrícula <code>MF-234-ZD</code>. <syntaxhighlight lang="sql"> SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches WHERE NOT matricula = 'MF-234-ZD'; </syntaxhighlight> La siguiente consulta utiliza la condicional '''DISTINCT''', la cual nos devolverá la tabla generada al seleccionar únicamente los campos marca y modelo de cada registro, eliminando los renglones repetidos. Dicho de otra manera, el [[conjunto]] de modelos de cada marca que hay en coches. <syntaxhighlight lang="sql"> SELECT DISTINCT marca, modelo FROM coches; </syntaxhighlight> Si se omitiese '''DISTINCT''' o se usase '''ALL''' la tabla generada tendría renglones repetidos porque puede haber varios coches de la misma marca y modelo pero con distinta matrícula. En ese caso el resultado sería un [[multiconjunto]] donde cada renglón con los campos ''marca y modelo'' en la respuesta corresponde a alguna matrícula de la tabla ''coches'' que no se muestra en la respuesta. ==== Cláusula ORDER BY (Ordernar por) ==== La cláusula'' ORDER BY'' es la instrucción que nos permite especificar el orden en el que serán devueltos los datos. Podemos especificar el orden de forma ascendente o descendente a través de las palabras clave '''ASC '''y '''DESC'''. El orden depende del tipo de datos que estén definidos en la columna, de forma que un campo numérico será ordenado como tal, y un alfanumérico se ordenará de la A a la Z, aunque su contenido sea numérico. El valor predeterminado es ASC si no se especifica al hacer la consulta. Ejemplos: <syntaxhighlight lang="sql"> SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches ORDER BY marca ASC, modelo DESC; </syntaxhighlight> Este ejemplo, selecciona todos los campos matrícula, marca, modelo, color, numero_kilometros y num_plazas de la tabla coches, ordenándolos por los campos marca y modelo, marca en forma ascendente y modelo en forma descendente.<syntaxhighlight lang="sql"> SELECT matricula, marca, modelo, color, numero_kilometros, num_plazas FROM coches ORDER BY 2; </syntaxhighlight> Este ejemplo, selecciona todos los campos matrícula, marca, modelo, color, numero_kilometros y num_plazas de la tabla coches, ordenándolos por el campo ''marca'', ya que aparece en segundo lugar dentro de la lista de campos que componen la '''SELECT.''' === Subconsultas === Una subconsulta es una sentencia SELECT que está embebida en una cláusula de otra sentencia SQL. También pueden utilizarse subconsultas en los comandos INSERT, UPDATE, DELETE y en la cláusula FROM.<ref>{{Cita libro|apellidos=Morteo, Bocalandro.|nombre=Francisco, Nicolás|enlaceautor=|título=Un enfoque práctico de SQL|url=|fechaacceso=|año=2004|editorial=Ediciones cooperativas|isbn=987-1076-61-4|editor=|ubicación=|página=|idioma=|capítulo=}}</ref> Las subconsultas pueden resultar útiles si necesitas seleccionar filas de una tabla con una condición que depende de los datos de la propia tabla o de otra tabla. La subconsulta (consulta interna), se ejecuta antes de la consulta principal; el resultado de la subconsulta es utilizado por la consulta principal (consulta externa). <syntaxhighlight lang="sql"> SELECT c.matricula, c.modelo FROM coches AS c WHERE c.matricula IN ( SELECT m.matricula FROM multas AS m WHERE m.importe > 100 ); </syntaxhighlight>En este ejemplo, se seleccionan las matrículas y los modelos de los coches cuyas multas superan los u$s 100. === INSERT (Insertar) === Una sentencia ''INSERT'' de SQL agrega uno o más registros a una (y solo una) tabla en una base de datos relacional. ==== Forma básica ==== <syntaxhighlight lang="sql"> INSERT INTO tabla(columnaA, [columnaB, ...]) VALUES ('valor1', ['valor2', ...]); -- O también se puede utilizar como: INSERT INTO tabla VALUES ('valor1', 'valor2'); </syntaxhighlight> Las cantidades de columnas y valores deben ser iguales. Si una columna no se especifica, le será asignado el valor por omisión. Los valores especificados (o implícitos) por la sentencia <code>INSERT</code> deberán satisfacer todas las restricciones aplicables. Si ocurre un error de sintaxis o si alguna de las restricciones es violada, no se agrega la [[fila (base de datos)|fila]] y se devuelve un error. ==== Ejemplo ==== <syntaxhighlight lang="sql"> INSERT INTO agenda_telefonica (nombre, numero) VALUES ('Roberto Jeldrez', 4886850); </syntaxhighlight> Cuando se especifican todos los valores de una tabla, se puede utilizar la sentencia acortada: <syntaxhighlight lang="sql"> INSERT INTO nombre_tabla VALUES ('valor1', ['valor2', ...]); </syntaxhighlight> Ejemplo (asumiendo que 'nombre' y 'número' son las únicas columnas de la tabla 'agenda_telefonica'): <syntaxhighlight lang="sql"> INSERT INTO agenda_telefonica VALUES ('Johnny Aguilar', 080473968); </syntaxhighlight> ==== Formas avanzadas ==== Una característica de SQL (desde SQL-92) es el uso de ''constructores de filas'' para insertar múltiples filas a la vez, con una sola sentencia SQL: <syntaxhighlight lang="sql"> INSERT INTO tabla(columna1[, columna2, ...]) VALUES ('valor1A', ['valor1B', ...]), ('value2A', ['value2B', ...]), ...; </syntaxhighlight> Esta característica es soportada por DB2, PostgreSQL (desde la versión 8.2), MySQL, y H2. Ejemplo (asumiendo que nombre y número son las únicas columnas en la tabla agenda_telefonica): <syntaxhighlight lang="sql"> INSERT INTO agenda_telefonica VALUES ('Roberto Fernández', '4886850'), ('Alejandro Sosa', '4556550'); </syntaxhighlight> Que podía haber sido realizado por las sentencias <syntaxhighlight lang="sql"> INSERT INTO agenda_telefonica VALUES ('Roberto Fernández', '4886850'); INSERT INTO agenda_telefonica VALUES ('Alejandro Sosa', '4556550'); </syntaxhighlight> Notar que las sentencias separadas pueden tener semántica diferente (especialmente con respecto a los triggers), y puede tener diferente rendimiento que la sentencia de inserción múltiple. Para insertar varias filas en MS SQL puede utilizar esa construcción: <syntaxhighlight lang="sql"> INSERT INTO phone_book SELECT 'John Doe', '555-1212' UNION ALL SELECT 'Peter Doe', '555-2323'; </syntaxhighlight> Tenga en cuenta que no se trata de una sentencia SQL válida de acuerdo con el estándar SQL ([[SQL: 2003]]), debido a la cláusula subselect incompleta. Para hacer lo mismo en Oracle se usa la [[Tabla DUAL]], siempre que se trate de solo una simple fila: <syntaxhighlight lang="sql"> INSERT INTO phone_book SELECT 'John Doe', '555-1212' FROM DUAL UNION ALL SELECT 'Peter Doe','555-2323' FROM DUAL </syntaxhighlight> Una implementación conforme al estándar de esta lógica se muestra el siguiente ejemplo, o como se muestra arriba (no aplica en Oracle): <syntaxhighlight lang="sql"> 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) </syntaxhighlight> ===== Copia de filas de otras tablas ===== Un INSERT también puede utilizarse para recuperar datos de otros, modificarla si es necesario e insertarla directamente en la tabla. Todo esto se hace en una sola sentencia SQL que no implica ningún procesamiento intermedio en la aplicación cliente. Un SUBSELECT se utiliza en lugar de la cláusula VALUES. El SUBSELECT puede contener la [[Sentencia JOIN en SQL|sentencia JOIN]], llamadas a funciones, y puede incluso consultar en la misma TABLA los datos que se inserta. Lógicamente, el SELECT se evalúa antes que la operación INSERT esté iniciada. Un ejemplo se da a continuación. <syntaxhighlight lang="sql"> INSERT INTO phone_book2 SELECT * FROM phone_book WHERE name IN ('John Doe', 'Peter Doe'); </syntaxhighlight> Una variación es necesaria cuando algunos de los datos de la tabla fuente se está insertando en la nueva tabla, pero no todo el registro. (O cuando los esquemas de las tablas no son iguales.) <syntaxhighlight lang="sql"> INSERT INTO phone_book2 ([name], [phoneNumber]) SELECT [name], [phoneNumber] FROM phone_book WHERE name IN ('John Doe', 'Peter Doe'); </syntaxhighlight> El SELECT produce una tabla (temporal), y el esquema de la tabla temporal debe coincidir con el esquema de la tabla donde los datos son insertados. === UPDATE (Actualizar) === Una sentencia ''UPDATE'' de SQL es utilizada para modificar los valores de un conjunto de registros existentes en una tabla. ==== Ejemplo ==== <syntaxhighlight lang="sql"> UPDATE My_table SET field1 = 'updated value' WHERE field2 = 'N'; </syntaxhighlight> === DELETE (Borrar) === Una sentencia ''DELETE'' de SQL borra uno o más registros existentes en una tabla. ==== Forma básica ==== <syntaxhighlight lang="sql"> DELETE FROM tabla WHERE columna1 = 'valor1'; </syntaxhighlight> ==== Ejemplo ==== <syntaxhighlight lang="sql"> DELETE FROM mi_tabla WHERE columna2 = 'N'; </syntaxhighlight>
Resumen:
Al guardar los cambios aceptas los
términos de uso
y liberas de forma irrevocable tu contribución conforme a los términos de las licencias
licencia CC BY-SA 4.0
y
GFDL
. Aceptas igualmente que un hipervínculo o URL es atribución suficiente conforme a la licencia Creative Commons.
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Buscar
Buscar
Editando
SQL
(sección)
Añadir idiomas
Añadir tema