Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SQL SELECT
SQL DISTINCT
SQL WHERE
SQL AND OR
SQL IN
SQL BETWEEN
SQL LIKE
SQL ORDER BY
SQL Fonciones
SQL COUNT
SQL GROUP BY
SQL HAVING
SQL ALIAS
SQL Join
SQL Outer Join
SQL Concatenar
SQL SUBSTRING
SQL TRIM
Existen estándares para SQL. Sin embargo, el SQL que puede utilizarse en cada uno de las
principales RDBMS actuales viene en distintas formas. Esto se debe a dos razones: 1) el
estándar SQL es bastante complejo, y no es práctico implementar el estándar completo, y 2)
cada proveedor de base de datos necesita una forma de diferenciar su producto de otros. En
esta guía de referencia, dichas diferencias se señalarán cuando sea apropiado.
Este sitio de la guía de referencia SQL enumera los comandos SQL normalmente utilizados, y
se divide en las siguientes secciones :
Para cada comando, primero se presentará y explicará la sintaxis SQL, seguida por un ejemplo.
Al final de esta guía de referencia, deberá tener una idea general de la sintaxis SQL. Además,
deberá poder realizar consultas SQL utilizando la sintaxis apropiada. Según mi experiencia
creo que el comprender lo básico de SQL es mucho más fácil que dominar todas las
dificultades de este lenguaje de base de datos, y espero que también llegue a la misma
conclusión.
Si está interesado en cómo recuperar datos utilizando SQL, le recomendamos que empiece
con la sección Comandos SQL. Si está interesado en comprender cómo puede utilizarse SQL
para manipular una tabla de base de datos, le recomendamos que comience con la
sección Manipulación de Tabla. Si está buscando ayuda sobre un comando SQL específico,
puede utilizar el Mapa del Sitio para encontrar el comando que está buscando.
Bien, suficiente introducción. Agregue este sitio a favoritos ahora y comience a aprender
SQL!
Nota: Si enseña SQL o da una clase relacionada con bases de dato, puede realizar un enlace a
este sitio como material de referencia para sus alumnos.
COMANDOS SQL
¿Para qué utilizamos los comandos SQL? El uso común es la selección de datos desde tablas
ubicadas en una base de datos. Inmediatamente, vemos dos palabras claves:
necesitamos SELECT la información FROM una tabla. (Note que la tabla es un contenedor que
reside en la base de datos donde se almacena la información. Para obtener más información
acerca de cómo manipular tablas, consulte la Sección Manipulación de Tabla). Por lo tanto
tenemos la estructura SQL más básica:
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Podemos utilizar esta tabla como ejemplo a lo largo de la guía de referencia (esta tabla
aparecerá en todas las secciones). Para seleccionar todos los negocios en esta tabla,
ingresamos,
Pueden seleccionarse los nombres de columnas múltiples, así como también los nombres de
tablas múltiples.
La palabra clave SELECT nos permite tomar toda la información de una columna (o columnas)
en una tabla. Esto, obviamente, significa necesariamente que habrá redundancias. ¿Qué
sucedería si sólo deseamos seleccionar cada elemento DISTINCT? Esto es fácil de realizar en
SQL. Todo lo que necesitamos hacer es agregar DISTINCT luego de SELECT. La sintaxis es la
siguiente:
Por ejemplo, para seleccionar todos los negocios distintos en la Tabla Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT DISTINCT store_name FROM Store_Information;
Resultado:
Store_Name
Los Angeles
San Diego
Boston
Luego, podríamos desear seleccionar condicionalmente los datos de una tabla. Por ejemplo,
podríamos desear sólo recuperar los negocios con ventas mayores a 1.000€ dólares
estadounidenses. Para ello, utilizamos la palabra clave WHERE. La sintaxis es la siguiente:
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "condición";
Por ejemplo, para seleccionar todos los negocios con ventas mayores a 1000 dólares
estadounidenses en la Tabla Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT Store_Name
FROM Store_Information
WHERE Sales > 1000;
Resultado:
Store_Name
Los Angeles
En la sección anterior, hemos visto que la palabra clave WHERE también puede utilizarse para
seleccionar datos condicionalmente desde una tabla. Esta condición puede ser una condición
simple (como la que se presenta en la sección anterior), o puede ser una condición compuesta.
Las condiciones compuestas están formadas por múltiples condiciones simples conectadas
por AND u OR. No hay límites en el número de condiciones simples que pueden presentarse
en una sola instrucción SQL.
{}+ significa que la expresión dentro de las llaves ocurrirá una o más veces. Note
que AND u OR pueden utilizarse indistintamente. Además, podemos utilizar el símbolo
paréntesis ( ) para indicar el orden de la condición.
Por ejemplo, podemos desear seleccionar todos los negocios con ventas mayores a 1000€
dólares estadounidenses o todos los negocios con ventas menores a 500€ dólares
estadounidenses pero mayores a 275€ dólares estadounidenses en la
Tabla Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
San Francisco 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT Store_Name
FROM Store_Information
WHERE Sales > 1000
OR (Sales < 500 AND Sales > 275);
Resultado:
Store_Name
Los Angeles
San Francisco
En SQL, hay dos usos de la palabra clave IN, y esta sección introduce aquél relacionado con la
cláusula WHERE. Cuando se lo utiliza en este contexto, sabemos exactamente el valor de los
valores regresados que deseamos ver para al menos una de las columnas. La sintaxis para el
uso de la palabra clave IN es la siguiente:
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "nombre_columna" IN (''valor1', ''valor2', ...);
El número de valores en los paréntesis pueden ser uno o más, con cada valor separado por
comas. Los valores pueden ser números o caracteres. Si hay sólo un valor dentro del
paréntesis, este comando es equivalente a
Por ejemplo, podríamos desear seleccionar todos los registros para los negocios de Los
Ángeles y San Diego en la Tabla Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
San Francisco 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT *
FROM Store_Information
WHERE Store_Name IN ('Los Angeles', 'San Diego');
Resultado:
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Esto seleccionará todas las filas cuya columna tenga un valor entre 'valor1' y 'valor2'.
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
San Francisco 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT *
FROM Store_Information
WHERE Txn_Date BETWEEN '06-Jan-1999' AND '10-Jan-1999';
Tenga en cuenta que la fecha puede almacenarse en diferentes formatos según las diferentes
bases de datos. Esta guía de referencia simplemente elige uno de los formatos.
Resultado:
Tabla Store_Information
Store_Name Sales Txn_Date
LOS ANGELES 1500 05-Jan-1999
SAN DIEGO 250 07-Jan-1999
SAN FRANCISCO 300 08-Jan-1999
BOSTON 700 08-Jan-1999
Deseamos encontrar todos los negocios cuyos nombres contengan ‘AN’. Para hacerlo,
ingresamos,
SELECT *
FROM Store_Information
WHERE Store_Name LIKE '%AN%';
Resultado:
Por ejemplo, podríamos desear enumerar los contenidos de la Tabla Store_Information según
la suma en dólares, en orden descendente:
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
San Francisco 300 08-Jan-1999
Boston 700 08-Jan-1999
Ingresamos,
SELECT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC;
Resultado:
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
Boston 700 08-Jan-1999
San Francisco 300 08-Jan-1999
San Diego 250 07-Jan-1999
Ya que hemos comenzado trabajando con números, la siguiente pregunta natural a realizarse
es si es posible hacer cálculos matemáticos con aquellos números, tales como sumas, o sacar
un promedio. ¡La respuesta es sí! SQL tiene varias funciones aritméticas, y estas son:
AVG
COUNT
MAX
MIN
SUM
Por ejemplo, si deseamos obtener la sumatoria de todas las ventas de la siguiente tabla,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
ingresaríamos
SELECT SUM(Sales) FROM Store_Information;
Resultado:
SUM(Sales)
2750
2750 dólares estadounidenses representa la suma de todas las entradas de Ventas: 1500 +
250 + 300 + 700.
Además de utilizar dichas funciones, también es posible utilizar SQL para realizar tareas
simples como suma (+) y resta (-). Para ingresar datos del tipo caracter, hay también varias
funciones de cadenas disponibles, tales como funciones de concatenación, reducción y
subcadena. Los diferentes proveedores RDBMS tienen diferentes implementaciones de
funciones de cadenas, y es mejor consultar las referencias para sus RDBMS a fin de ver cómo
se utilizan estas funciones.
SQL > Comandos SQL > Count
Otra función aritmética es COUNT. Esto nos permite COUNT el número de filas en una tabla
determinada. La sintaxis es,
SELECT COUNT("nombre_columna")
FROM "nombre_columna";
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
ingresamos,
SELECT COUNT (Store_Name)
FROM Store_Information;
Resultado:
COUNT (Store_Name)
4
COUNT y DISTINCT pueden utilizarse juntos en una instrucción para determinar el número de
las distintas entradas en una tabla. Por ejemplo, si deseamos saber el número de los distintos
negocios, ingresaríamos,
Resultado:
COUNT (DISTINCT Store_Name)
3
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Deseamos saber las ventas totales para cada negocio. Para hacerlo, ingresaríamos,
SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name;
Resultado:
Store_Name SUM(Sales)
Los Angeles 1800
San Diego 250
Boston 700
Otra cosa que la gente puede querer hacer es limitar el resultado según la suma
correspondiente (o cualquier otra función de agregado). Por ejemplo, podríamos desear ver
sólo los negocios con ventas mayores a 1 500 €, dólares. En vez de utilizar la
cláusula WHERE en la instrucción SQL, a pesar de que necesitemos utilizar la
cláusula HAVING, que se reserva para funciones de agregados. La cláusula HAVINGse coloca
generalmente cerca del fin de la instrucción SQL, y la instrucción SQL con la cláusula HAVING.
puede o no incluir la cláusula GROUP BY sintaxis para HAVING es,
SELECT "nombre1_columna", SUM("nombre2_columna")
FROM "nombre_tabla"
GROUP BY "nombre1_columna"
HAVING (condición de función aritmética);
Nota: La cláusula GROUP BY es opcional.
En nuestro ejemplo, tabla Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
ingresaríamos,
SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name
HAVING SUM(Sales) > 1500;
Resultado:
Store_Name SUM(Sales)
Los Angeles 1800
Nos concentraremos ahora en el uso de alias. Hay dos tipos de alias que se utilizan con mayor
frecuencia. Alias de columna y alias de tabla.
Resumiendo, los alias de columna existen para ayudar en la organización del resultado. En el
ejemplo anterior, cualquiera sea el momento en que vemos las ventas totales, se enumeran
como SUM(Sales). Mientras esto es comprensible, podemos ver casos donde el título de la
columna pueden complicarse (especialmente si incluye varias operaciones aritméticas). El uso
de un alias de columna haría el resultado mucho más legible.
El segundo tipo de alias es el alias de tabla. Esto se alcanza al colocar un alias directamente
luego del nombre de tabla en la cláusula FROM. Esto es conveniente cuando desea obtener
información de dos tablas separadas (el término técnico es 'realizar uniones'). La ventaja de
utiliza un alias de tablas cuando realizamos uniones es rápidamente aparente cuando
hablamos de uniones.
Antes de comenzar con las uniones, miremos la sintaxis tanto para el alias de columna como
de tabla:
SELECT "alias_tabla"."nombre1_columna" "alias_columna"
FROM "nombre_tabla" "alias_tabla";
Brevemente, ambos tipos de alias se colocan directamente después del elemento por el cual
generan el alias, separados por un espacio en blanco. Nuevamente utilizamos nuestra
tabla, Store_Information,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Utilizamos el mismo ejemplo que en la sección SQL GROUP BY, salvo que hemos colocado
tanto el alias de columna como el alias de tabla:
Resultado:
Store Total Sales
Los Angeles 1800
San Diego 250
Boston 700
Note la diferencia en el resultado: los títulos de las columnas ahora son diferentes. Ese es el
resultado de utilizar el alias de columna. Note que en vez de “Sum(Sales)” de algún modo
enigmático, ahora tenemos “Total Sales”, que es más comprensible, como título de columna. La
ventaja de utilizar un alias de tablas no es fácil de ver en este ejemplo. Sin embargo, se tornará
evidente en la siguiente sección.
Ahora miremos las uniones. Para realizar uniones en SQL se requieren mucho de los
elementos que ya hemos presentado. Digamos que tenemos las siguientes dos tablas:
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
y queremos saber las ventas por región. Vemos que la tabla Geography incluye información
sobre regiones y negocios, y la tabla Store_Information contiene información de ventas para
cada negocio. Para obtener la información de ventas por región, debemos combinar la
información de las dos tablas. Al examinar las dos tablas, encontramos que están enlazadas a
través del campo común “nombre_negocio” Primero presentaremos la instrucción SQL y
explicaremos el uso de cada segmento después:
Resultado:
REGION SALES
East 700
West 2050
Las primeras dos líneas le indican a SQL que seleccione dos campos, el primero es el campo
"Region_Name" de la tabla Geography(denominado REGION), y el segundo es la suma del
campo "Sales" de la tabla Store_Information (denominado SALES). Note como se utilizan los
alias de tabla aquí: Geography se denomina A1, e Store_Information se denomina A2. Sin los
alias, la primera línea sería
que es mucho más problemática. En esencia, los alias de tabla facilitan el entendimiento de la
totalidad de la instrucción SQL, especialmente cuando se incluyen tablas múltiples.
Anteriormente, hemos visto una unión izquierda, o interna, donde seleccionamos filas comunes
a las tablas que participan en la unión. ¿Qué sucede en los casos donde estamos interesados
en la selección de elementos en una tabla sin importar si se encuentran presentes en la
segunda tabla? Ahora necesitaremos utilizar el comando SQL OUTER JOIN.
La sintaxis para realizar una unión externa en SQL depende de la base de datos. Por ejemplo,
en Oracle, colocaremos un "(+)" en la cláusula WHERE del otro lado de la tabla para la que
queremos incluir todas las filas.
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
y queremos saber la suma de las ventas de todos los negocios. Si realizamos una unión
regular, no podríamos obtener lo que deseamos debido a que habríamos omitido “New York"
ya que no aparece en la tabla Store_Information. Por lo tanto, necesitamos realizar una unión
externa respecto de las dos tablas anteriores:
Note que en este caso, estamos utilizando la sintaxis Oracle para unión externa.
Resultado:
Store_Name SALES
Boston 700
New York
Los Angeles 1800
San Diego 250
Nota: Se devuelve NULL cuando no hay coincidencia en la segunda tabla. En este caso, “New
York" no aparece en la tabla Store_Information, por lo tanto su columna "SALES"
correspondiente es NULL.
Algunas veces es necesario combinar en forma conjunta (concatenar) los resultados de varios
campos diferentes. Cada base de datos brinda una forma para realizar esto:
MySQL: CONCAT( )
Oracle: CONCAT( ), ||
SQL Server: +
Concatenar cad1, cad2, cad3, y cualquier otra cadena juntas. Por favor note que la función
CONCAT( ) de Oracle sólo permite dos argumentos – sólo dos cadenas pueden colocarse
juntas al mismo tiempo utilizando esta función. Sin embargo, es posible concatenar más de dos
cadenas al mismo tiempo en Oracle utilizando '||'.
Tabla Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
Ejemplo 1
MySQL/Oracle:
SELECT CONCAT (Region_Name, Store_Name) FROM Geography
WHERE Store_Name = 'Boston';
Resultado:
'EastBoston'
Ejemplo 2
Oracle:
SELECT Region_Name || ' ' || Store_Name FROM Geography
WHERE Store_Name = 'Boston';
Resultado:
'East Boston'
Ejemplo 3
SQL Server:
SELECT Region_Name + ' ' + Store_Name FROM Geography
WHERE Store_Name = 'Boston';
Resultado:
'East Boston'
SQL > Comandos SQL > Substring Funcion
La función de subcadena en SQL se utiliza para tomar una parte de los datos almacenados.
Esta función tiene diferentes nombres según las diferentes bases de datos:
Los usos más frecuentes son los siguientes (utilizaremos SUBSTR( ) aquí):
SUBSTR (str, pos)
Selecciona todos los caracteres de <str> comenzando con posición <pos>. Note que esta
sintaxis no es compatible en SQL Server.
Comienza con el carácter <pos> en la cadena <str> y selecciona los siguientes caracteres
<len>.
Tabla Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
Ejemplo 1
SELECT SUBSTR (Store_Name, 3)
FROM Geography
WHERE Store_Name = 'Los Angeles';
Resultado:
's Angeles'
Ejemplo 2
SELECT SUBSTR (Store_Name, 2, 4)
FROM Geography
WHERE Store_Name = 'San Diego';
Resultado:
'an D'
La función TRIM en SQL se utiliza para eliminar un prefijo o sufijo determinado de una cadena.
El patrón más común a eliminarse son los espacios en blanco. Esta función tiene diferentes
nombres según las diferentes bases de datos:
TRIM( [[ LOCATION] [remstr] FROM ] str): [LOCATION] puede ser LÍDER, REMANENTE, o
AMBAS. Esta función se deshace del patrón [remstr] tanto para el comienzo de la cadena como
para el final, o para ambos. Si no se especifica ningún [remstr], los espacios en blanco se
eliminarán.
LTRIM (str): Elimina todos los espacios en blanco del comienzo de la cadena.
RTRIM (str): Elimina todos los espacios en blanco del final de la cadena.
Ejemplo 1
SELECT TRIM(' Sample ');
Resultado:
'Sample'
Ejemplo 2
SELECT LTRIM(' Sample ');
Resultado:
'Sample '
Ejemplo 3
SELECT RTRIM(' Sample ');
Resultado:
' Sample'
Las tablas son la estructura básica donde se almacena la información en la base de datos.
Dado que en la mayoría de los casos, no hay forma de que el proveedor de base de datos sepa
con antelación cuales son sus necesidades de almacenamiento de datos, es probable que
necesite crear tablas en la base de datos usted mismo. Muchas herramientas de base de datos
le permiten crear tablas sin ingresar SQL, pero debido a que las tablas son los contenedores de
toda la información, es importante incluir la sintaxis CREATE TABLE en esta guía de
referencia.
Antes de sumergirnos en la sintaxis SQL para CREATE TABLE, es una buena idea
comprender lo que se incluye en una tabla. Las tablas se dividen en filas y columnas. Cada fila
representa una parte de los datos, y cada columna puede pensarse como la representación de
un componente de aquella parte de los datos. Entonces, por ejemplo, si tenemos una tabla
para registrar la información del cliente, las columnas pueden incluir información tal como
Primer Nombre, Apellido, Dirección, Ciudad, País, Fecha de Nacimiento y demás. Como
resultado, cuando especificamos una tabla, incluimos los títulos de columna y los tipos de datos
para esta columna en particular.
Entonces ¿Qué son los tipos de datos? Generalmente, los datos se generan en formas
variadas. Podría ser un entero (tal como 1), un número real (tal como 0,55), una línea (tal como
'sql'), una fecha/expresión de tiempo (tal como '25-ene-2000 03:22:22'), o incluso en formato
binario. Cuando especificamos una tabla, necesitamos especificar el tipo de dato asociado con
cada columna (es decir, especificaremos que ‘First_Name’ es de char(50) tipo – lo que significa
que es una línea con 50 caracteres). Una cosa a tener en cuenta es que las diferentes bases
de datos relacionales permiten diferentes tipos de datos, entonces es prudente consultar
primero una referencia específica de base de datos.
Puede colocar restricciones para limitar el tipo de dato que puede ingresarse en una tabla.
Dichas restricciones pueden especificarse cuando la tabla se crea por primera vez a través de
la instrucción CREATE TABLE, o luego de crear la tabla a través de la instrucción ALTER
TABLE.
NOT NULL
En forma predeterminada, una columna puede ser NULL. Si no desea permitir un valor NULL
en una columna, querrá colocar una restricción en esta columna especificando que NULL no es
ahora un valor permitido.
Las columnas “SID” y “Last_Name” no incluyen NULL, mientras que “First_Name” puede incluir
NULL.
UNIQUE
La restricción UNIQUE asegura que todos los valores en una columna sean distintos.
La columna “SID” no puede incluir valores duplicados, mientras dicha restricción no se aplica
para columnas “Last_Name” y “First_Name”.
Por favor note que una columna que se especifica como clave primaria también puede ser
única. Al mismo tiempo, una columna que es única puede o no ser clave primaria.
CHECK
La restricción CHECK asegura que todos los valores en una columna cumplan ciertas
condiciones.
Por favor note que la restricción CHECK no sea ejecutada por MySQL en este momento.
La clave primaria se utiliza para identificar en forma única cada línea en la tabla. Puede ser
parte de un registro real, o puede ser un campo artificial (uno que no tiene nada que ver con el
registro real). Una clave primaria puede consistir en uno o más campos en una tabla. Cuando
se utilizan múltiples campos como clave primaria, se los denomina claves compuestas.
Las claves primarias pueden especificarse cuando se crea la tabla (utilizando CREATE
TABLE) o cambiando la estructura existente de la tabla (utilizando ALTER TABLE).
MySQL:
CREATE TABLE Customer
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));
Oracle:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
SQL Server:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
MySQL:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
Oracle:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
SQL Server:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
Nota: Antes de utilizar el comando ALTER TABLE para agregar una clave primaria, necesitará
asegurarse de que el campo esté definido como 'NOT NULL' -- en otras palabras, NULL no
puede aceptarse como valor para ese campo.
Una clave externa es un campo (o campos) que señala la clave primaria de otra tabla. El
propósito de la clave externa es asegurar la integridad referencial de los datos. En otras
palabras, sólo se permiten los valores que se esperan que aparezcan en la base de datos.
Por ejemplo, digamos que tenemos dos tablas, una tabla CUSTOMER que incluye todos los
datos del CUSTOMER, y la tabla ORDERS que incluye los pedidos del CUSTOMER. La
restricción aquí es que todos los pedidos deben asociarse con un CUSTOMER que ya se
encuentra en la tabla CUSTOMER. En este caso, colocaremos una clave externa en la
tabla ORDERS y la relacionaremos con la clave primaria de la tabla CUSTOMER. De esta
forma, nos aseguramos que todos los pedidos en la tabla ORDERS estén relacionadas con
un CUSTOMER en la tabla CUSTOMER. En otras palabras, la tabla ORDERS no puede
contener información de un CUSTOMER que no se encuentre en la tabla CUSTOMER.
Tabla CUSTOMER
Nombre de Columna Característica
SID Clave Primaria
Last_Name
First_Name
Tabla ORDERS
Nombre de Columna Característica
Order_ID Clave Primaria
Order_Date
Customer_SID Clave Externa
Amount
MySQL:
Oracle:
SQL Server:
MySQL:
Oracle:
SQL Server:
Las vistas pueden considerarse como tablas virtuales. Generalmente hablando, una tabla tiene
un conjunto de definiciones, y almacena datos físicamente. Una vista también tiene un conjunto
de definiciones, que se construye en la parte superior de la(s) tabla(s) u otra(s) vista(s), y no
almacena datos físicamente.
La “Instrucción SQL” puede ser cualquiera de las instrucciones SQL que hemos descripto en
esta guía de referencia.
Utilicemos un ejemplo simple para ilustrar. Supongamos que tenemos la siguiente tabla:
Tabla Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date datetime
y deseamos crear una vista denominada V_Customer que contiene sólo las columnas
First_Name, Last_Name y País de esta tabla, ingresaríamos
View V_Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Country char(25)
Podemos utilizar también una vista para aplicar uniones a dos tablas. En este caso, los
usuarios sólo ven una vista en vez de dos tablas, y la instrucción SQL que los usuarios
necesitan emitir se vuelve mucho más simple. Digamos que tenemos las siguientes dos tablas:
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
y deseamos construir una vista que tenga ventas organizadas según la región. Colocaríamos la
siguiente instrucción SQL:
Esto nos brinda una vista, V_REGION_SALES, que se ha definido para las ventas de los
negocios según los registros de la región. Si deseamos saber el contenido de esta vista,
ingresamos,
Resultado:
REGION SALES
East 700
West 2050
Los índices nos ayudan a obtener datos de las tablas en forma más rápida. Utilicemos un
ejemplo para ilustrar este punto: Digamos que estamos interesados en leer en un libro de
jardinería acerca de cómo cultivar pimientos. En vez de leer el libro desde el comienzo hasta
que encontremos una sección sobre pimientos, es mucho más rápido para nosotros ir a la
sección índice al final del libro, ubicar qué páginas contienen la información sobre pimientos, y
luego dirigirnos a esas páginas directamente. Al dirigirnos al índice primero ahorramos tiempo y
seguramente es el método más eficiente para ubicar la información que necesitamos.
El mismo principio se aplica para la obtención de datos desde una tabla de base de datos. Sin
un índice, el sistema de base de datos lee a través de toda la tabla (este proceso se denomina
“escaneo de tabla”) para localizar la información deseada. Con el índice correcto en su lugar, el
sistema de base de datos puede entonces primero dirigirse al índice para encontrar de dónde
obtener los datos, y luego dirigirse a dichas ubicaciones para obtener los datos necesarios.
Esto es mucho más rápido.
Por lo tanto, generalmente se recomienda crear índices en tablas. Un índice puede cubrir una o
más columnas. La sintaxis general para la creación de un índice es:
No hay una regla estricta respecto de cómo nombrar un índice. El método generalmente
aceptado es colocar un prefijo, tal como “IDX_”, antes del nombre de un índice para evitar la
confusión con otros objetos de la base de datos. También es una buena idea brindar
información sobre qué tabla y columna(s) se utilizará el índice.
Por favor note que la sintaxis exacta para CREATE INDEX puede ser distinta según las
diferentes bases de datos. Debería consultar con su manual de referencia de base de datos
para obtener la sintaxis precisa.
Manipulación de Tabla
Una vez que se crea la tabla en la base de datos, hay muchas ocasiones donde uno puede
desear cambiar la estructura de la tabla. Los casos típicos incluyen los siguientes:
Por favor note que lo anterior no es una lista exhaustiva. Hay otras instancias donde ALTER
TABLE se utiliza para cambiar la estructura de la tabla, tales como cambiar la especificación de
la clave primaria o agregar una restricción única para una columna.
La sintaxis SQL para ALTER TABLE es
[modificar especificación] depende del tipo de modificación que deseamos realizar. Para los
usos mencionados anteriormente, las instrucciones [modificar especificación] son:
Tabla Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date datetime
Primero, deseamos agregar una columna denominada “Gender” a esta tabla. Para hacerlo,
ingresamos,
Table Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date datetime
Gender char(1)
Table customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Addr char(50)
City char(50)
Country char(25)
Birth_Date datetime
Gender char(1)
Luego, lo que queremos es cambiar el tipo de datos para “Addr” a 30 caracteres. Para hacerlo,
ingresamos,
Table Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Addr char(30)
City char(50)
Country char(25)
Birth_Date datetime
Gender char(1)
Table Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Addr char(30)
City char(50)
Country char(25)
Birth_Date datetime
A veces podemos decidir que necesitamos eliminar una tabla en la base de datos por alguna
razón. De hecho, sería problemático si no podemos hacerlo ya que esto crearía una pesadilla
de mantenimiento para DBA. Afortunadamente, SQL nos permite hacerlo, ya que podemos
utilizar el comando DROP TABLE. La sintaxis para DROP TABLE es
A veces deseamos eliminar los datos en una tabla. Una forma de hacer esto es con DROP
TABLE, que vimos en la última sección Pero ¿Si deseamos simplemente deshacernos de los
datos pero no de la tabla en sí? Para esto, podemos utilizar el comando TRUNCATE TABLE.
La sintaxis para TRUNCATE TABLE es
Entonces, si deseamos truncar una tabla denominada cliente que creamos en SQL CREATE
TABLE, simplemente ingresamos
En SQL, hay fundamental y básicamente dos formas para INSÉRER datos en una tabla: Una
es insertar una fila por vez, y la otra es insertar filas múltiples por vez. Primero observemos
como podemos INSÉRER datos a través de una fila por vez:
La sintaxis para insertar datos en una tabla mediante una fila por vez es la siguiente:
Tabla Store_Information
Nombre de Columna Tip de Datos
Store_Name char(50)
Sales float
Txn_Date datetime
y ahora deseamos insertar una fila adicional en la tabla que represente los datos de ventas
para Los Ángeles el 10 de enero de 1999. En ese día, este negocio tenía $900 dólares
estadounidenses en ventas. Por lo tanto, utilizaremos la siguiente escritura SQL:
El segundo tipo de INSERT INTO nos permite insertar filas múltiples en una tabla. A diferencia
del ejemplo anterior, donde insertamos una única fila al especificar sus valores para todas las
columnas, ahora utilizamos la instrucción SELECT para especificar los datos que deseamos
insertar en la tabla. Si está pensando si esto significa que está utilizando información de otra
tabla, está en lo correcto. La sintaxis es la siguiente:
Note que esta es la forma más simple. La instrucción entera puede contener fácilmente
cláusulas WHERE, GROUP BY, y HAVING, así como también uniones y alias.
Entonces por ejemplo, si deseamos tener una tabla Store_Information, que recolecte la
información de ventas para el año 1998, y ya conoce en donde reside la fuente de datos en
tabala Sales_Information, ingresaremos:
INSERT INTO Store_Information (Store_Name, Sales, Txn_Date)
SELECT Store_Name, Sales, Txn_Date
FROM Sales_Information
WHERE Year (Txn_Date) = 1998;
Aquí hemos utilizado la sintaxis de Servidor SQL para extraer la información anual por medio
de una fecha. Otras bases de datos relacionales pueden tener sintaxis diferentes. Por ejemplo,
en Oracle, utilizará TO_CHAR (Txn_Date, 'yyyy') = 1998.
Una vez que hay datos en la tabla, podríamos tener la necesidad de modificar los mismos. Para
hacerlo, utilizamos el comando UPDATE. La sintaxis para esto es,
UPDATE "nombre_tabla"
SET "columna_1" = [nuevo valor]
WHERE "condición";
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
y notamos que las ventas para Los Angeles el 08/01/1999 es realmente de 500€ en vez de
300€ dólares estadounidenses, y que esa entrada en particular necesita actualizarse. Para
hacerlo, utilizamos el siguiente SQL:
UPDATE Store_Information
SET Sales = 500
WHERE Store_Name = 'Los Angeles'
AND Txn_Date = '08-Jan-1999';
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 500 08-Jan-1999
Boston 700 08-Jan-1999
En este caso, hay sólo una fila que satisface la condición en la cláusula WHERE. Si hay
múltiples filas que satisfacen la condición, todas ellas se modificarán.
También es posible UPDATE múltiples columnas al mismo tiempo. La sintaxis en este caso se
vería como la siguiente:
UPDATE "nombre_tabla"
SET colonne 1 = [[valor1], colonne 2 = [valor2]
WHERE "condición";
A veces podemos desear deshacernos de los registros de una tabla. Para ello, utilizamos el
comando DELETE FROM. La sintaxis para esto es,
Es más fácil utilizar un ejemplo. Por ejemplo, digamos que actualmente tenemos la siguiente
tabla:
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
y decidimos no mantener ninguna información sobre Los Ángeles en esta tabla. Para lograrlo,
ingresamos el siguiente SQL:
Tabla Store_Information
Store_Name Sales Txn_Date
San Diego 250 07-Jan-1999
Boston 700 08-Jan-1999
SQL Avanzado
SQL > SQL Avanzado
SQL UNION
SQL UNION ALL
SQL INTERSECT
SQL MINUS
SQL Subconsulta
SQL EXISTS
SQL CASE
SQL > SQL Avanzado > Union
El propósito del comando SQL UNION es combinar los resultados de dos consultas
juntas. En este sentido, UNION es parecido a Join, ya que los dos se utilizan para
información relacionada en múltiples tablas. Una restricción de UNION es que todas las
columnas correspondientes necesitan ser del mismo tipo de datos. También, cuando
utilizamos UNION, sólo se seleccionan valores distintos (similar a SELECT DISTINCT).
La sintaxis es la siguiente:
[Instrucción SQL 1]
UNION
[Instrucción SQL 2];
Supongamos que tenemos las siguientes dos tablas,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Internet_Sales
Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750
y deseamos saber de todas las fechas donde hay una operación de venta. Para hacerlo,
utilizamos la siguiente instrucción SQL:
SELECT Txn_Date FROM Store_Information
UNION
SELECT Txn_Date FROM Internet_Sales;
Resultado:
Txn_Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999
Por favor note que si ingresamos "SELECT DISTINCT Txn_Date" para cada o ambas
instrucciones SQL, obtendremos el mismo conjunto de resultados.
SQL > SQL Avanzado > Union All
El propósito del Comando SQL UNION ALL es también combinar los resultados de dos
consultas juntas. La diferencia entre UNION ALL y UNION es que, mientras UNION sólo
selecciona valores distintos, UNION ALL selecciona todos los valores.
La sintaxis para UNION ALL es la siguiente:
[Instrucción SQL 1]
UNION ALL
[Instrucción SQL 2];
Utilicemos el mismo ejemplo de la sección anterior para ilustrar la diferencia.
Supongamos que tenemos las siguientes dos tablas,
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Internet_Sales
Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750
La sintaxis es la siguiente:
[Instrucción SQL 1]
INTERSECT
[Instrucción SQL 2];
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Internet_Sales
Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750
y deseamos encontrar todas las fechas donde hay ventas tanto en el negocio como en Internet.
Para hacerlo, utilizamos la siguiente instrucción SQL:
Resultado:
Txn_Date
07-Jan-1999
Por favor note que el comando INTERSECT sólo arrojará valores distintivos.
MINUS opera en dos instrucciones SQL. Toma todos los resultados de la primera instrucción
SQL, y luego sustrae aquellos que se encuentran presentes en la segunda instrucción SQL
para obtener una respuesta final. Si la segunda instrucción SQL incluye resultados que no
están presentes en la primera instrucción SQL, dichos resultados se ignoran.
La sintaxis es la siguiente:
[Instrucción SQL 1]
MINUS
[Instrucción SQL 2];
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Tabla Internet_Sales
Txn_Date Sales
07-Jan-1999 250
10-Jan-1999 535
11-Jan-1999 320
12-Jan-1999 750
y deseamos encontrar todas las fechas donde hay ventas en el negocio, pero no aquellas
realizadas por Internet. Para hacerlo, utilizamos la siguiente instrucción SQL:
Resultado:
Txn_Date
05-Jan-1999
08-Jan-1999
Por favor note que el comando MINUS sólo arrojará valores distintos.
Algunas bases de datos pueden utilizar EXCEPT en vez de MINUS. Por favor verifique la
documentación para su base de datos específica para el uso apropiado.
Es posible incorporar una instrucción SQL dentro de otra. Cuando esto se hace en las
instrucciones WHERE o HAVING, tenemos una construcción de subconsulta.
La sintaxis es la siguiente:
SELECT "nombre1_columna"
FROM "nombre1_tabla"
WHERE "nombre2_columna" [Operador de Comparación]
(SELECT "nombre3_columna"
FROM "nombre2_tabla"
WHERE "Condición");
[Operador de Comparación] podrían ser operadores de igualdad tales como =, >, <, >=, <=.
También puede ser un operador textual como "LIKE". La parte en rojo se considera como la
"consulta interna", mientras que la parte en verde se considera como la "consulta externa".
Utilisons le même exemple que celui que nous avons utilisé pour illustrer les jointures SQL :
Table Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Table Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
et en utilisant une sous-requête pour trouver les ventes de tous les magasins dans la région
West (Ouest), il faudra utiliser l’instruction SQL suivante :
Resultado:
SUM(Sales)
2050
Dans cet exemple, au lieu de joindre directement les deux tables et d’ajouter seulement le
montant des ventes des magasins de la région West (Ouest), nous allons d’abord utiliser la
sous-requête pour trouver les magasins situés dans la région West (Ouest), puis additionner le
montant des ventes de ces magasins.
Dans l’exemple ci-dessus, la requête interne est d’abord exécutée, puis le résultat est envoyé à
la requête externe. Ce type de sous-requête est appelé sous-requête simple. Si la requête
interne dépend de la requête externe, nous aurons une sous-requête corrélée. Vous trouverez
ci-dessous un exemple de de sous-requête corrélée :
Notez la clause WHERE dans la requête interne, où la condition nécessite une table de la
requête externe.
EXISTS simplemente verifica si la consulta interna arroja alguna fila. Si lo hace, entonces la
consulta externa procede. De no hacerlo, la consulta externa no se ejecuta, y la totalidad de la
instrucción SQL no arroja nada.
SELECT "nombre1_columna"
FROM "nombre1_tabla"
WHERE EXISTS
(SELECT *
FROM "nombre2_tabla"
WHERE "Condición");
Por favor note que en vez de *, puede seleccionar una o más columnas en la consulta interna.
El efecto será idéntico.
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
Table Geography
Region_Name Store_Name
East Boston
East New York
West Los Angeles
West San Diego
Al principio, esto puede parecer confuso, debido a que la subsequencia incluye la condición
[Region_Name = 'West'], aún así la consulta sumó los negocios para todas las regiones. Si
observamos de cerca, encontramos que debido a que la subconsulta arroja más de 0 filas, la
condición EXISTS es verdadera, y la condición colocada dentro de la consulta interna no
influencia la forma en que se ejecuta la consulta externa.
CASE se utiliza para brindar un tipo de lógica "si-entonces-otro" para SQL. Su sintaxis es:
"condición" puede ser un valor estático o una expresión. La cláusula ELSE es opcional.
Tabla Store_Information
Store_Name Sales Txn_Date
Los Angeles 1500 05-Jan-1999
San Diego 250 07-Jan-1999
Los Angeles 300 08-Jan-1999
Boston 700 08-Jan-1999
si deseamos multiplicar las sumas de ventas de 'Los Angeles' por 2 y las sumas de ventas de
'San Diego' por 1,5, ingresamos,
Resultado:
Store_name Nuevas Ventas Txn_Date
Los Angeles 3000 05-Jan-1999
San Diego 375 07-Jan-1999
San Francisco 300 08-Jan-1999
Boston 700 08-Jan-1999
Sintaxis SQL
En esta página, enumeramos la sintaxis SQL para cada uno de los comandos SQL en esta
guía de referencia. Para obtener explicaciones detalladas para cada sintaxis SQL, por favor
diríjase a la sección individual haciendo clic en la palabra clave.
El propósito de esta página es brindar una página de referencia rápida para la sintaxis SQL. Le
sugerimos que agregue esta página a favoritos ahora presionando Control-D para que pueda
tener esta página de sintaxis a mano.
Select
SELECT "nom de colonne" FROM "nombre_tabla";
Distinct
SELECT DISTINCT "nombre_columna"
FROM "nombre_tabla";
Where
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "condition";
And/Or
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "condición simple"
{[AND|OR] "condición simple"}+;
In
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "nombre_columna" IN ('valor1', 'valor2', ...);
Between
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "nombre_columna" BETWEEN 'valor1' AND 'valor2';
Like
SELECT "nombre_columna"
FROM "nombre_tabla"
WHERE "nombre_columna" LIKE {patrón};
Order By
SELECT "nombre_columna"
FROM "nombre_tabla"
[WHERE "condición"]
ORDER BY "nombre_columna" [ASC, DESC];
Count
SELECT COUNT("nombre_columna")
FROM "nombre_tabla";
Group By
SELECT "nombre_columna 1", SUM("nombre_columna 2")
FROM "nombre_tabla"
GROUP BY "nombre_columna 1";
Having
SELECT "nombre_columna 1", SUM("nombre_columna 2")
FROM "nombre_tabla"
GROUP BY "nombre_columna 1"
HAVING (condición de función aritmética);
Create Table
CREATE TABLE "nombre_tabla"
("columna 1" "tipo_de_datos_para_columna_1",
"columna 2" "tipo_de_datos_para_columna_2",
... );
Drop Table
DROP TABLE "nombre_tabla";
Truncate Table
TRUNCATE TABLE "nombre_tabla";
Insert Into
INSERT INTO "nombre_tabla" ("colonne 1", "colonne 2", ...)
VALUES ("valor 1", "valor 2", ...);
Update
UPDATE "nombre_tabla"
SET "colonne 1" = [nuevo valor]
WHERE "condición";
Delete From
DELETE FROM "nombre_tabla"
WHERE "condición";