Manual sql

3,340 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,340
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
120
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Manual sql

  1. 1. Taller de Base de datosSQL: Lenguaje de manipulación de datos (DML)OBJETIVOS • Conocer las sentencias disponibles en SQL para manipulación de datos, es decir, insertar, modificar o eliminar filas de una tabla.1. Inserción de filas en una tablaConsiste en añadir una o varias filas a una tabla. La sentencia es la siguiente:INSERT INTO <nombre tabla> [(<lista-de columnas>)]{VALUES (<lista-de valores>) <sentencia SELECT> }Se puede emplear para dos objetivos distintos:a) Insertar una fila en una tablaINSERT INTO <nombre tabla> [(<lista-de columnas>)]VALUES (<lista-de valores>)b) Insertar en una tabla el resultado de una consulta (inserción multifila)INSERT INTO <nombre tabla> [(<lista-de columnas>)]<sentencia SELECT>Los valores de tipo DATE o CHAR se deben encerrar entre comillas simples.Si no se indica la lista de columnas, se consideran todas las de la tabla.En la opción b) la tabla donde se inserta se puede utilizar en la consulta SELECT.En la opción b) la consulta no puede obtener una cláusula ORDER BY.Los valores insertados deben ser de un tipo compatible con el de las columnas de latabla.2. Eliminación de filas de una tablaPermite eliminar filas de una tabla. La sentencia es:DELETE FROM <nombre tabla> [WHERE <condición>]Si no se pone condición, se borran todas las filas de la tabla.3. Modificación de los datos de una tablaSe emplea para modificar los datos de las filas existentes en una tabla:UPDATE <nombre tabla> SET{ <columna> = <expresión> [, ...]| {(<lista-de columnas>) | *} = (<lista-de expresiones>) }[WHERE <condición>]Una expresión puede estar formada por una subconsulta SELECT entre paréntesis cuyoresultado es una única fila de una sola columna (un único valor simple).
  2. 2. La lista de columnas está formada por aquellas columnas a las cuales se les modificarásu valor. Si se omite la cláusula WHERE entonces se actualizan todas las filas de latabla.SQL II (Lenguaje de Manipulación de Datos) • Introducción de información (INSERT) • Consulta de información (SELECT) o Consulta condicional (WHERE) o Ordenación de la salida (ORDER BY) o Evitar repetición en la salida (DISTINCT) o Funciones de agregación (AVG, MAX, MIN, SUM, COUNT) o Cuantificadores (SOME, ANY, ALL) o Patrones en cadenas (LIKE) o Renombramiento (AS) o Combinación de consultas o Operaciones sobre conjuntos (UNION, INTERSECT, EXCEPT) o Consultas agrupadas (GROUP BY) • Modificación de información (UPDATE) • Borrado de información (DELETE)Introducción o inserción de tuplasINSERT INTO provincia VALUES (41,SEVILLA);INSERT INTO provincia VALUES (21,HUELVA);INSERT INTO provincia VALUES (28,MADRID);INSERT INTO provincia VALUES (8,BARCELONA);INSERT INTO provincia VALUES (23,JAEN);INSERT INTO alumno VALUES (4,ANTONIO,PEREZ LOPEZ,22,41,6.5);INSERT INTO alumno VALUES (3,PABLO,SUAREZ GUERRA,25,21,7.8);INSERT INTO alumno VALUES (82,RAFAELA,PEREZ LOPEZ,19,8,4.3);INSERT INTO alumno VALUES (9,MARIO,BEATO SOLIS,22,28,5.1);INSERT INTO alumno VALUES (2,ANGELA,RODRIGUEZ JODAR,27,41,6.9);INSERT INTO alumno VALUES (1,JULIAN,BARCO SANDOVAL,26,41,6.5);INSERT INTO alumno VALUES (8,FRANCISCA,RAMIREZ MARTIN,25,41,3.5);INSERT INTO alumno VALUES (12,BENITO,GOTERA OTILIO,28,21,9.3);Para que la inserción de una tupla sea válida deben satisfacerse las restricciones declave, integridad y de otro tipo que pudieran existir. Obsérvese que en el ejemplo losvalores del atributo añadido a los de la definición original de la tabla ocupan el últimolugar en la lista de valores y que los valores de los atributos se especifican en el mismoorden en que fueron declarados los atributos. Si no se recuerda el orden de los atributosentonces se puede especificar en cualquier orden el nombre de cada atributo dentro de lasentencia INSERT de la siguiente manera:INSERT INTO alumno (num,codprov,apellidos,nombre,nota,edad)VALUES (12,21,GOTERA OTILIO,BENITO,9.3,28);
  3. 3. No es necesario insertar tuplas individualmente de una en una sino que también puedeninsertarse varias tuplas resultantes de una consulta.Consulta1. Listar todo el contenido de una tablaSELECT * FROM provincia; CODPROV NOMPROV---------- -------------------- 41 SEVILLA 21 HUELVA 28 MADRID 8 BARCELONA 23 JAENSELECT * FROM alumno; NUM NOMBRE APELLIDOS EDAD CODPROV NOTA------ ---------- -------------------- ------ -------- ------ 4 ANTONIO PEREZ LOPEZ 22 41 6.5 3 PABLO SUAREZ GUERRA 25 21 7.8 82 RAFAELA PEREZ LOPEZ 19 8 4.3 9 MARIO BEATO SOLIS 22 28 5.1 2 ANGELA RODRIGUEZ JODAR 27 41 6.9 1 JULIAN BARCO SANDOVAL 26 41 6.5 8 FRANCISCA RAMIREZ MARTIN 25 41 3.5 12 BENITO GOTERA OTILIO 28 21 9.3Observar que las tuplas se listan en la salida en el orden en que se hubieran introducido.2. Selección de atributos concretos:SELECT apellidos, nombre, edad FROM alumno;APELLIDOS NOMBRE EDAD-------------------- ---------- ----------PEREZ LOPEZ ANTONIO 22SUAREZ GUERRA PABLO 25PEREZ LOPEZ RAFAELA 19BEATO SOLIS MARIO 22RODRIGUEZ JODAR ANGELA 27BARCO SANDOVAL JULIAN 26RAMIREZ MARTIN FRANCISCA 25GOTERA OTILIO BENITO 283. Ordenación de la salidaSELECT * FROM provincia ORDER BY nomprov; CODPROV NOMPROV---------- -------------------- 8 BARCELONA 21 HUELVA 23 JAEN 28 MADRID 41 SEVILLASELECT apellidos, nombre, edad FROM alumno ORDER BY edad;
  4. 4. APELLIDOS NOMBRE EDAD-------------------- ---------- ----------PEREZ LOPEZ RAFAELA 19PEREZ LOPEZ ANTONIO 22BEATO SOLIS MARIO 22SUAREZ GUERRA PABLO 25RAMIREZ MARTIN FRANCISCA 25BARCO SANDOVAL JULIAN 26RODRIGUEZ JODAR ANGELA 27GOTERA OTILIO BENITO 28Puede ordenarse tanto por valores alfabeticos como numéricos. Puede ordenarse demenor a mayor (orden ascendente, o ASC) o de mayor a menor (orden descendente, oDESC). Por defecto el orden considerado es de menor a mayor. La ordenación tieneasociado un cierto coste computacional por lo que solo debe realizarse cuando seanecesario.4. Ordenación múltipleSELECT apellidos, nombre FROM alumno ORDER BY edad DESC, apellidos ASC, nombre ASC;APELLIDOS NOMBRE-------------------- ----------GOTERA OTILIO BENITORODRIGUEZ JODAR ANGELABARCO SANDOVAL JULIANRAMIREZ MARTIN FRANCISCASUAREZ GUERRA PABLOBEATO SOLIS MARIOPEREZ LOPEZ ANTONIOPEREZ LOPEZ RAFAELA5. Condición simpleSELECT apellidos FROM alumno WHERE edad = 23;SELECT apellidos FROM alumno WHERE edad != 23;SELECT * FROM alumno WHERE edad BETWEEN 19 AND 25;SELECT num FROM alumno WHERE nota IS NOT null;SELECT num FROM alumno WHERE codprov IN (21, 41);6. Condición compuestaSELECT nota FROM alumno WHERE edad > 20 AND codprov = 41;SELECT num FROM alumno WHERE edad < 20 OR edad > 30;SELECT edad FROM alumno WHERE edad < 20 OR codprov NOT IN (41,21);7. Combinación de condición y ordenaciónSELECT nota FROM alumno WHERE nota>=5 AND edad>20 ORDER BY nota;(Nombre y apellidos de los alumnos aprobados (nota>=5) y con edad mayor de 20años, ordenados según la nota).
  5. 5. NOTA----------5.16.56.56.97.89.3Obsérvese que en la salida puede aparecer un mismo valor repetidas veces.SELECT nombre, ape FROM alumno WHERE edad>20 ORDER BY edad, nota DESC;(Nombre y apellidos de los alumnos con edades mayores de 20 años, ordenados poredad y nota).8. Evitar repetición en la salidaSELECT DISTINCT apellidos FROM alumno WHERE edad=23;SELECT UNIQUE edad FROM alumno;La salida de una consulta de este tipo suele (dependiendo de la implementación concretaen cada caso) estar ordenada por defecto.9. Función media aritméticaLas funciones de agregación toman como entrada una colección de valores o tuplas desalida producidas por una consulta y producen un único valor como salida.SELECT AVG(edad) FROM alumno;SELECT AVG(nota) FROM alumno WHERE nota>=5;10. Función de cuentaSELECT COUNT(*) FROM alumno WHERE nota>=5;11. Cardinalidad de una tabla (número de filas o tuplas)SELECT COUNT(*) FROM alumno;12. Función de sumaSELECT SUM(edad) FROM alumno;13. Función de máximoSELECT MAX(nota) FROM alumno;SELECT MAX(nombre) FROM alumno;14. Función de mínimoSELECT MIN(nota), MIN(edad) FROM alumno;SELECT MIN(nota) FROM alumno WHERE nota>7;
  6. 6. 15. Nombres de alumnos que empiezan por ASELECT nombre FROM alumno WHERE nombre LIKE A%;Esta comparación es sensible a minúsculas y mayúsculas. El carácter % equivale alcomodín asterisco * del DOS: se ignora un número variable de caracteres. El carácter_ equivale al comodín ? del DOS: se ignora un carácter. Para testear la nopresencia de patrones en cadenas se puede utilizar NOT LIKE.16. Nombres de provincias cuya segunda y tercera letras son EVSELECT nomprov FROM provincia WHERE nomprov LIKE _EV%;Existen muchas más funciones definidas sobre cadenas de caracteres: concatenación decadenas, extracción de subcadenas, cálculo de la longitud de una cadena, etc.17. Copia de tablasCREATE TABLE alumno2 AS SELECT * FROM alumno;La tabla final posee la misma estructura lógica, restricciones y contenido.18. Enlace de tablasEl enlace de la información contenida en dos tablas se realiza a través del mecanismo declave ajena. Ejemplo: numero de alumno y nombre de su provincia:SELECT num, nomprov FROM alumno, provincia WHERE alumno.codprov = provincia.codprov;La clausula FROM define por sí misma un producto cartesiano de las tablas que seespecifican detrás de ella. La posterios clásula WHERE se aplica a las filas del productocartesiano resultado. Como ejemplo véase el resultado del producto cartesiano de laprimera fila de la tabla de alumnos por todas las filas de la tabla de provincias:NUM NOMBRE APELLIDOS EDAD ALUMNO.CODPROV NOTA PROVINCIA.CODPROV NOM PEREZ 4 ANTONIO 22 41 6.5 41 SEVI LOPEZ PEREZ 4 ANTONIO 22 41 6.5 21 HUEL LOPEZ PEREZ 4 ANTONIO 22 41 6.5 28 MAD LOPEZ PEREZ 4 ANTONIO 22 41 6.5 8 BARC LOPEZ PEREZ 4 ANTONIO 22 41 6.5 23 JAEN LOPEZ19. Renombramiento
  7. 7. Puede cambiarse el nombre de una columna en la salida de una consulta de la siguientemanera:SELECT nombre_columna_1 AS nombre_salida_1, nombre_columna_2 AS nombre_salida_2, ... FROM ...;SELECT AVG(nota) AS nota_media FROM alumno;Combinación de consultas1. Número de alumnos que han obtenido la máxima notaSELECT COUNT(*) FROM alumno WHERE nota=(SELECT MAX(nota) FROM alumno);2. Número de edades distintas para las que existe al menos 1 alumno con dichaedadSELECT COUNT(*) FROM (SELECT UNIQUE(edad) FROM alumno);3. Nombres de provincias para las cuales existen alumnosSELECT nomprov FROM provincia WHERE codprov IN (SELECT codprov FROM alumno);SELECT nomprov FROM provincia WHERE EXISTS (SELECT * FROM alumno WHERE alumno.codprov = provincia.codprov);Estas dos sentencias producen el mismo resultado aunque dependiendo de laimplementación quizás no en el mismo orden.4. Alumnos cuya nota sea menor que todas las notas obtenidas por los alumnos de20 añosSELECT apellidos, nombre FROM alumno WHERE nota < ALL (SELECT nota FROM alumno WHERE edad=20);Hay que tener cuidado con el corportamiento de este tipo de sentencias pues no estáclaro qué salida debería obtenerse si, en el ejemplo anterior, no existiera ningún alumnocon 20 años de edad.El predicado ALL es del tipo conocido como cuantificador y tiene el significado de"todos". Otros predicados cuantificadores son SOME y ANY, ambos con el significado de"al menos 1". Estos predicados cuantificadores pueden utilizarse con los comparadores<, <=, >, >=, etc.5. Nombre de los alumnos cuya nota sea igual a alguna de las obtenidas por algúnalumno de más de 20 añosSELECT nombre FROM alumno WHERE nota = ANY (SELECT nota FROM alumno WHERE edad>20);
  8. 8. SELECT nombre FROM alumno WHERE nota IN (SELECT nota FROM alumno WHERE edad>20);6. Nombres de provincias para las que existen alumnos con más de 25 años de edadSELECT nomprov FROM provincia WHERE codprov IN (SELECT codprov FROM alumno WHERE edad>25);SELECT nomprov FROM provincia WHERE EXISTS (SELECT * FROM alumno WHERE alumno.codprov=provincia.codprov ANDedad>25);Nuevamente puede darse el caso de que la salida producida, aún contenido las mismastuplas, estén dispuestas en diferente orden. Es importante observar cómo se realiza elenlace de información entre las dos tablas a través de su atributo común clave ajena.7. Operaciones sobre conjuntos Operación Descripción UNION Unión de conjuntos (usualmente resultados de salida). INTERSECT Intersección de conjuntos. EXCEPT MINUS Diferencia de conjuntos.Los conjuntos que participen en este tipo de operaciones han de ser compatibles, esto es,deben tener el mismo conjunto de atributos o resultados de salida. Estas tres operacioneseliminan automáticamente los duplicados (se supone que un elemento solo puede estaruna vez en un conjunto). Si se quiere conservar los duplicados debe usarse el operadorALL. Ejemplos:SELECT codprov FROM provincia UNION SELECT codprov FROM alumno;SELECT codprov FROM provincia UNION ALL SELECT CODPROV FROM alumno;SELECT codprov FROM provincia MINUS SELECT codprov FROM alumno;Modificación de información (valores de atributos)UPDATE alumno SET nota=NULL;UPDATE alumno SET nombre=BENITA WHERE nombre=BENITO;UPDATE alumno SET nota=1+nota WHERE nota <=9;UPDATE alumno SET nota=5.0 WHERE nota BETWEEN 4.5 AND 5.0;Borrado de tuplasDELETE alumno;DELETE alumno WHERE nota < 5.0;
  9. 9. Una sentencia DELETE solo puede operar sobre una tabla. Si se borran todas las tuplas deuna tabla como resultado de un borrado, ya sea absoluto o condicional, la tabla siguedefinida y existiendo aunque sin contenido.Consultas agrupadas1. Nota media de los alumnos de cada provinciaSELECT codprov, AVG(nota) FROM alumno GROUP BY codprov; CODPROV AVG(NOTA)---------- ---------- 8 4.3 21 8.55 28 5.1 41 5.85La salida de una consulta se ordena en general por el campo por el que se agrupa, pordefecto. Observar que en el ejemplo no aparecen las provincias para las cuales no hayalumnos.2. Nota media de las provincias cuya nota media sea mayor de 5SELECT codprov, AVG(nota) FROM alumno GROUP BY codprov HAVING (AVG(nota) > 5);3. Nota media de las provincias para las que haya más de 1 alumnoSELECT codprov, AVG(nota) FROM alumno GROUP BY codprov HAVING (COUNT(*) > 1);4. Nota media, agrupada por edades, de los alumnos de SevillaSELECT edad, AVG(nota) FROM alumno WHERE codprov IN (SELECT codprov FROM provincia WHERE nomprov=SEVILLA) GROUP BY edad;Existen importantes diferencias entre las clausulas WHERE y HAVING a pesar de queambas permiten especificar condiciones sobre la consulta. La clausula WHERE especificauna condición que es aplicable a una sola tupla mientras que HAVING indica unacondición que no se aplica a una única tupla sino a cada grupo de tuplas construido porla clausula GROUP BY. El predicado lógico de HAVING se aplica después de la formaciónde grupos mientras que el de WHERE se aplica antes.Si en una misma consulta aparece una clausula WHERE y otra HAVING se aplica primero elpredicado de la clausula WHERE. Las tuplas que satisfagan dicho predicado lógico secolocan en grupos según venga indicado por la clausula GROUP BY. Entonces los gruposque no satisfagan el predicado lógico de HAVING se eliminan. Por último la clausulaSELECT utiliza los grupos resultantes para generar los resultados de salida.5. Número de alumnos por cada nota
  10. 10. SELECT nota, COUNT(*) FROM alumno GROUP BY nota;6. Notas medias por provincia con ordenación según la notaSELECT codprov, AVG(nota) FROM alumno GROUP BY codprov ORDER BY 2;Donde el 2 referencia al segundo elemento de la lista de selección (en este caso, lamedia de las notas).7. Edad máxima de los alumnos de cada provinciaSELECT codprov, MAX(edad) FROM alumno GROUP BY codprov;DML.- El Lenguaje de Manipulación de Datos (Data Manipulation Languaje) es o consiste en la forma de recuperar datosalmacenados en una BD. el DML tiene dos perspectivas: 1.- Proposiciones integradas.- Son una serie de instrucciones contenidas en un programa. 2.- Consulta (Query).- Son consultas rápidas a una BD. Para ambas se requiere un lenguaje de programación. Entonces, el DBMS se convierte en un intermediario entre elusuario y la BD almacenada, entonces, a través de un programa o una consulta podemos extraer información. Siendo formales, el DBMS es un elemento de software que espeficica la forma en que los datos pueden estructurarse.Controla todos los accesos a dichos datos y proporciona algunos otros servicios aplicados a las BD, como seguridad, sistemade respaldos, etc.2.4.3. Lenguaje de manipulación de datos (DML – Data Manipulation Language)Un D.M.L. es un sublenguaje de consulta y manipulación de datos.Se entenderá por manipulación de datos la : • Recuperación de Información. • Inserción de nueva Información. • Eliminación (Borrado) de información existente. • Modificación de Información Almacenada.2.4.4. Otras características de SQL.Además de los dos tipos de sublenguajes mencionados anteriormente, SQLpuede ser utilizado para otras características propias que no poseen loslenguajes formales de consultas, estas son: • Definición de vistas. El DDL de SQL incluye instrucciones para la definición de vistas. • Autorización. El DDL de SQL incluye instrucciones para la especificación de los derechos de acceso a los objetos de la base de datos. • Integridad. El DDL de SQL también incluye un conjunto de sentencias para la especificación de restricciones de integridad.
  11. 11. • Control de transacciones. SQL incluye ordenes para la especificación de los estados de una transacción, algunas implementaciones permiten además el bloqueo explicito de objetos de datos con el fin de manejar control de concurrencia.Para los efectos de este trabajo se anexa en el apéndice A una brevedescripción de los sublenguajes de Definición y manipulación de datos.1. IntroducciónSQL (Standar Query Lenguaje) es un lenguaje estandarizado de base de datos, el cual nospermite realizar tablas y obtener datos de ella de manera muy sencilla. Para exponer masclaramente los conceptos se realizaran ejemplo sobre relaciones que se crearan aquí paraentender mejor como funciona SQL.Cuando aquí nos refiramos a relación estamos hablando mas concretamente a la tabla dedatos 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 28978845SQL es un lenguaje que consta de varias partes
  12. 12. • Lenguaje de definición de datos ( DDL): Proporciona ordenes para definir esquemas de relación, eliminar relaciones, crear índices y modificar esquemas de relación.• Lenguaje de manipulación de datos interactivos (DML): incluye un leguaje de consultas que permite rescatar datos de las relaciones. También incluye ordenes para insertar, suprimir y modificar tuplas.• Lenguaje de manipulación de datos inmerso (DML): La forma inmersa de SQL esta diseñada para usar dentro de los lenguajes de programación de lenguaje general.• Definición de vistas (DDL): incluye ordenes para definir vistas. 2. Estructura básica La estructura básica de una expresión para consulta SQL consta de tres cláusulas:• SELECT• FROM• WHERE 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.
  13. 13. 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. 3. Predicados y conectores Los conectores lógicos en SQL son:• AND• OR• NOT 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:• + ( Suma )• - ( Resta )• * ( Multiplicación )• / ( División ) 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
  14. 14. 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:• El carácter ( % ) es igual a cualquier subcadena• El operador ( _ ) es igual a cualquier carácter 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. 4. Tuplas duplicadas 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.
  15. 15. En aquellos casos en los que queremos forzar la eliminación de duplicados insertamos lapalabra clave DISTINCT después de la cláusula SELECTEjemplo 4.1: Listar todos los apellidos no repetidos de la relación personaSELECT DISTINCT apellidoFROM 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 marquesiaparecí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 sobrerelaciones y corresponden a las operaciones del álgebra unión, intersección y resta deconjuntos respectivamente. Para realizar esta operación de conjuntos debemos tener sumocuidado que las relaciones tengan las mismas estructuras.Incorporemos ahora una nueva relación, llamada jugadores que representa las personas quejuegan al fútbol, sus atributos serán DNI, puesto y nro_camiseta. Supongamos que esta nuevatabla esta conformada de la siguiente maneraJUGADORES DNI PUESTO NRO_CAMISETA1 26125988 DELANTERO 92 25485699 MEDIO 5
  16. 16. 3 28978845 ARQUERO 14 29789854 DEFENSOR 3Ejemplo 4.2 : Obtener todos los nombres de la relación persona cuyos apellidos sean Marquesio SerratSELECT nombreFROM PERSONAWHERE apellido = "MARQUESI"UNIONSELECT nombreFROM PERSONAWHERE apellido = "SERRAT" ANSWER PRIMER NOMBRE 1 MARTIN 2 PABLO 3 JUANEjemplo 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 conjuntoEl conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de
  17. 17. valores producidos en lo general por una cláusula SELECT. Análogamente el conector NOT INprueba la no pertenencia al conjuntoEjemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, seencuentran en la relación personaSELECT nombre, apellidoFROM personaWHERE dni IN(SELECT dniFROM jugadores) ANSWER NOMBRE APELLIDO s MARTIN MARQUESI 1 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 conjuntosEn conjuntos la frase << mayor que algún >> se representa en SQL por ( >SOME ), tambiénpodría entenderse esto como << mayor que el menor de >>, su sintaxis es igual que la delconector 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 >>. Aligual que el operador SOME, puede escribirse ( >ALL ),( =ALL ) ( >=ALL ), ( <=ALL ) y( <>ALL ).En ocasiones podríamos querer comparar conjuntos para determinar si un conjunto contienelos miembros de algún otroconjunto. Tales comparaciones se hacen usando las construcciones CONTAINS y NOTCONTAINS5. Pruebas para relaciones vacíasLa construcción EXISTS devuelve el valor TRUE si la subconsulta del argumento no esta vacía,y la construcción NOT EXISTS devuelve TRUE si la consulta es vacía.Ejemplo 5.1 : encontrar todos los nombre y apellidos de la relación persona si es que en larelación jugadores existe un jugador con el numero de dni 27128055SELECT nombre, apellidoFROM personaWHERE EXISTS(SELECT dniFROM jugadoresWHERE dni = 27128055 ) ANSWER NOMBRE APELLIDO
  18. 18. Como el dni = 27128055 no existe en la relación jugadores, la condición es FALSE y por lo tanto la respuesta es vacía 6. Ordenación de la presentación de tuplas SQL ofrece al usuario cierto control sobre el orden en el que se va a presentar las tuplas en una relación. La cláusula ORDER BY hace que las tupla en el resultado dé una consulta en un orden especifico. Por omisión SQL lista los elementos en orden ascendente. Para especificar el tipo de ordenación, podemos especificar DESC para orden descendente o ASC para orden ascendente. También es posible ordenar los resultados por mas de una atributo Ejemplo 6.1 : encontrar todos los nombres y apellido de la relación persona y ordenar los resultados por apellido y nombre en forma descendente SELECT apellido, nombre FROM persona ORDER BY apellido DESC, nombre DESC ANSWER APELLIDO NOMBRE 1 SERRAT JUAN 2 SANCHEZ ROBERTO 3 MUSACHEGUI BETANIA 4 MICHELLI SOLEDAD 5 MARQUESI PABLO 6 MARQUESI MARTIN 7 GUISSINI ESTEFANIA 8 BRITTE SANDRA 9 ARDUL MELISA 10 ALEGRATO RUBEN Funciones de agregación SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la cláusula GROUP BY, también incluye funciones para calcular• Promedios AVG• Mínimo MIN
  19. 19. • Máximo MAX• Total SUM• Contar COUNT Para los próximos ejemplos incorporamos una nueva relación llamada PRO que representara los jugadores profesionales de fútbol, sus atributos serán dni, años_pro, club, valor_actual. Y los valores son los siguientes: PRO DNI AÑOS_PRO CLUB VALOR_ACTUAL 1 26125988 5 ALL BOYS 1000 2 25485699 2 ALL BOYS 2500 3 27126045 3 LANUS 12000 4 26958644 4 LANUS 6500 5 29120791 1 LANUS 450 Ejemplo 6.2: determinar el valor total en jugadores así como también la cantidad de jugadores de cada club en la relación pro SELECT club, SUM(valor_actual) AS VALOR_TOTAL, COUNT(club) AS NRO_JUGADORES FROM pro GROUP BY CLUB ANSWER CLUB VALOR_TOTAL NRO_JUGADORES 1 ALL BOYS 3.500,00 2 2 LANUS 18.950,00 3 Ejemplo 6.3: Determinar por cada club cual es el valor_actual del jugador mas caro de la relación pro SELECT club, MAX(valor_actual) AS JUG_MAS_CARO FROM pro GROUP BY CLUB ANSWER CLUB JUG_MAS_CARO
  20. 20. 1 ALL BOYS 2500 2 LANUS 12000Hay ocasiones en la que los duplicados deben eliminarse antes de calcular una agregación.Cuando queremos eliminar los duplicados del calculo usamos la palabra clave DISTINCTantepuesto al atributo de agregación que queremos calcular, como por ejemploCOUNT(DISTINCT club).Hay ocasiones en las que es útil declara condiciones que se aplican a los grupos mas que a lastuplas. Para esto usamos la cláusula HAVING de SQL.Ejemplo 6.4: Determinar por cada club cual es el valor_actual del jugador mas caro, pero con lacondición de que este sea mayor a 10000 de la relación proSELECT club, MAX(valor_actual) AS JUG_MAS_CAROFROM proGROUP BY CLUBHAVING MAX(valor_actual) > 10000 ANSWER CLUB JUG_MAS_CARO 1 LANUS 12000 Si en la misma consulta aparece una cláusula WHERE y una cláusula HAVING, primero se aplica el predicado de la cláusula WHERE, las tupla que satisfacen el predicado WHERE son colocadas en grupos por la cláusula GROUP BY. Después se aplica la cláusula HAVING a cada grupo.7. Modificación de la base de datosEliminaciónUna solicitud de eliminación se expresa casi de igual forma que una consulta. Podemossuprimir solamente tuplas completas, no podemos suprimir valores solo de atributos.DELETE FROM rWHERE PDonde P presenta un predicado y r representa una relación. Las tuplas t en r para las cualesP(t) es verdadero, son eliminadasde r.Si omitimos la cláusula WHERE se eliminan todas las tuplas de la relación r ( un buen sistemadebería buscar confirmación del usuario antes de ejecutar una acción tan devastadora )Ejemplo 7.1 : Eliminar todas las tuplas de la relación persona en donde apellido sea igual a"BRITTE"DELETE FROM personaWHERE apellido = "BRITTE" deleted NOMBRE APELLIDO DNI 1 SANDRA BRITTE 25483669
  21. 21. InserciónPara insertar datos en una relación, especificamos una tupla que se va a insertar o escribimos una consulta cuyo resultado es un conjunto de tuplas que se van a insertar. La inserción de tuplas la realizamos mediante las sentencias INSERT INTO r1 VALUES (v1,v2,...,v) Ejemplo 7.2 : Insertar una tupla con los mismos valores de la tupla eliminada en el ejemplo anterior en la relación persona. INSERT INTO persona VALUES ("SANDRA","BRITTE",25483669) inserted NOMBRE APELLIDO DNI 1 SANDRA BRITTE 25483669 En este ejemplo, los valores se especifican en el orden en que se listan los atributos correspondientes en el esquema de relación. Para poder ingresar los datos en un orden diferente podríamos haber escrito INSERT INTO persona(DNI, NOMBRE, APELLIDO) VALUES (25483669,"SANDRA","BRITTE")ActualizacionesEn ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos losvalores en dicha tupla. Para este propósito usamos la sentenciaUPDATE r1SET A1 = V1, A2 = V2,...,An = VnWHERE PDonde r1 es la relación Ai el atributo a modificar Vi el valor que se le asignara a Ai y P es elpredicado.Ejemplo 7.3 : En la relación jugadores actualizar la posición de los jugadores que posean lacamiseta numero 5 y asignarles la camiseta numero 7.UPDATE jugadoresSET nro_camiseta = 7WHERE nro_camiseta = 5updated DNI PUESTO NRO_CAMISETA1 25485699 MEDIO 58. Valores nulosEs posible que para las tuplas insertadas se den valores únicamente a algunos atributos delesquema. El resto de los atributos son asignados a valores nulos representados por NULL.Para esto colocamos la palabra reservada NULL como valor del atributo.Ejemplo 7.4 : Insertar en la relación jugadores un jugador con dni = 26356312, puesto =defensor, y al cual aun no le han asignado un nro_camiseta.INSERT INTO jugadoresVALUES(26356312,"DEFENSOR", NULL)inserted DNI PUESTO NRO_CAMISETA
  22. 22. 1 26356312 DEFENSOR9. Definición de datosCreaciónUna relación en SQL se define usando la ordenCREATE TABLE r(A1 D1, A2 D3,...,An Dn)Donde r es el nombre de la relación, cada Ai es el nombre de un atributo del esquema de larelación r y Di es el tipo de dato de Ai. Una relación recién creada esta vacía. La orden INSERTpuede usarse para cargar la relaciónEjemplo 9.1 : crear la relación lesionado con los atributos nombre, apellido ambos de tipo chary tiempo_inhabilit de tipo enteroCREATE TABLE "lesionado.db" (NOMBRE CHAR(20),APELLIDO CHAR(20),TIEMPO_INHABILT INTEGER) lesionado NOMBRE APELLIDO TIEMPO_INHABILTEliminaciónPara eliminar una relación usamos la orden DROP TABLE r, esta orden elimina toda lainformación sobre la relación sacada de la base de datos, esta orden es mas fuerte que DELETFROM r ya que esta ultima elimina todas las tuplas pero no destruye la relación, mientras quela primera si.Ejemplo 9.2 : eliminar la relación personaDROP TABLE personaActualizacionLa orden ALTER TABLE se usa para añadir atributos a una relación existente. A todas lastuplas en la relación se les asigna NULL como valor de atributo. La sintaxis de ALTER TABLEes la siguiente:ALTER TABLE r1 ADD A1 D1Ejemplo 9.3 : agregar los atributos de tipo char nombre y apellido a la relación jugadoresALTER TABLE jugadores ADD NOMBRE CHAR(20)ALTER TABLE jugadores ADD APELLIDO CHAR(20)Lenguajes de cuarta generaciónNo existe consenso sobre lo que es un lenguaje de cuarta generación (4GL). Lo que enun lenguaje de tercera generación (3GL) como COBOL requiere cientos de líneas decódigo, tan solo necesita diez o veinte líneas en un 4GL. Comparado con un 3GL, quees procedural, un 4GL es un lenguaje no procedural: el usuario define qué se debehacer, no cómo debe hacerse. Los 4GL se apoyan en unas herramientas de mucho másalto nivel denominadas herramientas de cuarta generación. El usuario no debe definirlos pasos a seguir en un programa para realizar una determinada tarea, tan sólo debedefinir una serie de parámetros que estas herramientas utilizarán para generar unprograma de aplicación. Se dice que los 4GL pueden mejorar la productividad de los
  23. 23. programadores en un factor de 10, aunque se limita el tipo de problemas que puedenresolver. Los 4GL abarcan: • Lenguajes de presentación, como lenguajes de consultas y generadores de informes. • Lenguajes especializados, como hojas de cálculo y lenguajes de bases de datos. • Generadores de aplicaciones que definen, insertan, actualizan y obtienen datos de la base de datos. • Lenguajes de muy alto nivel que se utilizan para generar el código de la aplicación.Los lenguajes SQL y QBE son ejemplos de 4GL. Hay otros tipos de 4GL: • Un generador de formularios es una herramienta interactiva que permite crear rápidamente formularios de pantalla para introducir o visualizar datos. Los generadores de formularios permiten que el usuario defina el aspecto de la pantalla, qué información se debe visualizar y en qué lugar de la pantalla debe visualizarse. Algunos generadores de formularios permiten la creación de atributos derivados utilizando operadores aritméticos y también permiten especificar controles para la validación de los datos de entrada. • Un generador de informes es una herramienta para crear informes a partir de los datos almacenados en la base de datos. Se parece a un lenguaje de consultas en que permite al usuario hacer preguntas sobre la base de datos y obtener información de ella para un informe. Sin embargo, en el generador de informes se tiene un mayor control sobre el aspecto de la salida. Se puede dejar que el generador determine automáticamente el aspecto de la salida o se puede diseñar ésta para que tenga el aspecto que desee el usuario final. • Un generador de gráficos es una herramienta para obtener datos de la base de datos y visualizarlos en un gráfico mostrando tendencias y relaciones entre datos. Normalmente se pueden diseñar distintos tipos de gráficos: barras, líneas, etc. • Un generador de aplicaciones es una herramienta para crear programas que hagan de interface entre el usuario y la base de datos. El uso de un generador de aplicaciones puede reducir el tiempo que se necesita para diseñar un programa de aplicación. Los generadores de aplicaciones constan de procedimientos que realizan las funciones fundamentales que se utilizan en la mayoría de los programas. Estos procedimientos están escritos en un lenguaje de programación de alto nivel y forman una librería de funciones entre las que escoger. El usuario especifica qué debe hacer el programa y el generador de aplicaciones es quien determina cómo realizar la tarea.Lenguaje de manejo de datosUna vez creados los esquemas de la base de datos, los usuarios necesitan un lenguajeque les permita manipular los datos de la base de datos: realizar consultas, inserciones,eliminaciones y modificaciones. Este lenguaje es el que se denomina lenguaje demanejo de datos (LMD).Hay dos tipos de LMD: los procedurales y los no procedurales. Con un LMDprocedural el usuario (normalmente será un programador) especifica qué datos senecesitan y cómo hay que obtenerlos. Esto quiere decir que el usuario debe especificar
  24. 24. todas las operaciones de acceso a datos llamando a los procedimientos necesarios paraobtener la información requerida. Estos lenguajes acceden a un registro, lo procesan ybasándose en los resultados obtenidos, acceden a otro registro, que también debenprocesar. Así se va accediendo a registros y se van procesando hasta que se obtienen losdatos deseados. Las sentencias de un LMD procedural deben estar embebidas en unlenguaje de alto nivel, ya que se necesitan sus estructuras (bucles, condicionales, etc.)para obtener y procesar cada registro individual. A este lenguaje se le denominalenguaje anfitrión. Las bases de datos jerárquicas y de red utilizan LMD procedurales.Un LMD no procedural se puede utilizar de manera independiente para especificaroperaciones complejas sobre la base de datos de forma concisa. En muchos SGBD sepueden introducir interactivamente instrucciones del LMD desde un terminal o bienembeberlas en un lenguaje de programación de alto nivel. Los LMD no proceduralespermiten especificar los datos a obtener en una consulta o los datos que se debenactualizar, mediante una sola y sencilla sentencia. El usuario o programador especificaqué datos quiere obtener sin decir cómo se debe acceder a ellos. El SGBD traduce lassentencias del LMD en uno o varios procedimientos que manipulan los conjuntos deregistros necesarios. Esto libera al usuario de tener que conocer cuál es la estructurafísica de los datos y qué algoritmos se deben utilizar para acceder a ellos. A los LMD noprocedurales también se les denomina declarativos. Las bases de datos relacionalesutilizan LMD no procedurales, como SQL (Structured Query Language) o QBE (Query-By-Example). Los lenguajes no procedurales son más fáciles de aprender y de usar quelos procedurales, y el usuario debe realizar menos trabajo, siendo el SGBD quien hacela mayor parte.La parte de los LMD no procedurales que realiza la obtención de datos es lo que sedenomina un lenguaje de consultas. En general, las órdenes tanto de obtención como deactualización de datos de un LMD no procedural se pueden utilizar interactivamente,por lo que al conjunto completo de sentencias del LMD se le denomina lenguaje deconsultas, aunque es técnicamente incorrecto.Introducción a SQLDefiniciónSQL es un descendiente de SEQUEL (o Structured English QUEry Language), que fueoriginalmente diseñado por IBM. SQL fue creado como un lenguaje para construir sistemasde administración de base de datos relacionales (RDBMS: Relational DataBase ManagementSystem) sobre cualquier plataforma de hardware. El primer RDBMS comercial usando el SQLque apareció en 1981, y SQL es ahora el lenguaje estandar para consultas de red a través deplataformas de software y hardware diferentes. SQL es realmente un sublenguaje diseñadopara estar embebido en un lenguaje de programación de una aplicación. Es tan flexible quepuede ser usado tanto para manipulación de datos como para definición de datos.Los servidores de bases de datos SQL manejan peticiones en unidades lógicas de trabajollamadas transacciones. Una transacción es un grupo de operaciones relacionados que debentodas ser realizadas con éxito antes de que el RDBMS finalice cualquier cambio en la base dedatos. En SQL, todas las transacciones pueden ser terminadas explícitamente con uncomando (instrucción) ya sea aceptar o descartar los cambios. Una vez usted esté satisfechode que no hay errores ocurridos durante la transacción, puede terminar esa transacción conuna instrucción de COMMIT. La base de datos entonces cambia para reflejar las operaciones
  25. 25. que usted ha realizado. Si ocurre un error, usted puede abandonar los cambios con unaintrucción de ROLLBACK.El servidor de base de datosUna red de área local (LAN: local area network) permite que los usuarios de estaciones detrabajo compartan archivos, software, y recursos de impresora guardado en el máquinasdedicadas llamadas servidores. Si su estación de trabajo necesita acceso a datos guardadosen el disco duro del servidor hace una petición de esos datos del servidor. El servidor envíalos datos solicitados a través de la red de vuelta a su estación de trabajo donde sonprocesados localmente. Sin embargo, una gran diferencia del servidor de red con la estaciónde trabajo es que los datos del servidor pueden ser accesados por más de un usuario almismo tiempo.Pruesto que el procesamiento es realizado en el servidor y no en la estación de trabajo queoriginó la petición, la estación de trabajo se vuelve un cliente del servidor de base de datos.En un sistema Cliente/Servidor, múltiples clientes (usuarios) hacen peticiones de serviciosdel servidor de bases de datos a través del uso de aplicaciones clientes creadas con Paradoxpara Windows, Visual dBASE, Delphi, o Borland C++.El modelo relacionalEl modelo relacional de datos está basado en una colección de tablas. El usuario del sistemade base de datos puede consultar estas tablas, insertar nuevas tuplas, eliminar tuplas yactualizar tuplas. Existen varios lenguajes para expresar estas operaciones. El álgebrarelacional es un lenguaje procedimental que es equivalente en capacidad a las dos formasdel cálculo relacional cuando están restringidas a expresiones seguras.Convenciones de nombre (Naming conventions)Esta sección describe las convenciones de nombre para tablas y columnas, mejoras desintaxis, y limitaciones de sintaxis para SQL.El SQL estandar de ANSI (ANSI-standard SQL) confina cada nombre de tabla o columna auna palabra simple formada de caracteres alfanuméricos y el símbolo de underscore (_).El SQL tiene varias partes: + Lenguaje de definición de datos. (DDL) El SQL DDL o de definición de datos proporciona órdenes para definir esquemas de relación, eliminar relaciones, crear índices y modificar esquemas de relación, se pueden crear y alterar tablas. + Lenguaje de manipulación de datos interactivo. El SQL DML o de Manipulación de datos incluye un lenguaje de consultas basado en el álgebra relacional y el cálculo relacional de tuplas. Permite seleccionar, insertar, actualizar o borrar datos. + Lenguaje de manipulación de datos inmerso (DML) La forma inmersa de SQL está diseñada para usar dentro de los lenguajes de programación. + Definición de vista. El SQL DDL incluye órdenes para definir vistas. + Control de transacciones. SQL incluye órdenes para especificar el comienzo y final de las transacciones. Varias implementaciones, incluyendo IBM SAA-SQL, permiten el bloque explícito de los datos para control de concurrencia.
  26. 26. Estructura básicaLa estructura básica de una expresión en SQL consta de tres cláusulas: SELECT, FROM yWHERE.SELECTSELECT es usado para recuperar filas de una o más tablas. lista_columnas indica cualescolumnas quiere recuperar.SELECT [DISTINCT] lista_columnasFROM referencias_tablas[WHERE condicion_búsqueda][GROUP BY group_list][HAVING having_condition][ORDER BY order_list][LIMIT [offset,] rows ][PROCEDURE procedure_name][UNION select_expr]Todas las palabras usadas deben ser dadas en el orden mostrado abajo, por ejemplo unaclausula HAVING debe venir luego de una GROUP BY y antes de una ORDER BY. • A una expresión SELECT se le puede pasar un alias usando AS. El alias es usado como el nombre de la columna y puede ser usado con ORDER BY y HAVING. Por ejemplo: o select concat(last_name,, ,first_name) AS full_name from mytable ORDER BY full_name; • La cláusula FROM referencias_tablas indica las tablas de las cuales recuperar filas. Si hay más de una tabla usted está realizando un "join". • Usted se puede referir al nombre de una columna como + La cláusula SELECT corresponde a la operación de proyección del álgebra relacional. Se usa para listar los valores guardados en la base de datos señalados por la consulta. + La cláusula FROM corresponde a la operación de producto cartesiano de álgebra relacional. Dice de cual tabla de la base de datos se va a tomar registros en la consulta. + La cláusula WHERE corresponde al predicado de selección del álgebra relacional. Permite definir condiciones que limitan aún más la consulta.La instrucción SELECT es usada para recuperar datos de una o más tablas.Para recuperar todos los datos de una tabla (tabla1) usaríamos la siguiente sentencia:SELECT * FROM tabla1
  27. 27. Esta sentencia usa * para denotar que se incluyan todos los campos. Select indica la acción,y FROM de cual tabla se van a tomar los datos.Ahora si yo quisiera que el resultado solo trajera algunos campos (no todos) debería crear lasentencia de la siguiente forma:SELECT nombre, apellido FROM tabla1Así solo los campos nombre y apellido vendrán incluidos en el resultado.Existen otros parámetros que son opcionales y dependen de cada caso: WHERE, queestablece una condición; ORDER BY que permite hacer una ordenacion del resultado; GROUPBY que permite hacer una agrupación de los resultados; HAVING que permite incluir otracondición; y UNION que permite hacer uniones con otros resultados.Un SELECT que recupera datos de múltiples tablas es llamado un "join." La plantilla para elcomando SELECT es la siguiente:Una consulta típica en SQL tiene la forma: SELECT A1, A2, A3,... An FROM r1, r2, .... rm WHERE PDonde A1, A2, A3... son atributos, r1, r2,.. son relaciones, y P es un predicado.Si se omite la cláusula WHERE el predicado P es verdadero. La lista de atributos puedesustituirse por un asterisco para seleccionar todos los atributos de todas las relaciones queaparecen la cláusula FROM.SQL forma el producto cartesiano de las relaciones nombradas en la cláusula FROM, realizauna selección del álgebra relacional usando el predicado de la cláusula WHERE y despuésproyecta el resultado a los atributos de la cláusula SELECT.El resultado de una consulta SQL es, por supuesto, una relación. Consideremos una consultasencilla usando el ejemplo bancario. "Encontrar los nombres de las sucursales en la relacióndepósito".: SELECT nombre_sucursal FROM depósitoSQL soporta especificaciones de path y archivo totales para los nombres de las tablas. Losnombres de las tablas con path o extensiones de nombre de archivo deben ser encerradas encomillas simples o dobles. Por ejemplo, SELECT * FROM PARTS.DBF SELECT * FROM "C:SAMPLEPARTS.DBF"SQL también soporta los alias de BDE para nombres de Tabla. Por ejemplo, SELECT * FROM ":PDOX:TABLE1"Si usted omite la extensión de archivo para un nombre de una tabla local, se asume que latabla es del tipo especificado por la Utilidad de Configuración BDE, ya sea en la configuracióndel Defadirt Driver en la página del sistema o en tipo de drive por defecto para los aliasestandar asociados con la consulta o con la tabla.Finalmente, el SQL permite que los nombres de las tablas dupliquen las palabras clave deSQL siempre que esos nombres de tablas estén encerrados por comillas sencillas o dobles.Por ejemplo, SELECT PASSID FROM "PASSWORD"
  28. 28. Operaciones de conjuntos y tuplas duplicadasLos lenguajes de consulta formales se basan en la noción matemática de relación como unconjunto. Por ello nunca aparecen tuplas duplicadas en las relaciones. En la práctica, laeliminación de duplicados lleva bastante tiempo. Por tanto, SQL ( y casi todos los demáslenguajes de consulta comerciales) permiten duplicados en las relaciones. Así pues laconsulta que veíamos con SELECT Y FROM muestra el nombre de sucursal por cada vez queaparezca en depósito.En aquellos casos en los que queremos forzar la eliminación de duplicados, insertamos lapalabra clave DISTINCT después de SELECT. Un ejemplo de una consulta así sería: SELECT DISTINCT nombre-sucursal FROM depósitoColumnasEl SQL soporta nombres de columnas multi-palabra de Paradox y nombres de columna conlas palabras clave de SQL duplicadas siempre que se encierren en comillas simples o dobles.Por ejemplo, el siguiente nombre de la columna son dos palabras:SELECT E."Emp Id" FROM EMPLOYEE EEn el siguiente ejemplo, el nombre de la columna DATE coincide con una palabra clave delSQL, por ello se especifica el nombre de la relación:SELECT DATELOG."DATE" FROM DATELOGCuando son dos columnas: SELECT PART_NO, PART_NAME FROM PARTSCon los siguientes tópicos obtendrá más información acerca del uso de SELECT: Cláusula FROM La cláusula FROM especifica la tabla o tablas de las cuales se van a recuperar datos. Table_reference puede ser una tabla simple, una lista de tablas delimitada por comas, o puede ser un join interno o externo como se especifica en el estandar SQL- 92. Por ejemplo, la siguiente instrucción especifica una tabla simple: SELECT PART_NO FROM "PARTS.DBF" La siguiente instrucción especifica un join externo para table_reference: SELECT * FROM PARTS LEFT OUTER JOIN INVENTORY ON PARTS.PART_NO = INVENTORY.PART_NOOperaciones de conjuntosSQL incluye las operacines UNION, INTERSECT, y MINUS, que operan sobre relaciones ycorresponden a las operaciones del álgebra de conjuntos.Vamos a demostrar cómo se pueden escribir en SQL las consultas de los siguientesejemplos:
  29. 29. "Encontrar todos los clientes que tienen una cuenta en la sucursal Perryridge: SELECT DISTINCT nombre-cliente FROM depósito WHERE nombre-sucursal = "Perryridge""Encontrar todos los clientes que tiene un préstamos en la sucursal Perryridge": SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge""Encontrar todos los clientes que tiene un préstamo, una cuenta o las dos en la sucursal dePerryridge": (SELECT nombre-cliente FROM depósito WHERE nombre-sucursal = "Perryridge") UNION (SELECT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge")"Encontrar todos los clientes que tienen un préstamo y una cuenta en la sucursalPerryridge": (SELECT DISTINCT nombre-cliente FROM depósito WHERE nombre-sucursal = "Perryridge") INTERSECT (SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge")Por omisión, la operación unión elimina todas las tuplas duplicadas."Encontrar los clientes de la sucursal Perryridge que tienen una cuenta allí pero no unpréstamo" (SELECT DISTINCT nombre-cliente FROM depósito
  30. 30. WHERE nombre-sucursal = "Perryridge") MINUS (SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge")Cláusula WHERE La cláusula WHERE opcional reduce el número de filas devuelto por una consulta a aquellos que cumplen con el criterio especificado en search_condition. Por ejemplo, la siguiente instrucción recupera sólo aquellas filas con PART_NO mayor a 543: SELECT * FROM PARTS WHERE PART_NO > 543 La cláusula WHERE puede incluir el predicado IN, seguido por una lista parentizada de valores. Por ejemplo, la siguiente instrucción recupera sólo aquellas filas donde el número de parte se acopla a un item en la lista del predicado IN: SELECT * FROM PARTS WHERE PART_NO IN (543, 544, 546, 547) Adicionalmente a operaciones de comparación escalares ( =, <, > ... ) también se pueden usar predicados adicionales que usan IN, ANY, ALL, EXISTS.INSERTEn SQL, INSERT es de dos formas:INSERT INTO CUSTOMER (FIRST_NAME, LAST_NAME, PHONE)VALUES(:fname, :lname, :phone_no)La insersión de una tabla a otra a través de una subconsulta no es permitida.Ejemplos:La siguiente instrucción añade una fila a una tabla, asignando valores a dos comlumnas:INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID)VALUES (52, "DGPII");La siguiente instrucción especifica valores para insertar dentro de una tabla con unainstrucción de SELECT:INSERT INTO PROJECTSSELECT * FROM NEW_PROJECTSWHERE NEW_PROJECTS.START_DATE > "6-JUN-1994";
  31. 31. UPDATENo hay restricciones o extensiones de la instrucción UPDATE del ANSI-estandar.DELETENo hay restricciones o extensiones para la instrucción DELETE Ansi-estandar.Predicados y ConectoresPara encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en algunasucursal. En SQL se podría escribir así: SELECT DISTINCT cliente.nombre-cliente, ciudad-cliente FROM préstamo, cliente WHERE préstamo.nombre-cliente = cliente.nombre-clienteObsérvese que SQL usa la notación nombre-relación.nombre-atributo, con el álgebrarelacional, para evitar ambiguedad en los casos en los que un atributo aparece en el esqumade más de una relación. Podíamos haber escrito cliente.ciudad-cliente en ves de ciudad-cliente en el SELECT. Sin embargo, puesto que el atributo ciudad-cliente aparece solamenteen una de las relaciones que se nombran en la cláusula FROM, no hay ambiguedad al escribirciudad-cliente.Ampliemos la consulta anterior y consideremos un caso algo más complicado en el que serequiere tamibén que todos los clientes tengan un préstamo en la sucursal Perryridge:"Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en la sucursalPerryridge" Para eso vamos a usar un AND. SELECT DISTINCT cliente.nombre-cliente, ciudad-cliente FROM préstamo, cliente WHERE préstamo.nombre-cliente=cliente.nombre-cliente AND nombre-sucursal = "Perryridge"SQL usa los conectores lógicos AND, NOT y OR.SQL incluye un operador de comparacion BETWEEN para simplificar la cláusula WHERE. Siqueremos encontrar el número de cuentas con saldos entre 90.000 y 100.000 dólarespodemos usa la comparación siguiente: SELECT número-cuenta FROM depósito WHERE saldo BETWEEN 90000 AND 100000Lo mismo se puede hacer con el operador NOT BETWEEN.SQL también incluye un operador de selección para comparaciones de cadenas decaracteres. Los modelos se describen usando estas dos características especiales:
  32. 32. + porcentaje (%) que es igual a cualquier subcadena.+ subrayado _. El Carácter _ es igual a cualquier caracter.Ejemplos:+ "Perry%" es igual a cualquier subcadena que empiece por Perry.+ "%idge%" es igual a cualquier cadena que contenga "idge" como subcadena.,+ "___" es igual a cualquier cadena de 3 caracteres.Los modelos de comparación en SQL se expresan usando el operadir LIKE. "Encontrar losnombres de todos los clientes cuya calle incluye la subcadena Main": SELECT nombre-cliente FROM cliente WHERE calle LIKE "%Main%"Hay también caracteres de escape para indicar que se va a incluir un caracter especial dentrode la cadena de búsqueda, con la cláusula ESCAPE+ LIKE "ab%cd%" ESCAPE "" es igual a todas las cadenas que empiezan por "ab%cd".Pertenencia a un conjuntoSQL se basa en un conjunto relacional de operaciones que permiten probar la pertenencia delas tuplas a una relación. El conector IN prueba si se es miembro de un conjunto, donde elconjunto es una colección de valores porducidos por una cláusula SELECT. El conecto NOT INprueba la no pertenencia al conjunto. Para ilustrarlo, considérese de nuevo la consulta"Encontrar a todos los clientes que tienen un préstamo y una cuenta en el Perryridge".Vamos a hacer esto realizando una subconsulta. SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal= "Perryridge" AND nombre-cliente IN (SELECT nombre-cliente FROM depósito WHERE nombre-sucursal = "Perryridge")En SQL pueden haber varias consultas que significan lo mismo. Por ejemplo para encontrarlos clientes que tienen una cuenta y un préstamo en al sucursal de Perryridge: SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge" AND
  33. 33. <nombre-sucursal, nombre-cliente> IN (SELECT nombre-sucursal, nombre-cliente FROM depósito)Para el uso de NOT IN tenemos el siguiente ejemplo. Vamos a buscar los clientes que tienenuna cuenta en la sucursal Perryridge pero no tienen un préstamos en la sucursal Perryridge: SELECT DISTINCT nombre-cliente FROM depósito WHERE nombre-sucursal ="Perryridge" AND nombre-cliente NOT IN (SELECT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge")Variables de TuplaSQL toma prestada la notación de variables de tupla dell cálcdiro relacional de tuplas. Unavariable de tupla en SQL debe estar asociada con una relación determinada. Las variables detupla se definen en la cláusula FROM. Para ilustrarlo, volvemos a escribir la consulta:"Encontrar el nombre y la ciudad de todos los clientes que tienen un préstamo en algunasucursal", así: SELECT DISTINCT T.nombre-cliente, ciudad cliente FROM préstamo S, cliente T WHERE S.nombre-cliente = T.nombre-clienteNótese q ue una variable de tupla se define en la cláusula FROM colocándola después delnombre de la relación con la cual está asociada, separada por uno o más espacios.En consultas que contienen subconsultas, se aplica una regla de ámbito a las variables detupla. En una subconsulta, está permitido usar sólo variables de tupla definidas en la mismasubconsulta o en cualquier consulta que contenga la subconsulta. Si una variable de tuplaestá definida tanto localmente en una subconsulta como globalmente en una consulta que lacontiene, se aplica la definición local. Cuando escribimos expresiones de la forma nombre-relación.nombre-atributo, el nombre de la relación es, en efecto, una variable de tupladefinida implícitamente.Las variables de tuplas son muy útiles para comparar dos tuplas de la misma relación. Entales casos el álgebra relacional usa la operación renombrar. Supóngase que queremosencontrar todos los clientes que tienen una cuenta en la misma sucursal en la que Jonestiene una cuenta. Escribimos esta consulta: SELECT DISTINCT T.nombre-cliente FROM depósito S, depósito T WHERE S.nombre-cliente = "Jones" AND
  34. 34. S.nombre-sucursal = T.nombre-sucursalObsérvese que no podríamos usar la notación depósito.nombre-sucursal, puesto que noestaría claro cuál es la referencia a depósito que se quiere hacer. SELECT DISTINCT nombre-cliente FROM depósito WHERE nombre-sucursal IN (SELECT nombre-cliente FROM depósito WHERE nombre-cliente = "Jones")Comparación de conjuntosFue posible utilizar la construcción IN en la consulta anterior porque estuvimos probando laigualdad entre dos nombres de sucursales. Considérese la consulta: "Encontrar los nombresde todas las sucursales que tienen un activo mayor que alguna sucursal situada enBrooklyn". Podemos escribir la expresión: SELECT DISTINCT nombre-cliente FROM sucursal T, sucursal S WHERE T.activo > S.activo AND S.ciudad-sucursal = "Brooklyn"Hay otra forma adicional que ofrece SQL para escribir este tipo de consultas con la frase"mayor que algún" >SOME. SELECT nombre-sucursal FROM sucursal WHERE activo > SOME (SELECT activo FROM sucursal where ciudad-sucursal = "Brooklyn")Las construcciones IN, > SOME, > ALL nos permiten probar un único valor con los miembrosdel conjunto completo. Puesto que SELECT genera un conjunto de tuplas, a veces podemosquerer comparar conjuntos para determinar si un conjunto contiene todos los miembros dealgún otro conjunto. Tales comparaciones se hacen en SQL usando las construccionesCONTAINS y NOT CONTAINS.Considérese la consulta "Encontrar todos los clientes que tiene una cuenta en todas lassucursales situadas en Brooklyn". Para cada cliente, necesitamos ver si el conjunto de todaslas sucursales en las que el cliente tiene una cuenta contiene el conjunto de todas lassucursales de Brooklyn. SELECT DISTINCT S.nombre-cliente FROM depósito S WHERE (SELECT T.nombre-sucursal FROM depósito T
  35. 35. WHERE S.nombre-cliente = T.nombre-cliente) CONTAINS (SELECT nombre-sucursal FROM sucursal WHERE ciudad-sucursal = "Brooklyn")CONTAINS no forma parte del SQL ANSI estándar.Prueba de relaciones vacíasSQL incluye una característica para probar si una subconsulta tiene alguna tupla en suresultado. La construcción EXISTS devuelve el valor de verdadero si la subconsulta delargumento no está vacía. usando la construcción EXISTS, podemos escribir la consulta"Encontrar a todos los clientes que tienen una cuenta y un préstamo en la sucursalPerryridge". SELECT nombre-cliente FROM CLIENTE WHERE EXISTS( SELECT * FROM depósito WHERE depósito.nombre-cliente = cliente.nombre-cliente AND nombre-sucursal = "Perryridge") AND EXISTS (SELECT * FROM préstamo WHERE préstamo.nombre-cliente= cliente.nombre-cliente AND nombre-sucursal= "Perryridge")Como ejemplo final, considérese la consulta "Encontrar a todos los clientes que tienen unacuenta en todas las sucursales situadas en Brooklyn". Para cada cliente, necesitamos ver siel conjunto de todas las sucursales de Brooklyn. Usando la construcción MINUS, podemosescribir la siguiente consulta. SELECT DISTINCT S.nombre-cliente FROM depósito S WHERE NOT EXISTS ((SELECT nombre-sucursal FROM sucursal WHERE ciudad-sucursal = "Brooklyn") MINUS (SELECT T.nombre-sucursal FROM depósito T WHERE S.nombre-cliente=T.nombre-cliente))
  36. 36. Ordenación de la presentación de las tuplasLa cláusula ORDER BY especifica el orden de las filas recuperadas. Por ejemplo, la siguienteconsulta recupera una lista de todas las partes listadas en orden alfabético por nombre departe: SELECT * FROM partes ORDER BY nombre-parte ASCLa siguiente consulta recupera toda la información de partes ordenada en sentidodescendento por número de parte: SELECT * FROM PARTS ORDER BY PART_NO DESCSi queremos listar en orden alfabético todos los clientes que tienen una cuenta en Perryridge SELECT DISTINCT nombre-cliente FROM préstamo WHERE nombre-sucursal = "Perryridge" ORDER BY nombre-clienteSupóngase que queremos listar la relación préstamo completa en orden descendente decantidad. Si varios préstamos tienen la misma cantidad, los ordenamos en orden ascendentepor número de préstamo. SELECT * FROM préstamo ORDER BY cantidad DESC, número-préstamo ASCLos campos calcdirados pueden ser ordenados por nombre de correlación o posición ordinal.Por ejemplo, la siguiente consulta ordena las filas por FdirL_NAME, un campo calcdirado: SELECT apellido || , || primer-nombre AS nombre-completo, teléfono FROM clientes ORDER BY nombre-completo ASCNo se requiere proyección de todos los agrupamientos u ordenamiento de columnas.Funciones de agregaciónSQL ofrece la posibilidad de calcdirar funciones en grupos de tuplas usando la cláusulaGROUP BY. El atributo o atributos dados en la cláusula GROUP BY se usan para formargrupos. Las tuplas con el mismo valor en todos los atributos en la cláusula GROUP BY secoloca en un grupo. SQL incluye también funciones de agregación: SUM(), para totalizar valores numéricos en una columna AVG(), para promediar todos los valores numéricos no Ndiros en una columna
  37. 37. MIN(), para determinar el valor mínimo en una columna MAX(), para determinar el valor máximo en una columna COUNT(), para contar el número de valores en una columan que cumplen con el criterio especificadoLas operaciones como AVG se llaman funciones de agregación porque operan sobre gruposde tuplas. El resultado de una función de agregación es un valor único. Para ilustrarloconsidérese la consulta " Encontrar el saldo promedio de las cuentas en todas lassucursales". SELECT nombre-sucursal, AVG(saldo) FROM depósito GROUP BY nombre-sucursalLa retención de duplicados es importante para calcdirar un promedio.Se usa la cláusula DISTINCT por ejemplo en la siguiente consulta: "Encontrar el número declientes con depósitos para cada sucursal" SELECT nombre-sucursal, COUNT (DISTINCT, nombre-cliente) FROM depósito GROUP BY nombre-sucursalcláusula HAVINGLa cláusula HAVING especifica condiciones que los registros deben cumplir para ser incluidosen el retorno de una consulta. Es una expresión condicional usada junto con la cláusulaGROUP BY. Los Grupos que no cumplan con la expresión en la cláusula HAVING son omitidosdel conjunto resultado.Las subconsultas son soportadas en la cláusula HAVING. Una subconsulta trabaja como unacondición de búsqueda para restringir el número de filas devueltas por la consulta externa, o"padre". Vea la cláusula WHERE adicionalmente a los operadores de comparación escalar ( =,<, > ... ) se pueden usar predicados adicionales usando IN, ANY, ALL, EXISTS.A veces es útil declarar una condición que se aplica a los grupos más que a las tuplas. Porejemplo, podríamos estar interesados únicamente en sucursales en las que el saldo promediode las cuentas es mayor a 1200 dólares. Esta condición no se aplica a una única tupla.Más bien se aplica a cada grupo construido mediante la cláusula GROUP BY. Para expresaruna consulta de este tipo, usamo sl a cláusula HAVING. Los predicados de la cláusulaHAVING se aplican después de la formación de grupos, por lo que pueden utilizarse funcionesdke agregación. SELECT nombre-sucursal, AVG (saldo) FROM depósito GROUP BY nombre-sucursal HAVING AVG(saldo) > 1200
  38. 38. Veamos el siguiente caso "Encontrar aquellas sucursales con el saldo promedio mayor". Lasfunciones de agregados no pueden componerse en SQL. Significa que cualquier intento deutilizar MAX(AVG(... no estará permitida. En cambio, nuestra estrategia es encontraraquellas sucursales para las que el balance promedio es mayor o igual que todos losbalances promedio. SELECT nombre-sucursal FROM depósito GROUP BY nombre-sucursal HAVING AVG(saldo) >= ALL (SELECT AVG(saldo) FROM depósito GROUP BY (nombre-sucursal)))La función de agregación COUNT se usa frecuentemente para contar el número de tuplas enuna relación. La relación para esto en SQL es COUNT (*). Así, para encontrar el número detuplas en la relación cliente, escribimos SELECT COUNT (*) FROM clienteSELECT COUNT (persona) cláusula UNION La cláusula UNION combina los resultados de dos o más instrucciones SELECT para producir una tabla simple. Joins heterogéneos El SQL soporta uniones o joins de tablas en diferentes formatos de bases de datos; tal como un join es llamado un "join heterogéneo". Cuando usted realiza un join heterogéneo, usted puede seleccionar un alias local.. Para seleccionar un alias, escoja SQL|Select Alias. Si usted no ha seleccionado un alias, SQL intentará encontrar la tabla en el directorio actual de la base de datos que está siendo usado. Por ejemplo, el alias :WORK: podría ser el handle de base de datos pasado dentro de la función. Cuando usted especifica una tabla luego de selecciona un alias local: Para tablas locales, especifique el alias o el path. para tablas remotas, especifique el alias. Las siguientes instrucciones recuperan datos de una tabla de Paradox y una tabla de dBase: SELECT DISTINCT C.CUST_NO, C.STATE, O.ORDER_NO FROM "CUSTOMER.DB" C, "ORDER.DBF" O WHERE C.CUST_NO = O.CUST_NO Usted también puede usar alias BDE junto con los nombres de las tablas.Las siguientes secciones describen funciones disponibles para instrucciones DML en SQL.Las substituciones de parámetros en instrucciones DML
  39. 39. Funciones agregadas Funciones de String Función DATE Operadores consultas ActualizablesSubstitución de parámetros en instrucciones DMLLos marcadores de variables o parámetros (?) pueden ser usados en instrucciones DML enlugar de los valores. Las variables deben siempre estar precedidas por dos puntos (:), porejemplo:SELECT apellido, primer-nombre FROM "CUSTOMER.DB"WHERE apellido > :var1 AND primer-nombre < :var2Funciones de agregaciónSe incluyen también expresiones agregadas complejas, tal como: SUM( Field * 10 ) SUM( Field ) * 10 SUM( Field1 + Field2 )Funciones de StringEl SQL soporta las siguientes funciones de manipdiración de cadenas del SQL ANSI-standardpara recuperación, insersión y actualización: UPPER(), para forzar una cadena a estar en mayúscdiras LOWER(), para forzar una cadena a estar en minúscdiras TRIM(), para quitar repeticiones de un caracter especificado desde la izquierda, derecha o a ambos lados de una cadena SUBSTRING() para crear una subcadena de una cadenaFunción DateEl SQL soporta la función EXTRACT() para aislar un campo numérico simple de un campodate/time al recuperar usando la siguiente sintaxis:EXTRACT (extract_field FROM field_name)Por ejemplo, la siguiente instrucción extrae el valor del año de un campo DATE:SELECT EXTRACT(YEAR FROM HIRE_DATE)
  40. 40. FROM EMPLOYEEUsted puede también extraer MONTH, DAY, HOUR, MINUTE, y SECOND usando esta función.Nota: EXTRACT no soporta las cláusulas TIMEZONE_HOUR o TIMEZONE_MINUTE.OperadoresEl SQL soporta los siguientes operadores:Tipo OperatorAritméticos + - * /Comparación < > = <> >= =<IS NdirL IS NOTNdirLLógico AND OR NOTConcatenación de cadenas ||consultas actualizablesSQL Links ofrece soporte expandido para consultas actualizables de tabla simple y multi-tabla.Estas restricciones se aplican a las actualizaciones: Campos enlazadas no pueden ser actualizados El cambio de índice causará un errorRestricciones sobre las consultas en vivoLa semántica de consultas en vivo, para todos los métodos de manipdiración de datos,devuelve cursores que son funcional y semánticamente similares a los cursores retornadospor la función DbiOpenTable del BDE. Las consultas de tablas simples o las vistas sonactualizables, siempre que: No hay operaciones JOIN, UNION, INTERSECT, o MINUS No hay una palabra clave DISTINCT en el SELECT. (Esta restricción puede ser relajada si todos los campos de un índice único están protegidos). Todo en la cláusula SELECT es una referencia de columna simple o un campo calcdirado, no se permiten agregaciones. La tabla referenciada en la cláusula FROM es una tabla base actualizable o una vista actualizable. No hay una cláusula de GROUP BY o HAVING. No hay subconsultas que referencian la tabla en la cláusula FROM ni en subconsultas correlacionadas.
  41. 41. Cualquier cláusula ORDER BY puede ser satisfecha con un índice.Las restricciones adicionales pueden aplicarse a los métodos de los campos o cursores. Si uníndice es usado para satisfacer una cláusula de orden, la función DbiSwitchToIndex del BDEdevuelve un error.Restricciones a uniones en vivoLas uniones en vivo dependen de los cursores compuestos. Los joins en vivo pueden usarsesólo si: Todos All joins are left-to-right outer joins. All join are equi-joins. All join conditions are satisfied by indexes (for Paradox and dBASE) Output ordering is not defined. Each table in the join is a base table. The query contains no elements listed above that wodird prevent single-table updatability.ConstraintsUsted puede restringir cualquier consulta actualizable asignando la propiedad de lainstrucción de consulta stmtCONSTRAINED a TRUE antes de ejecución. Un error seráentonces retornado cada vez que una modificación o insersión cause que el nuevo registrodesaparezca del conjunto resultado.Campos calcdirados (Calcdirated fields)Para consultas actualizables con campos calcdirados, una propiedad adicional de campoidentifica un campo resultado como de sólo lectura y calcdirado. Todas las llamadas a lafunción BDE DbiPutField causa una recalcdiración de cualquier campo dependiente.Llamadas de función BDE acerca de resultados de consultasSi una consulta devuelve un cursor, ese cursor soportará completamente las capacidades deconsulta de bajo nivel de un cursor devuelto de la función BDE DbiOpenTable. Por eso losfiltros y los mapas de campo puede ser aplicado para refinar más el conjunto resultado. Adiferencia de los cursores de tabla abierta, algunas operaciones tal como DbiAddIndex oDbiSwitchToIndex no son soportados.Ejemplos DMLLas siguientes cláusulas son soportadas:SELECT FROM, WHERE, ORDER BY, GROUP BY, and HAVINGLos siguientes agregados son soportados:SUM, AVG, MIN, MAX, COUNT
  42. 42. Los siguientes operadores son soportados:, -, *, /, =, < >, IS NdirLLas operaciones UPDATE, INSERT, DELETE son soportados completamente. Los siguientesejemplos muestras instrucciones DML con bases de datos estandar:Ejemplo 1: UPDATE update goods set city = Santa Cruz where goods.city = Scotts ValleyEjemplo 2: INSERT insert into goods ( part_no, city ) values ( aa0094, San Jose )Ejemplo 3: DELETE delete from goods where part_no = aa0093Ejemplo 4: SELECT used to joinEl siguiente ejemplo ilustra cómo se soportan las instrucciones SELECT como un equivalentede JOIN: select distinct p.part_no, p.quantity, g.city from parts p, goods g where p.part_no = g.part_no and p.quantity > 20 order by p.quantity, g.city, p.part_noUna instrucción SELECT que contiene un join debe tener una cláusula WHERE en la cual porlo menos un campo de cada tabla se ve envuelta en un chequeo de seguridad.Ejemplo 5: Sub-selectsSe soportan las consultas sub-seleccionadas. El siguiente ejemplo ilustra esta sintaxis. select p.part_no from parts p where p.quantity in
  43. 43. (select i.quantity from inventory i where i.part_no = aa9393)Ejemplo 6: GROUP BYLos siguentes ejemplos ilustran la cláusula GROUP BY: select part_no, sum(quantity) as PQTY from parts group by part_noNota: Los agregados en la cláusula SELECT debe tener una cláusula GROUP BY si se usa uncampo proyectado, como se muestra en el primer ejemplo.Ejemplo 7: ORDER BYEl siguiente ejemplo ilustra el ORDER BY con una cláusula DESCENDING: select distinct customer_no from c:datacustomer order by customer_no descendingDefinición de DatosLocal SQL supports data definition language (DDL) for creating, altering, and droppingtables, and for creating and dropping indexes.Views are supported.Local SQL does not permit the substitution of variables for values in DDL statements.The following DDL statements are supported:CREATE TABLEALTER TABLEDROP TABLECREATE INDEXDROP INDEXCREATE VIEWFor additional illustrative Ejemplos see:DDL Ejemplos
  44. 44. CREATE TABLECREATE TABLE is supported with the following limitations:Column definitions based on domains are not supported.Constraints are limited to PRIMARY KEY for Paradox. Constraints are unsupported in dBASE.For Ejemplo, the following statement creates a Paradox table with a PRIMARY KEY constrainton the LAST_NAME and FIRST_NAME columns:CREATE TABLE "employee.db"(LAST_NAME CHAR(20),FIRST_NAME CHAR(15),SALARY NUMERIC(10,2),DEPT_NO SMALLINT,PRIMARY KEY(LAST_NAME, FIRST_NAME))The same statement for a dBASE table shodird omit the PRIMARY KEY definition:CREATE TABLE "employee.dbf"(LAST_NAME CHAR(20),FIRST_NAME CHAR(15),SALARY NUMERIC(10,2),DEPT_NO SMALLINT)Creating Paradox and dBASE tablesYou create a Paradox or dBASE table using local SQL by specifying the file extension whennaming the table:".DB" for Paradox tables".DBF" for dBASE tablesIf you omit the file extension for a local table name, the table created is the table typespecified in the Defadirt Driver setting in the System page of the BDE Configuration Utility.Data type mappings for CREATE TABLE
  45. 45. The following table lists SQL syntax for data types used with CREATE TABLE, and describeshow those types are mapped to Paradox and dBASE types by the BDE:SQL Syntax BDE Logical Paradox dBASESMALLINT fldINT16 Short Number (6,10)INTEGER fldINT32 Long Integer Number (20,4)DECIMAL(x,y) fldBCD BCD N/ANUMERIC(x,y) fldFLOAT Number Number (x,y)FLOAT(x,y) fldFLOAT Number Float (x,y)CHARACTER(n) fldZSTRING Alpha CharacterVARCHAR(n) fldZSTRING Alpha CharacterDATE fldDATE Date DateBOOLEAN fldBOOL Logical LogicalBLOB(n,1) fldstMEMO Memo MemoBLOB(n,2) fldstBINARY Binary BinaryBLOB(n,3) fldstFMTMEMO Formatted memo N/ABLOB(n,4) fldstOLEOBJ OLE OLEBLOB(n,5) fldstGRAPHIC Graphic N/ATIME fldTIME Time N/ATIMESTAMP fldTIMESTAMP Timestamp N/AMONEY fldFLOAT, fldstMONEY Money Number (20,4)AUTOINC fldINT32, fldstAUTOINC Autoincrement N/ABYTES(n) fldBYTES(n) Bytes N/Ax = precision (defadirt: specific to driver)y = scale (defadirt: 0)n = length in bytes (defadirt: 0)1-5 = BLOB subtype (defadirt: 1)ALTER TABLELocal SQL supports the following subset of the ANSI-standard ALTER TABLE statement. Youcan add new columns to an existing table using this ALTER TABLE syntax:
  46. 46. ALTER TABLE table ADD column_name data_type [, ADD column_name data_type ...]For Ejemplo, the following statement adds a column to a dBASE table:ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINTYou can delete existing columns from a table using the following ALTER TABLE syntax:ALTER TABLE table DROP column_name [, DROP column_name ...]For Ejemplo, the next statement drops two columns from a Paradox table:ALTER TABLE "employee.db" DROP LAST_NAME, DROP FIRST_NAMEADD and DROP operations can be combined in a single statement. For Ejemplo, the followingstatement drops two columns and adds one:ALTER TABLE "employee.dbf" DROP LAST_NAME, DROP FIRST_NAME, ADD FdirL_NAMECHAR[30]DROP TABLEDROP TABLE deletes a Paradox or dBASE table. For Ejemplo, the following statement drops aParadox table:DROP TABLE "employee.db"CREATE VIEWA view creates a virtual table from a SELECT statement. You can look at just the data youneed within this movable frame or window on the table, while the technical underpinningsare hidden. Instead of entering a complex qualified SELECT statement, the user simplyselects a view.CREATE VIEW describes a view of data based on one or more underlying tables in thedatabase. The rows to return are defined by a SELECT statement that lists columns from thesource tables. A view does not directly represent physically stored data. It is possible toperform select, project, join, and union operations on views as if they were tables.CREATE VIEW enables users to create views on tables by using the following syntax:CREATE VIEW view_name [ (column_name [, column_name]...)]CREATE VIEW is supported in conjunction with the Client Data Repository (CDR). The CDRstores the SELECT statement that defines the view.The "WITH CHECK OPTION" is supported to create a constrained view.Views of Views are supported. However, the CASCADE/LOCAL view attribute is notsupported, because all updateable views CASCADE the constraints.DDL EjemplosThe following Ejemplos show the use of DDL statements with standard databases.Ejemplo 1a: DDL (DROP TABLE)
  47. 47. When the table name contains a period "." character, enclose the name in quotation marks:drop table "c:datacustomer.db"Ejemplo 1b: DDL (DROP TABLE)No quotation marks are used if the table name does not contain the "." character:drop table clientsEjemplo 2: DDL (CREATE INDEX)create index part on parts (part_no)Paradox: Paradox primary indexes can be created only when creating the table. Secondaryindexes are created as case insensitive and maintained, when possible.dBASE: dBASE indexes are created as maintained. The Index name specified is the tagname.For more information about different types of indexes, see DbiAddIndex in the BorlandDatabase Engine Online Reference.Ejemplo 3: DDL (DROP INDEX)The syntax for drop index is tablename.indexname:drop index parts.part_noParadox: For Paradox only, the syntax tablename.primary indicates the primary index:drop index parts.primaryIntroduction to Borland SQL Links for Windows (32-bit version)Borland SQL Links for Windows is a set of BDE-hosted driver connections to databaseservers. By creating queries, SQL Links emdirates fdirl navigation capabilities, enabling usersto access and manipdirate data in SQL databases by using convenient features in Borlandapplications.Any Borland application based upon the Borland Database Engine (BDE) can use Borland SQLLinks, including your custom applications built using the BDE API. Borland SQL Links isincluded with some Borland client/server application development tools such as DelphiClient/Server.The SQL Links product package includes database drivers for InterBase, ORACLE, Sybase,and Microsoft SQL Server databases. These drivers require the installation of the appropriatevendors server connectivity API or interface software. Borland Database Engine includesbuilt-in drivers for Borland standard databases.Other topics in this Introduction to SQL LinksAdditional informationOther BDE online documentation
  48. 48. SQL Reserved Words.This document contains a list of reserved words for Local SQL in the Borland DatabaseEngine (BDE).This file contains an alphabetical list of words reserved byLocal SQL in the Borland Database Engine. Note that this fileis provided as-is.ACTIVE, ADD, ALL, AFTER, ALTER, AND, ANY, AS, ASC, ASCENDING,AT, AUTO, AUTOINC, AVGBASE_NAME, BEFORE, BEGIN, BETWEEN, BLOB, BOOLEAN, BOTH, BY,BYTESCACHE, CAST, CHAR, CHARACTER, CHECK, CHECK_POINT_LENGTH,COLLATE, COLUMN, COMMIT, COMMITTED, COMPUTED, CONDITIONAL,CONSTRAINT, CONTAINING, COUNT, CREATE, CSTRING, CURRENT,CURSORDATABASE, DATE, DAY, DEBUG, DEC, DECIMAL, DECLARE, DEFAdirT,DELETE, DESC, DESCENDING, DISTINCT, DO, DOMAIN, DOUBLE, DROPELSE, END, ENTRY_POINT, ESCAPE, EXCEPTION, EXECUTE, EXISTS,EXIT, EXTERNAL, EXTRACTFILE, FILTER, FLOAT, FOR, FOREIGN, FROM, FdirL, FUNCTIONGDSCODE, GENERATOR, GEN_ID, GRANT, GROUP,GROUP_COMMIT_WAIT_TIMEHAVING, HOURIF, IN, INT, INACTIVE, INDEX, INNER, INPUT_TYPE, INSERT,INTEGER, INTO, IS, ISOLATIONJOINKEYLONG, LENGTH, LOGFILE, LOWER, LEADING, LEFT, LEVEL, LIKE,LOG_BUFFER_SIZE

×