You are on page 1of 12

INTRODUCCIN AL LENGUAJE SQL

Basndose en el modelo relacional de Codd y en el sublenguaje de acceso a datos para


este modelo, los laboratorios de IBM definen el lenguaje SEQUEL (Structured English
QUEry Language). Sin embargo, fue Oracle quien lo introdujo por primera vez en 1979
en un programa comercial.

Sobre SQL, DDL, y DML.

SQL es un lenguaje normalizado que nos permite realizar todo tipo de operaciones en las
bases de datos relacionales. Para esto utiliza un conjunto de comandos que se pueden
clasificar en:

Comandos DDL que permiten crear y definir nuevas bases de datos, campos e
indices.
Comandos DML que permiten generar consultas para ordenar, filtrar y extraer
datos de la base de datos.

La sentencia bsica: SELECT...FROM...WHERE.

Como ustedes recordarn las bases de datos relacionales organizan la informacin en un


conjunto de tablas, con n filas y n columnas. Las filas son los registros existentes en la
tabla y las columnas son campos o atributos del objeto que representamos en la tabla.
Para realizar cualquier operacin en la base de datos debemos realizar consultas en
trminos de campos y tablas.

Una tabla de Access:

La sintaxis bsica de una consulta de seleccin es la siguiente:

SELECT Campos FROM Tabla;


En donde campos es la lista de campos(o columnas) que se deseen recuperar y tabla es el
origen de los mismos, por ejemplo:

SELECT Nombre, Telefono FROM Clientes;

Esta consulta devuelve un conjunto de registros con los campos nombre y telfono de la
tabla clientes.

SQL puede filtrar los registros de una consulta de seleccin con el fin de recuperar
solamente aquellos que cumplan unas condiciones preestablecidas. Para ello utiliza la
clusula WHERE:

SELECT * FROM Empleados WHERE Estado = 'Soltero'

El *(Asterisco) se utiliza como un comodn que hace referencia a todos los campos de las
tablas. En este caso nuestra consulta nos dar como resultado un conjunto de registros o
filas con todos los campos (o columnas) de la tabla Empleados, y solo se mostraran las
filas que cumplan con la condicin de que el campo Estado sea igual a 'Soltero'. "Es decir
listar a todos los empleados solteros"

Operadores y conectores.

Los operadores bsicos son:

= Igual
<> Desigual
> Mayor
< Menor
>= Mayor igual
<= Menor igual

Cuando seleccionamos registros con la clusula WHERE, podemos emplear estos


operadores para buscar aquellos que cumplan con determinadas condiciones. Por
ejemplo:

ID LAST_NAME FIRST_NAME SALARY POSITION


202 Johnson Bruce 5200 Analyst
203 Adams Marilyn 4500 Programmer
205 Thompson Elizabeth 4000 Programmer
207 Smith Jennifer 4500 Designer
209 Brown James 5000 Designer
211 Parker Adam 6000 Programmer

SELECT ID, LAST_NAME FROM EMPLOYEE WHERE SALARY >= 5000


En este ejemplo utilizamos el operador mayor igual para mostrar algunos datos de los
empleados que ganen 5000 o ms. La consulta nos devolvera lo siguiente:

ID LAST NAME
202 Johnson
209 Brown
211 Parker

Los conectores AND y OR pueden utilizarse para evaluar ms de una condicin en la


consulta. El operador AND une dos o ms condiciones y la consulta devolver las filas
que cumplan con todas esas condiciones. Cuando se utiliza el operador OR entre las
condiciones la consulta devolver las filas o registros que cumplan con al menos una de
las condiciones.

SELECT ID, LAST_NAME FROM EMPLOYEE WHERE POSITION = 'Programmer'


AND SALARY > 5000

ID LAST_NAME
211 Parker

SELECT ID, LAST_NAME FROM EMPLOYEE WHERE POSITION = 'Programmer'


OR SALARY > 5000

ID Last Name
202 Johnson
203 Adams
205 Thompson
211 Parker

El ejemplo anterior ilustra que el conector AND es ms exigente que el OR, en el primer
caso solo obtenemos 1 registro dado que se deben cumplir todas las condiciones (que sea
programador y que adems gane ms de 5000), mientras que en el segundo caso
obtenemos 3 registros dado que solo exigiamos que se cumpla al menos 1 de las
condiciones (que sea programador o que gane ms de 5000). Los conectores AND y OR
pueden combinarse para realizar consultas un poco ms elaboradas, y pueden utilizarse
parntesis para que el motor interprete las condiciones en el orden correcto.

SELECT ID, SALARY FROM EMPLOYEE WHERE (LAST_NAME='Adams' AND


FIRST_NAME='Marilyn') OR (LAST_NAME='Smith' AND FIRST_NAME='Jennifer')

ID SALARY
203 4500
207 4500
El operador LIKE es un operador muy til que se utiliza para comparar campos de texto
que coincidan en partes con cadenas de caracteres. Desde ya que no nos sirve de nada
para otro tipo de datos que no sea texto. Supongamos ahora que queremos listar a los
empleados cuyo apellido termine en 'SON':

SELECT ID, LAST_NAME FROM EMPLOYEE WHERE LAST_NAME LIKE


'%SON'

ID LAST_NAME
202 Johnson
205 Thompson

Ordenar los registros

La clusula ORDER BY se utiliza al final de la consulta para ordenar los registros por un
campo dado en forma ascendente (con el sufijo ASC) o en forma descendente (con el
sufijo DESC), la forma ascendente es predeterminada, y por ello no es obligatorio usar
ASC.

SELECT ID, LAST_NAME FROM EMPLOYEE WHERE LAST_NAME LIKE


'%SON' ORDER BY ID DESC

ID LAST_NAME
205 Thompson
202 Johnson

Consultas multitabla

En este punto vamos a estudiar las consultas multitabla llamadas as porque estn basadas
en ms de una tabla. Existen dos tipos de consultas multitabla:

La UNION de tablas.
La COMPOSICION de tablas.

La Unin de tablas se utiliza cuando tenemos dos tablas con las mismas columnas y
queremos obtener una nueva tabla con las filas de la primera y las filas de la segunda. En
este caso la tabla resultante tiene las mismas columnas que la primera tabla (que son las
mismas que las de la segunda tabla).

Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y
queremos una lista con todos los libros que tenemos. En este caso las dos tablas tienen las
mismas columnas, lo nico que vara son las filas, adems queremos obtener una lista de
libros (las columnas de una de las tablas) con las filas que estn tanto en libros nuevos
como las que estn en libros antiguos, en este caso utilizaremos este tipo de operacin.
El operador que permite realizar esta operacin es el operador UNION.

La composicin de tablas

La composicin de tablas consiste en concatenar filas de una tabla con filas de otra.
Obtenemos una tabla con las columnas de la primera tabla unidas a las columnas de la
segunda tabla, y las filas de la tabla resultantes son concatenaciones de filas de la primera
tabla con filas de la segunda.

A diferencia de la unin la composicin permite obtener una fila con datos de las dos
tablas, esto es muy til cuando queremos visualizar filas cuyos datos se encuentran en
dos tablas.

Tipos de composicin

Existen distintos tipos de composicin, aprenderemos a utilizarlos todos y a elegir el tipo


ms apropiado a cada caso. Los tipos de composicin de tablas son:

El producto cartesiano
El INNER JOIN
Outer Joins: LEFT / RIGHT JOIN

El producto cartesiano

El producto cartesiano se indica poniendo en la clusula FROM las tablas que queremos
componer separadas por comas, podemos obtener as el producto cartesiano de dos, tres,
o ms tablas. Tabla puede ser un nombre de tabla o un nombre de consulta. Si todas las
tablas estn en una base de datos externa, aadiremos la clusula IN basedatosexterna
despus de la ltima tabla. Pero para mejorar el rendimiento y facilitar el uso, se
recomienda utilizar una tabla vinculada en lugar de la clusula IN.

Hay que tener en cuenta que el producto cartesiano obtiene todas las posibles
combinaciones de filas por lo tanto si tenemos dos tablas de 100 registros cada una, el
resultado tendr 100x100 filas, si el producto lo hacemos de estas dos tablas con una
tercera de 20 filas, el resultado tendr 200.000 filas (100x100x20) y estamos hablando de
tablas pequeas. Se ve claramente que el producto cartesiano es una operacin costosa
sobre todo si operamos con ms de dos tablas o con tablas voluminosas.

Se puede componer una tabla consigo misma, en este caso es obligatorio utilizar un
nombre de alias por lo menos para una de las dos. Por ejemplo:

SELECT * FROM empleados, empleados emp

En este ejemplo obtenemos el producto cartesiano de la tabla de empleados con ella


misma. Todas las posibles combinaciones de empleados con empleados. Para ver cmo
funciona el producto cartesiano tomemos las tablas [empleado] y [departamento], y
creamos una consulta que halle el producto cartesiano de las dos.

SELECT * FROM empleado, departamento

Se observa que tenemos las dos filas de la primera consulta combinadas con las dos filas
de la segunda. Esta operacin no es de las ms utilizadas, normalmente cuando queremos
componer dos tablas es para aadir a las filas de una tabla, una fila de la otra tabla, por
ejemplo aadir a los empleados el nombre de su correspondiente departamento, esto
equivaldra a un producto cartesiano con una seleccin de filas:

SELECT * FROM empleado ,departamento WHERE


empleado.cod_dto=departamento.cod_dto

Combinamos todos los empleados con todos los departamentos pero luego seleccionamos
los que cumplan que el cdigo de departamento de la tabla de empleados sea igual al
cdigo de departamento de la tabla de departamentos, por lo tanto nos quedamos con los
datos de empleados combinados con los datos del departamento correspondiente. Las
columnas que aparecen en la clusula WHERE de nuestra consulta anterior se denominan
columnas de emparejamiento ya que permiten emparejar las filas de las dos tablas. Las
columnas de emparejamiento no tienen por qu estar incluidas en la lista de seleccin.
Normalmente emparejamos tablas que estn relacionadas entre s y una de las columnas
de emparejamiento es clave principal, pues en este caso, cuando una de las columnas de
emparejamiento tienen un ndice definido es ms eficiente utilizar otro tipo de
composicin, el INNER JOIN.

El INNER JOIN

El INNER JOIN es otro tipo de composicin de tablas, permite emparejar filas de


distintas tablas de forma ms eficiente que con el producto cartesiano cuando una de las
columnas de emparejamiento est indexada. Ya que en vez de hacer el producto
cartesiano completo y luego seleccionar la filas que cumplen la condicin de
emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla las
filas que cumplen la condicin, con lo cual se emparejan slo las filas que luego aparecen
en el resultado. Se pueden definir varias condiciones de emparejamiento unidas por los
operadores AND y OR poniendo cada condicin entre parntesis. Ejemplo:

SELECT * FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab)


AND (pedidos.producto = productos.idproducto)

Se pueden combinar ms de dos tablas. En este caso hay que sustituir en la sintaxis una
tabla por un INNER JOIN completo. Por ejemplo:
SELECT * FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie)
INNER JOIN empleados ON pedidos.rep = empleados.numemp

En vez de tabla1 hemos escrito un INNER JOIN completo, tambin podemos escribir:

SELECT * FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON


pedidos.rep = empleados.numemp) ON pedidos.clie = clientes.numclie

En este caso hemos sustituido tabla2 por un INNER JOIN completo.

Ejemplo:

SELECT * FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie

Tabla1 y tabla2 son especificaciones de tabla, (nombre de tabla con alias o no, nombre de
consulta guardada), de las tablas cuyos registros se van a combinar. Pueden ser las dos la
misma tabla, en este caso es obligatorio definir al menos un alias de tabla. Observar que
dentro de la clusula ON los nombres de columna deben ser nombres cualificados (llevan
delante el nombre de la tabla y un punto). col1, col2 son las columnas de
emparejamiento. Las columnas de emparejamiento deben contener la misma clase de
datos, las dos de tipo texto, de tipo fecha etc... comp representa cualquier operador de
comparacin ( =, <, >, <=, >=, o <> ) y se utiliza para establecer la condicin de
emparejamiento.

Outer Joins: LEFT / RIGHT JOIN

Supongamos que tenemos que listar los departamentos de la cia. con sus respectivos
empleados a partir de las siguientes tablas:

LEGAJO NOMBRE DEPTO


29003 Lopez Mario 1
28750 Fernandez Ricardo 2
29043 Gimenez Leticia 1
28009 Romario Pedro 1
27773 Abramovich Juan 2
ID NOMBRE
1 COMPRAS
2 MARKETING
3 SISTEMAS

SELECT * FROM DEPARTAMENTO INNER JOIN EMPLEADO ON


DEPARTAMENTO.ID = EMPLEADO.DEPTO

Y el resultado es:
ID NOMBRE LEGAJO NOMBRE DEPTO
1 COMPRAS 29003 Lopez Mario 1
1 COMPRAS 29043 Gimenez Leticia 1
1 COMPRAS 28009 Romario Pedro 1
2 MARKETING 28750 Fernandez Ricardo 2
2 MARKETING 27773 Abramovich Juan 2

El problema de este listado, es que no nos muestra los departamentos que no tienen
empleados, sino que simplemente los obvia. Si quisieramos mostrar aquellos registros
cuya tabla1 no se corresponde con ningun registro de la tabla2 tenemos que utilizar un
outer join. En este caso utilizamos un LEFT JOIN para mostrar todos los registros de la
tabla1 (o tabla izquierda) incluso aquellos que no tienen correspondencia con ningun
registro de la tabla2, para estos que no se corresponden con otros valores se les concatena
un conjunto de valores null.

SELECT * FROM DEPTO LEFT JOIN EMPLEADO ON DEPTO.ID =


EMPLEADO.DEPTO

ID NOMBRE LEGAJO NOMBRE DEPTO


1 COMPRAS 29003 Lopez Mario 1
1 COMPRAS 29043 Gimenez Leticia 1
1 COMPRAS 28009 Romario Pedro 1
2 MARKETING 28750 Fernandez Ricardo 2
2 MARKETING 27773 Abramovich Juan 2

Si el caso fuera inverso, digamos que existiesen empleado que no esten asignados a
ningun departamento, lo correcto para mostrar todos los empleados, incluso aquellos que
no tengan departamento, sera utilizar un RIGHT JOIN. De todos modos esto depende
del orden en que se tomen las tablas al realizar la consulta, o sea que si usamos RIGHT
JOIN es porque suponemos que empleado es la segunda tabla que mencionamos (la del
lado derecho).

Las funciones

SQL cuenta con un conjunto de funciones muy tiles para realizar clculos y operaciones
sobre los registros de una tabla o consulta. Dependiendo del motor de base de datos que
se utilice podr encontrarse con mayor o menor nmero de funciones, pero a
continuacin se nombran las ms usuales en todas las bases de datos.

AVG - Promedio:

Calcula la media aritmtica de un conjunto de valores contenidos en un campo


especificado de una consulta. Su sintaxis es la siguiente

Avg(expr)
Donde expr representa el campo que contiene los datos numricos para los que se desea
calcular la media o una expresin que realiza un clculo utilizando los datos de dicho
campo. La media calculada por Avg es la media aritmtica (la suma de los valores
dividido por el nmero de valores). La funcin Avg no incluye ningn campo Null en el
clculo.

SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos > 100;

Count - Cantidad de registros:

Calcula el nmero de registros devueltos por una consulta. Su sintaxis es la siguiente

Count(expr)

En donde expr contiene el nombre del campo que desea contar. Los operandos de expr
pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual
puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de
SQL). Puede contar cualquier tipo de datos incluso texto. Aunque expr puede realizar un
clculo sobre un campo, Count simplemente cuenta el nmero de registros sin tener en
cuenta qu valores se almacenan en los registros. La funcin Count no cuenta los
registros que tienen campos null a menos que expr sea el carcter comodn asterisco (*).
Si utiliza un asterisco, Count calcula elnmero total de registros, incluyendo aquellos que
contienen campos null. Count(*) es considerablemente ms rpida que Count(Campo).
No se debe poner el asterisco entre dobles comillas ('*').

SELECT Count(*) AS Total FROM Pedidos;

Si expr identifica a mltiples campos, la funcin Count cuenta un registro slo si al


menos uno de los campos no es Null. Si todos los campos especificados son Null, no se
cuenta el registro. Hay que separar los nombres de los campos con ampersand (&).

SELECT Count(FechaEnvo & Transporte) AS Total FROM Pedidos;

Max, Min - Mximo y Mnimo:

Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo


especifico de una consulta. Su sintaxis es:

Min(expr)
Max(expr)

En donde expr es el campo sobre el que se desea realizar el clculo. Expr pueden incluir
el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser
intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL).

SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'Espaa';


SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'Espaa';

Sum - Suma:

Devuelve la suma del conjunto de valores contenido en un campo especifico de una


consulta. Su sintaxis es:

Sum(expr)

En donde expr respresenta el nombre del campo que contiene los datos que desean
sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos.
Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante
o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las
funciones agregadas de SQL).

SELECT Sum(PrecioUnidad * Cantidad) AS Total FROM DetallePedido;

Agrupar registros

GROUP BY sirve para agrupar varios registros de una tabla que coincidan en el campo
especificado junto a la clusula GROUP BY en un nico registro.

Ejemplo: GROUP BY departamento agrupar a todos los registros de la tabla empleado


por departamento y la tabla de resultado tendr tantos registros como departamento tenga
la tabla original.

EMPLEADO SALARIO DEPTO


Gmez 1250 COMPRAS
Perez 1300 CONTABLE
Jurez 950 COMPRAS
Torres/td> 1500 CONTABLE

SELECT * FROM EMPLEADO GROUP BY DEPTO

EMPLEADO SALARIO DEPTO


Gmez 1250 COMPRAS
Perez 1300 CONTABLE

Ahora bien, la base de datos ha obtenido de nuestra tabla original solo dos registros, uno
para cada departamento, que es el criterio de agrupacin en nuestra clusula GROUP
BY, sin embargo que aparezcan los valores [Gomez-1250; Perez-1300] es totalmente
arbitrario ya que la base de datos ha tomado alguna funcin predeterminada para resumir
dichos valores. En otras bases de datos como Access se nos pedir que pongamos
explicitamente una funcin para los campos que no estan enumerados en la clusula
GROUP BY.

As que bien, el objetivo de agrupar los registros de una tabla es entonces poder calcular
en base a estos grupos algn tipo de funcin como las que enumeramos arriba (Count,
Max, Min, AVG.. y otras tantas). De este modo SQL nos servir para algo ms til como
por ejemplo calcular el salario promedio de todos los empleados, o de los grupos de
empleados por departamento.

Select AVG(Salario) From Empleados

AVG(Salario)
1250

Select Departamento, AVG(Salario) From Empleados Group by Departamento

Departamento AVG(Salario)
COMPRAS 1100
CONTABLE 1400

WHERE Y HAVING

Como ya sabemos la clusula Where se utiliza para filtrar registros de una tabla en base a
algn criterio. Having tambin sirve para filtrar registros, pero filtra los registros que han
sido agrupados. Por lo tanto Having se usa despus del Group By y antes de Order By.

Select Departamento, AVG(Salario) From Empleados Where Salario > 1000 Group By
Departamento

Departamento AVG(Salario)
COMPRAS 1250
CONTABLE 1400

Select Departamento, AVG(Salario) From Empleados Group By Departamento Having


AVG(Salario) > 1000

Departamento AVG(Salario)
COMPRAS 1100
CONTABLE 1400

Si quisiramos conocer que departamentos superan los 1300 pesos de salario promedio
teniendo en cuenta solo a los empleados con un salario superior a 1000, tendramos:

Select Departamento, AVG(Salario) From Empleados Where Salario > 1000 Group by
Departamento Having AVG(Salario) > 1300
Y el resultado es:

Departamento AVG(Salario)
CONTABLE 1400

You might also like