Вы находитесь на странице: 1из 13

Conferencia Ttulo: Introduccin al SQL. Sentencia SELECT. CONTENIDO SQL estndar.

OBJETIVOS Conocer los fundamentos del lenguaje SQL. Conocer las potencialidades de la sentencia SELECT del SQL.

BIBLIOGRAFA INTRODUCCIN En la actualidad existen muchos SGBD cuyos lenguajes son en general, diferentes. Sin embargo, todos ellos tienen embebido un lenguaje nico conocido como SQL (siglas de Structured Query Language). Este hecho da una medida de la importancia de este lenguaje en el mbito de los SGBD y por eso se hace necesario su estudio. DESARROLLO Este lenguaje naci como parte de un SGBD relacional denominado System R, a principios de los aos 70. Evolucion mucho desde aquellos tiempos y cambi su nombre desde SEQUEL hasta el SQL actual. Cada sistema de programacin incorpora una variante del estndar de modo que no necesariamente lo cubra todo pero s puede incluir elementos propios an cuando estos no estn en el estndar. En esta actividad se discutirn algunos de los comandos fundamentales de este lenguaje. Partes del lenguaje: El SQL contiene comandos para las 3 partes componentes del lenguaje: DDL (Data Description Languaje) DCL (Data Control Languaje) DML (Data Manipulation Languaje) Como componentes del DDL estn los comandos que permiten definir relaciones, vistas, ndices, etc. se cuenta entre otros, con los siguientes: 1. CREATE (crear tablas, etc.) Ejemplo: CREATE TABLE tablabase (definicin_de_columna [,definicin_de_columna][, definicin_de_clave_primaria] [, definicin_de_clave_ajena [,definicin_de_clave_ajena]]) CREATE TABLE SP

( Snum char(5) NOT NULL DEFAULT S1, Pnum char(5) NOT NULL, Cant INTEGER NOT NULL, PRIMARY KEY (Snum,Pnum), FOREIGN KEY (Snum) REFERENCES S (Snum)); 2. ALTER (modificar estructuras de tablas, etc.) Ejemplo: ALTER TABLE tablabase ADD columna tipodedato ALTER TABLE S ADD SS char(5); 3. DROP (eliminar tablas, etc.) Ejemplo: DROP TABLE S; Como componentes del DCL estn los comandos para controlar los accesos a la BD, como son: GRANTOtorgar permisos de acceso a la BD. REVOKERemover (quitar) privilegios de acceso. Como componentes del DML se encuentran los comandos encargados de realizar las consultas, adems de los que permiten insertar, suprimir y modificar tuplas. Entre los ms importantes estn: SELECTRealizar consultas (recuperaciones), a menudo clasificado dentro del QL (Query Language). INSERTInsertar tuplas. UPDATEModificar tuplas. DELETEEliminar tuplas. El primero puede considerarse como el ms importante de todos comandos. Comprender su estructura y uso permite interpretar correctamente el cdigo SQL generado por muchos SGBD. Esta instruccin, aun cuando se denomina seleccin, envuelve mucho ms contenido que la operacin de seleccin del lgebra Relacional pues incluye toda la funcionalidad del lgebra Relacional, aunque es ms bien descriptivo, o sea, en el estilo del Clculo Relacional. Est formada por varias clusulas, algunas de las cuales se pueden usar o no en funcin de lo que se quiere recuperar. Estructura bsica: Consta de las clusulas: SELECTListar los atributos deseados (Proyeccin del lgebra) FROMListar las tablas (Producto cartesiano del lgebra) WHEREPredicado de seleccin. Contiene atributos de las tablas del FROM. Incluye las expresiones de combinacin entre las tablas para el JOIN del lgebra.

Una instruccin SELECT incluye obligatoriamente las clusulas SELECT y FROM, aunque una consulta tpica tiene la forma siguiente: SELECT A1, A2, , An FROM r1, r2, , rn WHERE p Lo que es equivalente a : ( (r1 TIMES r2 TIMES ... TIMES rn ) WHERE p ) {A1, A2, , An} SELECT * significa todos los atributos de todas las relaciones. En la sintaxis a continuacin, los nmeros en parntesis indican el orden de ejecucin. SELECT [DISTINCT] (6) elementos (5) FROM tables (1) [WHERE condicin] (2) [GROUP BY campos] (3) [HAVING condicin] (4) [ORDER BY campos] (7) Los elementos pueden contener constants, expresiones y atributos. Si se usa en combinacin con GROUP BY se pueden poner constantes, funciones agregativas de columnas (AVG([DISTINCT] columna), SUM([DISTINCT] columna), MIN(columna), MAX(columna), COUNT( * | [DISTINCT] columna)) que producen un nico valor, columnas de agrupacin del GROUP BY, o expresiones con las anteriores (No considera llaves primarias ni ajenas). En el HAVING siempre se incluyen funciones de columna, si no se trata igual que el WHERE pero se aplica una vez que se hayan formado los grupos, mientras que el WHERE se aplica antes. Ejemplo: SELECT Snomb FROM S Encuentra los nombres de todos los suministradores, mientras que: SELECT Snomb FROM S WHERE Mun=H.Vieja Recupera los nombres de los suministradores que radican en la H.Vieja. SELECT Pieza=,P.Pnum, Precio=, P.Precio, pesos, Miles=, Cant/1000 AS Miles FROM P Obtiene una lista con un encabezado especial, incluyendo constantes y expresiones.

Ejemplo: Pieza= P1 Precio= 50 pesos Miles= 30 Pieza= P2 Precio= 30 pesos Miles= 10 El predicado del WHERE permite expresiones con los operadores lgicos AND, OR, NOT. Ejemplo: SELECT Pnum FROM P WHERE Cant>25 AND Precio < 80 Encuentra piezas de menos de 80 pesos con cantidades superiores a los 25. Cuando el nombre de las tablas son extensos se puede trabajar con alias, tambin se pueden usar alias para las columnas de salida. Cuando se usen alias para las tablas de entrada es estrictamente obligatorio calificar en toda la orden con el nuevo alias. Ejemplo: SELECT S.Snum FROM Suministrador S WHERE S.Ciudad=Holguin Operadores Adems de los operadores lgicos mencionados, y los de comparacin <, >, =, etc., existen otros operadores. Estos son: BETWEENPara expresiones que incluyan rango de valores. LIKESe emplea en patrones o modelos para las comparaciones de cadenas de caracteres. Ej. SELECT SNum FROM SP WHERE Cantidad BETWEEN 10 AND 20 Para los patrones del LIKE se emplean los caracteres % y _, que hacen la funcin de comodines con el siguiente significado: %Cualquier subcadena _.Cualquier carcter Ej. SELECT Snomb FROM S WHERE Snomb LIKE %EZ Encuentra todos los nombres de los suministradores terminados en EZ. Estos operadores de comparacin pueden combinarse con NOT. Tuplas duplicadas. Los lenguajes de consulta formales se basan en la nocin matemtica de relacin como un conjunto, lo que implica que no existen tuplas duplicadas. En la prctica la eliminacin de duplicados lleva tiempo y en SQL se permiten duplicados en los resultados de las consultas. Esto se evita con la palabra clave DISTINCT despus del SELECT.

Por ejemplo, sea SP(Snum,Pnum,Cantidad) Si se hace: SELECT SNum FROM SP Se obtienen los mismos Snum repetidos tantas veces como ellos estn involucrados en un suministro de un producto diferente. Esto se evita con: SELECT DISTINCT Snum FROM SP El inverso de DISTINC es ALL (implcito). Operaciones de conjunto. El SQL estndar incluye la operacin UNION. En sus primeras versiones se incluy tambin INTERSECT y MINUS, pero no estn en el estndar (aunque pueden lograrse con otras caractersticas del mismo) Ej: Para encontrar los nmeros de productos con Peso>20 o suministrados por S2 o ambos, es posible hacer: SELECT Pnum FROM Producto WHERE Peso>20 UNION (SELECT P FROM SP WHERE Snum=S2) Consultas con ms de una tabla. El Join en SQL puede lograrse de la siguiente forma: SELECT SNomb FROM S,SP WHERE Snum=S AND Cantidad >50 La parte en negrita es la condicin de la combinacin de las tablas. Si en ambas tablas el atributo Snum del suministrador tuviera el mismo nombre, por ejemplo Snum, se hace uso de nombres calificados: WHERE S.Snum=SP.SNum AND Cantidad >50 Opcionalmente pueden agregarse ms condiciones con AND. El Join no tiene que ser necesariamente un equijoin aunque es lo ms comn. Puede hacerse el join de una tabla consigo misma. Recurdese la consulta: Encontrar parejas de nmeros de suministradores que radiquen en el mismo municipio Puede expresarse como:

SELECT S1.SNuM, S2.Snum FROM S S1, S S2 (Note que aqu se usan alias para cada ocurrencia de la relacin) WHERE S1.Mun=S2.Mun AND S1.Snum<S2.Snum Lo que se ha hecho significa que el SQL emplea el concepto de variable de tupla del clculo relacional y resuelve el problema de referenciar 2 tuplas de la misma relacin de esta manera. Consultas anidadas (subconsulta) En SQL es posible anidar un SELECT dentro de otro (sin restricciones de profundidad en el anidamiento, al menos en teora) Por ejemplo, para encontrar los nombres de los suministradores que suministran el producto P2 hay ms de una forma de obtenerlo en SQL. 1.SELECT Snomb FROM S,SP (con join) WHERE SNum=S AND Pnum=P2 2.SELECT Snomb FROM S WHERE Snum IN (SELECT Snum FROM SP WHERE Pnum=P2) Lo que significa que una misma consulta puede ser expresada de diferentes formas. El operador IN permite comparacin de conjuntos, al igual que SOME, ANY, ALL. SOME, ANY..Significa Algn, cualquier ALLSignifica Todos Ejs: SELECT Pnomb FROM P WHERE Peso>ALL (SELECT Peso FROM P WHERE Color=Rojo) Esta consulta encuentra los nombres de los suministradores, los nombres de los productos cuyo peso es mayor que el peso de los productos de color rojo. (Uso del cuantificador Existencial EXISTS ) SQL da la posibilidad de comprobar si una subconsulta tiene alguna tupla en su resultado. EXISTS devuelve TRUE si la subconsulta del argumento no est vaca.

Ej. Encontrar los nombres de los suministradores que suministran el producto p2 (3ra variante). SELECT Snomb FROM S WHERE EXISTS (SELECT * FROM SP WHERE S=Snum AND Pnum=P2)

Un suministro de P2

EXISTS representa el cuantificador existencial y devolver verdadero cuando el resultado del SELECT anidado tenga alguna tupla, o sea, cuando haya algn suministro de P2 por parte de algn suministrador. La consulta devuelve entonces los suministradores para los que existe un suministro de p2. Puede combinarse con NOT. Ej. Encontrar los que no suministran p2 SELECT Snomb FROM S WHERE NOT EXISTS (SELECT * FROM SP WHERE S=Snum AND Pnum=P2) Ordenamiento de la presentacin del resultado. Es posible que las tuplas obtenidas aparezcan en cierto orden. Esto se logra con la clusula ORDER BY. Ej. SELECT Snomb FROM S WHERE Mun=H.Vieja ORDER BY Snomb El orden implcito es ascendente pero puede especificarse lo contrario con ASC, DESC. El ordenamiento puede ser sobre mltiples atributos, y puede usarse el nmero de orden en las columnas de salida en lugar del nombre Ejemplo: ORDER BY 3. Funciones de agregacin. Es posible utilizar funciones que en general operan sobre los valores de una columna. Estas son: AVG..realiza una media de una columna de datos numricos. COUNT....cuenta el nmero de elementos seleccionados en una columna. COUNT(*) .cuenta el nmero de filas en el resultado de la consulta. MINdetermina el menor valor de una columna.

MAX..determina el mayor valor de una columna. SUM..proporciona el total de la suma de una columna de datos numricos. Ejemplos: a) SELECT COUNT(*) FROM S.Devuelve cantidad de suministradores b) SELECT COUNT(DISTINCT Snum) FROM SP..Cantidad de suministradores que tienen suministros c) SELECT SUM (Cantidad) FROM SP WHERE Pnum=P1.Suma de las cantidades de P1 suministradas. Estas funciones son llamadas de agregacin pues pueden operar sobre grupos de tuplas tambin. Para ello se combinan con la clusula GROUP BY. En esta clusula se especifica un atributo (o varios atributos) y el efecto es como si se formaran grupos en la tabla, donde en cada grupo formado estarn las tuplas con igual valor en el atributo(s) especificado(s) en el GROUP BY. Ej. SELECT Pnum, SUM(Cantidad) FROM SO GROUP BY Pnum. De esta forma es posible calcular la suma de la cantidad suministrada no slo para el producto P1, sino para todos los productos. Cuando se va a calcular una suma, o un promedio, es importante considerar los duplicados. Por ej.. PNum p1 p1 p1 SNum s1 s2 s4 Cantidad 100 200 100

Est duplicado p1, 100 pero no es posible eliminarlo pues el valor que se obtendra no sera 400 (el correcto) sino 300. En otras circunstancias podr ser conveniente eliminarlos, para lo que puede emplearse el DISTINCT que ya vimos. Ej. Se desea encontrar la cantidad de productos que suministra cada suministrador. SELECT Snum, COUNT(DISTINCT PNuM) FROM SP GROUP BY SNUM Pnum p1 p2 SNum s1 s1 Cantidad 100 50

p4 p3 p4

s1 s2 s2

10 20 30

Rpta: S1 3 S2 2 Tambin es posible usar funciones en una subconsulta: SELECT Pnomb FROM P WHERE Peso> (SELECT AVG(Peso) FROM P) A veces es necesario declarar una condicin o predicado para que sea aplicado a los grupos y no a las tuplas. Para ello se usa HAVING Ej. SELECT P,Sum(cant) FROM SP GROUP by P HAVING Sum(cant) > 100 El empleo de Group By y Having exige que: cada expresin del SELECT tenga un solo valor por grupo. la expresin de Having tenga un solo valor por grupo. Es decir, no es posible tener: SELECT P, Cant From SP Group By P Having Cant>100 porque Cant no tiene un solo valor para cada P, en ese caso habra que agrupar tambin por Cant. En un SELECT pueden combinarse clusulas WHERE y HAVING. En tal caso, primero se aplica el predicado del WHERE a todas las tuplas y slo estas sern agrupadas segn el Group By para luego aplicar el predicado del Having. Ej. SELECT AVG(cant) FROM S,SP WHERE S.Snum=SP.S and MUN =Plaza Group By SP.Snum Having Count(Distinct P) 3 En este ejemplo se calcula el valor promedio del atributo Cant para aquellos suministradores que radican en Plaza y que adems suministran ms de tres productos diferentes.

El SQL estndar ha incluido la posibilidad de definir el tipo de combinacin entre las tablas relacionadas y esto se especifica en la clusula FROM del SELECT. Sustituye la condicin de combinacin de la clusula WHERE. Combinacin interna (INNER JOIN) En el resultado se incluyen slo las filas que casan en las tablas combinadas. Corresponde al JOIN del lgebra relacional Ej: Sean las tablas Suministrador y SP: SELECT Suministrador.snomb ,Sp.cantidad; FROM suministradores_productos.suministrador INNER JOIN suministradores_productos.sp ; ON Suministrador.snum = Sp.s; En esta instruccin se obtendrn los nombres de los suministradores que tienen suministros (que aparecen en SP) junto con la cantidad suministrada. Combinacin externa (OUTER JOIN) Tiene 3 variantes: LEFT, RIGHT y FULL con el siguiente significado: LEFT: Incluye todas las filas de la tabla de la izquierda (la que aparece a la izquierda de la palabra LEFT) y las que casan de la derecha. Aplicando esta combinacin al ejemplo anterior la instruccin quedara: SELECT Suministrador.snomb, Sp.cantidad; FROM suministradores_productos.suministrador suministradores_productos.sp ; ON Suministrador.snum = Sp.s LEFT OUTER JOIN

Y en el resultado estaran todos los suministradores. En el caso de los que no tienen suministros, en la columna cantidad aparece un NULL. RIGHT: Incluye todas las filas de la tabla de la derecha, ms las que casan. Si la tabla de la derecha es una tabla secundaria en una relacin (como lo es SP respecto a Suministrador), esta operacin sirve para encontrar las violaciones de la integridad referencial en un sistema que no la chequee. Rellena con NULL en los campos en que no hayan valores por tratarse de filas que no casan. FULL: Incluye todas las filas de las 2 tablas, casen o no. Rellena con NULL en los campos en que no hayan valores por tratarse de filas que no casan. Ejemplo: Vamos a ver un ejemplo de aplicacin, para ello tomaremos el que hemos estado viendo en clases, el del Hospital que tenia las siguientes tablas: pacientes(noipac, nompac, apespac, edad, sexo)

noipac: identificacin del paciente nompac: nombre del paciente sexo, edad: sexo y edad del paciente especialidad(codesp, descrip, cantmed) codesp: codigo de la especialidad descrip:descripcin de la especialidad cantmed: cantidad de mdicos en esa especialidad medico( noimed, nommed, agrad, gmed, codesp) noimed: nmero de identificacin del mdico nommed: nombre del medico agrad: aos de graduado gmed: grado del medico codesp: codigo de la especialidad a la que pertenece consulta(noipac, codesp, diagnostico tratamiento, noimed) 1. Listar los pacientes con todos sus datos. SELECT* FROM paciente 2. Listar los pacientes de sexo femenino y que su edad exceda a 20. SELECT * FROM paciente WHERE sexo = 'F' AND edad >20 3. Listar las especialidades y cantidad de mdicos de c/u de ellos ordenados por cant de mdicos. SELECT descrip AS "Especialidad", cantmed FROM especialidad ORDER BY cantmed 4. Listar los especialidades que la cantidad de mdicos que poseen estn por encima de la cantidad promedio de mdicos que existen para todas las especialidades SELECT descrip FROM hospital.especialidad WHERE cantmed >(SELECT AVG(cantmed) FROM hospital.especialidad) 5. Listar el nombre y grado de cualquier medico con mas de 15 aos de graduado. SELECT nommed FROM hospital.medico WHERE agrad >15 6. Listar el diagnostico y tratamiento de todos los pacientes que tuvieron consulta de ortopedia Ejercicio propuesto: Supongamos una pequea empresa de distribucin que atiende pedidos de clientes. Tendremos las siguientes tablas: CLIENTES: Contiene una fila por cada uno de los clientes de la empresa. VENDEDORES: Contiene una fila por cada uno de los vendedores de la empresa.

OFICINAS: Contiene una fila por cada una de las oficinas en que trabajan los vendedores. PRODUCTOS: Contiene una fila por cada tipo de producto disponible para la venta PEDIDOS: Contiene un artculo para cada pedido ordenado por un cliente, por simplicidad se supone que cada pedido se refiere a un nico producto.

OFICINAS(oficina, ciudad, regin, dir, objetivo, ventas) oficina: cdigo de la oficina ciudad: ciudad donde radica la oficina region: regin donde radica la oficina dir: director de la oficina (es uno de los vendedores) objetivo: cunto debe ganar la oficina ventas: ventas realizadas por la oficina CLIENTES(num_clie, empresa, vendedor_clie, lim_credito) num_clie: cdigo del cliente empresa: nombre de la empresa vendedor_clie: vendedor que atiende al cliente. lim_credito: lmite de crdito concedido al cliente. PRODUCTOS(id_fab, id_producto, descripcin, precio, existencia) id_fab: cdigo del fabricante id_producto: cdigo del producto descripcin: descripcin del producto. precio: precio del producto. existencia: existencia del producto. VENDEDORES(num_empl, nombre, edad, oficina_vend, titulo, contrato, director, cuota, ventas) num_empl: nmero del empleado (su cdigo) nombre: nombre del empleado. edad: edad del empleado. oficina_vend: oficina en que trabaja el vendedor. titulo: puesto que ocupa contrato: fecha del contrato. director: cdigo de su director (es otro vendedor) cuota: cuota asignada a este vendedor. ventas: ventas que ha realizado el vendedor. PEDIDOS(num_pedido, fecha_pedido, clie, vend, fab, producto, cant, importe) num_pedido: nmero del pedido. fecha_pedido: fecha del pedido. clie: cliente que realiz el pedido (su cdigo) vend: vendedor que acept el pedido. fab, producto: cdigo del producto que se pide. cant: cantidad del producto que se pide.

importe: importe del producto que se pide. Las columnas sombreadas son las llaves de las tablas. 7. Listar las oficinas de ventas con sus objetivos y ventas reales. 8. Listar las oficinas de ventas de la regin Este con sus objetivos y ventas. 9. Listar las oficinas de ventas de la regin Este cuyas ventas exceden a sus objetivos. 10. Listar los nombres, oficinas y fechas de contrato de todos los vendedores. 11. Cul es el nombre, cuota y ventas del empleado nmero 107? 12. Listar el nombre y fecha de contrato de cualquier vendedor cuyas ventas sean superiores a 500 000. 13. Listar todos los nombres de los vendedores, sus cuotas y directores. 14. Mostrar que suceder si se eleva la cuota de cada vendedor en un 3% de sus ventas anuales 15. Muestra los empleados dirigidos por Bob Smith (empleado 104). 16. Halla los vendedores contratados antes de 1988. 17. Listar las oficinas cuyas ventas estn por debajo del 80% del objetivo. 18. Cul es el nombre y el lmite de crdito del cliente nmero 2107? 19. Listar los pedidos cuyos importes estn entre 30000 y 40000. 20. Listar los pedidos obtenidos por los vendedores 107, 109, 101 y 103. 21. Listar todos lo vendedores cuyos nombres comiencen con B. 22. Listar todos los productos del fabricante QSA cuyo identificador comience por XK. 23. Listar los vendedores a los que se ha asignado oficina. 24. Hallar todos los vendedores que estn pro debajo de la cuota, pero cuyas ventas no son inferiores a 150000.