Programación con SQL Aspecto teórico práctico básico
Resumen: Aspecto teórico-práctico básico. Estructura básica. Predicados y conectores. Tuplas duplicadas. Pruebas para relaciones vacías. Ordenación de la presentación de tuplas. Modificación de la base de datos. Valores nulos. Definición de datos.
Publicación enviada por Vargas Daniel Eduardo
Indice
1. Introducción
2. Estructura básica
3. Predicados y conectores
4. Tuplas duplicadas
5. Pruebas para relaciones vacías
6. Ordenación de la presentación de tuplas
7. Modificación de la base de datos
8. Valores nulos
9. Definición de datos
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
|
PERSONA
|
NOMBRE
|
APELLIDO
|
DNI
|
|
1
|
MARTIN
|
MARQUESI
|
26125988
|
|
2
|
PABLO
|
MARQUESI
|
25485699
|
|
3
|
ROBERTO
|
SANCHEZ
|
20566401
|
|
4
|
ESTEFANIA
|
GUISSINI
|
27128064
|
|
5
|
RUBEN
|
ALEGRATO
|
24238975
|
|
6
|
SANDRA
|
BRITTE
|
25483669
|
|
7
|
MELISA
|
ARDUL
|
27456224
|
|
8
|
SOLEDAD
|
MICHELLI
|
29889656
|
|
9
|
BETANIA
|
MUSACHEGUI
|
27128765
|
|
10
|
JUAN
|
SERRAT
|
28978845
|
SQL es un lenguaje que consta de varias partes
- Lenguaje de definición de datos ( DDL): Proporciona ordenes para definir
esquemas de relación, eliminar relaciones, crear índices y modificar
esquemas de relación.
- Lenguaje de manipulación de datos interactivos (DML): incluye un leguaje
de consultas que permite rescatar datos de las relaciones. También incluye
ordenes para insertar, suprimir y modificar tuplas.
- Lenguaje de manipulación de datos inmerso (DML): La forma inmersa de SQL
esta diseñada para usar dentro de los lenguajes de programación de
lenguaje general.
- Definición de vistas (DDL): incluye ordenes para definir vistas.
2.
Estructura básica
La estructura básica de una expresión para consulta SQL consta de tres cláusulas:
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"
|
ANSWER
|
PRIMER NOMBRE
|
|
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
Los conectores lógicos en SQL son:
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 )
También incluye el operador de comparación BETWEEN, que se utiliza para
valores comprendidos
Ejemplo 3.1 : Encontrar todos los nombres y dni de las personas cuyos dni sea
mayor que 26 millones y menor a 28 millones
SELECT nombre, dni
FROM persona
WHERE dni BETWEEN 26000000 and 28000000
|
ANSWER
|
NOMBRE
|
DNI
|
|
1
|
MARTIN
|
26125988
|
|
2
|
ESTEFANIA
|
27128064
|
|
3
|
MELISA
|
27456224
|
|
4
|
BETANIA
|
27128765
|
Análogamente podemos usar el operador de comparación NOT BETWEEN.
SQL también incluye un operador de selección para comparaciones de cadena de
caracteres. Los modelos se describen usando los caracteres especiales:
- El carácter ( % ) es igual a cualquier subcadena
- El operador ( _ ) es igual a cualquier carácter
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
|
Análogamente podemos buscar desigualdades usando el operador
de comparación NOT LIKE.
4. Tuplas
duplicadas
Los lenguajes de consulta formales se basan en la noción matemática de
relación como un conjunto. Por ello nunca aparecen tuplas duplicadas en las
relaciones. En la practica la eliminación de duplicados lleva bastante tiempo.
Por lo tanto SQL permite duplicados en las relaciones. Así pues en las
consultas se listaran todas las tuplas inclusive las repetidas.
En aquellos casos en los que queremos forzar la eliminación de duplicados
insertamos la palabra clave DISTINCT después de la cláusula SELECT
Ejemplo 4.1: Listar todos los apellidos no repetidos de la relación persona
SELECT DISTINCT apellido
FROM persona
|
ASWER
|
APELLIDO
|
|
1
|
MARQUESI
|
|
2
|
SANCHEZ
|
|
3
|
GUISSINI
|
|
4
|
ALEGRATO
|
|
5
|
BRITTE
|
|
6
|
ARDUL
|
|
7
|
MICHELLI
|
|
8
|
MUSACHEGUI
|
|
9
|
SERRAT
|
Si observamos la tabla original de la relación persona
veremos que el apellido marquesi aparecía dos veces, pero debido al uso de
DISTINCT en la consulta la relación respuesta solo lista un solo marquesi.
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
|
JUGADORES
|
DNI
|
PUESTO
|
NRO_CAMISETA
|
|
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"
|
ANSWER
|
PRIMER NOMBRE
|
|
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)
|
ANSWER
|
NOMBRE
|
APELLIDO
|
| s
1
|
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
5. Pruebas para relaciones vacías
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 )
Como el dni = 27128055 no existe en la relación jugadores, la
condición es FALSE y por
lo tanto la respuesta es vacía
6. Ordenación de la presentación de tuplas
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
|
ANSWER
|
APELLIDO
|
NOMBRE
|
|
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:
|
PRO
|
DNI
|
AÑOS_PRO
|
CLUB
|
VALOR_ACTUAL
|
|
1
|
26125988
|
5
|
ALL BOY'S
|
1000
|
|
2
|
25485699
|
2
|
ALL BOY'S
|
2500
|
|
3
|
27126045
|
3
|
LANUS
|
12000
|
|
4
|
26958644
|
4
|
LANUS
|
6500
|
|
5
|
29120791
|
1
|
LANUS
|
450
|
Ejemplo 6.2: determinar el valor total en jugadores así como también la
cantidad de jugadores de cada club en la relación pro
SELECT club, SUM(valor_actual) AS VALOR_TOTAL,
COUNT(club) AS NRO_JUGADORES
FROM pro
GROUP BY CLUB
|
ANSWER
|
CLUB
|
VALOR_TOTAL
|
NRO_JUGADORES
|
|
1
|
ALL BOY'S
|
3.500,00
|
2
|
|
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
SELECT club, MAX(valor_actual) AS JUG_MAS_CARO
FROM pro
GROUP BY CLUB
|
ANSWER
|
CLUB
|
JUG_MAS_CARO
|
|
1
|
ALL BOY'S
|
2500
|
|
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
|
ANSWER
|
CLUB
|
JUG_MAS_CARO
|
|
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.
7.
Modificación de la base de datos
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"
|
deleted
|
NOMBRE
|
APELLIDO
|
DNI
|
|
1
|
SANDRA
|
BRITTE
|
25483669
|
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)
|
inserted
|
NOMBRE
|
APELLIDO
|
DNI
|
|
1
|
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
|
updated
|
DNI
|
PUESTO
|
NRO_CAMISETA
|
|
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)
|
inserted
|
DNI
|
PUESTO
|
NRO_CAMISETA
|
|
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)
|
lesionado
|
NOMBRE
|
APELLIDO
|
TIEMPO_INHABILT
|
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)
Trabajo enviado por:
Vargas Daniel Eduardo
daniedvargas@hotmail.com
Fundación de Computadoras Históricas
http://www.comsto.org
Compartir 
Publicación enviada por Vargas Daniel Eduardo
Contactar mailto:daniedvargas@hotmail.com
Código ISPN de la Publicación EpZVVZFEApVgWFKUuW
Publicado Saturday 31 de January de 2004
Ultimas Publicaciones en ilustrados.com
ilustrados.com nace con el fin difundir el conocimiento publicando trabajos de investigación, monografias, tesis, presentaciones powerpoint y afines. Publicar trabajos en ilustrados.com ha alcanzado prestigio y reconocimiento internacional siendo cada vez más el número de académicos, empresas, investigadores, científicos que consultan las publicaciones de nuestro portal.
|