This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Técnicas de Modelamiento
Introducción al SQL Técnicas de Modelamiento
Introducción al SQL
Prof. César Luza MonteroFacultad de Ingeniería de Sistemas e Informática
CREATE TABLE TIPO_USUARIO(idTipoUsuario int Identity(1,1),descTipoUsuario varchar(20) NOT NULL,CONSTRAINT PK_TIPO_USUARIO PRIMARY KEY(idTipoUsuario))
CREATE TABLE USUARIO(idUsuario char(8)NOT NULL,idTipoUsuario int NOT NULL,apelUsuario varchar(35)NOT NULL,nomUsuario varchar(35) NOT NULL,direccion varchar(50)NULL,habilitado bit NOT NULL,fechaExpCarnet smalldatetime NOT NULL,fechaVencCarnet smalldatetime NOT NULL,CONSTRAINT PK_USUARIO_idUsuario PRIMARY KEY(idUsuario),CONSTRAINT FK_USUARIO_idTipoUsuario FOREIGN KEY (idTipoUsuario)
REFERENCES TIPO_USUARIO(idTipoUsuario))
Contenido
Mapa de contenidos
El SQL
Definición Comandos Consultas Ejemplos
Definición de SQL
� SQL = Structured Query Language� Es el lenguaje más usado para bases de
datos relacionales� Lenguaje declarativo de alto nivel� Desarrollado por IBM (1974-1977)� Se convirtió en un standard definido por :
– ANSI (American National Standards Institute) e– ISO (International Standards Organization)
Palabra clave que indica que la sentencia de SQL que queremos ejecutar es de selección
ALL Indica que queremos seleccionar todos los valores. .Es el valor por defecto y no suele especificarse casi nunca
DISTINCT Indica que queremos seleccionar sólo los valores distintos
FROM
Indica la tabla (o tablas) desde la que queremos recuperar los datos. En el caso de que exista más de una tabla se denomina a la consulta "consulta combinada" o "join". En las consultas combinadas es necesario aplicar una condición de combinación a través de una cláusula WHERE
WHERE Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Admite los operadores lógicos AND y OR.
GROUP BY Especifica la agrupación que se da a los datos. Se usa siempre en combinación con funciones agregadas
HAVING
Especifica una condición que debe cumplirse para que los datos sean devueltos por la consulta. Su funcionamiento es similar al de WHERE pero aplicado al conjunto de resultados devueltos por la consulta. Debe aplicarse siempre junto a GROUP BY y la condición debe estar referida a los campos contenidos en ella
ORDER BYPresenta el resultado ordenado por las columnas indicadas. El orden puede expresarse con ASC (orden ascendente) y DESC (orden descendente). El valor predeterminado es ASC.
DML Select
� Base Datos de ejemplo
– A fin de entender mejor el uso de las consultas con SQL usaremos una simple base de datos de ejemplo
– La base de datos esta formada por dos tablas: CARRO y CONDUCTOR
– Cada carro tiene un solo propietario Conductor– Un conductor puede ser propietario de varios carros
CONDUCTOR
CARRO
DML Select
Nombre FechaNacimiento
Jim Smith 11 Jan 1980
Bob Smith 23 Mar 1981
Bob Jones 3 Dec 1986
NROPLACA MARCA COLOR PRECIO PROPIETARIO
F611 AAA FORD ROJO 12000 Jim SmithJ111 BBB SKODA AZUL 11000 Jim SmithA155 BDE MERCEDES AZUL 22000 Bob SmithK555 GHT FIAT VERDE 6000 Bob JonesSC04 BFE SMART AZUL 13000
CONDUCTOR
CARRO
FK
PK
PK
DML Select simple
� SELECT column FROM tablename� SELECT column1,column2,column3 FROM tablename� SELECT * from tablename
SELECT * from CARRO;SELECT * from CARRO;NROPLACA MARCA COLOR PRECIO PROPIETARIO
F611 AAA FORD ROJO 12000 Jim Smith
J111 BBB SKODA AZUL 11000 Jim Smith
A155 BDE MERCEDES AZUL 22000 Bob Smith
K555 GHT FIAT VERDE 6000 Bob Jones
SC04 BFE SMART AZUL 13000
DML Select simple
SELECT nroplaca from CARRO;
NROPLACAF611 AAA
J111 BBB
A155 BDE
K555 GHT
SC04 BFE
COLOR
PROPIETARIO
ROJO Jim Smith
AZUL Jim Smith
AZUL Bob Smith
VERDE Bob Jones
AZUL
SELECT color, propietario from CARRO;
Los espacios y saltos de líneas no importan. Una buena practica es poner ”;” al final de la consulta.
Las mayúsculas o minúsculas (excepto entre comillas simples) es los mismo.
Las sentencias siguientes son validas:SELECT NROPLACA FROM CARRO;
SElecT nroplaca From Carro
DML Select clausula where
� Usted puede tener condiciones (reglas) en su consulta� Esas condiciones son comprobadas para cada fila que su
consulta produce� Si la condición es verdadera, la columna es mostrada� Si la condición es falsa, la columna no es mostrada� La condición empieza con WHERE
SELECT columnasFROM tablaWHERE condición
DML Select con condición Simple
� Una condición simple puede ser mostrar los carros de color ROJO� La condición será color = 'ROJO'
NROPLACA
F611 AAA
J111 BBB
A155 BDE
K555 GHT
SC04 BFE
NROPLACA
F611 AAA
SELECT * from CARRO where color = ‘ROJO’;
NROPLACA
MARCA COLOR PRECIO PROPIETARIO
F611 AAA FORD ROJO 12000 Jim Smith
SELECT nroplaca FROM CARRO;
SELECT nroplaca from CARRO WHERE color = 'ROJO‘;
CASE SENSITIVE.‘ROJO’ no es lo mismo que ‘Rojo’ o ‘rojo’
DML Select Comparaciones
� Las comparaciones validas incluyen: =,!=,<>,<,<=,>,>=– Color = ‘ROJO’ El color debe ser rojo– Color != ‘ROJO’ El color no es rojo– Color <> ‘ROJO’ Igual que !=– Precio > 10000 Mayor que 10000– Precio >= 10000 Mayor o igual a 10000– Precio < 10000 Menor que 10000– Precio <=10000 Menor o igual a 10000
� Números – Usted puede decir ‘10000’ o 10000.� Los Strings siempre tienen comillas
DML Select Comparando Fechas
� Las comparaciones de fechas pueden ser delicadas� Usted puede usar todos lo comparadores para las fechas
NOMBRE
FECHANACIMIENTO
Jim Smith 11 Jan 1980
Bob Smith
23 Mar 1981
Bob Jones
3 Dec 1986
NOMBRE
FECHANACIMIENTO
Bob Jones
3 Dec 1986
SELECT nombre, fechanacimiento from CONDUCTOR where fechanacimiento = ‘3 Dec 1986’
SELECT nombre, fechanacimiento from CONDUCTOR
� FECHA1>FECHA2 indica que FECHA1 es en el futuro después de FECHA2.
SELECT nombre,fechanacimiento from CONDUCTORWHERE FECHANACIMIENTO >= ‘1 Jan 1981’
NOMBRE FECHANACIMIENTO
Bob Smith 23 Mar 1981
Bob Jones 3 Dec 1986
DML Select Clausula BETWEEN
� Cuando trata con fechas, algunas veces se desea comprobar si el valor de un campo cae entre dos fechas
� La manera mas fácil de hacerlo es con BETWEEN� Por ejemplo, Encontrar todos los conductores que nacieron
entre 1995 y 1999SELECT nombre,fechanacimiento from CONDUCTORWHERE FECHANACIMIENTO between ‘1 Jan 1985’
and ’31 Dec 1999’� Between trabaja para otras cosas también, no solo fechas…
SELECT nroplaca from CARRO where precio between 5000 and 10000;
DML Select Clausula NULL
� NULL indica que algo no tiene valor� No es un valor, y usted no puede usar operadores de comparación
normales � Por ejemplo, buscar los carros sin propietarios
Malo: SELECT nroplaca from carro where propietario = NULLMalo: SELECT nroplaca from carro where propietario = ‘NULL’
� Hay dos operadores especiales: IS NULL y IS NOT NULL
NROPLACASC04 BFE
SELECT nroplaca from carroWHERE propietario is null
NROPLACA
F611 AAA
J111 BBB
A155 BDE
K555 GHT
SC04 BFE
SELECT nroplaca from carroWHERE propietario is not null
DML Select Clausula LIKE
� Algunas veces se desea tener una condición que involucra un string parcial o substrings en comodines
� LIKE permite esto, y se introduce en reemplazo de ‘=‘� Si el string contiene ‘%’ o ‘_’, LIKE los usa para soportar comodines.
– % - Matches 0 o mas caracteres en el string– _ - Matches exactamente 1 carácter en el string
� Nombre LIKE ‘Jim Smith’ e.g. Jim Smith� Nombre LIKE ‘_im Smith’ e.g. Tim Smith� Nombre LIKE ‘___ Smith’ e.g. Bob Smith� Nombre LIKE ‘% Smith’ e.g. Frank Smith� Nombre LIKE ‘% S%’ e.g. Brian Smart� Nombre LIKE ‘Bob %’ e.g. Bob Martin� Nombre LIKE ‘%’ i.e. match cualquiera� LIKE es mas costoso que =� Si usted no esta usando wildcards, siempre use = mas que LIKE.
DML Select Operadores Lógicos
� Combinar condiciones en una simple clausula WHERE puede ser de utilidad
� AND y OR nos permiten hacer esto� NOT también nos permite modificar el comportamiento de las
condiciones� Cuando esas combinaciones se juntan, pueden ocurrir
problemas en el orden� Esto se resuelve usando paréntesis
DML Select Operador AND
� AND combina condiciones donde todas deben ser verdaderas para filtrar
� Revisemos la tabla CARRO:
NROPLACA MARCA COLOR PRECIO PROPIETARIO
F611 AAA FORD ROJO 12000 Jim Smith
J111 BBB SKODA AZUL 11000 Jim Smith
A155 BDE MERCEDES AZUL 22000 Bob Smith
K555 GHT FIAT VERDE 6000 Bob Jones
SC04 BFE SMART AZUL 13000
DML Select Operador AND
SELECT nroplaca from carro SELECT nroplaca from carrowhere color = ‘AZUL’ WHERE nroplaca LIKE ‘%5’
NROPLACAJ111 BBB
A155 BDE
SC04 BFE
NROPLACA
A155 BDE
K555 GHT
SELECT nroplaca from carroWHERE color = ‘AZUL’ and nroplaca LIKE ‘%5%’;
NROPLACA
A155 BDE
DML Select Múltiples AND
� Usted puede tener muchas condiciones como LIKE y AND juntas
� Por ejemplo:
SELECT nroplacaFROM carroWHERE color = ‘AZUL’AND nroplaca like ‘%5%’AND propietario like ‘Bob %’;
DML Select Operador OR
� OR es semejante a ‘uno u otro’. Basta que una de las condiciones sea verdadera entonces el filtro es verdadero.
� Por ejemplo: Buscar los carros de color rojo o azul
SELECT nroplaca,color from CARROWHERE color = ‘ROJO’ OR color = ‘AZUL’
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones 3 Dec 1986
DML Select JOIN Moderno
SELECT *FROM carro JOIN conductor ON ( propietario = nombre );
NROPLACA
MARCA COLOR PRECIO PROPIETARIO
NOMBRE
FECHANACIMIENTO
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES
BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones
3 Dec 1986
DML Select OUTER JOIN
� Este es un carro sin propietario.� Algunas veces deseamos ver las filas que fallan a la condición join por
el valor NULL� Para ver los NULL en el joins usaremos OUTER JOIN.� El JOIN discutido hasta este punto es conocido como INNER JOIN.� Realmente outer join significa que deseamos forzar que todas las filas
de una de las tablas aparezca en el resultado. � Hay algunas variantes del OUTER JOIN, dependiendo de cuales filas
desea usted no perder.
NROPLACA
MARCA COLOR
PRECIO PROPIETARIO NOMBRE FECHANACIMIENTO
SC04 BFE SMART BLUE 13000 Bob Jones 3 Dec 1986
Considere la ultima fila del join sin restricción
DML Select OUTER JOIN
� Considere: Select *
FROM carro JOIN conductor on (propietario = nombre)
To the RIGHT of the JOIN
To the LEFT of the JOIN� Si usted desea todas las filas de CARRO siempre en la respuesta,
necesita un LEFT OUTER JOIN� Si usted necesita todas las filas de CONDUCTOR siempre en la
respuesta, necesita un RIGHT OUTER JOIN
DML Select OUTER JOIN
SELECT *FROM carro LEFT JOIN conductor ON ( propietario = nombre);
nroplaca marca color precio propietario nombre fecnac
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones 3 Dec 1986
SC04 BFE SMART BLUE 13000
SELECT *FROM carro RIGHT JOIN conductor ON ( propietario = nombre);
DML Select FULL OUTER JOIN
� Con LEFT OUTER join, usted no pierde las filas de la tabla izquierda� Con RIGHT OUTER join, usted no pierde las filas de la tabla derecha.� Si usted desea mostrar todas las filas de ambos lados
– Necesita FULL OUTER join, conocido como FULL JOIN.� Considere una nueva fila; David Davis, para CONDUCTOR. David no
es propietario de ningún carro.
nombre fechanacimiento
Jim Smith 11 Jan 1980
Bob Smith 23 Mar 1981
Bob Jones 3 Dec 1986
David Davis 1 Oct 1975
DML Select Ejemplo: LEFT y RIGHT
SELECT *FROM carro LEFT JOIN conductor ON ( propietario = nombre);
nroplaca marca color precio propietario nombre fecnac
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones 3 Dec 1986
SC04 BFE SMART BLUE 13000
SELECT *FROM carro RIGHT JOIN conductor ON ( propietario = nombre );nroplaca marca color precio propietario nombre fecnac
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones 3 Dec 1986
David Davis 1 Oct 1975
DML Select Ejemplo: Full
SELECT *FROM carro FULL JOIN conductor ON ( propietario = nombre);
nroplaca marca color precio propietario nombre fecnac
F611 AAA FORD RED 12000 Jim Smith Jim Smith 11 Jan 1980
J111 BBB SKODA BLUE 11000 Jim Smith Jim Smith 11 Jan 1980
A155 BDE MERCEDES BLUE 22000 Bob Smith Bob Smith 23 Mar 1981
K555 GHT FIAT GREEN 6000 Bob Jones Bob Jones 3 Dec 1986
SC04 BFE SMART BLUE 13000
David Davis 1 Oct 1975
DML Select Naming
� Algunas veces los nombres de las columnas pueden ser ambiguos.� Tome dos tablas, llamados ALPHA y BRAVO. Asumimos que cada
tabla tiene una columna llamada CODIGO.
� La consulta: SELECT CODIGO from ALPHA,BRAVO;
� Falla, porque CODIGO esta en ambas tablas. � El DBMS no puede trabajar el nombre de columna que se desea.� Se puede decirle al DBMS con exactitud anteponiendo el nombre de
la tabla al nombre de la columna, separados por un punto.
� SELECT alpha.codigo from ALPHA, BRAVO;
DML Select Aliases
� Si se escribe una consulta grande, puede escribir el mismo nombre largo de tabla una y otra vez.
� Esto puede provocar errores en la digitación� SQL permite renombrar las tabla durante la consulta.� Se escribe el nuevo nombre inmediatamente después del
nombre de la tabla en el FROM, separado por espacio.� Mas que: SELECT carro.propietario FROM carro;� Puede decir: SELECT c.propietario FROM carro c;
� Tambien trabaja en JOIN.SELECT c.nroplaca, c.propietario, d.fechanacimientoFROM carro c JOIN conductor d on (c.propietario = d.nombre)
DML Select Selfjoin
� Un selfjoin, o un equijoin, es donde una misma tabla es usado dos veces en una línea FROM
� Indica la necesidad de usar una sola tabla en dos formas diferentes simultáneamente
� Considere la pregunta “Quienes son propietarios de un carro del mismo color que del de Bob Smith”?
Color
BLUE
SELECT propietario FROM carroWHERE color = ‘BLUE’AND propietario != ‘Bob Smith’AND propietario not null;
Propietario
Jim Smith
SELECT color FROM carro WHERE propietario = ‘Bob Smith’;
� Cuando finaliza con una VIEW puede crear su propio borrado, con el comando DROP VIEW.
� Para nuestro ejemplo…
DROP VIEW count1;
DROP VIEW count2;
SQL - Subqueries
Subqueries
� Un Subquery es una sentencia select dentro de otra� Usado en la cláusula WHERE � Los Subqueries pueden retornar muchas filas.� Los Subqueries pueden retornar solo una columna.� Se utiliza como reemplazo de una Vista o de un selfjoin.� Algunos programadores lo ven como más fácil de entender
que otras � El principal inconveniente es que pueden ser mucho más
lentos que selfjoin o las Vistas
Ejemplo Simple
� Quien en la base de datos es mayor que Jim Smith?
SELECT fecnac FROM conductor WHERE nombre = ‘Jim Smith’;
SELECT nmbre FROM conductor WHERE fecnac > ’11 Jan 1980’;
fecnac
11 Jan 1980
name
Bob Smith
Bob Jones
Ejemplo Simple
� Select juntos:
SELECT nombre FROM conductorWHERE fecnac > (SELECT fecnac
FROM conductorWHERE nombre = ‘Jim Smith’)
;
� Esta consulta solo trabajará si hay solo 1 Jim Smith.
ANY y ALL
� Para soportar subqueries que retornan mas de 1 fila se necesita algun operador adicional… ANY and ALL.
� ANY – cambia la regla de que debe ser verdadera para al menos un de las filas retornadas desde el subquery.
� ALL – cambia la regla de que debe ser verdadera para todos y cada una de las filas retornadas desde el subquery.
� Los operadores ANY o ALL va inmediatamente antes de abrir el paréntesis.
Ejemplo 1
� Que carros son del mismo color de los carros propedad de Jim Smith?
� Jim es propietario de 2 carros, uno es Rojo y el otro Azul. Estamos buscando los carros que sean Rojo o Azul.
SELECT nroplaca FROM carro
WHERE color = ANY ( SELECT color
FROM carro
WHERE propietario = ‘Jim Smith’
)
Ejemplo 2
� Listar los conductores mas jovenes que todas las personas propietarias de carros azules.
� Estamos buscando las edades de los conductores quienes osn propietarios de carros de color azul, y listar los conductores que son menores que todas esas edades.
SELECT nombre,fecnac FROM conductorWHERE fecnac < ALL (
SELECT fecnacFROM carro JOIN conductor ON (propietario=nombre)WHERE color = ‘BLUE’
) ;
IN and NOT IN
� We earlier saw IN working for sets like (‘A’,’B’).� A subquery itself returns its result as a set.� Therefore we can use IN and NOT IN on
subqueries.
� Question: Which cars are the same colour as one of Jim Smith’s cars?
SELECT regno FROM carWHERE colour IN (SELECT colour FROM car
WHERE owner = ‘Jim Smith’);
Example of NOT IN
� Question: Which cars DO NOT have the same colour as one of Jim Smith’s cars?
SELECT regno FROM car
WHERE colour NOT IN (SELECT colour FROM car
WHERE owner = ‘Jim Smith’)
;
EXISTS
� If a question involves discovering uniqueness, then it can probably be easily solved using the operator EXISTS or NOT EXISTS.
� The EXISTS operator tests the result of running a subquery, and if any rows are returned it is TRUE, else it is FALSE.
� NOT EXISTS does the opposite of EXISTS.
� Note that subqueries can actually refer to tables defined outside the brackets which define the subquery. This is exceptionally useful, but can be slow to execute and confusing to look at.
� Question: List the colours which are only used once in the database.
SELECT colourFROM car aWHERE exists (
SELECT colour -- The row does not matterFROM car b -- unique name from aWHERE a.colour = b.colour -- Same colour as aAND a.regno != b.regno -- Different car from a
);
UNION
� Sometimes you might write two or more queries which produce the same types of answer, and you want to combine the rows of these answers into a single result.
� UNION does this, and basically allows you to join different SELECT statement together.
� UNION automatically removes duplicate rows.
� For the next example, assume a row has been added to the DRIVER table for David Davis, but that he owns no cars.
� Question: List all drivers in the DRIVER table, together with how many cars they own.
SELECT name,count(*)
FROM driver JOIN car on (name = owner)
David Davis is missing, as he did not satisfy the JOIN condition.
NAME Count(*)
Jim Smith 2
Bob Smith 1
Bob Jones 1
� Write a query just for David Davis…
SELECT name,0
FROM driver
WHERE name NOT IN (select owner from car)
NAME
David Davis 0
� Link the two queries together:SELECT name,count(*)FROM driver JOIN car on (name = owner)UNIONSELECT name,0FROM driverWHERE name NOT IN (select owner from car)
NAME Count(*)
Jim Smith 2
Bob Smith 1
Bob Jones 1
David Davis 0
View Manipulation
When is a view ‘materialised’ or populated with rows of data?
� When it is defined or� when it is accessed
If it is the former then subsequent inserts, deletes and updates would not be visible. If the latter then changes will be seen.
Some systems allow you to chose when views are materialised, most do not and views are materialised whenever they are accessed thus all changes can be seen.
VIEW update, insert and delete
Can we change views?� Yes, provided the
primary key of all the base tables which make up the view are present in the view.
Base Table - A Base Table - BA# B#
View Definition
A# B#View
VIEW cont...
� This view cannot be changed because we have no means of knowing which row of B to modify
Base Table - A Base Table - BA# B#
View Definition
A#View
SELECT - Order of Evaluation
SELECT [DISTINCT] column_name 5,6 eliminate unwanted data
FROM label_list 1 Cartesian Product[WHERE condition ] 2
eliminate unwanted rows[GROUP BY column_list 3 group rows[HAVING condition ]] 4 eliminate unwanted