You are on page 1of 40

Bases de datos

Capítulo 3: Introducción a SQL - 1


Capítulo 3 – Introducción a SQL – Parte 1

CONTENIDO
Parte 1:
• Comentarios generales sobre SQL
• Definición de datos
• Estructura básica de las consultas
• Operaciones básicas adicionales
• Operaciones sobre conjuntos
• Valores nulos

Parte 2:
• Funciones de agregación
• Subconsultas anidadas
• Modificación de la base de datos
Historía

• En 1970 E. F. Codd propone el modelo relacional y asociado a éste un sublenguaje de acceso a


los datos basado en el cálculo de predicados.
• Predecesor de SQL: IBM Sequel desarrollado como parte del proyecto System R en el laboratorio de
investigación de IBM en San José (California, USA)
– Acabó renombrado como Structured Query Language (SQL)
• En la actualidad SQL es el estándar de facto de la inmensa mayoría de los SGBD comerciales.
• El ANSI SQL sufrió varias revisiones y agregados a lo largo del tiempo:
– SQL-86, SQL-89, SQL-92
– SQL:1999, SQL:2003, SQL:2008
• El soporte al estándar SQL-92 es general y muy amplio.
– Cada implementación comercial incluye característcas especiales

• Los ejemplos que se ven en el tema funcionan en todos los sistemas


Componentes de SQL
• Lenguaje de definición de datos (LDD)
– Comandos para la definición de esquemas de relación, borrado de relaciones y
modificación de los esquemas de relación.
– Comandos para especificarlas restricciones de integridad que deben cumplir los datos
almacenados en la base de datos.
– Comandos para la definición de vistas
– Comandos para especificar los derechos de acceso a las relaciones y a las vistas
– Comandos para definir el almacenamiento físico de cada relación en el disco
• Lenguaje de manipulación de datos (LMD)
– Lenguaje de consultas
– Comandos para insertar, borrar y modificar tuplas en la base de datos
• Control de transacciones
• SQL incorporado y SQL dinámico definen cómo se pueden incorporar instrucciones de SQL
en lenguajes de programación de propósito general como C, C++ y Java.
Tipos de dominio predefinidos en SQL
• char(n) cadena de caracteres de longitud fija, con una longitud n especificada por el
usuario.
• varchar(n) cadena de caracteres de longitud variable con una longitud máxima n
especificada por el usuario.
• Int Número (un conjunto finito de valores enteros pero que depende de la
máquina).
• smallint Número entero pequeño (un subconjunto dependiente de la máquina del
tipo de dominio entero)
• numeric(p,d) Número de coma fija, p dígitos (más el signo), y de esos p dígitos, d
pertenecen a la parte decimal.
• real, double precision Números de coma flotante y números de coma flotante de
doble precisión. La precisión depende de la máquina).
• float(n) Número de coma flotante cuya precisión es, al menos, de n dígitos.
Definición básica de esquemas
Las relaciones se definen mediante el comando create table.
create table r (A1 D1, A2 D2, ..., An Dn,
(restricción_integridad1),
...,
(restricción_integridadk) )
– r es el nombre de la relación
– Ai nombre de atributo en el esquema de la relación r
– Di es el dominio del atributo Ai
Ejemplo:
create table departamento
(nombre_dept varchar (20),
edificio varchar (15) not null,
presupuesto numeric (12,2),
primary key (nombre_dept));
Restricciones de integridad en SQL
• primary key (A1, ..., An ) clave primaria formada por A1, ..., An
• foreign key (Am, ..., An ) references r
– Clave externa. Los atributos (Am, ..., An ) se deben corresponder con los valores de los
atributos de la clave primaria de la relación r.
• not null no se permite el valor nulo para ese atributo
Ejemplo:
create table profesor(
ID char(5),
nombre varchar(20) not null,
nombre_dept varchar(20),
sueldo numeric(8,2),
primary key (ID),
foreign key (nombre_dept) references departmento)

¡Ojo! primary key en un atributo, asegura restricción not null


Ejemplos de definición de esquemas (1/2)
• create table estudiante (
ID varchar(5),
nombre varchar(20) not null,
nombre_dept varchar(20),
tot_creditos numeric(3,0),
primary key (ID),
foreign key (nombre_dept ) references departmento) );
• create table matricula(
ID varchar(5),
asignatura_id varchar(8),
secc_id varchar(8),
semestre varchar(6),
año numeric(4,0),
nota varchar(2),
primary key (ID, asignatura_id, secc_id, semestre, año),
foreign key (ID) references estudiante ,
foreign key (asignatura_id , secc_id, semestre, año) references seccion);
Ejemplos de definición de esquemas (2/2)
• create table asignatura (
asignatura_id varchar(8) primary key,
nombre_asign varchar(50),
nombre_dept varchar(20),
creditos numeric(2,0),
foreign key (nombre_dept) references departamento) );

– La declaración primary key se puede hacer directamente en la declaración del atributo, como se
hace en el ejemplo de arriba con el atributo asignatura_id
Añadir tuplas a una relación
• Todas las relaciones recién creadas están inicialmente vacías
• Se utiliza el comando insert para introducir datos en la relación
Ejemplo:
– Se desea introducir el hecho de que existe un profesor de nombre Smith en el
departamento de Biología con un profesor_id 10211 y un sueldo de 66.000 €, se
escribirá:

insert into profesor


values (10211, 'Smith', 'Biología', 66000);

– En el comando insert los valores se indican en el orden en que se encuentran definidos


los atributos en el esquema de relación.
Borrado y modificación de relaciones
• drop table r
– Borra la relación r y todo su contenido de la base de datos
• delete from r
– Borra las tuplas de r pero mantiene la relación r
• alter table
– Modifica es esquema de una tabla: añadir o eliminar atributos
– alter table r add A D
• Añade a la relación r el atributo A con dominio D
• Todas las tuplas ya existentes tienen valor null es este atributo
– alter table r drop A
• Elimina el atributo A de la relación r
• drop no está soportado por todas las bases de datos
Estructura básica de las consultas
• La estructura básica de una consulta SQL consta de tres cláusulas:
– select los atributos deseados en el resultado de una consulta
– from lista de relaciones a acceder para evaluar la consulta
– where predicado con atributos de las relaciones de la cláusula from

• Una consulta característica de SQL tiene la forma:


select A1, A2, ..., An
from r1, r2, ..., rm
where P
– Ai representan los atributos
– ri representan las relaciones
– P es un predicado

• El resultado de una consulta de SQL es una relación


Cláusula SELECT (1/3)
• La cláusula select se utiliza para especificar los atributos deseados en el resultado de una consulta
– Corresponde a la operación de proyección del álgebra relacional
Ejemplo: obtener los nombres de todos los profesores
select nombre
from profesor
• En la sintaxis del álgebra relacional “puro”, la consulta debería ser:
Õnombre (profesor)
NOTA: los nombres de SQL son de tipo de letra insensitivo (lo que significa que se puede utilizar las
mayúsculas o minúsculas.)
– Nombre ≡ NOMBRE ≡ nombre
– Puede ser deseable utilizar las mayúsculas en los lugares en los que utilizamos la fuente en
negrita.
– En algunas configuraciones, los nombres de tabla y columna distinguen entre mayúsculas y
minúsculas.
– MySQL tiene una opción de configuración para habilitarlo / deshabilitarlo.
Cláusula SELECT (2/3)
• SQL permite los duplicados en las relaciones además de en los resultados de la consulta.
• Para forzar la eliminación de duplicados, insertar la clave distinct después de select.
• Ejemplo: encontrar los nombres de departamento de todos los profesores
select distinct nombre_dept
from profesor

• La clave all especifica explícitamente que los duplicados no se eliminen (valor por defecto)
select all nombre_dept
from profesor
Cláusula SELECT (3/3)
• Un asterisco (*) en la cláusula select indica “todos los atributos”
select *
from profesor
• La cláusula select puede contener expresiones aritméticas que incluyan los operadores +, –,
* y / con constantes o atributos de las tuplas.

Ejemplo:
La consulta:
select ID, nombre, nombre_dept, sueldo /12
from profesor
devolverá a una relación que es la misma que la relación profesor, excepto que el atributo
sueldo se divide entre 12
Cláusula WHERE (1/2)
• La cláusula where permite seleccionar solamente aquellas filas de la relación resultado de la
cláusula from que satisfagan determinado predicado
– Corresponde al predicado de la selección del álgebra relacional.

Ejemplo: encontrar los nombres de todos los profesores del departamento de Informática
cuyo sueldo sea superior a 70.000€.
select nombre
from profesor
where nombre_dept = 'Informática' and sueldo > 70000;

• Las comparaciones se pueden aplicar a los resultados de las expresiones aritméticas.


Cláusula WHERE (2/2)
• Los operandos de los operadores lógicos pueden ser expresiones que incluyan los
operadores de comparación <, <=, > , >=, = y <> .
• Los resultados de las comparaciones se pueden combinar utilizando las conectivas lógicas
and, or y not. .
• SQL permite utilizar los operadores de comparación para comparar cadenas de caracteres y
expresiones aritméticas, así como otros tipos especiales, como los tipos fecha (date)
• Más adelante se ven más características de cláusula where
Cláusula FROM (1/2)
• Contiene una lista de las relaciones que se van a explorar en la evaluación de la consulta
– La cláusula from se define por sí misma como el producto cartesiano de las relaciones
indicadas separadas por comas

Ejemplo:

select nombre, asignatura_id


from profesor, enseña
where profesor.ID = enseña.ID;

– Si un nombre de atributo aparece en más de una relación, para referenciarlo hay que
usar el prefijo del nombre de la relación para deshacer la ambigüedad:
• profesor.ID Atributo ID de la relación profesor
• enseña.ID Atributo ID de la relación enseña
Cláusula FROM (2/2)
• from profesor, enseña
– El producto cartesiano: cada tupla de profesor se combina con cada tupla de enseña
Resumen consultas (1/2)
• Una consulta característica de SQL tiene la forma:

select A1, A2, ..., An


from r1, r2, ..., rm
where P

• En general, el significado de una consulta en SQL se puede entender de la siguiente forma:


1. Genere un producto cartesiano de las relaciones de la cláusula from
2. Aplique los predicados indicados en la cláusula where al resultado del paso 1
3. Para cada tupla del paso 2, extraiga los atributos (o resultado de las expresiones)
indicados en la cláusula select
Resumen consultas (2/2)
Ejemplo:
– Encontrar los nombres de los profesores y los identificadores de asignatura de los
profesores del departamento de Informática

select nombre, asignatura_id


from profesor, enseña
where profesor.ID = enseña.ID and
profesor.nombre_dept = ’Informática';
Natural Join (1/4)
• Es un caso habitual que la condición de coincidencia de la cláusula from suele requerir que
todos los atributos con los mismos nombres tengan el mismo valor.
• Operación natural join:
– Opera con dos relaciones y genera como resultado una relación
– Solo considera aquellos pares de tuplas con los mismos valores en los atributos comunes
en los esquemas de ambas relaciones
– En la relación resultado no se repiten los atributos comunes
– El orden en que aparecen los atributos son:
• Primero los comunes a los esquemas de ambas relaciones
• Después atributos únicos al esquema de la primera relación
• Finalmente atributos únicos al esquema de la segunda relación
Natural Join (2/4)
Ejemplo:
– profesor(ID, nombre, nombre_dept, sueldo)
– enseña(ID, asignatura id, secc_id, semestre, año)
– Las dos consultas siguientes son equivalentes:

select nombre, asignatura_id


from profesor, enseña
where profesor.ID = enseña.ID;

select nombre, asignatura_id


from profesor natural join enseña;
Natural Join (3/4)
• Una cláusula from en una consulta SQL puede tener varias relaciones combinadas
utilizando la unión natural:
select A1, A2,…, An
from r1 natural join r2 natural join. . . natural join rm
where P;
• Se puede especificar exactamente qué atributos se deben igualar con join … using: r1 join
r2 using (A1 A2)
– La operación es similar a r1 natural join r2, excepto que un par de tuplas t1 de r1 y t2 de
r2 casan si t1.A1 = t2.A1 y t1.A2 = t2.A2; incluso si r1 y r2 tienen un atributo común de
nombre A3, no se requiere que t1.A3 = t2.A3
Natural Join (4/4)
Ejemplo:
select nombre, nombre_asig
from (profesor natural join enseña) join asignatura using (asignatura_id)

enseña(ID, asignatura_id, secc_id, semestre, año)


profesor(ID, nombre, nombre_dept, sueldo)
asignatura(asignatura_id, nombre_asig, nombre_dept, créditos)

• Se calcula: (profesor natural join enseña)


raux(ID, enseña.asignatura_id, enseña.secc_id, enseña.semestre, enseña.año,
profesor.nombre, nombre_dept, profesor.sueldo)
• Se calcula: raux join asignatura using (asignatura_id)
r(asignatura_id, ID, enseña.secc_id, enseña.semestre, enseña.año, profesor.nombre,
profesor.nombre_dept, profesor.sueldo, asignatura.nombre_asig,
asignatura.nombre_dept, asignatura.créditos)
Operaciones básicas – Renombrado (1/2)
• Los nombres de los atributos en el resultado de una consulta provienen de los nombres
de los atributos en las relaciones de la cláusula from pero …
– Dos relaciones de la cláusula from pueden tener atributos con los mismos nombres
– Si se utiliza una expresión aritmética en la cláusula select, el atributo resultado no
tiene nombre
– Puede que queramos cambiar este nombre en el resultado
– Se desean comparar tuplas de la misma relación
• SQL permite el renombrado de relaciones y de atributos de la relación resultado con
clausula as
nombre_anterior as nombre_nuevo
– Se puede usar tanto en clausula from como select
• El nuevo nombre se denomina nombre de correlación en la norma de SQL, pero
normalmente se llaman alias de tabla, o variable de correlación, o variable de tupla.
Operaciones básicas – Renombrado (1/2)
Ejemplos:
• Asignar nuevo nombre a atributo del resultado:
select nombre as nombre _profesor, asignatura_id
from profesor, enseña
where profesor.ID = enseña.ID;

• La misma consulta pero usando nombres más cortos:


select T. nombre, S.asignatura_id
from profesor as T, enseña as S
where T.ID = S.ID;

• Comparar tuplas de la misma relación: Encontrar los nombres de todos los profesores cuyo sueldo
sea mayor que al menos un profesor del departamento de Biología
select distinct T. nombre
from profesor as T, profesor as S
where T.sueldo > S.sueldo and S.nombre_dept = 'Biología';
Operaciones básicas – Cadena caracteres (1/3)
• SQL especifica las cadenas de caracteres encerrándolas entre comillas simples
• La norma SQL especifica que la operación de igualdad entre cadenas de caracteres sí es
sensible a mayúsculas. SQL Server y MySQL no.
• Hay varias funciones que operan con cadenas:
– Concatenación de cadenas: ||
– Extraer subcadenas: substring()
– Cálculo longitud de subcadenas: len() o length()
– Conversión a mayúsculas o minúsculas: upper() y lower()
– Eliminar espacios en blanco al final: trim()
• Se pueden usar operadores de comparación con cadenas
Operaciones básicas – Cadena caracteres (2/3)
• Para realizar la comparación de patrones se usan los operadores
– like cierto si cumple el patrón
– not like cierto si no cumple el patrón
• Los patrones se escriben utilizando caracteres especiales:
– Tanto por ciento (%). % encaja con cualquier subcadena
– Guión bajo (_). _ encaja con cualquier carácter, pero sólo uno
– Los patrones distinguen mayúsculas de minúsculas
• Ejemplos de patrones:
– ' Intro%' la cadena empieza por “lntro”.
– ' %lnfor%' la cadena contiene “Infor”
– '_ _ _' la cadena tiene exactamente tres caracteres
– '_ _ _% ' la cadena tiene, al menos, tres caracteres.
Operaciones básicas – Cadena caracteres (3/3)
Ejemplo:
– Encontrar los nombres de todos los departamentos cuyo nombre de edificio incluye la
subcadena “Watson”

select nombre_dept
from departamento
where edificio like '%Watson%';
Operaciones básicas – Orden resultado
• SQL permite cierto control sobre el orden en el cual se presentan las tuplas de una relación mediante
la cláusula order by
– Por defecto orden ascendente pero se puede cambiar:
• desc para especificar orden descendente
• asc para especificar orden ascendente (cadenas -> alfabético)
Ejemplo: lista, por orden alfabético, de todos los profesores del dpto. de Física
select nombre
from profesor
where nombre_dept = 'Física'
order by nombre;
Ejemplo: listado completo profesores por orden descendente de sueldo y cuando sueldo sea igual,
ordena alfabéticamente por nombre
select *
from profesor
order by sueldo desc, nombre asc;
Operaciones básicas – Predicados where
• Para simplificar predicados de la clausula where a la hora de comparar valores
– between cierto si el valor está dentro de un rango
– not between cierto si el valor no está dentro de un rango

Ejemplo: Lista de los nombres de los profesores con sueldos entre 90.000 € y 100.000 €

– Solución 1: con between


select nombre
from profesor
where sueldo between 90000 and 100000;

– Solución 2: sin between


select nombre
from profesor
where sueldo <= 100000 and sueldo >= 90000;
Operaciones sobre conjuntos (1/5)
• Las operaciones de conjuntos union, intersect, y except operan sobre relaciones y
corresponden a las operaciones de álgebra relacional È, Ç, -
• Cada una de las operaciones antes citadas elimina duplicados automáticamente; para
retener todos los duplicados se utilizan las versiones de multiconjunto correspondientes
union all, intersect all y except all
• Comprobar si están implementadas en la versión de SQL empleada

Ejemplo: Supóngase que una tupla se produce m veces en r y n veces en s, entonces, se


produce:
– m + n veces en r union all s
– min(m,n) veces en r intersect all s
– max(0, m – n) veces en r except all s
Operaciones sobre conjuntos (2/5)
Ejemplo:
Consultas de partida sobre la relación sección:

– Consulta1: encontrar las asignaturas que se enseñaron en el


semestre de otoño de 2009:
select asignatura_id
from sección
where semestre = 'Otoño' and año = 2009;

– Consulta2: encontrar las asignaturas que se enseñaron en el


semestre de primavera de 2010:
select asignatura_ id
from sección
where semestre = 'Primavera' and año = 2010;
Operaciones sobre conjuntos (3/5)
Ejemplo:
– Para encontrar todas las asignaturas que se enseñaron en e l otoño de 2009 o en la
primavera de 2010, o en ambas:
Consulta1 È Consulta2:
(select asignatura_id
from sección
where semestre = 'Otoño' and año = 2009;)
union
(select asignatura_ id
from sección
where semestre = 'Primavera' and año = 2010;)
Operaciones sobre conjuntos
Ejemplo union / union all

union union all

36
Operaciones sobre conjuntos (4/5)
Ejemplo:
– Para encontrar todas las asignaturas que se enseñaron en el otoño de 2009, así como en
la primavera de 2010
Consulta1 Ç Consulta2
(select asignatura_id
from sección
where semestre = 'Otoño' and año = 2009;)
intersect
(select asignatura_ id
from sección
where semestre = 'Primavera' and año = 2010;)
Operaciones sobre conjuntos (5/5)
Ejemplo:
– Para encontrar todas las asignaturas que se enseñaron en el semestre de otoño de 2009
pero que no se enseñaron en el semestre de primavera de 2010
Consulta1 - Consulta2
(select asignatura_id
from sección
where semestre = 'Otoño' and año = 2009;)
except
(select asignatura_ id
from sección
where semestre = 'Primavera' and año = 2010;)
Valores nulos (1/2)
• Algunos de los valores de una tupla puede tener valor nulo: null
• null significa que el valor es desconocido o no existe
• El problema surge al trabajar con estos valores nulos
– Las comparaciones con valores null son un problema (diapositiva siguiente)
– El resultado de cualquier operación aritmética que incluyan, por ejemplo +, -, * o /, es null si
cualquier valor de entrada es null

Ejemplo: 5 + null devuelve null

• El predicado is null (o is not null) se usan para comprobar valor nulo

Ejemplo: encontrar a todos los profesores que aparezcan en la relación profesor con valores null en el
atributo sueldo
select nombre
from profesor
where sueldo is null;
Valores nulos (2/2)
• SQL trata como unknown (desconocido) el resultado de cualquier comparación en la que intervenga
el valor null excepto para los predicados is null o is not null.
– 5 < null o null <> null o null = null devuelven unknown

• Hay que manejar tres valores lógicos: true - false – unknown

– OR: (unknown or true) = true,


(unknown or false) = unknown
(unknown or unknown) = unknown
– AND: (true and unknown) = unknown,
(false and unknown) = false,
(unknown and unknown) = unknown
– NOT: (not unknown) = unknown
– “P is unknown” se evalúa como true si P es unknown

• El resultado del predicado de una clausula where se trata como false si se evalúa como
unknown

You might also like