SQL admite una variada gama de tipos de datos para el tratamiento de la informacin contenida en las tablas, los tipos de datos pueden ser numricos (con o sin decimales), alfanumricos, de fecha o booleanos(si o no).Segn el gestor de base de datos que estemos utilizando los tipos de datos varan, pero se reducen bsicamente a los expuestos anteriormente, aunque en la actualidad casi todos los gestores de bases de datos soportan un nuevo tipo, el BLOB (Binary Large Object), que es un tipo de datos especial destinado a almacenar archivos, imgenes.
Dependiendo de cada gestor de bases de datos el nombre que se da a cada uno de estos tipos puede ariar. Bsicamente tenemos los siguientes tipos de datos.
Ms detalladamente tenemos:
Operadores
Los operadores se pueden definir como combinaciones de caracteres que se utilizan tanto para realizar asignaciones como comparaciones entre datos. Los operadores se dividen en aritmticos, relacionales, lgicos, y concatenacin.
Atributos:
Palabras Clave
Las palabras clave son identificadoras con un significado especial para SQL, por lo que no pueden ser utilizadas para otro propsito distinto al que han sido pensadas. SQL dispone de muy pocas rdenes, pero de mltiples palabras lave, lo que le convierten en un lenguaje sencillo pero tremendamente potente para llevar a cabo su funcin.
Funciones Agregadas
Las funciones agregadas proporcionan a SQL utilidades de clculo sobre los datos de las tablas. Estas funciones se incorporan en las consultas SELECT y retornan un nico valor al operar sobre un grupo de registros.
Las funciones agregadas son.
Predicados Los predicados son condiciones que se indican en clusula WHERE de una consulta SQL. La siguiente tabla ilustra los predicados de SQL.
Consulta de datos El proceso ms importante que podemos llevar a cabo en una base de datos es la consulta de los datos. De nada servira una base de datos si no pudiramos consultarla. Es adems la operacin que efectuaremos con mayor frecuencia. Para consultar la informacin SQL pone a nuestra disposicin la sentencia SELECT.
La sentencia SELECT La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos.
El formato de la sentencia select es:
Veamos por partes que quiere decir cada una de las partes que conforman la sentencia.
Para formular una consulta a la tabla tCoches y recuperar los campos matricula, marca, modelo, color, numero_kilometros, num_plazas debemos ejecutar la siguiente consulta. Los datos sern devueltos ordenados por marca y por modelo en orden ascendente, de menor a mayor.
La palabra clave FROM indica que los datos sern recuperados de la tabla tCoches. Podramos haber especificado ms de una tabla, pero esto se ver en el apartado de consultas combinadas. Tambin podramos haber simplicado la consulta a travs del uso del comodn de campos, el asterisco "*".
El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla.
La clusula WHERE
La clusula WHERE es la instruccin que nos permite filtrar el resultado de una sentencia SELECT. Habitualmente no deseamos obtener toda la informacin existente en la tabla, sino que queremos obtener slo la informacin que nos resulte til es ese momento. La clusula WHERE filtra los datos antes de ser devueltos por la consulta. En nuestro ejemplo, si queremos consultar un coche en concreto debemos agregar una clusula WHERE. Esta clusula especifica una o varias condiciones que deben cumplirse para que la sentencia SELECT devuelva los datos. Por ejemplo, para que la consulta devuelva slo los datos del coche con matrcula M-1525-ZA debemos ejecutar la siguiente sentencia:
Adems, podemos utilizar tantas condiciones como queramos, utilizando los operadores lgicos AND y OR El siguiente ejemplo muestra una consulta que devolver los coches cuyas matrculas sean M-1525-ZA o bien M- 2566-AA.
Adems una condicin WHERE puede ser negada a travs del operador lgico NOT. La siguiente consulta devolver todos los datos de la tabla tCohes menos el que tenga matrcula M-1525-ZA.
Podemos tambin obtener las diferentes marcas y modelos de coches ejecutando la consulta.
En el caso anterior la palabra clave DISTINCT indica que slo queremos los valores distintos del par formado por los campos marca y modelo.
La clusula ORDER BY
Como ya hemos visto en los ejemplos anteriores podemos especificar el orden en el que sern devueltos los datos a travs de la clusula ORDER BY.
Como podemos ver en el ejemplo podemos especificar la ordenacin ascendente o descendente a travs de las palabras clave ASC y DESC. La ordenacin depende del tipo de datos que este definido en la columna, de forma que un campo numrico ser ordenado como tal, y un alfanumrico se ordenar de la A, a la Z, aunque su contenido sea numrico. De esta forma el valor 100 se devuelve antes que el 11.
Tambin podemos especificar el en la clusula ORDER BY el ndice numrico del campo dentro del la sentencia SELECT para la ordenacin, el siguiente ejemplo ordenara los datos por el campo marca, ya que aparece en segundo lugar dentro de la lista de campos que componen la SELECT.
Insertar datos.
Hasta ahora hemos visto como se almacenan los datos en una base de datos y como consultar esos datos almacenados, pero no hemos visto como almacenar dichos datos. Para almacenar datos en una base de datos debemos insertar filas en las tablas. Para ellos SQL pone a nuestra disposicin la sentencia INSERT.
Insercin de filas.
El proceso de insercin de filas consiste en aadir a una tabla una o ms filas y en cada fila todos o parte de sus campos. Podemos distinguir dos formas de insertar filas:
Insercin individual de filas.
Insercin mltiple de filas.
La sintaxis de la sentencia INSERT es diferente segn cul sea nuestro propsito.
Slo podremos omitir un campo al efectuar una insercin cuando este acept valores nulos.
Insercin individual de filas
Para realizar la insercin individual de filas SQL posee la instruccin INSERT INTO. La insercin individual de filas es la que ms comnmente utilizaremos. Su sintaxis es la siguiente:
Como se puede observar la sentencia tiene dos partes claramente diferenciadas, por un lado la propia INSERT INTO seguida de la lista de campos en los que queremos insertar los datos, y por otro la lista de valores que queremos insertar en los campos. La mejor forma de ver esto es a travs de un ejemplo.
Con esta sentencia INSERT creamos un registro en la tabla tCoches con los valores especificados, es decir, la matricula tendr el valor M- 1111-CA, la marca ser RENAULT y as sucesivamente.
Qu ocurrira si ya existiera un coche con la matrcula M-1111- CA? Se producir un error, porque hemos definido la clave primaria en el campo matrcula, y como hemos visto la clave primaria debe ser nica.
Si omitimos algn par " campo-valor " en la sentencia INSERT, pueden ocurrir varias cosas:
Que se produzca un error, si el campo no acepta valores nulos.
Que se grave el registro y se deje nulo el campo, cuando el campo acepte valores nulos.
Que se grave el registro y se tome el valor por defecto, cuando el campo tenga definido un valor por defecto.
Que hacer en cada momento depender del programa.
Por ejemplo, la siguiente sentencia crear un registro en la tabla tCoches con el campo numero_kilometros cero, ya que este es su valor por defecto.
Insercin mltiple de filas
La sentencia INSERT permite tambin insertar varios registros en una tabla. Pare ello se utiliza una combinacin de la sentencia INSERT junto a una sentencia SELECT. El resultado es que se insertan todos los registros devueltos por la consulta.
Para poder utilizar la insercin mltiple de filas se deben cumplir las siguientes normas:
La lista de campos de las sentencias insert y select deben coincidir en nmero y tipo de datos.
Ninguna de las filas devueltas por la consulta debe infringir las reglas de integridad de la tabla en la que vayamos a realizar la insercin.
Pongamos un ejemplo, vamos a crear una tabla con las diferentes marcas que tenemos en la base de datos. La sentencia SQL para crear la tabla es la siguiente:
Una vez que tenemos creada la tabla de marcas vamos a insertar otro par de registros en la tabla de coches, para ello utilizamos una sentencia insert into para una nica fila.
Ahora tenemos tres marcas diferentes en la tabla tCoches, y queremos insertarlas en la tabla de marcas, para ello podemos realizar tres inserciones individuales, pero qu pasara si no supiramos de antemano el nmero de marcas? Y si fueran unas cincuenta marcas? Nos podramos pasar el da entero escribiendo sentencias insert into.
Afortunadamente podemos realizar una insercin mltiple del siguiente modo:
Como resultado obtenemos un registro en la tabla tMarcas por cada marca de la tabla tCoches. El campo cdigo se ha generado automticamente ya que est definido como identidad.
Dmonos cuenta de que el orden de generacin no ha sido el mismo que el de insercin, sino que se ha aplicado el orden en el que han sido devueltos los datos por la sentencia SELECT.
Borrado de datos.
La sentencia DELETE.
Para borrar datos de una tabla, debemos utilizar la sentencia DELETE.
La sintaxis de la sentencia DELETE es la siguiente:
El siguiente ejemplo ilustra el uso de la sentencia DELETE. Es buena idea especificar en la sentencia WHERE los campos que forman la clave primaria de la tabla para evitar borrar datos que no queramos eliminar.
Cuando trabajemos con la sentencia DELETE debemos tener en cuenta las siguientes consideraciones:
Slo podemos borrar datos de una nica tabla. Cuando borramos datos de una vista, los estamos borrando tambin de la tabla. Las vistas son solo una forma de ver los datos, no una copia.
Si intentamos borrar un registro de una tabla referenciada por una FOREING KEY como tabla maestra, si la tabla dependiente tiene registros relacionados la sentencia DELETE fallar.
La sentencia TRUNCATE
Para realizar un borrado completo de tabla debemos considerar la posibilidad de utilizar la sentencia TRUNCATE, mucho ms rpida que DELETE.
La sintaxis de la sentencia TRUNCATE es la siguiente:
El siguiente ejemplo muestra el uso de la sentencia TRUNCATE.
Cuando trabajemos con la sentencia TRUNCATE debemos tener en cuenta las siguientes consideraciones.
La sentencia TRUNCATE no es transaccional. No se puede deshacer.
La sentencia TRUNCATE no admite clusula WHERE. Borra toda la tabla.
No todos los gestores de bases de datos admiten la sentencia TRUNCATE.
Actualizacin de datos.
La sentencia UPDATE.
Para la actualizacin de datos SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualizacin de uno o varios registros de una nica tabla. La sintaxis de la sentencia UPDATE es la siguiente:
Las siguientes sentencias actualizan los datos de la tabla tCoches con los valores de la tabla tMarca obtenidos anteriormente la insercin de datos.
Ntese que los valores para el campo marca aparecen entrecomillados, ya que es un campo de tipo varchar. Los valores con los que actualicemos los datos deben ser del tipo del campo.
Un aspecto a tener en cuenta es que los campos que forman la primary key de una tabla slo se podrn modificar si los registros no estn referenciados en ninguna otra tabla. En nuestro caso slo podremos modificar la matrcula de un coche si no tiene registros asociados en la tabla tAlquileres.
Esto puede causar problemas, ya que podramos habernos equivocado al dar de alta el coche en la tabla tCoches y detectar el error despus de alquilar el coche. En tal caso tendramos dar de alta un nuevo coche con la matrcula correcta, actualizar los registros de la tabla alquileres y por ltimo borrar el registro errneo de la tabla tCoches. Este proceso puede ser bastante complicado en el caso de que existirn ms relaciones con la tabla. Se podra considerar que la clave primaria de la tabla est mal definida y que la matrcula no debe ser el elemento que identifique el coche. Una alternativa seria crear un cdigo auto numrico para la tabla tCoches que realizar las veces de clave primaria y crear un ndice nico para la matrcula, este diseo tambin tiene sus "pegas", por lo que debemos decidir que modelo utilizar, y seleccionar las claves primarias con sumo cuidado.
Uso de sub- consultas con UPDATE.
El uso de sub- consultas es una tcnica avanzada de consulta que veremos con detalle ms adelante, pero que tratamos aqu de forma introductoria. Hasta ahora se han actualizado los datos con valores que conocemos de antemano, pero qu ocurre cuando esos datos deben tomarse de otra tabla de la base de datos? Podramos disear un programa que recorriera toda la tabla y buscar el valor adecuado para cada registro y lo actualizase. Sin duda es una solucin, y en ocasiones casi la nica, pero es una solucin cara y compleja que adems exige que conozcamos algn otro lenguaje de programacin. Para estos casos podemos utilizar subconsultas con la sentencia UPDATE.
La sintaxis es la siguiente:
Por cada registro de la tabla tCoches se ejecutar la subconsultas, actualizando el campo marca al valor del cdigo de la marca en la tabla tMarcas.
El uso de sub-consultas para actualizar datos tiene algunas limitaciones:
La sub-consulta slo puede devolver un nico campo.
La sub- consulta slo puede devolver un solo registro.
El tipo de datos devuelto por la subconsultas debe ser del mismo tipo que el campo al que estamos asignando el valor.
No todos los sistemas de bases de datos permiten usar subconsultas para actualizar datos (Access) aunque si una buena parte de ellos (ORACLE, SQL Server, Sybase ...).
Pero en nuestro ejemplo el campo cdigo de la tabla tMarcas es numrico y el campo marca de la tabla tCoches es texto. Por qu funciona? Muy fcil, el motor de la base de datos es capaz de convertir el valor numrico a un valor texto de forma automtica, si bien esta es una excepcin. Ahora que ya tenemos modificado el valor de la marca de los registros, es conveniente modificar su tipo de datos y crear una foreign key contra la tabla tMarcas. Para ello ejecutaremos las siguientes sentencias.