Documente Academic
Documente Profesional
Documente Cultură
OBJETIVOS
• Conocer las sentencias disponibles en SQL para manipulación de datos, es decir,
insertar, modificar o eliminar filas de una tabla.
1. Inserción de filas en una tabla
Consiste en añadir una o varias filas a una tabla. La sentencia es la siguiente:
Los valores de tipo DATE o CHAR se deben encerrar entre comillas simples.
Si no se indica la lista de columnas, se consideran todas las de la tabla.
En la opción b) la tabla donde se inserta se puede utilizar en la consulta SELECT.
En la opción b) la consulta no puede obtener una cláusula ORDER BY.
Los valores insertados deben ser de un tipo compatible con el de las columnas de la
tabla.
Una expresión puede estar formada por una subconsulta SELECT entre paréntesis cuyo
resultado es una única fila de una sola columna (un único valor simple).
La lista de columnas está formada por aquellas columnas a las cuales se les modificará
su valor. Si se omite la cláusula WHERE entonces se actualizan todas las filas de la
tabla.
Consulta
1. Listar todo el contenido de una tabla
SELECT * FROM provincia;
CODPROV NOMPROV
---------- --------------------
41 SEVILLA
21 HUELVA
28 MADRID
8 BARCELONA
23 JAEN
3. Ordenación de la salida
CODPROV NOMPROV
---------- --------------------
8 BARCELONA
21 HUELVA
23 JAEN
28 MADRID
41 SEVILLA
Puede ordenarse tanto por valores alfabeticos como numéricos. Puede ordenarse de
menor a mayor (orden ascendente, o ASC) o de mayor a menor (orden descendente, o
DESC). Por defecto el orden considerado es de menor a mayor. La ordenación tiene
asociado un cierto coste computacional por lo que solo debe realizarse cuando sea
necesario.
4. Ordenación múltiple
APELLIDOS NOMBRE
-------------------- ----------
GOTERA OTILIO BENITO
RODRIGUEZ JODAR ANGELA
BARCO SANDOVAL JULIAN
RAMIREZ MARTIN FRANCISCA
SUAREZ GUERRA PABLO
BEATO SOLIS MARIO
PEREZ LOPEZ ANTONIO
PEREZ LOPEZ RAFAELA
5. Condición simple
6. Condición compuesta
SELECT nota FROM alumno WHERE edad > 20 AND codprov = 41;
SELECT num FROM alumno WHERE edad < 20 OR edad > 30;
SELECT edad FROM alumno WHERE edad < 20 OR codprov NOT IN (41,21);
SELECT nota FROM alumno WHERE nota>=5 AND edad>20 ORDER BY nota;
SELECT nombre, ape FROM alumno WHERE edad>20 ORDER BY edad, nota DESC;
(Nombre y apellidos de los alumnos con edades mayores de 20 años, ordenados por
edad y nota).
Las funciones de agregación toman como entrada una colección de valores o tuplas de
salida producidas por una consulta y producen un único valor como salida.
La clausula FROM define por sí misma un producto cartesiano de las tablas que se
especifican detrás de ella. La posterios clásula WHERE se aplica a las filas del producto
cartesiano resultado. Como ejemplo véase el resultado del producto cartesiano de la
primera fila de la tabla de alumnos por todas las filas de la tabla de provincias:
19. Renombramiento
Puede cambiarse el nombre de una columna en la salida de una consulta de la siguiente
manera:
Combinación de consultas
1. Número de alumnos que han obtenido la máxima nota
SELECT COUNT(*) FROM alumno WHERE nota=(SELECT MAX(nota) FROM alumno);
2. Número de edades distintas para las que existe al menos 1 alumno con dicha
edad
4. Alumnos cuya nota sea menor que todas las notas obtenidas por los alumnos de
20 años
Hay que tener cuidado con el corportamiento de este tipo de sentencias pues no está
claro qué salida debería obtenerse si, en el ejemplo anterior, no existiera ningún alumno
con 20 años de edad.
5. Nombre de los alumnos cuya nota sea igual a alguna de las obtenidas por algún
alumno de más de 20 años
6. Nombres de provincias para las que existen alumnos con más de 25 años de edad
Nuevamente puede darse el caso de que la salida producida, aún contenido las mismas
tuplas, estén dispuestas en diferente orden. Es importante observar cómo se realiza el
enlace de información entre las dos tablas a través de su atributo común clave ajena.
Operación Descripción
UNION Unión de conjuntos (usualmente resultados de salida).
INTERSECT Intersección de conjuntos.
EXCEPT
MINUS Diferencia de conjuntos.
Los conjuntos que participen en este tipo de operaciones han de ser compatibles, esto
es, deben tener el mismo conjunto de atributos o resultados de salida. Estas tres
operaciones eliminan automáticamente los duplicados (se supone que un elemento solo
puede estar una vez en un conjunto). Si se quiere conservar los duplicados debe usarse
el operador ALL. Ejemplos:
Borrado de tuplas
DELETE alumno;
DELETE alumno WHERE nota < 5.0;
Una sentencia DELETE solo puede operar sobre una tabla. Si se borran todas las tuplas de
una tabla como resultado de un borrado, ya sea absoluto o condicional, la tabla sigue
definida y existiendo aunque sin contenido.
Consultas agrupadas
1. Nota media de los alumnos de cada provincia
SELECT codprov, AVG(nota) FROM alumno GROUP BY codprov;
CODPROV AVG(NOTA)
---------- ----------
8 4.3
21 8.55
28 5.1
41 5.85
La salida de una consulta se ordena en general por el campo por el que se agrupa, por
defecto. Observar que en el ejemplo no aparecen las provincias para las cuales no hay
alumnos.
3. Nota media de las provincias para las que haya más de 1 alumno
Existen importantes diferencias entre las clausulas WHERE y HAVING a pesar de que
ambas permiten especificar condiciones sobre la consulta. La clausula WHERE especifica
una condición que es aplicable a una sola tupla mientras que HAVING indica una
condición que no se aplica a una única tupla sino a cada grupo de tuplas construido por
la clausula GROUP BY. El predicado lógico de HAVING se aplica después de la formación
de grupos mientras que el de WHERE se aplica antes.
Si en una misma consulta aparece una clausula WHERE y otra HAVING se aplica primero el
predicado de la clausula WHERE. Las tuplas que satisfagan dicho predicado lógico se
colocan en grupos según venga indicado por la clausula GROUP BY. Entonces los grupos
que no satisfagan el predicado lógico de HAVING se eliminan. Por último la clausula
SELECT utiliza los grupos resultantes para generar los resultados de salida.
Donde el '2' referencia al segundo elemento de la lista de selección (en este caso, la
media de las notas).
DML.- El Lenguaje de Manipulación de Datos (Data Manipulation Languaje) es o consiste en la forma de recuperar datos
almacenados en una BD. el DML tiene dos perspectivas:
Para ambas se requiere un lenguaje de programación. Entonces, el DBMS se convierte en un intermediario entre el
usuario y la BD almacenada, entonces, a través de un programa o una consulta podemos extraer información.
Siendo formales, el DBMS es un elemento de software que espeficica la forma en que los datos pueden estructurarse.
Controla todos los accesos a dichos datos y proporciona algunos otros servicios aplicados a las BD, como seguridad, sistema
de respaldos, etc.
• Recuperación de Información.
• Inserción de nueva Información.
• Eliminación (Borrado) de información existente.
• Modificación de Información Almacenada.
1. Introducción
SQL (Standar Query Lenguaje) es un lenguaje estandarizado de base de datos, el cual nos
permite realizar tablas y obtener datos de ella de manera muy sencilla. Para exponer mas
claramente los conceptos se realizaran ejemplo sobre relaciones que se crearan aquí para
entender mejor como funciona SQL.
Cuando aquí nos refiramos a relación estamos hablando mas concretamente a la tabla de
datos en si, y sus atributos serán los campos de la tabla. Como ejemplo la siguiente relación
( tabla ) la llamaremos persona y sus atributos ( campos ) son nombre, apellido Y DNI
2. Estructura básica
La estructura básica de una expresión para consulta SQL consta de tres cláusulas:
• SELECT
• FROM
• WHERE
La cláusula SELECT se usa para listar los atributos que se desean en el resultado de una
consulta.
La cláusula FROM lista las relaciones que se van a examinar en la evaluación de la expresión
La cláusula WHERE costa de un predicado que implica atributos de las relaciones que
aparecen en la cláusula FROM.
Una consulta básica en SQL tiene la forma:
SELECT A1,A2,...,An
FROM r1,r2,...,rn
WHERE P
Donde Ai = atributo ( Campo de la tabla )
ri = relación ( Tabla )
P = predicado ( condición )
Ejemplo 2.1 : Seleccionar todos los nombres de las personas que tengan el apellido
MARQUESI de la tabla persona
SELECT nombre
FROM persona
WHERE apellido = " MARQUESI"
ANSWER NOMBRE
1 MARTIN
2 PABLO
El resultado de una consulta es por supuesto otra relación. Si se omite la cláusula WHERE, el
predicado P es verdadero. La lista A1, A2,..., An puede sustituirse por un asterisco (*) para
seleccionar todos los atributos de todas las relaciones que aparecen en la cláusula FROM,
aunque no es conveniente elegir esta ultima opción salvo que sea necesario pues
desperdiciamos mucho tiempo en obtenerlo
Alias
Es posible renombrar los atributos y las relaciones, a veces por conveniencia y otras veces por
ser necesario, para esto usamos la clausula AS como en el siguiente ejemplo.
Ejemplo 2.2
SELECT P.nombre AS [PRIMER NOMBRE]
FROM persona P
WHERE apellido = "MARQUESI"
1 MARTIN
2 PABLO
En este ejemplo cabe destacar un par de cosas. Cuando nos referimos a un atributo como es el
caso de nombre, podemos referirnos a este usando la relación ( o el alias en este ejemplo ) a la
que pertenece el atributo seguido de un punto seguido del atributo <P.nombre>, a veces esta
notación será necesaria para eliminar ambigüedades. Los corchetes los usamos cuando
usamos espacios en blancos o el caratér (–) en el nombre de atributo o alias.
Usar alias en los atributos nos permite cambiar el nombre de los atributos de la respuesta a la
consulta.
Cuando asociamos un alias con una relación decimos que creamos una variable de tupla.
Estas variables de tuplas se definen en la cláusula FROM después del nombre de la relación.
En las consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de
tupla. En una subconsulta esta permitido usar solo variables de tupla definidas en la misma
subconsulta o en cualquier consulta que tenga la subconsulta.
3. Predicados y conectores
• AND
• OR
• NOT
La lógica de estos conectores es igual que en cualquier lenguaje de programación y sirven para
unir predicados.
Las operaciones aritméticas en SQL son:
• + ( Suma )
• - ( Resta )
• * ( Multiplicación )
• / ( División )
1 MARTIN 26125988
2 ESTEFANIA 27128064
3 MELISA 27456224
4 BETANIA 27128765
Estos modelos se expresan usando el operador de comparación LIKE. Un error muy frecuente
es tratar de utilizar los modelos mediante el operador de igualdad ( = ) lo cual es un error de
sintaxis.
Ejemplo 3.2 : encontrar los nombres que comiencen con la letra p o el nombre tenga
exactamente 6 caracteres de la relación persona
SELECT nombre
FROM persona
WHERE (nombre LIKE "P%") OR (nombre LIKE "_ _ _ _ _ _")
ANSWER NOMBRE
1 MARTIN
2 PABLO
3 MELISA
4 SANDRA
4. Tuplas duplicadas
ASWER APELLIDO
1 MARQUESI
2 SANCHEZ
3 GUISSINI
4 ALEGRATO
5 BRITTE
6 ARDUL
7 MICHELLI
8 MUSACHEGUI
9 SERRAT
Operaciones de conjunto.
SQL incluye las operaciones de conjuntos UNION, INTERSECT, MINUS, que operan sobre
relaciones y corresponden a las operaciones del álgebra unión, intersección y resta de
conjuntos respectivamente. Para realizar esta operación de conjuntos debemos tener sumo
cuidado que las relaciones tengan las mismas estructuras.
Incorporemos ahora una nueva relación, llamada jugadores que representa las personas que
juegan al fútbol, sus atributos serán DNI, puesto y nro_camiseta. Supongamos que esta nueva
tabla esta conformada de la siguiente manera
1 26125988 DELANTERO 9
2 25485699 MEDIO 5
3 28978845 ARQUERO 1
4 29789854 DEFENSOR 3
Ejemplo 4.2 : Obtener todos los nombres de la relación persona cuyos apellidos sean Marquesi
o Serrat
SELECT nombre
FROM PERSONA
WHERE apellido = "MARQUESI"
UNION
SELECT nombre
FROM PERSONA
WHERE apellido = "SERRAT"
1 MARTIN
2 PABLO
3 JUAN
Ejemplo 4.3 : Obtener todos los DNI de los que juegan al fútbol y, además, están en la lista de
la relación persona
SELECT dni
FROM persona
INTERSECT
SELECT dni
FROM jugadores
ANSWER DNI
1 26125988
2 25485699
3 28978845
Por omisión, la operación de union elimina las tuplas duplicadas. Para retener duplicados se
debe escribir UNION ALL en lugar de UNION.
Pertenencia a un conjunto
El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de
valores producidos en lo general por una cláusula SELECT. Análogamente el conector NOT IN
prueba la no pertenencia al conjunto
Ejemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, se
encuentran en la relación persona
SELECT nombre, apellido
FROM persona
WHERE dni IN
(SELECT dni
FROM jugadores)
s MARTIN MARQUESI
2 PABLO MARQUESI
3 JUAN SERRAT
Es posible probar la pertenencia de una relación arbitraria SQL usa la notación de elementos
<v1,v2,...,vn> para representar una tupla de elementos de n que contiene los valores
v1,v2,...,vn.
Comparación de conjuntos
En conjuntos la frase << mayor que algún >> se representa en SQL por ( >SOME ), también
podría entenderse esto como << mayor que el menor de >>, su sintaxis es igual que la del
conector IN. SQL también permite las comparaciones ( >SOME ),( =SOME ) ( >=SOME ),
( <=SOME ) y ( <>SOME ).
También existe la construcción ( >ALL ), que corresponde a la frase << mayor que todos >>. Al
igual que el operador SOME, puede escribirse ( >ALL ),( =ALL ) ( >=ALL ), ( <=ALL ) y
( <>ALL ).
En ocasiones podríamos querer comparar conjuntos para determinar si un conjunto contiene
los miembros de algún otro
conjunto. Tales comparaciones se hacen usando las construcciones CONTAINS y NOT
CONTAINS
La construcción EXISTS devuelve el valor TRUE si la subconsulta del argumento no esta vacía,
y la construcción NOT EXISTS devuelve TRUE si la consulta es vacía.
Ejemplo 5.1 : encontrar todos los nombre y apellidos de la relación persona si es que en la
relación jugadores existe un jugador con el numero de dni 27128055
SELECT nombre, apellido
FROM persona
WHERE EXISTS
(SELECT dni
FROM jugadores
WHERE dni = 27128055 )
SQL ofrece al usuario cierto control sobre el orden en el que se va a presentar las tuplas en
una relación. La cláusula ORDER BY hace que las tupla en el resultado dé una consulta en un
orden especifico.
Por omisión SQL lista los elementos en orden ascendente. Para especificar el tipo de
ordenación, podemos especificar DESC para orden descendente o ASC para orden
ascendente.
También es posible ordenar los resultados por mas de una atributo
Ejemplo 6.1 : encontrar todos los nombres y apellido de la relación persona y ordenar los
resultados por apellido y nombre en forma descendente
SELECT apellido, nombre
FROM persona
ORDER BY apellido DESC, nombre DESC
1 SERRAT JUAN
2 SANCHEZ ROBERTO
3 MUSACHEGUI BETANIA
4 MICHELLI SOLEDAD
5 MARQUESI PABLO
6 MARQUESI MARTIN
7 GUISSINI ESTEFANIA
8 BRITTE SANDRA
9 ARDUL MELISA
10 ALEGRATO RUBEN
Funciones de agregación
SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la cláusula GROUP
BY, también incluye funciones para calcular
• Promedios AVG
• Mínimo MIN
• Máximo MAX
• Total SUM
• Contar COUNT
Para los próximos ejemplos incorporamos una nueva relación llamada PRO que representara
los jugadores profesionales de fútbol, sus atributos serán dni, años_pro, club, valor_actual. Y
los valores son los siguientes:
2 LANUS 18.950,00 3
Ejemplo 6.3: Determinar por cada club cual es el valor_actual del jugador mas caro de la
relación pro
2 LANUS 12000
Hay ocasiones en la que los duplicados deben eliminarse antes de calcular una agregación.
Cuando queremos eliminar los duplicados del calculo usamos la palabra clave DISTINCT
antepuesto al atributo de agregación que queremos calcular, como por ejemplo
COUNT(DISTINCT club).
Hay ocasiones en las que es útil declara condiciones que se aplican a los grupos mas que a las
tuplas. Para esto usamos la cláusula HAVING de SQL.
Ejemplo 6.4: Determinar por cada club cual es el valor_actual del jugador mas caro, pero con la
condición de que este sea mayor a 10000 de la relación pro
SELECT club, MAX(valor_actual) AS JUG_MAS_CARO
FROM pro
GROUP BY CLUB
HAVING MAX(valor_actual) > 10000
1 LANUS 12000
Si en la misma consulta aparece una cláusula WHERE y una cláusula HAVING, primero se
aplica el predicado de la cláusula WHERE, las tupla que satisfacen el predicado WHERE son
colocadas en grupos por la cláusula GROUP BY. Después se aplica la cláusula HAVING a
cada grupo.
Eliminación
Una solicitud de eliminación se expresa casi de igual forma que una consulta. Podemos
suprimir solamente tuplas completas, no podemos suprimir valores solo de atributos.
DELETE FROM r
WHERE P
Donde P presenta un predicado y r representa una relación. Las tuplas t en r para las cuales
P(t) es verdadero, son eliminadas
de r.
Si omitimos la cláusula WHERE se eliminan todas las tuplas de la relación r ( un buen sistema
debería buscar confirmación del usuario antes de ejecutar una acción tan devastadora )
Ejemplo 7.1 : Eliminar todas las tuplas de la relación persona en donde apellido sea igual a
"BRITTE"
DELETE FROM persona
WHERE apellido = "BRITTE"
Inserción
Para insertar datos en una relación, especificamos una tupla que se va a insertar o escribimos
una consulta cuyo resultado es un conjunto de tuplas que se van a insertar. La inserción de
tuplas la realizamos mediante las sentencias
INSERT INTO r1
VALUES (v1,v2,...,v)
Ejemplo 7.2 : Insertar una tupla con los mismos valores de la tupla eliminada en el ejemplo
anterior en la relación persona.
INSERT INTO persona
VALUES ("SANDRA","BRITTE",25483669)
En este ejemplo, los valores se especifican en el orden en que se listan los atributos
correspondientes en el esquema de relación. Para poder ingresar los datos en un orden
diferente podríamos haber escrito
INSERT INTO persona(DNI, NOMBRE, APELLIDO)
VALUES (25483669,"SANDRA","BRITTE")
Actualizaciones
En ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos los
valores en dicha tupla. Para este propósito usamos la sentencia
UPDATE r1
SET A1 = V1, A2 = V2,...,An = Vn
WHERE P
Donde r1 es la relación Ai el atributo a modificar Vi el valor que se le asignara a Ai y P es el
predicado.
Ejemplo 7.3 : En la relación jugadores actualizar la posición de los jugadores que posean la
camiseta numero 5 y asignarles la camiseta numero 7.
UPDATE jugadores
SET nro_camiseta = 7
WHERE nro_camiseta = 5
1 25485699 MEDIO 5
8. Valores nulos
Es posible que para las tuplas insertadas se den valores únicamente a algunos atributos del
esquema. El resto de los atributos son asignados a valores nulos representados por NULL.
Para esto colocamos la palabra reservada NULL como valor del atributo.
Ejemplo 7.4 : Insertar en la relación jugadores un jugador con dni = 26356312, puesto =
defensor, y al cual aun no le han asignado un nro_camiseta.
INSERT INTO jugadores
VALUES(26356312,"DEFENSOR", NULL)
1 26356312 DEFENSOR
9. Definición de datos
Creación
Una relación en SQL se define usando la orden
CREATE TABLE r(A1 D1, A2 D3,...,An Dn)
Donde r es el nombre de la relación, cada Ai es el nombre de un atributo del esquema de la
relación r y Di es el tipo de dato de Ai. Una relación recién creada esta vacía. La orden INSERT
puede usarse para cargar la relación
Ejemplo 9.1 : crear la relación lesionado con los atributos nombre, apellido ambos de tipo char
y tiempo_inhabilit de tipo entero
CREATE TABLE "lesionado.db" (
NOMBRE CHAR(20),
APELLIDO CHAR(20),
TIEMPO_INHABILT INTEGER)
Eliminación
Para eliminar una relación usamos la orden DROP TABLE r, esta orden elimina toda la
información sobre la relación sacada de la base de datos, esta orden es mas fuerte que DELET
FROM r ya que esta ultima elimina todas las tuplas pero no destruye la relación, mientras que
la primera si.
Ejemplo 9.2 : eliminar la relación persona
DROP TABLE persona
Actualizacion
La orden ALTER TABLE se usa para añadir atributos a una relación existente. A todas las
tuplas en la relación se les asigna NULL como valor de atributo. La sintaxis de ALTER TABLE
es la siguiente:
ALTER TABLE r1 ADD A1 D1
Ejemplo 9.3 : agregar los atributos de tipo char nombre y apellido a la relación jugadores
ALTER TABLE jugadores ADD NOMBRE CHAR(20)
ALTER TABLE jugadores ADD APELLIDO CHAR(20)
Los lenguajes SQL y QBE son ejemplos de 4GL. Hay otros tipos de 4GL:
Una vez creados los esquemas de la base de datos, los usuarios necesitan un lenguaje
que les permita manipular los datos de la base de datos: realizar consultas, inserciones,
eliminaciones y modificaciones. Este lenguaje es el que se denomina lenguaje de
manejo de datos (LMD).
Hay dos tipos de LMD: los procedurales y los no procedurales. Con un LMD
procedural el usuario (normalmente será un programador) especifica qué datos se
necesitan y cómo hay que obtenerlos. Esto quiere decir que el usuario debe especificar
todas las operaciones de acceso a datos llamando a los procedimientos necesarios para
obtener la información requerida. Estos lenguajes acceden a un registro, lo procesan y
basándose en los resultados obtenidos, acceden a otro registro, que también deben
procesar. Así se va accediendo a registros y se van procesando hasta que se obtienen los
datos deseados. Las sentencias de un LMD procedural deben estar embebidas en un
lenguaje de alto nivel, ya que se necesitan sus estructuras (bucles, condicionales, etc.)
para obtener y procesar cada registro individual. A este lenguaje se le denomina
lenguaje anfitrión. Las bases de datos jerárquicas y de red utilizan LMD procedurales.
Introducción a SQL
Definición
SQL es un descendiente de SEQUEL (o Structured English QUEry Language), que fue
originalmente diseñado por IBM. SQL fue creado como un lenguaje para construir sistemas
de administración de base de datos relacionales (RDBMS: Relational DataBase Management
System) sobre cualquier plataforma de hardware. El primer RDBMS comercial usando el SQL
que apareció en 1981, y SQL es ahora el lenguaje estandar para consultas de red a través de
plataformas de software y hardware diferentes. SQL es realmente un sublenguaje diseñado
para estar embebido en un lenguaje de programación de una aplicación. Es tan flexible que
puede ser usado tanto para manipulación de datos como para definición de datos.
Los servidores de bases de datos SQL manejan peticiones en unidades lógicas de trabajo
llamadas transacciones. Una transacción es un grupo de operaciones relacionados que deben
todas ser realizadas con éxito antes de que el RDBMS finalice cualquier cambio en la base de
datos. En SQL, todas las transacciones pueden ser terminadas explícitamente con un
comando (instrucción) ya sea aceptar o descartar los cambios. Una vez usted esté satisfecho
de que no hay errores ocurridos durante la transacción, puede terminar esa transacción con
una instrucción de COMMIT. La base de datos entonces cambia para reflejar las operaciones
que usted ha realizado. Si ocurre un error, usted puede abandonar los cambios con una
intrucción de ROLLBACK.
El modelo relacional
El modelo relacional de datos está basado en una colección de tablas. El usuario del sistema
de base de datos puede consultar estas tablas, insertar nuevas tuplas, eliminar tuplas y
actualizar tuplas. Existen varios lenguajes para expresar estas operaciones. El álgebra
relacional es un lenguaje procedimental que es equivalente en capacidad a las dos formas
del cálculo relacional cuando están restringidas a expresiones seguras.
El SQL estandar de ANSI (ANSI-standard SQL) confina cada nombre de tabla o columna a
una palabra simple formada de caracteres alfanuméricos y el símbolo de underscore (_).
Estructura básica
La estructura básica de una expresión en SQL consta de tres cláusulas: SELECT, FROM y
WHERE.
SELECT
SELECT es usado para recuperar filas de una o más tablas. lista_columnas indica cuales
columnas quiere recuperar.
FROM referencias_tablas
[WHERE condicion_búsqueda]
[GROUP BY group_list]
[HAVING having_condition]
[ORDER BY order_list]
[PROCEDURE procedure_name]
[UNION select_expr]
Todas las palabras usadas deben ser dadas en el orden mostrado abajo, por ejemplo una
clausula HAVING debe venir luego de una GROUP BY y antes de una ORDER BY.
• A una expresión SELECT se le puede pasar un alias usando AS. El alias es usado
como el nombre de la columna y puede ser usado con ORDER BY y HAVING. Por
ejemplo:
o select concat(last_name,', ',first_name) AS full_name from mytable
ORDER BY full_name;
• La cláusula FROM referencias_tablas indica las tablas de las cuales recuperar filas. Si
hay más de una tabla usted está realizando un "join".
• Usted se puede referir al nombre de una columna como
Para recuperar todos los datos de una tabla (tabla1) usaríamos la siguiente sentencia:
Esta sentencia usa * para denotar que se incluyan todos los campos. Select indica la acción,
y FROM de cual tabla se van a tomar los datos.
Ahora si yo quisiera que el resultado solo trajera algunos campos (no todos) debería crear la
sentencia de la siguiente forma:
Existen otros parámetros que son opcionales y dependen de cada caso: WHERE, que
establece una condición; ORDER BY que permite hacer una ordenacion del resultado; GROUP
BY que permite hacer una agrupación de los resultados; HAVING que permite incluir otra
condición; y UNION que permite hacer uniones con otros resultados.
Un SELECT que recupera datos de múltiples tablas es llamado un "join." La plantilla para el
comando SELECT es la siguiente:
SQL forma el producto cartesiano de las relaciones nombradas en la cláusula FROM, realiza
una selección del álgebra relacional usando el predicado de la cláusula WHERE y después
proyecta el resultado a los atributos de la cláusula SELECT.
El resultado de una consulta SQL es, por supuesto, una relación. Consideremos una consulta
sencilla usando el ejemplo bancario. "Encontrar los nombres de las sucursales en la relación
depósito".:
SQL también soporta los alias de BDE para nombres de Tabla. Por ejemplo,
SELECT * FROM ":PDOX:TABLE1"
Si usted omite la extensión de archivo para un nombre de una tabla local, se asume que la
tabla es del tipo especificado por la Utilidad de Configuración BDE, ya sea en la configuración
del Defadirt Driver en la página del sistema o en tipo de drive por defecto para los alias
estandar asociados con la consulta o con la tabla.
Finalmente, el SQL permite que los nombres de las tablas dupliquen las palabras clave de
SQL siempre que esos nombres de tablas estén encerrados por comillas sencillas o dobles.
Por ejemplo,
Columnas
El SQL soporta nombres de columnas multi-palabra de Paradox y nombres de columna con
las palabras clave de SQL duplicadas siempre que se encierren en comillas simples o dobles.
En el siguiente ejemplo, el nombre de la columna DATE coincide con una palabra clave del
SQL, por ello se especifica el nombre de la relación:
La cláusula FROM especifica la tabla o tablas de las cuales se van a recuperar datos.
Table_reference puede ser una tabla simple, una lista de tablas delimitada por
comas, o puede ser un join interno o externo como se especifica en el estandar SQL-
92. Por ejemplo, la siguiente instrucción especifica una tabla simple:
SELECT PART_NO
FROM "PARTS.DBF"
ON PARTS.PART_NO = INVENTORY.PART_NO
Operaciones de conjuntos
SQL incluye las operacines UNION, INTERSECT, y MINUS, que operan sobre relaciones y
corresponden a las operaciones del álgebra de conjuntos.
Vamos a demostrar cómo se pueden escribir en SQL las consultas de los siguientes
ejemplos:
"Encontrar todos los clientes que tienen una cuenta en la sucursal Perryridge:
FROM depósito
FROM préstamo
"Encontrar todos los clientes que tiene un préstamo, una cuenta o las dos en la sucursal de
Perryridge":
(SELECT nombre-cliente
FROM depósito
UNION
(SELECT nombre-cliente
FROM préstamo
"Encontrar todos los clientes que tienen un préstamo y una cuenta en la sucursal
Perryridge":
(SELECT DISTINCT nombre-cliente
FROM depósito
INTERSECT
FROM préstamo
FROM depósito
MINUS
FROM préstamo
Cláusula WHERE
La cláusula WHERE opcional reduce el número de filas devuelto por una consulta a
aquellos que cumplen con el criterio especificado en search_condition. Por ejemplo,
la siguiente instrucción recupera sólo aquellas filas con PART_NO mayor a 543:
La cláusula WHERE puede incluir el predicado IN, seguido por una lista parentizada
de valores. Por ejemplo, la siguiente instrucción recupera sólo aquellas filas donde el
número de parte se acopla a un item en la lista del predicado IN:
INSERT
En SQL, INSERT es de dos formas:
Ejemplos:
La siguiente instrucción añade una fila a una tabla, asignando valores a dos comlumnas:
UPDATE
No hay restricciones o extensiones de la instrucción UPDATE del ANSI-estandar.
DELETE
No hay restricciones o extensiones para la instrucción DELETE Ansi-estandar.
Predicados y Conectores
Para encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna
sucursal. En SQL se podría escribir así:
WHERE préstamo.nombre-cliente=cliente.nombre-cliente
SELECT número-cuenta
FROM depósito
Ejemplos:
Los modelos de comparación en SQL se expresan usando el operadir LIKE. "Encontrar los
nombres de todos los clientes cuya calle incluye la subcadena 'Main'":
SELECT nombre-cliente
FROM cliente
Hay también caracteres de escape para indicar que se va a incluir un caracter especial dentro
de la cadena de búsqueda, con la cláusula ESCAPE
+ LIKE "ab\%cd%" ESCAPE "\" es igual a todas las cadenas que empiezan por "ab%cd".
Pertenencia a un conjunto
SQL se basa en un conjunto relacional de operaciones que permiten probar la pertenencia de
las tuplas a una relación. El conector IN prueba si se es miembro de un conjunto, donde el
conjunto es una colección de valores porducidos por una cláusula SELECT. El conecto NOT IN
prueba la no pertenencia al conjunto. Para ilustrarlo, considérese de nuevo la consulta
"Encontrar a todos los clientes que tienen un préstamo y una cuenta en el Perryridge".
Vamos a hacer esto realizando una subconsulta.
FROM préstamo
nombre-cliente IN
(SELECT nombre-cliente
FROM depósito
WHERE nombre-sucursal = "Perryridge")
En SQL pueden haber varias consultas que significan lo mismo. Por ejemplo para encontrar
los clientes que tienen una cuenta y un préstamo en al sucursal de Perryridge:
SELECT DISTINCT nombre-cliente
FROM préstamo
<nombre-sucursal, nombre-cliente> IN
FROM depósito)
Para el uso de NOT IN tenemos el siguiente ejemplo. Vamos a buscar los clientes que tienen
una cuenta en la sucursal Perryridge pero no tienen un préstamos en la sucursal Perryridge:
SELECT DISTINCT nombre-cliente
FROM depósito
nombre-cliente NOT IN
(SELECT nombre-cliente
FROM préstamo
Variables de Tupla
SQL toma prestada la notación de variables de tupla dell cálcdiro relacional de tuplas. Una
variable de tupla en SQL debe estar asociada con una relación determinada. Las variables de
tupla se definen en la cláusula FROM. Para ilustrarlo, volvemos a escribir la consulta:
"Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en alguna
sucursal", así:
Nótese q ue una variable de tupla se define en la cláusula FROM colocándola después del
nombre de la relación con la cual está asociada, separada por uno o más espacios.
En consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de
tupla. En una subconsulta, está permitido usar sólo variables de tupla definidas en la misma
subconsulta o en cualquier consulta que contenga la subconsulta. Si una variable de tupla
está definida tanto localmente en una subconsulta como globalmente en una consulta que la
contiene, se aplica la definición local. Cuando escribimos expresiones de la forma nombre-
relación.nombre-atributo, el nombre de la relación es, en efecto, una variable de tupla
definida implícitamente.
Las variables de tuplas son muy útiles para comparar dos tuplas de la misma relación. En
tales casos el álgebra relacional usa la operación renombrar. Supóngase que queremos
encontrar todos los clientes que tienen una cuenta en la misma sucursal en la que Jones
tiene una cuenta. Escribimos esta consulta:
S.nombre-sucursal = T.nombre-sucursal
WHERE nombre-sucursal IN
Comparación de conjuntos
Fue posible utilizar la construcción IN en la consulta anterior porque estuvimos probando la
igualdad entre dos nombres de sucursales. Considérese la consulta: "Encontrar los nombres
de todas las sucursales que tienen un activo mayor que alguna sucursal situada en
Brooklyn". Podemos escribir la expresión:
S.ciudad-sucursal = "Brooklyn"
Hay otra forma adicional que ofrece SQL para escribir este tipo de consultas con la frase
"mayor que algún" >SOME.
SELECT nombre-sucursal FROM sucursal
(SELECT activo
FROM sucursal
Las construcciones IN, > SOME, > ALL nos permiten probar un único valor con los miembros
del conjunto completo. Puesto que SELECT genera un conjunto de tuplas, a veces podemos
querer comparar conjuntos para determinar si un conjunto contiene todos los miembros de
algún otro conjunto. Tales comparaciones se hacen en SQL usando las construcciones
CONTAINS y NOT CONTAINS.
Considérese la consulta "Encontrar todos los clientes que tiene una cuenta en todas las
sucursales situadas en Brooklyn". Para cada cliente, necesitamos ver si el conjunto de todas
las sucursales en las que el cliente tiene una cuenta contiene el conjunto de todas las
sucursales de Brooklyn.
FROM depósito S
FROM depósito T
CONTAINS
WHERE depósito.nombre-cliente =
cliente.nombre-cliente AND
nombre-sucursal = "Perryridge")
WHERE préstamo.nombre-cliente=
cliente.nombre-cliente
Como ejemplo final, considérese la consulta "Encontrar a todos los clientes que tienen una
cuenta en todas las sucursales situadas en Brooklyn". Para cada cliente, necesitamos ver si
el conjunto de todas las sucursales de Brooklyn. Usando la construcción MINUS, podemos
escribir la siguiente consulta.
SELECT DISTINCT S.nombre-cliente FROM depósito S
MINUS
(SELECT T.nombre-sucursal
FROM depósito T
WHERE
S.nombre-cliente=T.nombre-cliente))
Si queremos listar en orden alfabético todos los clientes que tienen una cuenta en Perryridge
SELECT DISTINCT nombre-cliente
FROM préstamo
ORDER BY nombre-cliente
FROM préstamo
Los campos calcdirados pueden ser ordenados por nombre de correlación o posición ordinal.
Por ejemplo, la siguiente consulta ordena las filas por FdirL_NAME, un campo calcdirado:
SELECT apellido || ', ' || primer-nombre
AS nombre-completo, teléfono
FROM clientes
AVG(), para promediar todos los valores numéricos no Ndiros en una columna
COUNT(), para contar el número de valores en una columan que cumplen con el
criterio especificado
Las operaciones como AVG se llaman funciones de agregación porque operan sobre grupos
de tuplas. El resultado de una función de agregación es un valor único. Para ilustrarlo
considérese la consulta " Encontrar el saldo promedio de las cuentas en todas las
sucursales".
SELECT nombre-sucursal, AVG(saldo)
FROM depósito
GROUP BY nombre-sucursal
FROM depósito
GROUP BY nombre-sucursal
cláusula HAVING
La cláusula HAVING especifica condiciones que los registros deben cumplir para ser incluidos
en el retorno de una consulta. Es una expresión condicional usada junto con la cláusula
GROUP BY. Los Grupos que no cumplan con la expresión en la cláusula HAVING son omitidos
del conjunto resultado.
Las subconsultas son soportadas en la cláusula HAVING. Una subconsulta trabaja como una
condición de búsqueda para restringir el número de filas devueltas por la consulta externa, o
"padre". Vea la cláusula WHERE adicionalmente a los operadores de comparación escalar
( =, <, > ... ) se pueden usar predicados adicionales usando IN, ANY, ALL, EXISTS.
A veces es útil declarar una condición que se aplica a los grupos más que a las tuplas. Por
ejemplo, podríamos estar interesados únicamente en sucursales en las que el saldo promedio
de las cuentas es mayor a 1200 dólares. Esta condición no se aplica a una única tupla.
Más bien se aplica a cada grupo construido mediante la cláusula GROUP BY. Para expresar
una consulta de este tipo, usamo sl a cláusula HAVING. Los predicados de la cláusula
HAVING se aplican después de la formación de grupos, por lo que pueden utilizarse funciones
dke agregación.
FROM depósito
GROUP BY nombre-sucursal
Veamos el siguiente caso "Encontrar aquellas sucursales con el saldo promedio mayor". Las
funciones de agregados no pueden componerse en SQL. Significa que cualquier intento de
utilizar MAX(AVG(... no estará permitida. En cambio, nuestra estrategia es encontrar
aquellas sucursales para las que el balance promedio es mayor o igual que todos los
balances promedio.
SELECT nombre-sucursal FROM depósito
GROUP BY nombre-sucursal
HAVING
GROUP BY (nombre-sucursal)))
FROM cliente
La cláusula UNION combina los resultados de dos o más instrucciones SELECT para
producir una tabla simple.
Joins heterogéneos
Para tablas locales, especifique el alias o el path. para tablas remotas, especifique el
alias.
Las siguientes instrucciones recuperan datos de una tabla de Paradox y una tabla de
dBase:
Usted también puede usar alias BDE junto con los nombres de las tablas.
Las siguientes secciones describen funciones disponibles para instrucciones DML en SQL.
Funciones agregadas
Funciones de String
Función DATE
Operadores
consultas Actualizables
Funciones de agregación
Se incluyen también expresiones agregadas complejas, tal como:
SUM( Field * 10 )
SUM( Field ) * 10
Funciones de String
El SQL soporta las siguientes funciones de manipdiración de cadenas del SQL ANSI-standard
para recuperación, insersión y actualización:
Por ejemplo, la siguiente instrucción extrae el valor del año de un campo DATE:
FROM EMPLOYEE
Usted puede también extraer MONTH, DAY, HOUR, MINUTE, y SECOND usando esta función.
Operadores
El SQL soporta los siguientes operadores:
Tipo Operator
Aritméticos + - * /
IS NdirL IS NOTNdirL
Concatenación de cadenas ||
consultas actualizables
SQL Links ofrece soporte expandido para consultas actualizables de tabla simple y multi-
tabla.
No hay una palabra clave DISTINCT en el SELECT. (Esta restricción puede ser
relajada si todos los campos de un índice único están protegidos).
Todo en la cláusula SELECT es una referencia de columna simple o un campo
calcdirado, no se permiten agregaciones.
La tabla referenciada en la cláusula FROM es una tabla base actualizable o una vista
actualizable.
Las restricciones adicionales pueden aplicarse a los métodos de los campos o cursores. Si un
índice es usado para satisfacer una cláusula de orden, la función DbiSwitchToIndex del BDE
devuelve un error.
All join conditions are satisfied by indexes (for Paradox and dBASE)
The query contains no elements listed above that wodird prevent single-table
updatability.
Constraints
Usted puede restringir cualquier consulta actualizable asignando la propiedad de la
instrucción de consulta stmtCONSTRAINED a TRUE antes de ejecución. Un error será
entonces retornado cada vez que una modificación o insersión cause que el nuevo registro
desaparezca del conjunto resultado.
Las operaciones UPDATE, INSERT, DELETE son soportados completamente. Los siguientes
ejemplos muestras instrucciones DML con bases de datos estandar:
Ejemplo 1: UPDATE
update goods
Ejemplo 2: INSERT
insert
Ejemplo 3: DELETE
delete
from goods
El siguiente ejemplo ilustra cómo se soportan las instrucciones SELECT como un equivalente
de JOIN:
Ejemplo 5: Sub-selects
select p.part_no
from parts p
where p.quantity in
(select i.quantity
from inventory i
Ejemplo 6: GROUP BY
from parts
group by part_no
Nota: Los agregados en la cláusula SELECT debe tener una cláusula GROUP BY si se usa un
campo proyectado, como se muestra en el primer ejemplo.
Ejemplo 7: ORDER BY
from c:\data\customer
Definición de Datos
Local SQL supports data definition language (DDL) for creating, altering, and dropping
tables, and for creating and dropping indexes.
Local SQL does not permit the substitution of variables for values in DDL statements.
CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
DROP INDEX
CREATE VIEW
DDL Ejemplos
CREATE TABLE
Constraints are limited to PRIMARY KEY for Paradox. Constraints are unsupported in dBASE.
For Ejemplo, the following statement creates a Paradox table with a PRIMARY KEY constraint
on the LAST_NAME and FIRST_NAME columns:
LAST_NAME CHAR(20),
FIRST_NAME CHAR(15),
SALARY NUMERIC(10,2),
DEPT_NO SMALLINT,
The same statement for a dBASE table shodird omit the PRIMARY KEY definition:
LAST_NAME CHAR(20),
FIRST_NAME CHAR(15),
SALARY NUMERIC(10,2),
DEPT_NO SMALLINT
If you omit the file extension for a local table name, the table created is the table type
specified in the Defadirt Driver setting in the System page of the BDE Configuration Utility.
The following table lists SQL syntax for data types used with CREATE TABLE, and describes
how those types are mapped to Paradox and dBASE types by the BDE:
ALTER TABLE
Local SQL supports the following subset of the ANSI-standard ALTER TABLE statement. You
can add new columns to an existing table using this ALTER TABLE syntax:
ALTER TABLE table ADD column_name data_type [, ADD column_name data_type ...]
You can delete existing columns from a table using the following ALTER TABLE syntax:
For Ejemplo, the next statement drops two columns from a Paradox table:
ADD and DROP operations can be combined in a single statement. For Ejemplo, the following
statement drops two columns and adds one:
DROP TABLE
DROP TABLE deletes a Paradox or dBASE table. For Ejemplo, the following statement drops a
Paradox table:
CREATE VIEW
A view creates a virtual table from a SELECT statement. You can look at just the data you
need within this movable frame or window on the table, while the technical underpinnings
are hidden. Instead of entering a complex qualified SELECT statement, the user simply
selects a view.
CREATE VIEW describes a view of data based on one or more underlying tables in the
database. The rows to return are defined by a SELECT statement that lists columns from the
source tables. A view does not directly represent physically stored data. It is possible to
perform select, project, join, and union operations on views as if they were tables.
CREATE VIEW enables users to create views on tables by using the following syntax:
CREATE VIEW is supported in conjunction with the Client Data Repository (CDR). The CDR
stores the SELECT statement that defines the view.
The "WITH CHECK OPTION" is supported to create a constrained view.
Views of Views are supported. However, the CASCADE/LOCAL view attribute is not
supported, because all updateable views CASCADE the constraints.
DDL Ejemplos
The following Ejemplos show the use of DDL statements with standard databases.
When the table name contains a period "." character, enclose the name in quotation marks:
No quotation marks are used if the table name does not contain the "." character:
Paradox: Paradox primary indexes can be created only when creating the table. Secondary
indexes are created as case insensitive and maintained, when possible.
dBASE: dBASE indexes are created as maintained. The Index name specified is the tag
name.
For more information about different types of indexes, see DbiAddIndex in the Borland
Database Engine Online Reference.
Paradox: For Paradox only, the syntax tablename.primary indicates the primary index:
Borland SQL Links for Windows is a set of BDE-hosted driver connections to database
servers. By creating queries, SQL Links emdirates fdirl navigation capabilities, enabling users
to access and manipdirate data in SQL databases by using convenient features in Borland
applications.
Any Borland application based upon the Borland Database Engine (BDE) can use Borland SQL
Links, including your custom applications built using the BDE API. Borland SQL Links is
included with some Borland client/server application development tools such as Delphi
Client/Server.
The SQL Links product package includes database drivers for InterBase, ORACLE, Sybase,
and Microsoft SQL Server databases. These drivers require the installation of the appropriate
vendor's server connectivity API or interface software. Borland Database Engine includes
built-in drivers for Borland standard databases.
Additional information
Local SQL in the Borland Database Engine. Note that this file
is provided as-is.
ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING,
BYTES
CURSOR
GROUP_COMMIT_WAIT_TIME
HAVING, HOUR
JOIN
KEY
LOG_BUFFER_SIZE
NUM_LOG_BUFFERS, NUMERIC
PRIVILEGES
SUM, SUSPEND
YEAR
OPERATORS:
||, -, *, /, <>, <, >, ,(comma), =, <=, >=, ~=, !=, ^=, (, )
16 ANEXOS
16.1 Resolución de Problemas
Para generar este tipo de consultas lo más sencillo es utilizar el asistente de consultas de
Access, editar la sentencia SQL de la consulta y pegarla en nuestro código. No obstante
este tipo de consulta se consigue de la siguiente forma:
Este tipo de consulta se emplea en situaciones tales como saber que productos no se han
vendido en un determinado periodo de tiempo,
La sintaxis es sencilla, se trata de realizar una unión interna entre dos tablas
seleccionadas mediante un LEFT JOIN, establecimiendo como condición que el campo
relacionado de la segunda sea Null.
Existen dos tipos de consultas SQL: las consultas de selección (nos devuelven datos) y
las consultas de acción (aquellas que no devuelven ningún registro). Ambas pueden ser
tratadas en Visual Basic pero de forma diferente.
Set RS=MiBaseDatos.OpenRecordset("MiConsulta")
DatePart
Esta función devuelve una parte señalada de una fecha concreta. Su sintaxis es:
Parte representa a la porción de fecha que se desea obtener, los posibles valores son:
Valor Descripción
yyyy Año
q Trimestre
m Mes
y Día del año
d Día del mes
w Día de la semana
ww Semana del año
h Hora
m Minutos
s Segundos
Valor Descripción
0 Utiliza el valor pode efecto del sistema
1 Domingo (Valor predeterminado)
2 Lunes
3 Martes
4 Miércoles
5 Jueves
6 Viernes
7 Sábado
ComienzoAño indica cual es la primera semana del año; los posibles valores son:
Valor Descripción
0 Valor del sistema
1 Comienza el año el 1 de enero (valor predeterminado).
2 Empieza con la semana que tenga al memos cuatro días en el nuevo año.
3 Empieza con la semana que esté contenida completamente en el nuevo año.
iif(Expresion,Valor1,Valor2)
Siempre es bueno intentar hacer las cosas de igual modo para que el mantenimiento y la
revisión nos sea una labor lo más sencilla posible. En lo que a mi respecta utilizo las
siguiente normas a la hora de elaborar sentecias SQL:
Los Nombres de las Tablas, Campos y Consultas, los escribo siempre la primera letra
con mayúsculas y el resto con minúsculas, en algunos casos utilizo el carácter "_" para
definir mejor el nombre: Detalles_Pedidos.
Aunque con el motor Jet se pueden utilizar acentos y espacios en blanco para nombrar
los campos, las tablas y las consultas no los utilizo porque cuando se exportar tablas a
otros sistemas los acentos y los espacios en blanco pueden producir errores
innecesarios.
Recuerda siempre que si utilizas espacios en blanco para llamar tablas o consultas cada
vez que hagas referencias a ellos en una consulta debes incluir sus nombres entre
corchetes.
SELECT [ID de Pedido], [Nombre del Producto], Cantidad FROM [Detalles del
Pedido];