Programación con SQL
Aspecto teórico práctico
básico
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
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.
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:
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:
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.
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