Un lenguaje de consulta comercial proporciona una interfaz más amigable al usuario. Un ejemplo de este tipo de lenguaje es el SQL, (Structured Query Languaje, Lenguaje de Consulta Estructurado).
Las partes más importantes del SQL son:
DDL: Lenguaje de definición de datos (que nos permite crear las estructuras )
DML: Lenguaje de manipulación de datos (que nos permite tener acceso a las estructuras para suprimir, modificar e insertar)
En este apartado estudiaremos la forma básica para realizar consultas con SQL, en el apartado 3.4: Modificación de la base de datos, estudiaremos lo que concierne a la modificación de las tablas.
La estructura básica de una expresión en SQL contiene 3 partes, Select, From y Where.
La cláusula Select se usa para listar los atributos que se desean en el resultado de una consulta.
From,Lista las relaciones que se van a examinar en la evaluación de la expresión.
Where, es la definición de las condiciones a las que puede estar sujeta una consulta.
La consulta típica de SQL tiene la siguiente forma:
SelectA1,A2,A3...An
Fromr1,r2,r3...rm
WhereCondición(es)
Donde:
A1,A2,A3...An: Representan a cada atributo(s) o campos de las
tablas de la base de datos relacional.
R1,r2,r3...rm: Representan a la(s) tabla(s) involucradas en la consulta.
Condición: Es el enunciado que rige el resultado de la consulta.
Si se omite la cláusula Where, la condición es considerada como verdadera, la lista de atributos (A1,A2..An) puede sustituirse por un asterisco (*), para seleccionar todos los atributos de todas las tablas que aparecen en la cláusula From.
Funcionamiento del SQL.
El SQL forma el producto cartesiano de las tablas involucradas en la cláusula From, cumpliendo con la condición establecida en la orden Where y después proyecta el resultado con la orden select.
Para nuestros ejemplos consideremos una tabla llamada CURSO, que contiene los siguientes campos:
Nombre del campo
|
Descripción
|
NumC
|
Número del curso, único para identificar cada curso
|
NombreC
|
Nombre del curso, también es único
|
DescC
|
Descripción del curso
|
Creditos
|
Créditos, número de estos que gana al estudiante al cursarlo
|
Costo
|
Costo del curso.
|
Depto
|
Departamento académico que ofrece el curso.
|
Datos contenidos en la tabla CURSO
NumC
|
NombreC
|
DescC
|
Creditos
|
Costo
|
Depto
|
A01
|
Liderazgo
|
Para público General
|
10
|
100.00
|
Admón.
|
S01
|
Introducción a la inteligencia artificial
|
Para ISC y LI
|
10
|
90.00
|
Sistemas.
|
C01
|
Construcción de torres
|
Para IC y Arquitectura
|
8
|
0.00
|
Ciencias
|
B01
|
Situación actual y perspectivas de la alimentación y la nutrición
|
Para IB
|
8
|
80.00
|
Bioquímica
|
E01
|
Historia presente y futuro de la energía solar
|
IE e II
|
10
|
100.00
|
Electromecánica.
|
S02
|
Tecnología OLAP
|
Para ISC y LI
|
8
|
100.00
|
Sistemas
|
C02
|
Tecnología del concreto y de las Estructuras
|
Para IC
|
10
|
100.00
|
Ciencias
|
B02
|
Metabolismo de lípidos en el camarón
|
Para IB
|
10
|
0.00
|
Bioquímica
|
E02
|
Los sistemas eléctricos de potencia
|
Para IE
|
10
|
100.00
|
Electromecánica
|
S03
|
Estructura de datos
|
Para ISC y LI
|
8
|
0.00
|
Sistemas
|
A01
|
Diseño bioclimático
|
Para Arquitectura
|
10
|
0.00
|
Arquitectura
|
C03
|
Matemáticas discretas
|
General
|
8
|
0.00
|
Ciencias
|
S04
|
Circuitos digitales
|
Para ISC
|
10
|
0.00
|
Sistemas
|
S05
|
Arquitectura de Computadoras
|
Para ISC
|
10
|
50.00
|
Sistemas
|
I01
|
Base de Datos Relacionales
|
Para ISC y LI
|
10
|
150.00
|
Informática
|
Ejemplos de consultas:
OBTENCIÓN DE UNA TABLA ENTERA
- Obtener toda la información disponible sobre un curso donde Costo sea 0.
SELECT *
FROM CURSO
WHERE Costo=0.00
Resultado de la consulta anterior.
NumC
|
NombreC
|
DescC
|
Creditos
|
Costo
|
Depto
|
C01
|
Construcción de torres
|
Para IC y Arquitectura
|
8
|
0.00
|
Ciencias
|
B02
|
Metabolismo de lípidos en el camarón
|
Para IB
|
10
|
0.00
|
Bioquímica
|
S03
|
Estructura de datos
|
Para ISC y LI
|
8
|
0.00
|
Sistemas
|
A01
|
Diseño bioclimático
|
Para Arquitectura
|
10
|
0.00
|
Arquitectura
|
C03
|
Matemáticas discretas
|
General
|
8
|
0.00
|
Ciencias
|
Colocamos un * debido a que no nos limitan la información de la tabla, es decir nos piden que mostremos todos los datos atributo de la tabla CURSO.
Como la única condición en la sentencia WHERE es que la tarifa del curso sea igual a 0, esta consulta regresa todas las tuplas donde se encuentre que Costo = 0.00.
Debido a que Costo es un campo numérico, la condición solo puede comparar con campos del mismo tipo. Para representar valores negativos se antepone a la izquierda el signo (-), en este ejemplo se considera solo el signo (=) para establecer la condición, sin embargo otros operadores que se pueden utilizar son:
Menor que <
Mayor que >
Menor o igual que <=
Mayor o igual que >=
Diferente <>
Además de los operadores booleanos AND, NOT, OR.
Cabe señalar que en la sentencia Where cuando se requiere establecer condiciones con cadenas, estas son delimitadas por apóstrofos (‘’). Las expresiones de cadenas son comparadas carácter por carácter, dos cadenas son iguales solo si coinciden todos los caracteres de las mismas.
Ejemplos de consultas con cadenas:
- Obtener toda la información sobre cualquier curso que ofrezca el departamento de Ciencias.
SELECT *
FROM CURSO
WHERE Depto = 'Ciencias';
Resultado de la consulta.
NumC
|
NombreC
|
DescC
|
Creditos
|
Costo
|
Depto
|
C01
|
Construcción de torres
|
Para IC y Arquitectura
|
8
|
0.00
|
Ciencias
|
C02
|
Tecnología del concreto y de las Estructuras
|
Para IC
|
10
|
100.00
|
Ciencias
|
S04
|
Circuitos digitales
|
Para ISC
|
10
|
0.00
|
Sistemas
|
VISUALIZACIÓN DE COLUMNAS ESPECIFICADAS.
En los ejemplos anteriores obteníamos toda la tabla completa, ahora veremos como mostrar solo algunos atributos específicos de una tabla.
- Obtener los valores NumC,NombreC y Depto, en este orden de toda la tabla curso.
SELECT NumC, NombreC, Depto
FROM CURSO;
Resultado de la consulta:
NumC
|
NombreC
|
Depto
|
A01
|
Liderazgo
|
Admón.
|
S01
|
Introducción a la inteligencia artificial
|
Sistemas.
|
C01
|
Construcción de torres
|
Ciencias
|
B01
|
Situación actual y perspectivas de la alimentación y la nutrición
|
Bioquímica
|
E01
|
Historia presente y futuro de la energía solar
|
Electromecánica.
|
S02
|
Tecnología OLAP
|
Sistemas
|
C02
|
Tecnología del concreto y de las Estructuras
|
Ciencias
|
B02
|
Metabolismo de lípidos en el camarón
|
Bioquímica
|
E02
|
Los sistemas eléctricos de potencia
|
Electromecánica
|
S03
|
Estructura de datos
|
Sistemas
|
A01
|
Diseño bioclimático
|
Arquitectura
|
C03
|
Matemáticas discretas
|
Ciencias
|
S04
|
Circuitos digitales
|
Sistemas
|
S05
|
Arquitectura de Computadoras
|
Sistemas
|
I01
|
Base de Datos Relacionales
|
Informática
|
Observamos que en este caso no se tiene la sentencia Where, no existe condición, por lo tanto, todas las filas de la tabla CURSO se recuperan, pero solo se visualizaran las tres columnas especificadas.
Así mismo, empleamos la (,) para separar los campos que deseamos visualizar.
VISUALIZACIÓN DE UN SUBCONJUNTO DE FILAS Y COLUMNAS
- Seleccionar los valores NumC, Depto y Costo para todos los cursos que tengan un Costo inferior a $100
SELECT NumC, Depto, Costo
FROM CURSO
WHERE Costo < 100.00
Como resultado de esta consulta se obtendrán todas aquellas tuplas que tengan un costo en CTARIFA menor que 100, y se visualizaran solo los campos de NumC, Depto,Costo.
Podemos observar que este ejemplo cubre el formato general de una consulta SQL.
La palabra clave DISTINCT
DISTINCT, es una palabra reservada que elimina las filas que duplicadas en el resultado de una consulta.
- Visualizar todos los departamentos académicos que ofrezcan cursos, rechazando los valores duplicados.
SELECT DISTINCT Depto
FROM CURSO;
Resultado de la consulta
Depto
|
Administración
|
Sistemas
|
Ciencias
|
Bioquímica
|
electromecánica
|
Arquitectura
|
Informática
|
La palabra DISTINCT va estrictamente después de la palabra SELECT.
De no haberse utilizado la palabra DISTINCT, el resultado hubiera mostrado todas las tuplas del atributo Depto que se encontraran, es decir, se hubiera visualizado la columna de Depto completamente.
EMPLEO DE LOS CONECTORES BOOLEANOS (AND, OR, NOT)
Para emplear las condiciones múltiples dentro de la sentencia WHERE, utilizamos los conectores lógicos.
El conector AND.
Este conector pide al sistema que seleccione una sola columna únicamente si ambas condiciones se cumplen.
- Obtener toda la información sobre todos los cursos que ofrece el departamento Sistemas que tengan una tarifa igual a 0.
SELECT *
FROM CURSO
WHERE Depto=’Sistemas’ AND Costo=0.00;
El resultado de esta consulta sería todas aquellas tuplas que cumplan exactamente con las dos condiciones establecidas.
El conector OR.
Este conector al igual que el AND permite conectar condiciones múltiples en la sentencia WHERE, a diferencia del conector AND, el OR permite la selección de filas que cumplan con una sola de las condiciones establecidas a través de este conector.
- Obtener toda la información existente sobre cualquier curso ofrecido por los departamentos Arquitectura o Bioquímica.
SELECT *
FROM CURSO
WHERE Depto = ‘Arquitectura’ OR Depto= ‘Bioquímica’;
El resultado de esta consulta será la de visualizar todas aquellas tuplas donde se cumpla cualquiera de las 2 condiciones, es decir mostrara todas las tuplas que tengan en el atributo Depto=Arquitectura o Bioquímica.
El conector NOT
Este nos permite marcar aquellas tuplas que por alguna razón no deseamos visualizar.
- Obtener el nombre del curso y del departamento de todos los cursos que no sean ofrecidos por el departamento Sistemas.
SELECT NombreC, Depto
FROM CURSO
WHERE NOT (Depto=’Sistemas’);
JERARQUIA DE OPERADORES BOOLEANOS.
En orden descendente (de mayor a menor prioridad)
NOT
AND
OR
Existen dos formas para realizar consultas: Join de Querys y Subquerys.
Cuando en la sentencia Fromcolocamos los nombres de las tablas separados por comas se dice que efectuamos una consulta de la forma Join de Querys, en este caso se requiere anteponer el nombre de la tabla y un punto al nombre del atributo. En el Join de Querys el resultado que se produce con las tablas que intervienen en la consulta es la concatenación de las tablas, en donde los valores de una columna de la primera tabla coinciden con los valores de una segunda tabla, la tabla de resultado tiene una fila por cada valor coincidente que resulte de las dos tablas originales.
Para ejemplificar esto, consideremos 2 tablas: Tabla1 y Tabla2, entonces:
C1
|
C2
|
C3
|
|
CA
|
CB
|
A
|
AAA
|
10
|
|
35
|
R
|
B
|
BBB
|
45
|
|
10
|
S
|
C
|
CCC
|
55
|
|
65
|
T
|
D
|
DDD
|
20
|
|
20
|
U
|
E
|
EEE
|
20
|
|
90
|
V
|
F
|
FFF
|
90
|
|
90
|
W
|
G
|
GGG
|
15
|
|
75
|
X
|
H
|
HHH
|
90
|
|
90
|
Y
|
|
|
|
|
35
|
Z
|
Resultado de la operación Join:
C1
|
C2
|
C3
|
CA
|
CB
|
A
|
AAA
|
10
|
10
|
S
|
D
|
DDD
|
20
|
20
|
U
|
E
|
EEE
|
20
|
20
|
U
|
F
|
FFF
|
90
|
90
|
V
|
F
|
FFF
|
90
|
90
|
W
|
F
|
FFF
|
90
|
90
|
Y
|
H
|
HHH
|
90
|
90
|
V
|
H
|
HHH
|
90
|
90
|
W
|
H
|
HHH
|
90
|
90
|
Y
|
Como podemos observar, la comparación se efectuó por las columnas C3 y CA, que son donde se encontraron valores iguales, el resultado muestra una tupla por cada coincidencia encontrada.
Cuando las consultas se anidan se conoce como Subquerys o subconsultas. Este tipo de consulta obtiene resultados parciales reduciendo el espacio requerido para realizar una consulta.
Nota: Todas las consultas que se resuelven con subquerys pueden resolverse con Join de Querys, pero no todas las consultas hechas con Join de Querys pueden resolverse utilizando Subquerys.
Para ejemplificar lo anterior consideremos el ejemplo
ALUMNO - cursa - MATERIA, que tienen los siguientes atributos:
NControl NControl Clave
NombreA Clave NombreM
Especialidad Calif Creditos
Dirección
Representando en tablas a los atributos quedarían de la siguiente forma:
Tabla alumno:
NControl
|
NombreA
|
Especialidad
|
Dirección
|
|
|
|
|
Tabla cursa:
Tabla materia:
- Obtener el nombre de la materia que cursa el alumno con número de control 97310211 con créditos igual a ocho.
SELECT NombreA
FROM Materia
WHERE creditos=’8’ and clave in(SELECT clave
FROM cursa
WHERE NControl=’97310211’;
- Obtener el número de control del alumno que tenga alguna calificación igual a 100
SELECT DISTINC(NControl)
FROM Cursa
WHERE Calif=’100’;
- Obtener el nombre de las materias que cursa el alumno Salvador Chávez.
SELECT NombreM
FROM Materia
WHERE Clave in (SELECT DISTINC (Clave)
FROM Cursa
WHERE NControl in (SELECT NControl)
FROM Alumno
WHERE NombreA=’Salvador
Chávez’));
FUNCIONES AVANZADAS APLICABLES A CONSULTAS
Existen funciones que permiten la agilización de consultas similares a una hoja de cálculo, ya que trabajan en base a renglones y columnas.
COUNT ( ): Cuenta el número de tuplas en la columna establecida
MIN ( ): Localiza el valor mínimo de la columna establecida
MAX ( ): Localiza el valor máximo de la columna establecida.
AVG ( ): Obtiene el promedio de valores de la columna establecida
SUM ( ): Obtiene el valor total que implican los valores obtenidos en la columna establecida.
Ejemplos:
- Obtener el número de alumnos que existen en la carrera de Ingeniería en Sistemas Computacionales.
SELECT Count (*)
FROM Alumno
WHERE especialidad=’ISC’;
- Obtener la máximo calificación que ha obtenido J.M. Cadena.
SELECT Max(Calif)
FROM Cursa
WHERE NControl IN (SELECT NControl
FROM Alumno
WHERE NombreA= ‘J.M. Cadena ’);
- Obtener el promedio de calificaciones de Salvador Chávez.
SELECT Avg (Calif)
FROM Cursa
WHERE NCotrol IN (SELECT NControl
FROM Alumno
WHERE NombreA=’Salvador Chávez’);
- Obtener la suma total de las calificaciones obtenidas por Daniel Colín.
SELECT Sum (Calif)
FROM Cursa
WHERE NControl IN (SELECT NControl
FROM Alumno
WHERE NombreA=’Daniel Colín’);
Hasta aquí hemos visto el manejo sencillo de realizar consultas con SQL, hay que destacar que en la realización de consultas anidadas se tiene que poner cuidando a la prioridad de los operadores, teniendo cuidado también al momento de agrupar los paréntesis que involucran las condiciones con los operadores.