SQL-SENTENCIAS
SQL-SENTENCIAS
Comando Descripción
ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos.
Comandos DML
Comando Descripción
SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos
Cláusulas
Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o manipular.
Cláusula Descripción
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
WHERE Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden específico
Operadores Lógicos
Operador Uso
AND Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas.
OR Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta.
<> Distinto de
= Igual que
SUM Utilizada para devolver la suma de todos los valores de un campo determinado
DISTINCTOW Omite los registros duplicados basandose en la totalidad del registro y no sólo en los campos seleccionados.
DISTINCT
Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción
SELECT se incluyan en la consulta deben ser únicos. Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo
apellido. Si dos registros contienen López en el campo Apellido, la siguiente instrucción SQL devuelve un único registro:
SELECT DISTINCT
Apellido
FROM
Empleados
Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la cláusula SELECT posean un contenido
diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros
usuarios.
DISTINCTROW
Este predicado no es compatible con ANSI. Que yo sepa a día de hoy sólo funciona con ACCESS.
Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior que sólo se fijaba en el contenido de los campos seleccionados,
éste lo hace en el contenido del registro completo independientemente de los campos indicados en la cláusula SELECT.
SELECT DISTINCTROW
Apellido
FROM Empleados
Si la tabla empleados contiene dos registros: Antonio López y Marta López el ejemplo del predicado DISTINCT devuelve un único registro con el
valor López en el campo Apellido ya que busca no duplicados en dicho campo. Este último ejemplo devuelve dos registros con el valor López en el
apellido ya que se buscan no duplicados en el registro completo.
ALIAS
En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por simple
capricho o porque estamos recuperando datos de diferentes tablas y resultan tener un campo con igual nombre. Para resolver todas ellas tenemos
la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como referencia el ejemplo anterior
podemos hacer que la columna devuelta por la consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame Empleado. En este
caso procederíamos de la siguiente forma:
SELECT DISTINCTROW
Apellido AS Empleado
FROM Empleados
AS no es una palabra reservada de ANSI, existen diferentes sistemas de asignar los alias en función del motor de bases de datos. En ORACLE
para asignar un alias a un campo hay que hacerlo de la siguiente forma:
SELECT
Apellido AS "Empleado"
FROM Empleados
También podemos asignar alias a las tablas dentro de la consulta de selección, en esta caso hay que tener en cuenta que en todas las referencias
que deseemos hacer a dicha tabla se ha de utilizar el alias en lugar del nombre. Esta técnica será de gran utilidad más adelante cuando se
estudien las vinculaciones entre tablas. Por ejemplo:
SELECT
Apellido AS Empleado
FROM
Empleados AS Trabajadores
Para asignar alias a las tablas en ORACLE y SQL-SERVER los alias se asignan escribiendo el nombre de la tabla, dejando un espacio en blanco y
escribiendo el Alias (se asignan dentro de la cláusula FROM).
SELECT
Trabajadores.Apellido (1) AS Empleado
FROM
Empleados Trabajadores
(1)
Esta nomenclatura [Tabla].[Campo] se debe utilizar cuando se está recuperando un campo cuyo nombre se repite en varias de las tablas que se
utilizan en la sentencia. No obstante cuando en la sentencia se emplean varias tablas es aconsejable utilizar esta nomenclatura para evitar el
trabajo que supone al motor de datos averiguar en que tabla está cada uno de los campos indicados en la cláusua SELECT.
DELETE
Crea una consulta de eliminación que elimina los registros de una o más de las tablas listadas en la cláusula FROM que satisfagan la cláusula
WHERE. Esta consulta elimina los registros completos, no es posible eliminar el contenido de algún campo en concreto. Su sintaxis es:
DELETE FROM Tabla WHERE criterio
Una vez que se han eliminado los registros utilizando una consulta de borrado, no puede deshacer la operación. Si desea saber qué registros se
eliminarán, primero examine los resultados de una consulta de selección que utilice el mismo criterio y después ejecute la consulta de borrado.
Mantenga copias de seguridad de sus datos en todo momento. Si elimina los registros equivocados podrá recuperarlos desde las copias de
seguridad.
DELETE
FROM
Empleados
WHERE
Cargo = 'Vendedor'
INSERT INTO
Agrega un registro en una tabla. Se la conoce como una consulta de datos añadidos. Esta consulta puede ser de dos tipo: Insertar un único
registro ó Insertar en una tabla los registros contenidos en otra tabla.
Para insertar un único Registro:
En este caso la sintaxis es la siguiente:
INSERT INTO Tabla (campo1, campo2, ..., campoN)
VALUES (valor1, valor2, ..., valorN)
Esta consulta graba en el campo1 el valor1, en el campo2 y valor2 y así sucesivamente.
Para seleccionar registros e insertarlos en una tabla nueva
En este caso la sintaxis es la siguiente:
SELECT campo1, campo2, ..., campoN INTO nuevatabla
FROM tablaorigen [WHERE criterios]
Se pueden utilizar las consultas de creación de tabla para archivar registros, hacer copias de seguridad de las tablas o hacer copias para exportar
a otra base de datos o utilizar en informes que muestren los datos de un periodo de tiempo concreto. Por ejemplo, se podría crear un informe de
Ventas mensuales por región ejecutando la misma consulta de creación de tabla cada mes.
Para insertar Registros de otra Tabla:
En este caso la sintaxis es:
INSERT INTO Tabla [IN base_externa] (campo1, campo2, , campoN)
SELECT TablaOrigen.campo1, TablaOrigen.campo2,,TablaOrigen.campoN FROM Tabla Origen
Ejemplos
INSERT INTO
Clientes
SELECT
ClientesViejos.*
FROM
ClientesNuevos
SELECT
Empleados.*
INTO Programadores
FROM
Empleados
WHERE
Categoria = 'Programador'
Esta consulta crea una tabla nueva llamada programadores con igual estructura que la tabla empleado y copia aquellos registros cuyo
campo categoria se programador
INSERT INTO
Empleados (Nombre, Apellido, Cargo)
VALUES
(
'Luis', 'Sánchez', 'Becario'
)
INSERT INTO
Empleados
SELECT
Vendedores.*
FROM
Vendedores
WHERE
Provincia = 'Madrid'
UPDATE
Crea una consulta de actualización que cambia los valores de los campos de una tabla especificada basándose en un criterio específico. Su
sintaxis es:
UPDATE Tabla SET Campo1=Valor1, Campo2=Valor2, CampoN=ValorN
WHERE Criterio
UPDATE es especialmente útil cuando se desea cambiar un gran número de registros o cuando éstos se encuentran en múltiples tablas. Puede
cambiar varios campos a la vez. El ejemplo siguiente incrementa los valores Cantidad pedidos en un 10 por ciento y los valores Transporte en un 3
por ciento para aquellos que se hayan enviado al Reino Unido.:
UPDATE
Pedidos
SET
Pedido = Pedidos * 1.1,
Transporte = Transporte * 1.03
WHERE
PaisEnvío = 'ES'
UPDATE no genera ningún resultado. Para saber qué registros se van a cambiar, hay que examinar primero el resultado de una consulta de
selección que utilice el mismo criterio y después ejecutar la consulta de actualización.
UPDATE
Empleados
SET
Grado = 5
WHERE
Grado = 2
UPDATE
Productos
SET
Precio = Precio * 1.1
WHERE
Proveedor = 8
AND
Familia = 3
Si en una consulta de actualización suprimimos la cláusula WHERE todos los registros de la tabla señalada serán actualizados.
UPDATE
Empleados
SET
Salario = Salario * 1.1
Consultas de Combinación entre tablas
Las vinculaciones entre tablas se realizan mediante la cláusula INNER que combina registros de dos tablas siempre que haya concordancia de
valores en un campo común. Su sintaxis es:
SELECT campos FROM tb1 INNER JOIN tb2 ON
tb1.campo1 comp tb2.campo2
En donde:
tb1, tb2 Son los nombres de las tablas desde las que se combinan los registros.
campo1, Son los nombres de los campos que se combinan. Si no son numéricos, los campos deben ser del mismo tipo de datos y
campo2 contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.
GROUP BY
Nombre + ' ' + Apellido
(Crea dos combinaciones equivalentes: una entre las tablas Detalles de pedidos y Pedidos, y la otra entre las tablas Pedidos y
Empleados. Esto es necesario ya que la tabla Empleados no contiene datos de ventas y la tabla Detalles de pedidos no contiene datos
de los empleados. La consulta produce una lista de empleados y sus ventas totales.)
Si empleamos la cláusula INNER en la consulta se seleccionarán sólo aquellos registros de la tabla de la que hayamos escrito a la izquierda de
INNER JOIN que contengan al menos un registro de la tabla que hayamos escrito a la derecha. Para solucionar esto tenemos dos cláusulas que
sustituyen a la palabra clave INNER, estas cláusulas son LEFT y RIGHT. LEFT toma todos los registros de la tabla de la izquierda aunque no
tengan ningún registro en la tabla de la izquierda. RIGHT realiza la misma operación pero al contrario, toma todos los registros de la tabla de la
derecha aunque no tenga ningún registro en la tabla de la izquierda.
La sintaxis expuesta anteriormente pertenece a ACCESS, en donde todas las sentencias con la sintaxis funcionan correctamente. Los manuales
de SQL-SERVER dicen que esta sintaxis es incorrecta y que hay que añadir la palabra reservada OUTER: LEFT OUTER JOIN y RIGHT OUTER
JOIN. En la práctica funciona correctamente de una u otra forma.
No obstante, los INNER JOIN ORACLE no es capaz de interpretarlos, pero existe una sintaxis en formato ANSI para los INNER JOIN que
funcionan en todos los sistemas. Tomando como referencia la siguiente sentencia:
SELECT
Facturas.*,
Albaranes.*
FROM
Facturas
INNER JOIN
Albaranes
ON
Facturas.IdAlbaran = Albaranes.IdAlbaran
WHERE
Facturas.IdCliente = 325
La transformación de esta sentencia a formato ANSI sería la siguiente:
SELECT
Facturas.*,
Albaranes.*
FROM
Facturas, Albaranes
WHERE
Facturas.IdAlbaran = Albaranes.IdAlbaran
AND
Facturas.IdCliente = 325
Como se puede observar los cambios realizados han sido los siguientes:
1. Todas las tablas que intervienen en la consulta se especifican en la cláusula FROM.
2. Las condiciones que vinculan a las tablas se especifican en la cláusula WHERE y se vinculan mediante el operador lógico AND.
Referente a los OUTER JOIN, no funcionan en ORACLE y además conozco una sintaxis que funcione en los tres sistemas. La sintaxis en
ORACLE es igual a la sentencia anterior pero añadiendo los caracteres (+) detrás del nombre de la tabla en la que deseamos aceptar valores
nulos, esto equivale a un LEFT JOIN:
SELECT
Facturas.*,
Albaranes.*
FROM
Facturas, Albaranes
WHERE
Facturas.IdAlbaran = Albaranes.IdAlbaran (+)
AND
Facturas.IdCliente = 325
Y esto a un RIGHT JOIN:
SELECT
Facturas.*,
Albaranes.*
FROM
Facturas, Albaranes
WHERE
Facturas.IdAlbaran (+) = Albaranes.IdAlbaran
AND
Facturas.IdCliente = 325
En SQL-SERVER se puede utilizar una sintaxis parecida, en este caso no se utiliza los caracteres (+) sino los caracteres =* para el LEFT JOIN y
*= para el RIGHT JOIN.
Consultas de Autocombinación
La autocombinación se utiliza para unir una tabla consigo misma, comparando valores de dos columnas con el mismo tipo de datos. La sintaxis en
la siguiente:
SELECT
alias1.columna, alias2.columna, ...
FROM
tabla1 as alias1, tabla2 as alias2
WHERE
alias1.columna = alias2.columna
AND
otras condiciones
Por ejemplo, para visualizar el número, nombre y puesto de cada empleado, junto con el número, nombre y puesto del supervisor de cada uno de
ellos se utilizaría la siguiente sentencia:
SELECT
t.num_emp, t.nombre, t.puesto, t.num_sup,s.nombre, s.puesto
FROM
empleados AS t, empleados AS s
WHERE
t.num_sup = s.num_emp
Consultas de Combinaciones no Comunes
La mayoría de las combinaciones están basadas en la igualdad de valores de las columnas que son el criterio de la combinación. Las no comunes
se basan en otros operadores de combinación, tales como NOT, BETWEEN, <>, etc.
Por ejemplo, para listar el grado salarial, nombre, salario y puesto de cada empleado ordenando el resultado por grado y salario habría que
ejecutar la siguiente sentencia:
SELECT
grados.grado,empleados.nombre, empleados.salario, empleados.puesto
FROM
empleados, grados
WHERE
empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior
ORDER BY
grados.grado, empleados.salario
Para listar el salario medio dentro de cada grado salarial habría que lanzar esta otra sentencia:
SELECT
grados.grado, AVG(empleados.salario)
FROM
empleados, grados
WHERE
empleados.salario BETWEEN grados.salarioinferior And grados.salariosuperior
GROUP BY
grados.grado
Operadores Lógicos
Los operadores lógicos soportados por SQL son: AND, OR, XOR, Eqv, Imp, Is y Not. A excepción de los dos últimos todos poseen la siguiente
sintaxis:
<expresión1> operador <expresión2>
En donde expresión1 y expresión2 son las condiciones a evaluar, el resultado de la operación varía en función del operador lógico. La tabla
adjunta muestra los diferentes posibles resultados:
Si a cualquiera de las anteriores condiciones le anteponemos el operador NOT el resultado de la operación será el contrario al devuelto sin el
operador NOT.
El último operador denominado Is se emplea para comparar dos variables de tipo objeto <Objeto1> Is <Objeto2>. este operador devuelve verdad
si los dos objetos son iguales.
SELECT * FROM Empleados
WHERE Edad > 25 AND Edad < 50
En determinado motores de bases de datos, esta cláusula, no reconoce el asterisco como carácter comodín y hay que sustituirlo por el carácter
tanto por ciento (%).
El Operador In
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sintaxis es:
expresión [Not] In(valor1, valor2, . . .)
SELECT *
FROM
Pedidos
WHERE
Provincia In ('Madrid', 'Barcelona', 'Sevilla')
La cláusula WHERE
La cláusula WHERE puede usarse para determinar qué registros de las tablas enumeradas en la cláusula FROM aparecerán en los resultados de
la instrucción SELECT. Después de escribir esta cláusula se deben especificar las condiciones expuestas en los apartados anteriores. Si no se
emplea esta cláusula, la consulta devolverá todas las filas de la tabla. WHERE es opcional, pero cuando aparece debe ir a continuación de FROM.
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Salario = 21000
SELECT
IdProducto, Existencias
FROM
Productos
WHERE
Existencias <= NuevoPedido
SELECT *
FROM
Pedidos
WHERE
FechaEnvio = #05-30-1994#
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos = 'King'
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos Like 'S*'
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Salario Between 200 And 300
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Apellidos Between 'Lon' And 'Tol'
SELECT
IdPedido, FechaPedido
FROM
Pedidos
WHERE
FechaPedido Between #01-01-1994# And #12-31-1994#
SELECT
Apellidos, Nombre, Ciudad
FROM
Empleados
WHERE
Ciudad In ('Sevilla', 'Los Angeles', 'Barcelona')
Agrupamiento de Registros
primarioN Es el nombre del campo o de los campos que forman el índice primario.
únicoN Es el nombre del campo o de los campos que forman el índice de clave única.
refN Es el nombre del campo o de los campos que forman el índice externo (hacen referencia a campos de otra tabla).
tabla externa Es el nombre de la tabla que contiene el campo o los campos referenciados en refN
campos externos Es el nombre del campo o de los campos de la tabla externa especificados por ref1, ref2,... , refN
Si se desea crear un índice para un campo cuando se esta utilizando las instrucciones ALTER TABLE o CREATE TABLE la cláusula CONTRAINT
debe aparecer inmediatamente después de la especificación del campo indexado.
Si se desea crear un índice con múltiples campos cuando se está utilizando las instrucciones ALTER TABLE o CREATE TABLE la cláusula
CONSTRAINT debe aparecer fuera de la cláusula de creación de tabla.
Indice Descripción
Genera un índice de clave única. Lo que implica que los registros de la tabla no pueden contener el mismo valor en los campos
UNIQUE
indexados.
PRIMARY Genera un índice primario el campo o los campos especificados. Todos los campos de la clave principal deben ser únicos y no
KEY nulos, cada tabla sólo puede contener una única clave principal.
Genera un índice externo (toma como valor del índice campos contenidos en otras tablas). Si la clave principal de la tabla
externa consta de más de un campo, se debe utilizar una definición de índice de múltiples campos, listando todos los campos de
FOREIGN referencia, el nombre de la tabla externa, y los nombres de los campos referenciados en la tabla externa en el mismo orden que
KEY los campos de referencia listados. Si los campos referenciados son la clave principal de la tabla externa, no tiene que especificar
los campos referenciados, predeterminado por valor, el motor Jet se comporta como si la clave principal de la tabla externa
estuviera formada por los campos referenciados.
Creación de Índices
Si se utiliza el motor de datos Jet de Microsoft sólo se pueden crear índices en bases de datos del mismo motor. La sintaxis para crear un índice
en ua tabla ya definida en la siguiente:
CREATE [ UNIQUE ] INDEX índice
ON Tabla (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]
En donde:
índice Es el nombre del índice a crear.
Indica el orden de los valores de los campos ASC indica un orden ascendente (valor predeterminado) y DESC un orden
ASC|DESC
descendente.
DISALLOW
Prohibe valores nulos en el índice
NULL
IGNORE NULL Excluye del índice los valores nulos incluidos en los campos que lo componen.
Asigna al índice la categoría de clave principal, en cada tabla sólo puede existir un único índice que sea "Clave Principal". Si
PRIMARY
un índice es clave principal implica que no puede contener valores nulos ni duplicados.
En el caso de ACCESS, se puede utilizar CREATE INDEX para crear un pseudo índice sobre una tabla adjunta en una fuente de datos ODBC tal
como SQL Server que no tenga todavía un índice. No necesita permiso o tener acceso a un servidor remoto para crear un pseudo índice, además
la base de datos remota no es consciente y no es afectada por el pseudo índice. Se utiliza la misma sintaxis para las tablas adjuntas que para las
originales. Esto es especialmente útil para crear un índice en una tabla que sería de sólo lectura debido a la falta de un índice.
CREATE INDEX
MiIndice
ON
Empleados (Prefijo, Telefono)
(Crea un índice llamado MiIndice en la tabla empleados con los campos Prefijo y Teléfono.)
CREATE UNIQUE INDEX
MiIndice
ON
Empleados (IdEmpleado)
WITH DISALLOW NULL
(Crea un índice en la tabla Empleados utilizando el campo IdEmpleado, obligando que el campo IdEmpleado no contenga valores nulos
ni repetidos.)
Modificar el Diseño de una Tabla
Modifica el diseño de una tabla ya existente, se pueden modificar los campos o los índices existentes. Su sintaxis es:
ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamaño)]
[CONSTRAINT índice]
CONSTRAINT índice multicampo} |
DROP {COLUMN campo I CONSTRAINT nombre del índice}}
En donde:
tabla Es el nombre de la tabla que se desea modificar.
tamaño Es el tamaño del campo que se va a añadir (sólo para campos de texto).
índice Es el nombre del índice del campo (cuando se crean campos) o el nombre del índice de la tabla que se desea eliminar.
índice Es el nombre del índice del campo multicampo (cuando se crean campos) o el nombre del índice de la tabla que se desea
multicampo eliminar.
Operación Descripción
Se utiliza para añadir un nuevo campo a la tabla, indicando el nombre, el tipo de campo y opcionalmente el tamaño (para
ADD COLUMN
campos de tipo texto).
DROP
Se utiliza para borrar un campo. Se especifica únicamente el nombre del campo.
COLUMN
Se utiliza para eliminar un índice. Se especifica únicamente el nombre del índice a continuación de la palabra reservada
DROP
CONSTRAINT.
ALTER TABLE
Empleados
ADD COLUMN
Salario CURRENCY
(Agrega un campo Salario de tipo Moneda a la tabla Empleados.)
ALTER TABLE
Empleados
DROP COLUMN
Salario
(Elimina el campo Salario de la tabla Empleados.)
ALTER TABLE
Pedidos
ADD CONSTRAINT
RelacionPedidos
FOREIGN KEY
(IdEmpleado)
REFERENCES
Empleados (IdEmpleado)
(Agrega un índice externo a la tabla Pedidos. El índice externo se basa en el campo IdEmpleado y se refiere al campo IdEmpleado de la
tabla Empleados. En este ejemplo no es necesario indicar el campo junto al nombre de la tabla en la cláusula REFERENCES, pues
ID_Empleado es la clave principal de la tabla Empleados.)
ALTER TABLE
Pedidos
DROP CONSTRAINT
RelacionPedidos
(Elimina el índice de la tabla Pedidos.)