20
Jun 13

Pildoritas de Bases de Datos: SQL. Predicados

pildoras bbdd
¡Hola corazones! Una vez más vuelvo con una pildorita de Bases de Datos y de nuevo es otra pildorita de SQL, pero tengo una buena noticia, es la última 😀

Como os comenté en el anterior artículo el tema de hoy serán los predicados y va a ser muy cortito.

Predicados

Los predicados son palabras reservadas que se indican entre SELECT y el nombre de la primera columna, y que indican ciertas características sobre los conjuntos recogidos en la consulta.

Los predicados principales son los siguientes:

Predicado Descripción
ALL Devuelve todos los registros de la consulta. Equivale a no indicar nada entre los campos y el SELECT.
DISTINCT Omite del resultado los registros que tienen los mismos datos en los campos seleccionados.
DISTINCTROW Omite del resultado los registros repetidos (en su totalidad, no sólo en los campos seleccionados)
TOP/LIMIT /ROWNUM Devuelve sólo los registros que se indiquen después de la palabra reservada.

 

Como veis este tema tampoco es que tenga mucha chicha, pero viene bien conocer los predicados porque se utilizan mucho en el día a día. Pondré varios ejemplos para que veáis su potencial.

Vamos a usar de nuevo nuestra amada tabla empleados del anterior post:

empleado

Imaginad que obtenemos los Apellidos de los empleados.

SELECT APELLIDOS FROM EMPLEADO

Puede ocurrir el caso de que existan en nuestra tabla dos personas con los mismos apellidos. En ese caso, obtendríamos dos registros, uno por cada empleado. Si queremos que no haya repeticiones, utilizaríamos el predicado DISTINCT.

SELECT DISTINCT APELLIDOS FROM EMPLEADO

Por otra parte, imaginaos que queremos saber quiénes son las 20 personas de la empresa que cobran más. Para eso utilizaríamos el predicado TOP, junto a la clausula ORDER BY.
Este comando es de los que he visto variar más entre los diferentes motores de búsqueda. Por tanto, indicaré la query para cada motor:

SQLServer

SELECT TOP 20 * EMPLEADOS ORDER BY SALARIO DESC

MySQL

SELECT * EMPLEADOS ORDER BY SALARIO DESC LIMIT 20

Oracle

SELECT * EMPLEADOS WHERE ROWNUM >= 20 ORDER BY SALARIO DESC

Como veis en MySQL y Oracle estas funcionalidades no son predicados como tal, sino clausulas - en el caso de MySQL - o incluso operadores dentro del WHERE (Oracle). No obstante, aunque no se coloquen después de la palabra SELECT su función es exactamente la misma.

DISTINCTROW os puede parecer igual a DISTINCT, pero tiene una diferencia notable: No afecta a los campos de la query repetidos, sino al registro completo.

Por ejemplo, imaginemos que un empleado de nuestro modelo ha estado en dos proyectos. Primero trabajo con una compañía y un tiempo más tarde entra al mismo proyecto pero siendo trabajador de otra cárnica. Si queremos saber simplemente en que proyectos ha trabajado deberíamos utilizar DISTINCTROW, ya que de otra forma tendríamos resultados repetidos.

ejemplo distinctrow

SELECT DISTINCTROW 
PROYECTO.NOMBRE 
FROM 
EMPLEADO, PROYECTO, PROYECTO_HAS_EMPLEADO 
WHERE 
PROYECTO.ID_PROYECTO = PROYECTO_HAS_EMPLEADO.ID_PROYECTO 
AND EMPLEADO.ID_EMPLEADO = PROYECTO_HAS_EMPLEADO.ID_EMPLEADO 
AND ID_EMPLEADO = 3

Bueno, con esto doy por finalizada la parte de SQL de las Pildoritas de Bases de Datos, aunque he sido un poco malvada, porque realmente no hemos terminado con SQL, ya que lo seguiremos usando en lo que queda culturitas. Dejemoslo en que hemos dejado atrás la parte coñazo de aprendizaje del lenguaje en sí. En siguientes pildoritas empezaremos con optimización de SQL.

Índice de Pildoritas

Share
5
Jun 13

Pildoritas de Bases de Datos: SQL. JOIN

pildoras bbdd
En las últimas pildoritas hemos adquirido conocimientos bastante aceptables de sintáxis SQL, pero hasta este momento no hemos utilizado álgebra relacional, que es el verdadero potencial de las Bases de datos SQL. Os pido que a partir de ahora penséis en los datos de tablas o los resultados de una query como conjuntos de datos, si es que no lo hacíais ya.

En muchas ocasiones, por no decir la gran mayoría, necesitaremos datos que se encuentran repartidos en varias tablas. Para ello, nos apoyaremos en la operación por antonomasia para relacionar tablas, el JOIN.

JOIN es el operador cartesiano de Algebra relacional y combina los registros de dos tablas tal que su resultado es la combinación de todos los registros de la primera tabla, con los de la segunda.

Un JOIN, como digo, es una relación entre tablas. Por tanto, ambas tablas deben tener al menos un campo común entre ellas con el que poderlas relacionar. Dichos campos suelen ser keys de las tablas.

El JOIN más típico, es aquel que realizamos de la siguiente forma:

SELECT EMPLEADO.DNI, EMPLEADO.NOMBRE, PUESTO.NOMBRE AS PUESTO 
FROM PUESTO, EMPLEADO 
WHERE EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

Con esta consulta obtenemos el DNI, nombre y puesto del empleado en la misma consulta, relacionando como se ve las tablas de Empleado y Puesto. Como vemos, lo único que hemos hecho es igualar la PK de Puesto (FK en Empleado) de ambas tablas.

Este JOIN realizado en el WHERE es igual al INNER JOIN, pero no nos adelantemos, poco a poco.

Existen muchas variaciones del JOIN, así que primeros vamos a ver los básicos: JOIN, LEFT JOIN, RIGHT JOIN, INNER JOIN y FULL OUTER JOIN.

Para los ejemplos de esta sección utilizaremos las tablas de Empleado y Puesto:

Joins (tablas ejemplo)

Por otra parte, los datos de las tablas serán los siguientes:

Empleado

DNI idPuesto idCompañia Nombre Apellidos Teléfono
87190290G 1 1 Pepe Padefo 666666666
28050763D 1 2 Antonia Picateclas 688888888
82500395Q 3 1 Eustaquio Traumas 699999999
01148640C 2 5 Augusto Flipao 655555555
70686067Y NULL 2 Pablo Unknow 644444444

 

Puesto

idPuesto Nombre Descripción
1 Programador Blablau!
2 Analista Blablauuuu!
3 Jefe de Proyecto RequeteBlablauuu!
4 Gerente MegaBlablauuuu!

 

INNER JOIN

Como comentaba justo arriba, el JOIN que se da al igualar la Key de dos claves es el INNER JOIN. Este sólo nos devolverá los datos que sean comunes a ambas tablas (esto tiene sentido si, por ejemplo, hay empleados sin un puesto). El JOIN simple es también un INNER JOIN.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE,
PUESTO.ID_PUESTO,
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO INNER JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

inner join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista

 

RIGHT JOIN

El RIGHT JOIN fuerza a que aparezcan todos los registros de la tabla de la derecha. Si no hay vinculación con uno de ellos, se colocarán los campos referenciados de la tabla de la izquierda a NULL.

SELECT EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO RIGHT JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

right join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
NULL NULL 4 Gerente

 

LEFT JOIN

El LEFT JOIN fuerza a que aparezcan todos los registros de la tabla de la izquierda. Si no hay vinculación entre alguno de esos registros y los de la tabla de la derecha, se colocarán los campos de la tabla de la derecha a NULL.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO LEFT JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

left join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
70686067Y Pablo NULL NULL

 

FULL OUTER JOIN

El FULL OUTER JOIN realiza un producto cartesiano entre ambas tablas y obtiene las combinaciones entre todos los registros, haya relación o no.

SELECT 
EMPLEADO.DNI, 
EMPLEADO.NOMBRE, 
PUESTO.ID_PUESTO, 
PUESTO.NOMBRE AS PUESTO 
FROM PUESTO FULL OUTER JOIN EMPLEADO 
ON EMPLEADO.ID_PUESTO = PUESTO.ID_PUESTO

full outer join

DNI NOMBRE ID_PUESTO PUESTO
87190290G Pepe 1 Programador
28050763D Antonia 1 Programador
82500395Q Eustaquio 3 Jefe Proyecto
01148640C Augusto 2 Analista
70686067Y Pablo NULL NULL
NULL NULL 4 Gerente

 

Con esto hemos acabado los JOIN, pero no con el tema, ya que ahora vamos a ver operadores que en vez de combinar tablas, combinan los resultados de varias queries.

UNION / UNION ALL

UNION es como una suma, o un OR lógico para ser más correctos. Lo que hace es unir los registros devueltos por dos consultas en un único conjunto de resultado. Para ello, es obligatorio que ambas queries tengan las mismas columnas en el SELECT.

Si se quiere que se muestren registros duplicados usaremos UNION ALL.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

UNION

SELECT DNI,NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 2

union

 

DNI NOMBRE
87190290G Pepe
28050763D Antonia
01148640C Augusto

 

INTERSECT

INTERSECT es parecido al operador UNION, pero en su caso aplica un AND lógico en vez de un OR.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

INTERSECT

SELECT DNI, NOMBRE FROM EMPLEADO WHERE DNI =  ‘28050763D’

intersect

 

 

DNI NOMBRE
28050763D Antonia

 

MINUS

El operador MINUS lo que hace es subtraer de la primera query los datos devueltos de la segunda que se encuentren en ella.

SELECT DNI, NOMBRE FROM EMPLEADO WHERE ID_PUESTO = 1

MINUS

SELECT DNI, NOMBRE FROM EMPLEADO WHERE DNI =  ‘28050763D’

minus

 

 

DNI NOMBRE
87190290G Pepe

 

 

 

Ahora ya sí, terminamos con el tema de los JOIN. En la siguiente pildorita veremos los predicados, tema que pone fin (ya era hora) a la parte de SQL.

Índice de Pildoritas

Share
1
Jun 13

Pildoritas de Bases de Datos: SQL. Clausulas II

pildoras bbdd

Un mes ha pasado ya desde la última entrada de las Pildoritas de Bases de Datos. ¡Mil disculpas por el retraso!

Por si os habéis olvidado en este tiempo de la anterior pildorita , os hago un resumen breve: En primer lugar enumeré las clausulas y las expliqué cada una por encima. Tras esto, vimos los operadores condicionales y de comparación, que se utilizan dentro de la clausula WHERE.

En este post vamos a continuar con las clausulas GROUP BY y HAVING, y sus operadores, las funciones de agregación, pero si no os importa cambiaré el orden del anterior post: Primero veremos las funciones de agregación, y luego repasaremos con este nuevo conocimiento las dos clausulas. Ya veréis por qué 😉

Funciones de agregación.

Las funciones de agregación se usan en la clausula SELECT (y en la HAVING, como veremos más tarde), y realizan operaciones que devuelven un único valor de un grupo de registros determinados.

 

Función Descripción
COUNT Devuelve el número de registros de la selección
SUM Devuelve la suma de todos los valores de un campo determinado.
AVG Obtiene la media de los valores de un campo determinado.
MIN Devuelve el valor más bajo del campo especificado.
MAX Devuelve el valor más alto del campo especificado.

 

Vamos a ver algunos ejemplos de consulta utilizando las funciones de agregación. Utilizaré para los ejemplos la tabla Empleado de nuestro eterno modelo de datos.

empleado* A lo mejor os habéis percatado de que hay un campo de más, salario. ¡No os spoileéis el post!

 

Si quisiéramos saber el número total de empleados que tenemos subcontratados por la empresa, usaríamos el operador COUNT.

SELECT COUNT(*)  FROM EMPLEADO

Si por ejemplo, necesitáramos conocer la media que pagamos a nuestros empleados, usaríamos la función AVG.

SELECT AVG(SALARIO) FROM EMPLEADO

Por último, y ya terminamos con los ejemplos en este capítulo, veamos como obtendríamos el salario del empleado que más cobra en la empresa:

SELECT MAX(SALARIO) FROM EMPLEADO

 

Pasemos ahora a las clausulas GROUP BY y HAVING, y veamos que relación tienen éstas con las funciones de agregación.

Clausulas GROUP BY y HAVING

El GROUP BY, como ya vimos, sirve para agrupar registros por los valores de una determinada columna.

Vamos a seguir con el ejemplo de los empleados, pero (ahora sí) vamos a meterle un nuevo campo, salario, para poder ver ejemplos de agrupaciones con algo de chicha.

 

Si quisiéramos saber cuanto le pagamos por los salarios de los empleados a cada compañía que tenemos contratada, agruparíamos por el campo compañía y haríamos un sumatorio del campo salarios.

SELECT SUM(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA

 

La cláusula HAVING, va en conjunción siempre con la clausula GROUP BY, y sirve para indicar condiciones de filtrado en las agrupaciones.

Es una clausula que muchas veces es prescindible, ya que podemos filtrar los resultados a través de la clausula WHERE, pero si queremos filtrar utilizando funciones de agregación, su uso será obligatorio.

HAVING suele ser lioso de entender en un principio, pero es sencillo visto de forma práctica.

 

En esta ocasión queremos saber a que compañías pagamos más de un millón de euros en el concepto de salario de empleados.

SELECT COMPAÑIA FROM EMPLEADO GROUP BY COMPAÑIA 
HAVING SUM(SALARIO) > 1.000.000

 

Y ahora, hagamos unas cuantas consideraciones con las cuales espero que consigáis afianzar toda esta parte.

 

Las funciones de agregación se utilizan siempre en la clausula SELECT y no necesitan por sí mismas la clausula GROUP BY, y por extensión, la HAVING, como ya habéis visto. Son las clausulas GROUP BY, y HAVING, las que “requieren” siempre de la existencia de una función de agregación. De hecho, en el momento que quisiéramos en una consulta mostrar otro campo a parte de la función de agregación, el motor de bases de datos con el que estuviéramos trabajando nos mostraría un error diciéndonos que este campo debe estar dentro de una clausula GROUP BY. Es decir, las columnas mostradas en el SELECT que no sean una función de agregación deben estar contenidas dentro del GROUP BY.

Lo mejor es ver estos usando un poco de Álgebra de Conjuntos.

Podemos tener el conjunto de empleados, que son todos los registros de la tabla empleado, y aplicar funciones de agregación con él. En este caso como es obvio no necesitamos especificar el comando GROUP BY.

Por otra parte, podríamos querer realizar funciones de agregación con un subconjunto del conjunto empleados. Por ejemplo, podríamos querer operar con el conjunto de empleados que tienen el puesto de 'Programador Junior', y obtener su salario medio.

 

En el primer ejemplo del apartado de la parte del GROUP BY, calculamos cuanto pagamos en concepto de sueldos de empleados a cada compañía. Imaginad que quisiéramos obtener el salario total que pagamos a cada compañía, por cada puesto.

SELECT COMPAÑIA, PUESTO, SUM(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO

De hecho, si quisiéramos rizar más el rizo, podríamos querer saber los salarios medios que pagamos por los puestos de “Programador Senior” y “Analista Funcional” a cada compañía (por eso de abaratar costes xD).

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO 
HAVING PUESTO IN ('Programador Senior', 'Analista Funcional')

Y ya, por el simple hecho de utilizar clausulas como si no hubiera mañana, vamos a obtener estos registros ordenados de mayor a menor media.

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO GROUP BY COMPAÑIA, PUESTO 
HAVING PUESTO IN ('Programador Senior', 'Analista Funcional') 
ORDER BY AVG(SALARIO)

¡¡Qué estoy mu locaaa!!

 

Espero que la pildorita de hoy no se os haya atragantado. He intentado daros un buen vaso de agua, sólo espero que este fuera de mini, y no de café xDD

En la próxima pildorita veremos los JOIN...Entonces agradeceréis que os haya introducido con mucha delicadeza el tema del álgebra de conjuntos xD

 

¿Os habéis percatado de que en el último y penúltimo ejemplo podríamos filtrar en el where en vez de en el HAVING?

SELECT COMPAÑIA, PUESTO, AVG(SALARIO) FROM EMPLEADO 
WHERE PUESTO IN ('Programador Senior', 'Analista Funcional') 
GROUP BY COMPAÑIA, PUESTO

¡Mindfuck! 😛

Índice de Pildoritas

Share
29
Apr 13

Pildoritas de Bases de Datos: SQL. Clausulas I

pildoras bbdd

En la entrada anterior de Pildoritas de Bases de Datos comenzamos con SQL viendo los comandos de definición de la base de datos (DDL) y los de manipulación de los datos (DML). Lo siguiente que vamos a ver son las clausulas, una parte importantísima en la definición de comandos DML.

Donde mejor se puede ver la importancia de las clausulas es en las consultas así que os adelanto que a partir de ahora vais a ver el comando SELECT hasta en la sopa.

Clausulas

Las clausulas son condiciones de filtrado para manipular datos.

Ya os adelanté un poco por encima en el anterior post las clausulas FROM y WHERE, pero ni siquiera rascamos un poco el potencial de estas clausulas. Paso a explicarlas y luego ya, como os prometí en el anterior post, veremos ejemplos prácticos donde aplicaremos lo aprendido.

FROM

Especifica de dónde queremos obtener los datos, es decir, de que tabla. Se utiliza no sólo en el comando de consulta, SELECT, sino también en los comandos UPDATE y DELETE por razones obvias, si no indicas donde está al menos lo que quieres manipular, mal vamos.

WHERE

Está clausula es donde se indican las condiciones de filtrado de los datos. Estas condiciones se definen a través de los operadores lógicos y de comparación. Pero no nos adelantemos aún, cada cosa a su tiempo 😉

Esta clausula también se usa en todos los comandos DML.

GROUP BY

La clausula GROUP BY sirve para agrupar la información. Es de gran utilidad combinada con las funciones de agregado que más adelante explicaremos.

Esta clausula es aplicable exclusivamente al comando SELECT.

HAVING

La clausula HAVING tiene siempre que ir acompañada de un GROUP BY. En ella indicamos las condiciones que debe satisfacer cada grupo y donde utilizaremos funciones de agregación. Como en el caso del GROUP BY de utilizarla será en el SELECT.

ORDER BY

Sirve para ordenar la información obtenida a través de la consulta en un determinado orden.

 

Una vez conocidas las clausulas, vamos a ver los operadores lógicos, de comparación y los predicados, lo cual nos servirá para poder indicar nuestras condiciones de filtrado en la clausula WHERE.

Operadores condicionales

Los operadores condicionales se utilizan en la lógica proposicional para admitir o rechazar proposiciones, así como para conectarlas. Los valores de estas proposiciones tendrán un valor Verdadero/Falso (0 o 1 o apagado y encendido, si lo llevamos al campo de los circuitos digitales). Los operadores lógicos operan con estas proposiciones para dar lugar a nuevos valores lógicos.

Los operadores lógicos son los cimientos de la informática, así que confío en que si habéis llegado a un manual de SQL este concepto lo teneis medianamente claro. Si no es así, os recomiendo una lectura al artículo de Wikipedia donde se explica el Álgebra de Boole.

AND

El operador AND se traduce en lógica y matemáticas como conjunción. Su resultado será verdadero si ambos operandos son verdaderos.

A B A AND B
Verdadero Verdadero Verdadero
Verdadero Falso Falso
Falso Verdadero Falso
Falso Falso Falso

OR

El operador OR es lo que en lógica se conoce como disyunción. Su resultado será verdadero cuando uno o más de sus operandos es verdadero.

A B A OR B
Verdadero Verdadero Verdadero
Verdadero Falso Verdadero
Falso Verdadero Verdadero
Falso Falso False

NOT

El operador NOT, o negación, opera sobre un sólo operando y nos devuelve su valor contrario.

A NOT A
Verdadero Falso
Falso Verdadero

 

* Para indicar estos valores en SQL indicaremos los vocablos anglosajones TRUE (Verdadero) y FALSE (Falso).

Operadores de comparación

Los operadores de comparación también son operadores lógicos como los condicionales, ya que nos devolverán un valor booleano, es decir, verdadero o falso.

Estos operadores comparan el valor de dos valores y determinan la relación existente entre ambos.

Operador Descripción
= Igual que
< Menor que
> Mayor que
<> Distinto de
<= Menor o igual que
>= Mayor o igual que
BETWEEN Existencia del valor entre un intervalo de valores
LIKE Se aplica con valores de tipo cadena y se utiliza para encontrar registros coincidentes a un patrón modelo
IN Compara conjuntos de valores
IS Compara si dos valores lógicos son iguales

 

Los operadores de comparación suelen ser usados junto a los operadores condicionales para construir expresiones más complejas. Por ejemplo, podríamos utilizar dos operadores diferentes de comparación con el operador lógico AND para determinar si ambas expresiones son verdaderas.

Dependiendo del motor que utilicemos, encontraremos otros muchos operadores de comparación, pero para eso no hay más que echarle un vistazo rápido a la documentación de dicha tecnología.

Ejemplos

Y ahora, como os prometí, vamos a ver algunos ejemplos prácticos donde apliquemos lo aprendido arriba, que es la mejor forma de asimilar todo este tocho de teoría. Los ejemplos de esta sección todavía no serán demasiado complejos, ya que por ahora lo mejor es no complicarnos mucho y asimilar la información poco a poco. Más adelante, cuando termine con la teoría de SQL haré una pildorita exclusiva de ejemplos prácticos.

Para este y para la mayoría de ejemplos utilizaremos la base de datos que definimos en el primer post de las pildoritas.

Entidad-Relacion-Final

Obtener el nombre y apellidos del empleado con DNI 99999999R

SELECT NOMBRE, APELLIDOS FROM EMPLEADOS WHERE DNI = '99999999R'

Obtener los proyectos que hayan empezado a partir del 01/01/2012 y hayan acabado antes de 31/12/2012.

SELECT * FROM PROYECTO 
WHERE FECHA_INICIO > '01/01/2012' AND FECHA_FIN < '31/12/2012'

* Como veis en la parte donde deberíamos indicar los campos hemos utilizado el carácter asterisco. Esto indica que queremos todos los campos de la tabla o tablas indicadas en el FROM

Obtener el nombre de todos los departamentos que estén en las áreas de Desarrollo y Bases de Datos

SELECT NOMBRE FROM PROYECTO WHERE AREA IN ('Desarrollo', 'Bases de Datos')

Obtener todas las compañías cuyo nombre empiece por A y sean de tipo S.L.

SELECT * FROM COMPAÑIA WHRE NOMBRE LIKE'A%' AND TIPO = 'S.L.'

* El caracter % que colocamos después de la A es el llamado carácter comodín y se utiliza para indicar cualquier cadena.

 

Y con esto ponemos fin a la segunda pildorita de SQL. Siento si me he extendido un poco en el tamaño de este post, pero no he visto forma humana de poder dividirlo en más partes sin que se pierda el contexto.

En la próxima pildorita veremos el resto de clausulas que nos quedan, GROUP BY y HAVING, y las funciones de agregación.

Índice de Pildoritas

Share
16
Apr 13

Pildoritas de Bases de Datos: SQL. Tipos de Comandos

pildoras bbdd
A petición popular (si entendemos como popular más de una persona) sigo con las Pildoritas de Bases de Datos.

Después de explicar el diseño de modelos relacionales vamos a pasar a la chicha, es decir, a crear modelos de datos relacionales y manipularlos. Para realizar esta tarea todos los motores de bases de datos relacional usan un lenguaje de datos normalizado (aunque con leves diferencias entre tecnologías) llamado SQL.

SQL (Structured Query Language) es un lenguaje declarativo de acceso a bases de datos que aplica álgebra relacional para obtener y manipular conjuntos de datos desde un modelo relacional (ahora seguramente entendáis por qué empecé con los dos anteriores posts). SQL también permite ejecutar otra serie de comandos enfocados en la definición de modelos de datos relacionales.

SQL está compuesto de dos tipos de comandos:

  • DLL (Data Definition Language): Permite crear y definir bases de datos, tablas, campos, índices...
  • DML (Data Manipulation Language): Filtra y ordena los datos que queremos manipular.

 

Comandos DDL

CREATE

Sirve para crear un nuevo objeto dentro del gestor de bases de datos. Los objetos de una bases de datos son tablas, índices, procedimientos almacenados y vistas.

Creación de una base de datos:

CREATE DATABASE NOMBRE_BASE_DE_DATOS

Creación de un índice:

CREATE INDEX NOMBRE_ÍNDICE ON "NOMBRE_TABLA" (NOMBRE_COLUMNA)

Creación de un procedimiento almacenado:

CREATE CREATE PROCEDURE NOMBRE_PROCEDIMIENTO
[PARAMETROS] 
AS 
(Sentencias SQL)
[RETURN [VALOR]]

*La definición de los procedimientos almacenados suele cambiar dependiendo del motor de bases de datos utilizado. En este caso he utilizado SQL Server, no obstante, la estructura es muy similar en el resto de motores, por lo que para definir un procedimiento almacenado en otra bases de datos con mirar la documentación os bastará.

Creación de una vista:

CREATE VIEW NOMBRE_VISTA AS
SUBCONSULTA;

ALTER

El comando ALTER permite realizar modificaciones en un objeto de la base de datos ya existente.

El uso más común del comando ALTER es el enfocado en la edición de una tabla, ALTER TABLE.

Por ejemplo, para agregar una nueva columna a una tabla ya existente ejecutaríamos el siguiente comando:

ALTER TABLE 'NOMBRE_TABLA' ADD NUEVO_CAMPO TIPO;

No obstante, el comando ALTER, como todos los comandos DLL, es aplicable a cualquier objeto de la base de datos.

DROP

Sirve para eliminar objetos de la base de datos. Por ejemplo, podríamos borrar una tabla con la siguiente sentencia:

DROP TABLE 'NOMBRE_TABLA'

 

Comandos DML

SELECT

Este comando sirve para recuperar un conjunto de datos siguiendo unos criterios de filtrado.

El comando SELECT, así como los comandos UPDATE y DELETE, necesitan su vez de una serie de clausulas, en las cuales entraré en el próximo post, que indicaran de donde obtener la información y que condiciones deben cumplir dichos datos.

No obstante, con indicar la procedencia de los datos ya podríamos crear nuestra primera consulta:

SELECT CAMPO FROM TABLA

Esta sentencia recuperaría todos los datos de la tabla, pero como podéis imaginar podemos querer filtrar estos campos para obtener sólo un subconjunto (utilizando las clausulas WHERE y HAVING) o agruparlos y ordenarlos de una determinada forma (por medio de las clausulas GROUP BY y ORDER BY)

INSERT

la sentencia INSERT agrega registros a la base de datos. La forma básica de este comando es el siguiente:

INSERT INTO 'NOMBRE_TABLA' ('COLUMNA1',['COLUMNA2,... '])
VALUES ('VALOR1', ['VALOR2,...'])

No obstante, y dependiendo del motor de bases de datos, se pueden insertar en una sentencia varios registros indicados de forma literal o incluso por medio de una consulta.

UPDATE y DELETE

La sentencia UPDATE sirve para modificar los valores de un conjunto de registros existentes en una tabla.

UPDATE NOMBRE_TABLA SET CAMPO = 'VALOR' WHERE CAMPO = 'VALOR';

El comando DELETE elimina uno o varios registros de una tabla:

DELETE FROM NOMBRE_TABLA WHERE CAMPO = 'VALOR';

Y hasta aquí ha llegado la primera pildorita de SQL. Se que ha sido un peñazo terrible, pero hay que empezar con un poco de teoría inicial para poder enterarnos de la sintaxis básica del lenguaje. En las siguientes entregas intentaré que la lectura sea más práctica y amena.

En el próximo post hablaré de las clausulas, los operadores lógicos y las funciones de agregado.

Índice de Pildoritas

Share