Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Tutorial SQL
Manual Tutorial SQL
www.desarrolloweb.com
Tutorial de SQL
Aprende a utilizar el estndar utilizado para la consulta de bases de datos. Seleccionar, crear,
modificar y borrar registros. Todo lo que necesitas para la creacin de tus pginas dinmicas.
Autores del manual
Este manual ha sido realizado por los siguientes colaboradores de DesarrolloWeb.com:
Rubn Alvarez
Redactor de DesarrolloWeb.com
http://www.desarrolloweb.com
(13 captulos
Miguel Angel Alvarez
Director de DesarrolloWeb.com
http://www.desarrolloweb.com
(1 captulo
Agustin Jareo
(1 captulo
Claudio
http://personal.lobocom.es/claudio/
(1! captulos
Pol Salvat
http://www.mistrucos.net
(3 captulos
Jonathan Soriano Folch
(1 captulo
Sara Alvarez
E"uipo DesarrolloWeb.com
http://www.desarrolloweb.com
(1 captulo
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
1
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Parte 1:
Introduccin
(ostramos "ue es el lengua)e *+$, % los tipos de datos % sentencias "ue podemos
encontrarnos a lo largo de este manual.
1.1. !u es S!"
Qu es y para qu sirve el SQ
Las aplicaciones en red son cada da ms numerosas y verstiles. En muchos casos, el esquema bsico de operacin es una
serie de scripts que rigen el comportamiento de una base de datos.
Debido a la diversidad de lenguajes y de bases de datos existentes, la manera de comunicar entre unos y otras sera realmente
complicada a gestionar de no ser por la existencia de estndares que nos permiten el realiar las operaciones bsicas de una
!orma universal.
Es de eso de lo que trata el "tructured #uery Language que no es mas que un lenguaje estndar de comunicacin con bases
de datos. $ablamos por tanto de un lenguaje normaliado que nos permite trabajar con cualquier tipo de lenguaje %&"' o
'$'( en combinacin con cualquier tipo de base de datos %)" &ccess, "#L "erver, )y"#L...(.
El hecho de que sea estndar no quiere decir que sea id*ntico para cada base de datos. En e!ecto, determinadas bases de
datos implementan !unciones espec!icas que no tienen necesariamente que !uncionar en otras.
&parte de esta universalidad, el "#L posee otras dos caractersticas muy apreciadas. 'or una parte, presenta una potencia y
versatilidad notables que contrasta, por otra, con su accesibilidad de aprendiaje.
El manual de "#L de desarrollo+eb pretende dar a conocer las operaciones bsicas que se pueden realiar con "#L y que
tienen una aplicacin directa con la creacin de aplicaciones en red sin pro!undiar ms de lo estrictamente necesario.
,uscamos con ello o!recer al +ebmaster un manual de re!erencia prctico y aplicado.
Artculo por Rubn Alvarez
1.#. $i%os de cam%o
!iferentes tipos campos empleados en las bases de datos
-omo sabemos una base de datos esta compuesta de tablas donde almacenamos registros catalogados en !uncin de
distintos campos %caractersticas(.
.n aspecto previo a considerar es la naturalea de los valores que introducimos en esos campos. Dado que una base de
datos trabaja con todo tipo de in!ormaciones, es importante especi!icarle qu* tipo de valor le estamos introduciendo de
manera a, por un lado, !acilitar la b/squeda posteriormente y por otro, optimiar los recursos de memoria.
-ada base de datos introduce tipos de valores de campo que no necesariamente estn presentes en otras. "in embargo, existe
un conjunto de tipos que estn representados en la totalidad de estas bases. Estos tipos comunes son los siguientes0
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
2
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Al&anumricos
-ontienen ci.ras % letras. /resentan una longitud limitada (011
caracteres
'umricos
E2isten de 3arios tipos, principalmente, enteros (sin decimales %
reales (con decimales.
(ooleanos /oseen dos .ormas: 4erdadero % .also (* o &o
Fechas
5lmacenan .echas .acilitando posteriormente su e2plotaci'n.
5lmacenar .echas de esta .orma posibilita ordenar los registros por
.echas o calcular los das entre una .echa % otra...
Memos
*on campos al.anum6ricos de longitud ilimitada. /resentan el
incon3eniente de no poder ser inde2ados (3eremos m7s adelante lo
"ue esto "uiere decir.
Autoincrementables
*on campos num6ricos enteros "ue incrementan en una unidad su
3alor para cada registro incorporado. *u utilidad resulta m7s "ue
e3idente: *er3ir de identi.icador %a "ue resultan e2clusi3os de un
registro.
Artculo por Rubn Alvarez
1.). $i%os de datos S!"
"ostramos unas tablas con todos los tipos de datos que #ay en SQ.
Los tipos de datos "#L se clasi!ican en 12 tipos de datos primarios y de varios sinnimos vlidos reconocidos por dichos
tipos de datos. Los tipos de datos primarios son0
$i%o de *atos "ongitud *escri%ci+n
89&5R: 1 b%te
/ara consultas sobre tabla ad)unta de productos de bases de
datos "ue de.inen un tipo de datos 8inario.
89; 1 b%te 4alores *i/&o ' ;rue/<alse
8:;E 1 b%te =n 3alor entero entre > % 011.
-?=&;ER @ b%tes =n nAmero incrementado autom7ticamente (de tipo $ong
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
3
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
-=RRE&-: B b%tes
=n entero escalable entre C00.33!.0>3.DB1.@!!,1B>B %
C00.33!.0>3.DB1.@!!,1B>!.
D5;E;9(E B b%tes =n 3alor de .echa u hora entre los aEos 1>> % CCCC.
*9&F$E @ b%tes
=n 3alor en punto .lotante de precisi'n simple con un rango de G
3.@>0B03H1>3B a G1.@>10CBH1>G@1 para 3alores negati3os,
1.@>10CBH1>G @1 a 3.@>0B03H1>3B para 3alores positi3os, % >.
D?=8$E B b%tes
=n 3alor en punto .lotante de doble precisi'n con un rango de G
1.!C!DC313@BD030H1>3>B a G@.C@>D1D@1B@10@!H1>G30@ para
3alores negati3os, @.C@>D1D@1B@10@!H1>G30@ a
1.!C!DC313@BD030H1>3>B para 3alores positi3os, % >.
*I?R; 0 b%tes =n entero corto entre G30,!DB % 30,!D!.
$?&F @ b%tes =n entero largo entre G0,1@!,@B3,D@B % 0,1@!,@B3,D@!.
$?&F;EJ;
1 b%te por
car7cter
De cero a un m72imo de 1.0 gigab%tes.
$?&F89&5R:
*egAn se
necesite
De cero 1 gigab%te. =tilizado para ob)etos ?$E.
;EJ;
1 b%te por
car7cter
De cero a 011 caracteres.
La siguiente tabla recoge los sinnimos de los tipos de datos de!inidos0
$i%o de *ato Sin+nimos
89&5R: 45R89&5R:
89;
8??$E5&
$?F9-5$
$?F9-5$1
:E*&?
8:;E 9&;EFER1
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
4
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
-?=&;ER 5=;?9&-RE(E&;
-=RRE&-: (?&E:
D5;E;9(E
D5;E
;9(E
;9(E*;5(/
*9&F$E
<$?5;@
9EEE*9&F$E
RE5$
D?=8$E
<$?5;
<$?5;B
9EEED?=8$E
&=(8ER
&=(ER9-
*I?R;
9&;EFER0
*(5$$9&;
$?&F
9&;
9&;EFER
9&;EFER@
$?&F89&5R:
FE&ER5$
?$E?8KE-;
$?&F;EJ;
$?&F-I5R
(E(?
&?;E
;EJ;
5$/I5&=(ER9-
-I5R G -I5R5-;ER
*;R9&F G 45R-I5R
45R95&; (&o 5dmitido 45$=E
Artculo por Claudio
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
5
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
1.,. $i%os de sentencias S!" - sus com%onentes sint.cticos
$asamos a describir los tipos de sentencias sql que podemos encontrarnos y sus componentes sintcticos.
En "#L tenemos bastantes sentencias que se pueden utiliar para realiar diversas tareas.
Dependiendo de las tareas, estas sentencias se pueden clasi!icar en tres grupos principales %D)L, DDL,D-L(, aunque nos
quedara otro grupo que a mi entender no est dentro del lenguaje "#L sino del 'L"#L.
SENTENCIA
DESCRIPCIN
DML Manipulacin de datos
"ELE-3
45"E63
DELE3E
.'D&3E
6ecupera datos de la base de datos.
&7ade nuevas !ilas de datos a la base de datos.
"uprime !ilas de datos de la base de datos.
)odi!ica datos existentes en la base de datos.
DDL Definicin de datos
-6E&3E 3&,LE
D68' 3&,LE
&L3E6 3&,LE
-6E&3E 94E:
D68' 94E:
-6E&3E 45DE;
D68' 45DE;
-6E&3E "<58<)
D68' "<585<)
&7ade una nueva tabla a la base de datos.
"uprime una tabla de la base de datos.
)odi!ica la estructura de una tabla existente.
&7ade una nueva vista a la base de datos.
"uprime una vista de la base de datos.
-onstruye un ndice para una columna.
"uprime el ndice para una columna.
De!ine un alias para un nombre de tabla.
"uprime un alias para un nombre de tabla.
DCL Control de acceso
=6&53
6E98>E
Control de transacciones
-8))43
68LL,&->
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
6
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
-oncede privilegios de acceso a usuarios.
"uprime privilegios de acceso a usuarios
?inalia la transaccin actual.
&borata la transaccin actual.
PLSQL SQL Progra!tico
DE-L&6E
8'E5
?E3-$
-L8"E
De!ine un cursor para una consulta.
&bre un cursor para recuperar resultados de consulta.
6ecupera una !ila de resultados de consulta.
-ierra un cursor.
1.,.1. Com%onentes sint.cticos
La mayora de sentencias "#L tienen la misma estructura.
3odas comienan por un verbo %select, insert, update, create(, a continuacin le sigue una o ms clausulas que nos dicen los
datos con los que vamos a operar %!rom, +here(, algunas de estas son opcionales y otras obligatorias como es el caso del
!rom.
Artculo por Sara Alvarez
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
7
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Parte 2:
Insercin y modificacin
de datos
4emos como insertar, modi.icar o borrar datos en nuestras tablas *+$.
#.1. Creaci+n de tablas
%&plicamos la manera de crear tablas a partir de sentencias SQ. !efinimos los tipo de campos
principales y la forma de especificar los 'ndices.
En general, la mayora de las bases de datos poseen potentes editores de bases que permiten la creacin rpida y sencilla de
cualquier tipo de tabla con cualquier tipo de !ormato.
"in embargo, una ve la base de datos est alojada en el servidor, puede darse el caso de que queramos introducir una nueva
tabla ya sea con carcter temporal %para gestionar un carrito de compra por ejemplo( o bien permanente por necesidades
concretas de nuestra aplicacin.
En estos casos, podemos, a partir de una sentencia "#L, crear la tabla con el !ormato que deseemos lo cual nos puede
ahorrar ms de un quebradero de cabea.
Este tipo de sentencias son especialmente /tiles para bases de datos como )ysql, las cuales trabajan directamente con
comandos "#L y no por medio de editores.
'ara crear una tabla debemos especi!icar diversos datos0 El nombre que le queremos asignar, los nombres de los campos y
sus caractersticas. &dems, puede ser necesario especi!icar cules de estos campos van a ser ndices y de qu* tipo van a
serlo.
La sintaxis de creacin puede variar ligeramente de una base de datos a otra ya que los tipos de campo aceptados no estn
completamente estandariados.
& continuacin os explicamos someramente la sintaxis de esta sentencia y os proponemos una serie de ejemplos prcticos0
#.1.1. Sinta/is
Create Table nombre_tabla
(
nombre_campo_1 tipo_1
nombre_campo_2 tipo_2
nombre_campo_n tipo_n
Key(campo_x,...)
)
'ongamos ahora como ejemplo la creacin de la tabla pedidos que hemos empleado en captulos previos0
Create Table pedidos
(
id_pedido INT(4) NOT NULL AUTO_INCREMENT,
id_cliente INT(4) NOT NULL,
id_articulo INT(4)NOT NULL,
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
8
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
fecha DATE,
cantidad INT(4),
total INT(4), KEY(id_pedido,id_cliente,id_articulo)
)
En este caso creamos los campos id los cuales son considerados de tipo entero de una longitud especi!icada por el n/mero
entre par*ntesis. 'ara id_pedido requerimos que dicho campo se incremente automticamente %&.38@45-6E)E53( de
una unidad a cada introduccin de un nuevo registro para, de esta !orma, automatiar su creacin. 'or otra parte, para evitar
un mensaje de error, es necesario requerir que los campos que van a ser de!inidos como ndices no puedan ser nulos %583
5.LL(.
El campo fecha es almacenado con !ormato de !echa %D&3E( para permitir su correcta explotacin a partir de las !unciones
previstas a tal e!ecto.
?inalmente, de!inimos los ndices enumerndolos entre par*ntesis precedidos de la palabra >E< o 45DE;.
Del mismo modo podramos crear la tabla de artculos con una sentencia como *sta0
Create Table articulos
(
id_articulo INT(4) NOT NULL AUTO_INCREMENT,
titulo VARCHAR(50),
autor VARCHAR(25),
editorial VARCHAR(25),
precio REAL,
KEY(id_articulo)
)
En este caso puede verse que los campos al!anum*ricos son introducidos de la misma !orma que los num*ricos. 9olvemos a
recordar que en tablas que tienen campos comunes es de vital importancia de!inir estos campos de la misma !orma para el
buen !uncionamiento de la base.
)uchas son las opciones que se o!recen al generar tablas. 5o vamos a tratarlas detalladamente pues sale de lo estrictamente
prctico. 3an slo mostraremos algunos de los tipos de campos que pueden ser empleados en la creacin de tablas con sus
caractersticas0
$i%o (-tes *escri%ci+n
9&; o
9&;EFER
@
&Ameros enteros. E2isten otros tipos de ma%or o menor longitud
espec.icos de cada base de datos.
D?=8$E o
RE5$
B
&Ameros reales (grandes % con decimales. /ermiten almacenar
todo tipo de nAmero no entero.
-I5R 1/caracter 5l.anum6ricos de longitud .i)a prede.inida
45R-I5R
1/caracterL
1
5l.anum6ricos de longitud 3ariable
D5;E 3
<echas, e2isten multiples .ormatos espec.icos de cada base de
datos
8$?8
1/caracterL
0
Frandes te2tos no inde2ables
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
9
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
89; o
8??$E5&
1 5lmacenan un bit de in.ormaci'n (3erdadero o .also
Artculo por Rubn Alvarez
#.#. 0structuras de las tablas en S!"
(na base de datos en un sistema relacional est compuesta por un con)unto de tablas, que corresponden
a las relaciones del modelo relacional.
En la terminologa usada en "#L no se alude a las relaciones, del mismo modo que no se usa el t*rmino atributo, pero s la
palabra columna, y no se habla de tupla, sino de lnea.
#.#.1. Creaci+n de $ablas 'uevas
CREATE TABLE tabla (
campo1 tipo (tamao) ndice1,
campo2 tipo (tamao) ndice2,... ,
ndice multicampo , ... )
En donde0
tabla Es el nombre de la tabla "ue se 3a a crear.
campo1
campo0
Es el nombre del campo o de los campos "ue se 3an a crear en la nue3a tabla.
$a nue3a tabla debe contener, al menos, un campo.
tipo Es el tipo de datos de campo en la nue3a tabla. (4er ;ipos de Datos
tamaEo Es el tamaEo del campo s'lo se aplica para campos de tipo te2to.
ndice1
ndice0
Es una cl7usula -?&*;R59&; "ue de.ine el tipo de ndice a crear. Esta cl7usula
en opcional.
ndice
multicamp
os
Es una cl7usula -?&*;R59&; "ue de.ine el tipo de ndice multicampos a crear.
=n ndice multicampo es a"uel "ue est7 inde2ado por el contenido de 3arios
campos. Esta cl7usula en opcional.
CREATE TABLE
Empleados (
Nombre TEXT (25),
Apellidos TEXT (50)
)
%-rea una nueva tabla llamada Empleados con dos campos, uno llamado 5ombre de tipo texto y longitud AB y otro llamado
apellidos con longitud BC(.
CREATE TABLE
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
10
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Empleados (
Nombre TEXT (10),
Apellidos TEXT,
FechaNacimiento DATETIME
)
CONSTRAINT
IndiceGeneral
UNIQUE (
Nombre, Apellidos, FechaNacimiento
)
%-rea una nueva tabla llamada Empleados con un campo 5ombre de tipo texto y longitud 1C, otro con llamado &pellidos
de tipo texto y longitud predeterminada %BC( y uno ms llamado ?echa5acimiento de tipo ?echaD$ora. 3ambi*n crea un
ndice /nico E no permite valores repetidos E !ormado por los tres campos.(
CREATE TABLE
Empleados (
IdEmpleado INTEGER CONSTRAINT IndicePrimario PRIMARY,
Nombre TEXT,
Apellidos TEXT,
FechaNacimiento DATETIME
)
%-rea una tabla llamada Empleados con un campo 3exto de longitud predeterminada %BC( llamado 5ombre y otro igual
llamado &pellidos, crea otro campo llamado ?echa5acimiento de tipo ?echaD$ora y el campo 4dEmpleado de tipo entero el
que establece como clave principal.(
#.#.#. "a cl.usula C1'S$RA2'$
"e utilia la clusula -85"36&453 en las instrucciones &L3E6 3&,LE y -6E&3E 3&,LE para crear o eliminar ndices.
Existen dos sintaxis para esta clusula dependiendo si desea -rear Eliminar un ndice de un /nico campo o si se trata de
un campo multindice. "i se utilia el motor de datos de )icroso!t, slo podr utiliar esta clusula con las bases de datos
propias de dicho motor. 'ara los ndices de campos /nicos0
CONSTRAINT nombre {PRIMARY KEY | UNIQUE | REFERENCES tabla externa
[(campo externo1, campo externo2)]}
'ara los ndices de campos m/ltiples0
CONSTRAINT nombre {PRIMARY KEY (primario1[, primario2 [,...]]) |
UNIQUE (nico1[, nico2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [,...]]) REFERENCES tabla externa
[(campo externo1 ,campo externo2 [,...])]}
En donde0
nombre Es el nombre del ndice "ue se 3a a crear.
primario& Es el nombre del campo o de los campos "ue .orman el ndice primario.
Anico& Es el nombre del campo o de los campos "ue .orman el ndice de cla3e Anica.
re.&
Es el nombre del campo o de los campos "ue .orman el ndice e2terno (hacen
re.erencia a campos de otra tabla.
tabla
e2terna
Es el nombre de la tabla "ue contiene el campo o los campos re.erenciados en
re.&
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
11
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
campos
e2ternos
Es el nombre del campo o de los campos de la tabla e2terna especi.icados por
re.1, re.0,... , re.&
"i se desea crear un ndice para un campo cuando se esta utiliando las instrucciones &L3E6 3&,LE o -6E&3E 3&,LE
la clusula -8536&453 debe aparecer inmediatamente despu*s de la especi!icacin del campo indexado.
"i se desea crear un ndice con m/ltiples campos cuando se est utiliando las instrucciones &L3E6 3&,LE o -6E&3E
3&,LE la clusula -85"36&453 debe aparecer !uera de la clusula de creacin de tabla.
9ndice Descripci'n
=&9+=E
Fenera un ndice de cla3e Anica. $o "ue implica "ue los registros de la tabla no
pueden contener el mismo 3alor en los campos inde2ados.
/R9(5R
: ME:
Fenera un ndice primario el campo o los campos especi.icados. ;odos los campos
de la cla3e principal deben ser Anicos % no nulos, cada tabla s'lo puede contener
una Anica cla3e principal.
<?RE9F
& ME:
Fenera un ndice e2terno (toma como 3alor del ndice campos contenidos en otras
tablas. *i la cla3e principal de la tabla e2terna consta de m7s de un campo, se
debe utilizar una de.inici'n de ndice de mAltiples campos, listando todos los
campos de re.erencia, el nombre de la tabla e2terna, % los nombres de los campos
re.erenciados en la tabla e2terna en el mismo orden "ue los campos de re.erencia
listados. *i los campos re.erenciados son la cla3e principal de la tabla e2terna, no
tiene "ue especi.icar los campos re.erenciados, predeterminado por 3alor, el motor
Ket se comporta como si la cla3e principal de la tabla e2terna estu3iera .ormada
por los campos re.erenciados.
#.#.). Creaci+n de 3ndices
"i se utilia el motor de datos Fet de )icroso!t slo se pueden crear ndices en bases de datos del mismo motor. La sintaxis
para crear un ndice en ua tabla ya de!inida en la siguiente0
CREATE [ UNIQUE ] INDEX ndice
ON Tabla (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]
En donde0
ndice Es el nombre del ndice a crear.
tabla Es el nombre de una tabla e2istente en la "ue se crear7 el ndice.
campo Es el nombre del campo o lista de campos "ue constitu%en el ndice.
5*-NDE*- 9ndica el orden de los 3alores de los campos 5*- indica un orden ascendente
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
12
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
(3alor predeterminado % DE*- un orden descendente.
=&9+=E 9ndica "ue el ndice no puede contener 3alores duplicados.
D9*5$$?W
&=$$
/rohibe 3alores nulos en el ndice
9F&?RE
&=$$
E2clu%e del ndice los 3alores nulos incluidos en los campos "ue lo componen.
/R9(5R:
5signa al ndice la categora de cla3e principal, en cada tabla s'lo puede e2istir
un Anico ndice "ue sea O-la3e /rincipalO. *i un ndice es cla3e principal implica
"ue no puede contener 3alores nulos ni duplicados.
En el caso de &--E"", se puede utiliar -6E&3E 45DE; para crear un pseudo ndice sobre una tabla adjunta en una
!uente de datos 8D,- tal como "#L "erver que no tenga todava un ndice. 5o necesita permiso o tener acceso a un
servidor remoto para crear un pseudo ndice, adems la base de datos remota no es consciente y no es a!ectada por el
pseudo ndice. "e utilia la misma sintaxis para las tablas adjuntas que para las originales. Esto es especialmente /til para
crear un ndice en una tabla que sera de slo lectura debido a la !alta de un ndice.
CREATE INDEX
MiIndice
ON
Empleados (Prefijo, Telefono)
(Crea un ndice llamado MiIndice en la tabla empleados con los campos Prefijo y Telfono.)
CREATE UNIQUE INDEX
MiIndice
ON
Empleados (IdEmpleado)
WITH DISALLOW NULL
%-rea un ndice en la tabla Empleados utiliando el campo 4dEmpleado, obligando que el campo 4dEmpleado no contenga
valores nulos ni repetidos.(
#.#.,. Modi&icar el *iseo de una $abla
)odi!ica el dise7o de una tabla ya existente, se pueden modi!icar los campos o los ndices existentes. "u sintaxis es0
ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamao)]
[CONSTRAINT ndice]
CONSTRAINT ndice multicampo} |
DROP {COLUMN campo I CONSTRAINT nombre del ndice}}
En donde0
tabla Es el nombre de la tabla "ue se desea modi.icar.
campo Es el nombre del campo "ue se 3a a aEadir o eliminar.
tipo Es el tipo de campo "ue se 3a a aEadir.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
13
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
tamaEo Es el tamaEo del campo "ue se 3a a aEadir (s'lo para campos de te2to.
ndice
Es el nombre del ndice del campo (cuando se crean campos o el nombre del
ndice de la tabla "ue se desea eliminar.
ndice
multicamp
o
Es el nombre del ndice del campo multicampo (cuando se crean campos o el
nombre del ndice de la tabla "ue se desea eliminar.
?peraci'n Descripci'n
5DD
-?$=(&
*e utiliza para aEadir un nue3o campo a la tabla, indicando el nombre, el tipo de
campo % opcionalmente el tamaEo (para campos de tipo te2to.
5DD *e utiliza para agregar un ndice de multicampos o de un Anico campo.
DR?/
-?$=(&
*e utiliza para borrar un campo. *e especi.ica Anicamente el nombre del campo.
DR?/
*e utiliza para eliminar un ndice. *e especi.ica Anicamente el nombre del ndice
a continuaci'n de la palabra reser3ada -?&*;R59&;.
ALTER TABLE
Empleados
ADD COLUMN
Salario CURRENCY
(Agrega un campo Salario de tipo Moneda a la tabla Empleados.)
ALTER TABLE
Empleados
DROP COLUMN
Salario
(Elimina el campo Salario de la tabla Empleados.)
ALTER TABLE
Pedidos
ADD CONSTRAINT
RelacionPedidos
FOREIGN KEY
(IdEmpleado)
REFERENCES
Empleados (IdEmpleado)
(Agrega un ndice externo a la tabla Pedidos. El ndice externo se basa en el campo IdEmpleado y se
refiere al campo IdEmpleado de la tabla Empleados. En este ejemplo no es necesario indicar el campo
junto al nombre de la tabla en la clusula REFERENCES, pues ID_Empleado es la clave principal de la
tabla Empleados.)
ALTER TABLE
Pedidos
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
14
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
DROP CONSTRAINT
RelacionPedidos
(Elimina el ndice de la tabla Pedidos.)
Artculo por Claudio
#.). Aadir un nuevo registro
Sinta&is y e)emplos para introducir registros en una tabla
Los registros pueden ser introducidos a partir de sentencias que emplean la instruccin 4nsert.
La sintaxis utiliada es la siguiente0
Insert Into nombre_tabla (nombre_campo1, nombre_campo2,...) Values (valor_campo1, valor_campo2...)
.n ejemplo sencillo a partir de nuestra tabla modelo es la introduccin de un nuevo cliente lo cual se hara con una
instruccin de este tipo0
Insert Into clientes (nombre, apellidos, direccion, poblacion, codigopostal, email, pedidos) Values
('Perico', 'Palotes', 'Percebe n13', 'Lepe', '123456', 'perico@desarrolloweb.com', 33)
-omo puede verse, los campos no num*ricos o booleanos van delimitados por apostro!es0 G. 3ambi*n resulta interesante ver
que el cdigo postal lo hemos guardado como un campo no num*rico. Esto es debido a que en determinados paises
%4nglaterra,como no( los codigos postales contienen tambi*n letras.
Nota" "i deseamos practicar con una base de datos que est vaca primero debemos crear las tablas que vamos a llenar. Las tablas tambi*n se
crean con sentencias "#L y aprendemos a hacerlo en el /ltimo captulo.
&unque, de todos modos, puede que sea ms cmodo utiliar un programa con inter!a gr!ica, como &ccess, que nos puede servir para crear
las tablas en bases de datos del propio &ccess o por 8D,- a otras bases de datos como "#L "erver o )y"#L, por poner dos ejemplos.
8tra posibilidad en una base de datos como )y"#L, sera crear las tablas utiliando un so!t+are como 'hp)y&dmin.
'or supuesto, no es imprescindible rellenar todos los campos del registro. Eso s, puede ser que determinados
campos sean necesarios. Estos campos necesarios pueden ser de!inidos cuando construimos nuestra tabla mediante
la base de datos.
Nota" "i no insertamos uno de los campos en la base de datos se inicialiar con el valor por de!ecto que hayamos de!inido a la hora de crear
la tabla. "i no hay valor por de!ecto, probablemente se inicialice como 5.LL %vaco(, en caso de que este campo permita valores nulos. "i ese
campo no permite valores nulos %eso se de!ine tambi*n al crear la tabla( lo ms seguro es que la ejecucin de la sentenca "#L nos de un error.
6esulta muy interesante, ya veremos ms adelante el por qu*, el introducir durante la creacin de nuestra tabla un campo
autoincrementable que nos permita asignar un /nico n/mero a cada uno de los registros. De este modo, nuestra tabla
clientes presentara para cada registro un n/mero exclusivo del cliente el cual nos ser muy util cuando consultemos varias
tablas simultneamente.
Artculo por Rubn Alvarez
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
15
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
#.,. (orrar un registro
Sinta&is y e)emplos para borrar registros en una tabla
'ara borrar un registro nos servimos de la instruccin Delete. En este caso debemos especi!icar cual o cuales son los
registros que queremos borrar. Es por ello necesario establecer una seleccin que se llevara a cabo mediante la clusula
:here.
La !orma de seleccionar se ver detalladamente en captulos posteriores. 'or ahora nos contentaremos de mostrar cul es el
tipo de sintaxis utiliado para e!ectuar estas supresiones0
Delete From nombre_tabla Where condiciones_de_seleccin
Nota" "i deseamos practicar con una base de datos que est vaca primero debemos crear las tablas que vamos a llenar. Las tablas tambi*n se
crean con sentencias "#L y aprendemos a hacerlo en el /ltimo captulo.
"i queremos por ejemplo borrar todos los registros de los clientes que se llamen 'erico lo haramos del siguiente modo0
Delete From clientes Where nombre='Perico'
$ay que tener cuidado con esta instruccin ya que si no especi!icamos una condicin con :here, lo que estamos haciendo
es #orrar toda la ta#la0
Delete From clientes
Artculo por Rubn Alvarez
#.4. Actualizar un registro
Sinta&is y e)emplos para editar registros en una tabla
.pdate es la instruccin que nos sirve para modi!icar nuestros registros. -omo para el caso de Delete, necesitamos
especi!icar por medio de :here cules son los registros en los que queremos hacer e!ectivas nuestras modi!icaciones.
&dems, obviamente, tendremos que especi!icar cules son los nuevos valores de los campos que deseamos actualiar. La
sintaxis es de este tipo0
Update nombre_tabla Set nombre_campo1 = valor_campo1, nombre_campo2 = valor_campo2,... Where
condiciones_de_seleccin
.n ejemplo aplicado0
Update clientes Set nombre='Jos' Where nombre='Pepe'
)ediante esta sentencia cambiamos el nombre 'epe por el de Fos* en todos los registros cuyo nombre sea 'epe.
&qu tambi*n hay que ser cuidadoso de no olvidarse de usar :here, de lo contrario, modi!icaramos todos los registros de
nuestra tabla.
Artculo por Rubn Alvarez
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
16
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Parte 3:
Bsqueda y seleccin de
datos en SQL
Estudiamos a .ondo todo lo relacionado con la sentencia select dentro del lengua)a *+$.
).1. Selecci+n de tablas 2
*mo realizar selecciones eficientemente. %)emplos prcticos.
La seleccin total o parcial de una tabla se lleva a cabo mediante la instruccin "elect. En dicha seleccin hay que especi!icar0
ELos campos que queremos seleccionar
ELa tabla en la que hacemos la seleccin
En nuestra tabla modelo de clientes podramos hacer por ejemplo una seleccin del nombre y direccin de los clientes con
una instruccin de este tipo0
Select nombre, direccin From clientes
"i quisi*semos seleccionar todos los campos, es decir, toda la ta#la, podramos utiliar el comodn H del siguiente modo0
Select * From clientes
6esulta tambi*n muy /til el !iltrar los registros mediante condiciones que vienen expresadas despu*s de la cl!usula $%ere.
"i quisi*semos mostrar los clientes de una determinada ciudad usaramos una expresin como esta0
Select * From clientes Where poblacion Like 'Madrid'
&dems, podramos ordenar los resultados en !uncin de uno o varios de sus campos. 'ara este ultimo ejemplo los
podramos ordenar por nombre as0
Select * From clientes Where poblacion Like 'Madrid' Order By nombre
3eniendo en cuenta que puede haber ms de un cliente con el mismo nombre, podramos dar un segundo criterio que
podra ser el apellido0
Select * From clientes Where poblacion Like 'Madrid' Order By nombre, apellido
"i invirti*semos el orden I nombre,apellido J por I apellido, nombre J, el resultado serKiacutea distinto. 3endramos los
clientes ordenados por apellido y aquellos que tuviesen apellidos id*nticos se subclasi!icaran por el nombre.
Es posible tambi*n clasificar por orden in&erso. "i por ejemplo quisi*semos ver nuestros clientes por orden de pedidos
realiados teniendo a los mayores en primer lugar escribiramos algo as0
Select * From clientes Order By pedidos Desc
.na opcin interesante es la de e!ectuar selecciones sin coincidencia. "i por ejemplo buscsemos el saber en qu* ciudades
se encuentran nuestros clientes sin necesidad de que para ello apareca varias veces la misma ciudad usaramos una sentencia
de esta clase0
Select Distinct poblacion From clientes Order By poblacion
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
17
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
&s evitaramos ver repetido )adrid tantas veces como clientes tengamos en esa poblacin.
Artculo por Rubn Alvarez
).#. Selecci+n de tablas 22
ista de operadores y e)emplos prcticos para realizar selecciones.
$emos querido compilar a modo de tabla ciertos operadores que pueden resultar /tiles en determinados casos. Estos
operadores sern utiliados despu*s de la clusula :here y pueden ser co#inados %!#ilente ediante par'ntesis
para optimiar nuestra seleccin a muy altos niveles.
1%eradores matem.ticos5
P (a%or "ue
Q (enor "ue
PR (a%or o igual "ue
QR (enor o igual "ue
QP Distinto
R 9gual
1%eradores l+gicos
5nd
?r
&ot
1tros o%eradores
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
18
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
$iSe
*elecciona los registros cu%o 3alor de campo se aseme)e, no teniendo en
cuenta ma%Asculas % minAsculas.
9n % &ot 9n
Da un con)unto de 3alores para un campo para los cuales la condici'n de
selecci'n es (o no 3alida
9s &ull % 9s
&ot &ull
*elecciona a"uellos registros donde el campo especi.icado esta (o no 3aco.
8etween...
5nd
*elecciona los registros comprendidos en un inter3alo
Distinct *elecciona los registros no coincidentes
Desc -lasi.ica los registros por orden in3erso
Comodines
H *ustitu%e a todos los campos
T *ustitu%e a cual"uier cosa o nada dentro de una cadena
U *ustitu%e un solo car7cter dentro de una cadena
9eamos a continuacin aplicaciones practicas de estos operadores.
En esta sentencia seleccionamos todos los clientes de )adrid cuyo nombre no es 'epe. -omo puede verse, empleamos Li(e
en lugar de ) simplemente para evitar inconvenientes debido al empleo o no de may/sculas.
Select * From clientes Where poblacion Like 'madrid' And Not nombre Like 'Pepe'
"i quisi*ramos recoger en una seleccin a los clientes de nuestra tabla cuyo apellido coien*a por A + cu+o n,ero de
pedidos esta coprendido entre -. + /.0
Select * From clientes Where apellidos like 'A%' And pedidos Between 20 And 40
El operador In, lo veremos ms adelante, es muy prctico para consultas en varias tablas. 'ara casos en una sola tabla es
empleado del siguiente modo0
Select * From clientes Where poblacion In ('Mdrid'!'Brcelon'!'"lenci'#
De esta !orma seleccionaos a0uellos clientes 0ue &i&an en esas tres ciudades.
Artculo por Rubn Alvarez
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
19
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
).). Selecci+n de tablas 222
*mo realizar selecciones sobre varias tablas. %)emplos prcticos basados en una aplicacin de e+
comercio.
.na base de datos puede ser considerada como un conjunto de tablas. Estas tablas en muchos casos estn relacionadas entre
ellas y se complementan unas con otras.
6e!iri*ndonos a nuestro clsico ejemplo de una base de datos para una aplicacin de eEcomercio, la tabla clientes de la que
hemos estado hablando puede estar per!ectamente coordinada con una tabla donde almacenamos los pedidos realiados por
cada cliente. Esta tabla de pedidos puede a su ve estar conectada con una tabla donde almacenamos los datos
correspondientes a cada artculo del inventario.
De este modo podramos !cilmente obtener in!ormaciones contenidas en esas tres tablas como puede ser la designacin del
artculo ms popular en una determinada regin donde la designacin del artculo sera obtenida de la tabla de artculos, la
popularidad %cantidad de veces que ese artculo ha sido vendido( vendra de la tabla de pedidos y la regin estara
comprendida obviamente en la tabla clientes.
Este tipo de organiacin basada en m/ltiples tablas conectadas nos permite trabajar con tablas mucho ms manejables a la
ve que nos evita copiar el mismo campo en varios sitios ya que podemos acceder a *l a partir de una simple llamada a la
tabla que lo contiene.
En este captulo veremos como, sirvi*ndonos de lo aprendido hasta ahora, podemos realiar !cilmente selecciones sobre
varias tablas. De!inamos antes de nada las di!erentes tablas y campos que vamos a utiliar en nuestros ejemplos0
$abla de clientes
'ombre cam%o $i%o cam%o
idUcliente &um6rico entero
nombre ;e2to
apellidos ;e2to
direccion ;e2to
poblacion ;e2to
codigopostal ;e2to
tele.ono &um6rico entero
email ;e2to
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
20
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
$abla de %edidos
'ombre cam%o $i%o cam%o
idUpedido &um6rico entero
idUcliente &um6rico entero
idUarticulo &um6rico entero
.echa <echa
cantidad &um6rico entero
$abla de art6culos
'ombre cam%o $i%o cam%o
idUarticulo &um6rico entero
titulo 5l.anum6rico
autor 5l.anum6rico
editorial 5l.anum6rico
precio &um6rico real
Estas tablas pueden ser utiliadas simultneamente para extraer in!ormaciones de todo tipo. "upongamos que queremos
enviar un mailing a todos aquellos que hayan realiado un pedido ese mismo da. 'odramos escribir algo as0
Select clientes$%ellidos! clientes$emil From clientes!%edidos &'ere %edidos$(ec' like '2)*02*00'
And %edidos$id+cliente, clientes$id+cliente
-omo puede verse esta ve, despu*s de la clusula ?rom, introducimos el nombre de las dos tablas de donde sacamos las
in!ormaciones. &dems, el nombre de cada campo va precedido de la tabla de provenencia separados ambos por un punto.
En los campos que poseen un nombre que solo aparece en una de las tablas, no es necesario especi!icar su origen aunque a
la hora de leer la sentencia puede resultar ms claro el precisarlo. En este caso el campo !echa podra haber sido designado
como L!echaL en lugar de Lpedidos.!echaL.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
21
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
9eamos otro ejemplo ms para consolidar estos nuevos conceptos. Esta ve queremos ver el ttulo del libro correspondiente
a cada uno de los pedidos realiados0
Select %edidos$id+%edido! rtic-los$tit-lo From %edidos! rtic-los &'ere
%edidos$id+rtic-lo,rtic-los$id+rtic-lo
En realidad la !iloso!a continua siendo la misma que para la consulta de una /nica tabla.
Artculo por Rubn Alvarez
).,. Selecci+n de tablas 27
%l empleo de funciones para la e&plotacin de los campos numricos y otras utilidades. %)emplos
prcticos.
&dems de los criterios hasta ahora explicados para realiar las consultas en tablas, "#L permite tambi*n aplicar un
conjunto de !unciones prede!inidas. Estas !unciones, aunque bsicas, pueden ayudarnos en algunos momentos a expresar
nuestra seleccin de una manera ms simple sin tener que recurrir a operaciones adicionales por parte del script que estemos
ejecutando.
&lgunas de estas !unciones son representadas en la tabla siguiente 0
Funci+n *escri%ci+n
*um(campo -alcula la suma de los registros del campo especi.icado
53g(-ampo -alcula la media de los registros del campo especi.icado
-ount(H
&os proporciona el 3alor del numero de registros "ue han sido
seleccionados
(a2(-ampo &os indica cual es el 3alor m72imo del campo
(in(-ampo &os indica cual es el 3alor mnimo del campo
Dado que el campo de la !uncin no existe en la base de datos, sino que lo estamos generando virtualmente, esto puede
crear inconvenientes cuando estamos trabajando con nuestros scripts a la hora de tratar su valor y su nombre de campo. Es
por ello que el valor de la funcin %a de ser recuperada a partir de un alias que nosotros especi!icaremos en la sentencia
"#L a partir de la instruccin AS. La cosa podra quedar as0
Select S-m(totl# As s-m+%edidos From %edidos
& partir de esta sentencia calculamos la suma de los valores de todos los pedidos realiados y almacenamos ese valor en un
campo virtual llamado suma@pedidos que podr ser utiliado como cualquier otro campo por nuestras paginas dinmicas.
'or supuesto, todo lo visto hasta ahora puede ser aplicado en este tipo de !unciones de modo que, por ejemplo, podemos
establecer condiciones con la clusula :here construyendo sentencias como esta0
Select S-m(cntidd# s s-m+rtic-los From %edidos &'ere id+rtic-lo,.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
22
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Esto nos proporcionara la cantidad de e1eplares de un deterinado li#ro 0ue %an sido &endidos.
8tra propiedad interesante de estas !unciones es que periten reali*ar operaciones con &arios capos dentro de un
iso par'ntesis0
Select A/0(totl*cntidd# From %edidos
Esta sentencia da como resultado el precio edio al 0ue se est!n &endiendo los li#ros. Este resultado no tiene por qu*
coincidir con el del precio edio de los li#ros presentes en el in&entario, ya que, puede ser que la gente tenga tendencia
a comprar los libros caros o los baratos0
Select A/0(%recio# s %recio+/ent From rtic-los
.na clusula interesante en el uso de !unciones es =roup ,y. Esta clusula nos permite agrupar registros a los cuales vamos
a aplicar la !uncin. 'odemos por ejemplo calcular el dinero gastado por cada cliente0
Select id+cliente! S-m(totl# s s-m+%edidos From %edidos 1ro-% B2 id+cliente
8 saber el nuero de pedidos 0ue %an reali*ado0
Select id+cliente! 3o-nt(*# s n-mero+%edidos From %edidos 1ro-% B2 id+cliente
Las posibilidades como vemos son numerosas y pueden resultar prcticas. 3odo queda ahora a disposicin de nuestras
ocurrencias e imaginacin.
Nota" En una de nuestras ?&# se dan otros ejemplos de trabajo con !unciones en selecciones "#L. "eleccionar una parte de una cadena en
"#L. En general, en las ?&# podemos encontrar respuestas a otras preguntas habituales.
Artculo por Rubn Alvarez
).4. Consultas de selecci+n
as consultas de seleccin se utilizan para indicar al motor de datos que devuelva informacin de las
bases de datos, esta informacin es devuelta en forma de con)unto de registros que se pueden almacenar
en un ob)eto recordset.
Este conjunto de registros puede ser modi!icable.
).4.1. Consultas b.sicas
La sintaxis bsica de una consulta de seleccin es la siguiente0
SELECT
Campos
FROM
Tabla
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo0
SELECT
Nombre, Telfono
FROM
Clientes
Esta sentencia devuelve un conjunto de resultados con el campo nombre y tel*!ono de la tabla clientes.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
23
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
).4.#. *evolver "iterales
En determinadas ocasiones nos puede interesar incluir una columna con un texto !ijo en una consulta de seleccin, por
ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las tari!as semanales de los electricistas,
podramos realiar la siguiente consulta0
SELECT
Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora * 40
FROM
Empleados
WHERE
Empleados.Cargo = 'Electricista'
).4.). 1rdenar los registros
&dicionalmente se puede especi!icar el orden en que se desean recuperar los registros de las tablas mediante la clusula
86DE6 ,< Lista de -ampos. En donde Lista de campos representa los campos a ordenar. Ejemplo0
SELECT
CodigoPostal, Nombre, Telefono
FROM
Clientes
ORDER BY
Nombre
Esta consulta devuelve los campos -odigo'ostal, 5ombre, 3ele!ono de la tabla -lientes ordenados por el campo 5ombre.
"e pueden ordenar los registros por mas de un campo, como por ejemplo0
SELECT
CodigoPostal, Nombre, Telefono
FROM
Clientes
ORDER BY
CodigoPostal, Nombre
4ncluso se puede especi!icar el orden de los registros0 ascendente mediante la clusula %&"- E se toma este valor por de!ecto(
descendente %DE"-(
SELECT
CodigoPostal, Nombre, Telefono
FROM
Clientes
ORDER BY
CodigoPostal DESC , Nombre ASC
).4.,. 8so de 2ndices de las tablas
"i deseamos que la sentencia "#L utilice un ndice para mostrar los resultados se puede utiliar la palabra reservada 45DE;
de la siguiente !orma0
SELECT ... FROM Tabla (INDEX=Indice) ...
5ormalmente los motores de las bases de datos deciden que ndice se debe utiliar para la consulta, para ello utilian
criterios de rendimiento y sobre todo los campos de b/squeda especi!icados en la clusula :$E6E. "i se desea !orar a no
utiliar ning/n ndice utiliaremos la siguiente sintaxis0
SELECT ... FROM Tabla (INDEX=0) ...
).4.4. Consultas con Predicado
El predicado se incluye entre la clusula y el primer nombre del campo a recuperar, los posibles predicados son0
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
24
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
Predicado *escri%ci+n
5$$ De3uel3e todos los campos de la tabla
;?/ De3uel3e un determinado nAmero de registros de la tabla
D9*;9&-; ?mite los registros cu%os campos seleccionados coincidan totalmente
D9*;9&-;?W
?mite los registros duplicados bas7ndose en la totalidad del registro % no s'lo
en los campos seleccionados.
).4.9. A""
"i no se incluye ninguno de los predicados se asume &LL. El )otor de base de datos selecciona todos los registros que
cumplen las condiciones de la instruccin "#L y devuelve todos y cada uno de sus campos. 5o es conveniente abusar de
este predicado ya que obligamos al motor de la base de datos a analiar la estructura de la tabla para averiguar los campos
que contiene, es mucho ms rpido indicar el listado de campos deseados.
SELECT ALL
FROM
Empleados
SELECT *
FROM
Empleados
).4.:. $1P
Devuelve un cierto n/mero de registros que entran entre al principio o al !inal de un rango especi!icado por una clusula
86DE6 ,<. "upongamos que queremos recuperar los nombres de los AB primeros estudiantes del curso 1MMN0
SELECT TOP 25
Nombre, Apellido
FROM
Estudiantes
ORDER BY
Nota DESC
"i no se incluye la clusula 86DE6 ,<, la consulta devolver un conjunto arbitrario de AB registros de la tabla de
Estudiantes. El predicado 38' no elige entre valores iguales. En el ejemplo anterior, si la nota media n/mero AB y la AO son
iguales, la consulta devolver AO registros. "e puede utiliar la palabra reservada 'E6-E53 para devolver un cierto
porcentaje de registros que caen al principio o al !inal de un rango especi!icado por la clusula 86DE6 ,<. "upongamos
que en lugar de los AB primeros estudiantes deseamos el 1C por ciento del curso0
SELECT TOP 10 PERCENT
Nombre, Apellido
FROM
Estudiantes
ORDER BY
Nota DESC
El valor que va a continuacin de 38' debe ser un entero sin signo. 38' no a!ecta a la posible actualiacin de la consulta.
).4.;. *2S$2'C$
8mite los registros que contienen datos duplicados en los campos seleccionados. 'ara que los valores de cada campo listado
en la instruccin "ELE-3 se incluyan en la consulta deben ser /nicos. 'or ejemplo, varios empleados listados en la tabla
Empleados pueden tener el mismo apellido. "i dos registros contienen Lpe en el campo &pellido, la siguiente instruccin
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
25
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
"#L devuelve un /nico registro0
SELECT DISTINCT
Apellido
FROM
Empleados
-on otras palabras el predicado D4"345-3 devuelve aquellos registros cuyos campos indicados en la clusula "ELE-3
posean un contenido di!erente. El resultado de una consulta que utilia D4"345-3 no es actualiable y no re!leja los
cambios subsiguientes realiados por otros usuarios.
).4.<. *2S$2'C$R1=
Este predicado no es compatible con &5"4. #ue yo sepa a da de hoy slo !unciona con &--E"".
Devuelve los registros di!erentes de una tablaP a di!erencia del predicado anterior que slo se !ijaba en el contenido de los
campos seleccionados, *ste lo hace en el contenido del registro completo independientemente de los campos indicados en la
clusula "ELE-3.
SELECT DISTINCTROW
Apellido
FROM Empleados
"i la tabla empleados contiene dos registros0 &ntonio Lpe y )arta Lpe el ejemplo del predicado D4"345-3 devuelve
un /nico registro con el valor Lpe en el campo &pellido ya que busca no duplicados en dicho campo. Este /ltimo ejemplo
devuelve dos registros con el valor Lpe en el apellido ya que se buscan no duplicados en el registro completo.
).4.1>. A"2AS
En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto,
otras veces por simple capricho o porque estamos recuperando datos de di!erentes tablas y resultan tener un campo con
igual nombre. 'ara resolver todas ellas tenemos la palabra reservada &" que se encarga de asignar el nombre que deseamos a
la columna deseada. 3omado como re!erencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta,
en lugar de llamarse apellido %igual que el campo devuelto( se llame Empleado. En este caso procederamos de la siguiente
!orma0
SELECT DISTINCTROW
Apellido AS Empleado
FROM Empleados
&" no es una palabra reservada de &5"4, existen di!erentes sistemas de asignar los alias en !uncin del motor de bases de
datos. En 86&-LE para asignar un alias a un campo hay que hacerlo de la siguiente !orma0
SELECT
Apellido AS "Empleado"
FROM Empleados
3ambi*n podemos asignar alias a las tablas dentro de la consulta de seleccin, en esta caso hay que tener en cuenta que en
todas las re!erencias que deseemos hacer a dicha tabla se ha de utiliar el alias en lugar del nombre. Esta t*cnica ser de gran
utilidad ms adelante cuando se estudien las vinculaciones entre tablas. 'or ejemplo0
SELECT
Apellido AS Empleado
FROM
Empleados AS Trabajadores
'ara asignar alias a las tablas en 86&-LE y "#LE"E69E6 los alias se asignan escribiendo el nombre de la tabla, dejando un
espacio en blanco y escribiendo el &lias %se asignan dentro de la clusula ?68)(.
SELECT
Trabajadores.Apellido (1) AS Empleado
FROM
Empleados Trabajadores
%1(Esta nomenclatura Q3ablaR.Q-ampoR se debe utiliar cuando se est recuperando un campo cuyo nombre se repite en
varias de las tablas que se utilian en la sentencia. 5o obstante cuando en la sentencia se emplean varias tablas es aconsejable
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
26
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
utiliar esta nomenclatura para evitar el trabajo que supone al motor de datos averiguar en que tabla est cada uno de los
campos indicados en la clusula "ELE-3.
).4.11. Recu%erar 2n&ormaci+n de una base de *atos 0/terna
'ara concluir este captulo se debe hacer re!erencia a la recuperacin de registros de bases de datos externas. Es ocasiones es
necesario la recuperacin de in!ormacin que se encuentra contenida en una tabla que no se encuentra en la base de datos
que ejecutar la consulta o que en ese momento no se encuentra abierta, esta situacin la podemos salvar con la palabra
reservada 45 de la siguiente !orma0
SELECT
Apellido AS Empleado
FROM
Empleados IN'c: databasesgestion.mdb'
En donde c0 databasesgestion.mdb es la base de datos que contiene la tabla Empleados. Esta t*cnica es muy sencilla y
com/n en bases de datos de tipo &--E"" en otros sistemas como "#LE"E69E6 u 86&-LE, la cosa es ms complicada la
tener que existir relaciones de con!iana entre los servidores o al ser necesaria la vinculacin entre las bases de datos. Este
ejemplo recupera la in!ormacin de una base de datos de "#LE"E69E6 ubicada en otro servidor %se da por supuesto que
los servidores estn lincados(0
SELECT
Apellido
FROM
Servidor1.BaseDatos1.dbo.Empleados
Artculo por Claudio
).9. Criterios de selecci+n en S!"
%studiaremos las posibilidades de filtrar los registros con el fin de recuperar solamente aquellos que
cumplan unas condiciones preestablecidas.
En el apartado anterior se vio la !orma de recuperar los registros de las tablas, las !ormas empleadas devolvan todos los
registros de la mencionada tabla. & lo largo de este apartado se estudiarn las posibilidades de !iltrar los registros con el !in
de recuperar solamente aquellos que cumplan unas condiciones preestablecidas.
&ntes de comenar el desarrollo de este apartado hay que recalcar tres detalles de vital importancia. El primero de ellos es
que cada ve que se desee establecer una condicin re!erida a un campo de texto la condicin de b/squeda debe ir encerrada
entre comillas simplesP la segunda es que no es posible establecer condiciones de b/squeda en los campos memo yP la tercera
y /ltima hace re!erencia a las !echas. & da de hoy no he sido capa de encontrar una sintaxis que !uncione en todos los
sistemas, por lo que se hace necesario particulariarlas seg/n el banco de datos0
8anco de
Datos
*inta2is
*+$G*ER4ER <echa R VmmGddGaaaaV
?R5-$E <echa R toUdate(W::::DD((W,WaaaammddW,
5--E** <echa R VmmGddGaaaaV
E1eplo
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
27
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
,anco de Datos Ejemplo %para grabar la !echa 1S de mayo de 1MOM(
*+$G*ER4ER
<echa R V>1G1BG1CDCV '
<echa R 1CDC>11B
?R5-$E <echa R toUdate(W::::DD((W, W1CDC>11BW
5--E** <echa R V>1G1BG1CDCV
6e!erente a los valores lgicos 3rue o ?alse cabe destacar que no son reconocidos en 86&-LE, ni en este sistema de bases
de datos ni en "#LE"E69E6 existen los campos de tipo L"4D58L de &--E""P en estos sistemas se utilian los campos
,43 que permiten almacenar valores de C 1. 4nternamente, &--E"", almacena en estos campos valores de C E1, as que
todo se complica bastante, pero aprovechando la coincidencia del C para los valores ?&L"E, se puede utiliar la sintaxis
siguiente que !unciona en todos los casos0 si se desea saber si el campo es !also L... -&)'8 T CL y para saber los
verdaderos L-&)'8 UV CL.
).9.1. 1%eradores "+gicos
Los operadores lgicos soportados por "#L son0 &5D, 86, ;86, Eqv, 4mp, 4s y 5ot. & excepcin de los dos /ltimos
todos poseen la siguiente sintaxis0
<expresin1> operador <expresin2>
En donde expresin1 y expresinA son las condiciones a evaluar, el resultado de la operacin vara en !uncin del operador
lgico. La tabla adjunta muestra los di!erentes posibles resultados0
?e/%resi+n
1@
1%erador ?e/%resi+n#@ Resultado
4erdad 5&D <also <also
4erdad 5&D 4erdad 4erdad
<also 5&D 4erdad <also
<also 5&D <also <also
4erdad ?R <also 4erdad
4erdad ?R 4erdad 4erdad
<also ?R 4erdad 4erdad
<also ?R <also <also
4erdad J?R 4erdad <also
4erdad J?R <also 4erdad
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
28
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
<also J?R 4erdad 4erdad
<also J?R <also <also
4erdad E"3 4erdad 4erdad
4erdad E"3 <also <also
<also E"3 4erdad <also
<also E"3 <also 4erdad
4erdad 9mp 4erdad 4erdad
4erdad 9mp <also <also
4erdad 9mp &ull &ull
<also 9mp 4erdad 4erdad
<also 9mp <also 4erdad
<also 9mp &ull 4erdad
&ull 9mp 4erdad 4erdad
&ull 9mp <also &ull
&ull 9mp &ull &ull
"i a cualquiera de las anteriores condiciones le anteponemos el operador 583 el resultado de la operacin ser el contrario
al devuelto sin el operador 583.
El /ltimo operador denominado 4s se emplea para comparar dos variables de tipo objeto U8bjeto1V 4s U8bjetoAV. este
operador devuelve verdad si los dos objetos son iguales.
SELECT *
FROM
Empleados
WHERE
Edad > 25 AND Edad < 50
SELECT *
FROM
Empleados
WHERE
(Edad > 25 AND Edad < 50)
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
29
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
OR
Sueldo = 100
SELECT *
FROM
Empleados WHERE
NOT Estado = 'Soltero'
SELECT *
FROM
Empleados
WHERE
(Sueldo >100 AND Sueldo < 500)
OR
(Provincia = 'Madrid' AND Estado = 'Casado')
).9.#. 2ntervalos de 7alores
'ara indicar que deseamos recuperar los registros seg/n el intervalo de valores de un campo emplearemos el operador
,et+een cuya sintaxis es0
campo [Not] Between valor1 And valor2 (la condicin Not es opcional)
En este caso la consulta devolvera los registros que contengan en LcampoL un valor incluido en el intervalo valor1, valorA
%ambos inclusive(. "i anteponemos la condicin 5ot devolver aquellos valores no incluidos en el intervalo.
SELECT *
FROM
Pedidos
WHERE
CodPostal Between 28000 And 28999
(Devuelve los pedidos realizados en la provincia de Madrid)
).9.). 0l 1%erador "iAe
"e utilia para comparar una expresin de cadena con un modelo en una expresin "#L. "u sintaxis es0
expresin Like modelo
En donde expresin es una cadena modelo o campo contra el que se compara expresin. "e puede utiliar el operador LiWe
para encontrar valores en los campos que coincidan con el modelo especi!icado. 'or modelo puede especi!icar un valor
completo %&na )ara(, o se puede utiliar una cadena de caracteres comodn como los reconocidos por el sistema operativo
para encontrar un rango de valores %LiWe &nH(.
El operador LiWe se puede utiliar en una expresin para comparar un valor de un campo con una expresin de cadena. 'or
ejemplo, si introduce LiWe -H en una consulta "#L, la consulta devuelve todos los valores de campo que comiencen por la
letra -. En una consulta con parmetros, puede hacer que el usuario escriba el modelo que se va a utiliar.
El ejemplo siguiente devuelve los datos que comienan con la letra ' seguido de cualquier letra entre & y ? y de tres dgitos0
Like 'P[A-F]###'
Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la & a la D seguidas de cualquier cadena.
Like '[A-D]*'
En la tabla siguiente se muestra cmo utiliar el operador LiWe para comprobar expresiones con di!erentes modelos.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
30
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
ACCESS
G
$i%o de
coincidencia
Modelo Planteado Coincide 'o coincide
4arios caracteres WaHaW aaW, Wa8aW, Wa888aW Wa8-W
-ar7cter especial WaXHYaW WaHaW WaaaW
4arios caracteres WabHW Wabcde.gW, WabcW WcabW, WaabW
=n solo car7cter WaZaW WaaaW, Wa3aW, Wa8aW Wa888aW
=n solo dgito WaVaW Wa>aW, Wa1aW, Wa0aW WaaaW, Wa1>aW
Rango de
caracteres
WXaGzYW W.W, WpW, W)W W0W, W[W
<uera de un rango WX\aGzYW WCW, W[W, WTW WbW, WaW
Distinto de un
dgito
WX\>GCYW W5W, WaW, W[W, W]W W>W, W1W, WCW
-ombinada WaX\bGmYVW W5nCW, Waz>W, WaCCW WabcW, Wa)>W
SQL2SER3ER
0Bem%lo *escri%ci+n
$9ME W5TW ;odo lo "ue comience por 5
$9ME WU&FW ;odo lo "ue comience por cual"uier car7cter % luego siga &F
$9ME WX5<YTW ;odo lo "ue comience por 5 ' <
$9ME WX5G<YTW ;odo lo "ue comience por cual"uier letra comprendida entre la 5 % la <
$9ME WX5^8YTW ;odo lo "ue comience por 5 % la segunda letra no sea una 8
En determinado motores de bases de datos, esta clusula, no reconoce el asterisco como carcter comodn y hay que
sustituirlo por el carcter tanto por ciento %X(.
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
31
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
).9.,. 0l 1%erador 2n
Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. "u sintaxis es0
expresin [Not] In(valor1, valor2, . . .)
SELECT *
FROM
Pedidos
WHERE
Provincia In ('Madrid', 'Barcelona', 'Sevilla')
).9.4. "a cl.usula =C0R0
La clusula :$E6E puede usarse para determinar qu* registros de las tablas enumeradas en la clusula ?68) aparecern
en los resultados de la instruccin "ELE-3. Despu*s de escribir esta clusula se deben especi!icar las condiciones expuestas
en los apartados anteriores. "i no se emplea esta clusula, la consulta devolver todas las !ilas de la tabla. :$E6E es
opcional, pero cuando aparece debe ir a continuacin de ?68).
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Salario = 21000
SELECT
IdProducto, Existencias
FROM
Productos
WHERE
Existencias <= NuevoPedido
SELECT *
FROM
Pedidos
WHERE
FechaEnvio = #05-30-1994#
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos = 'King'
SELECT
Apellidos, Nombre
FROM
Empleados
WHERE
Apellidos Like 'S*'
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Salario Between 200 And 300
SELECT
Apellidos, Salario
FROM
Empleados
WHERE
Apellidos Between 'Lon' And 'Tol'
SELECT
IdPedido, FechaPedido
FROM
Pedidos
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
32
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
WHERE
FechaPedido Between #01-01-1994# And #12-31-1994#
SELECT
Apellidos, Nombre, Ciudad
FROM
Empleados
WHERE
Ciudad In ('Sevilla', 'Los Angeles', 'Barcelona')
Artculo por Claudio
).:. Criterios de selecci+n en S!" 22
Seguimos con el group by, avg, sum y con el compute de sql+server.
-ombina los registros con valores id*nticos, en la lista de campos especi!icados, en un /nico registro. 'ara cada registro se
crea un valor sumario si se incluye una !uncin "#L agregada, como por ejemplo "um o -ount, en la instruccin "ELE-3.
"u sintaxis es0
SELECT campos FROM tabla WHERE criterio GROUP BY campos del grupo
=68.' ,< es opcional. Los valores de resumen se omiten si no existe una !uncin "#L agregada en la instruccin
"ELE-3. Los valores 5ull en los campos =68.' ,< se agrupan y no se omiten. 5o obstante, los valores 5ull no se
eval/an en ninguna de las !unciones "#L agregadas.
"e utilia la clusula :$E6E para excluir aquellas !ilas que no desea agrupar, y la clusula $&945= para !iltrar los registros
una ve agrupados.
& menos que contenga un dato )emo u 8bjeto 8LE, un campo de la lista de campos =68.' ,< puede re!erirse a
cualquier campo de las tablas que aparecen en la clusula ?68), incluso si el campo no esta incluido en la instruccin
"ELE-3, siempre y cuando la instruccin "ELE-3 incluya al menos una !uncin "#L agregada.
3odos los campos de la lista de campos de "ELE-3 deben o bien incluirse en la clusula =68.' ,< o como argumentos
de una !uncin "#L agregada.
SELECT
IdFamilia, Sum(Stock) AS StockActual
FROM
Productos
GROUP BY
IdFamilia
.na ve que =68.' ,< ha combinado los registros, $&945= muestra cualquier registro agrupado por la clusula
=68.' ,< que satis!aga las condiciones de la clusula $&945=.
$&945= es similar a :$E6E, determina qu* registros se seleccionan. .na ve que los registros se han agrupado
utiliando =68.' ,<, $&945= determina cuales de ellos se van a mostrar.
SELECT
IdFamilia, Sum(Stock) AS StockActual
FROM
Productos
GROUP BY
IdFamilia
HAVING
StockActual > 100
AND
NombreProducto Like BOS*
).:.1. A7D
-alcula la media aritm*tica de un conjunto de valores contenidos en un campo especi!icado de una consulta. "u sintaxis es la
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
33
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
siguiente
Avg(expr)
En donde expr representa el campo que contiene los datos num*ricos para los que se desea calcular la media o una
expresin que realia un clculo utiliando los datos de dicho campo. La media calculada por &vg es la media aritm*tica %la
suma de los valores dividido por el n/mero de valores(. La !uncin &vg no incluye ning/n campo 5ull en el clculo.
SELECT
Avg(Gastos) AS Promedio
FROM
Pedidos
WHERE
Gastos > 100
).:.#. Count
-alcula el n/mero de registros devueltos por una consulta. "u 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 !uncin %la cual puede ser intrnseca o de!inida por el usuario pero no otras de las
!unciones agregadas de "#L(. 'uede contar cualquier tipo de datos incluso texto.
&unque expr puede realiar un clculo sobre un campo, -ount simplemente cuenta el n/mero de registros sin tener en
cuenta qu* valores se almacenan en los registros. La !uncin -ount no cuenta los registros que tienen campos null a menos
que expr sea el carcter comodn asterisco %H(. "i utilia un asterisco, -ount calcula el n/mero total de registros, incluyendo
aquellos que contienen campos null. -ount%H( es considerablemente ms rpida que -ount%-ampo(. 5o se debe poner el
asterisco entre dobles comillas %GHG(.
SELECT
Count(*) AS Total
FROM
Pedidos
"i expr identi!ica a m/ltiples campos, la !uncin -ount cuenta un registro slo si al menos uno de los campos no es 5ull. "i
todos los campos especi!icados son 5ull, no se cuenta el registro. $ay que separar los nombres de los campos con
ampersand %K(.
SELECT
Count(FechaEnvo & Transporte) AS Total
FROM
Pedidos
'odemos hacer que el gestor cuente los datos di!erentes de un determinado campo
SELECT
Count(DISTINCT Localidad) AS Total
FROM
Pedidos
).:.). Ma/E Min
Devuelven el mnimo o el mximo de un conjunto de valores contenidos en un campo especi!ico de una consulta. "u
sintaxis es0
Min(expr)
Max(expr)
En donde expr es el campo sobre el que se desea realiar el clculo. Expr pueden incluir el nombre de un campo de una
tabla, una constante o una !uncin %la cual puede ser intrnseca o de!inida por el usuario pero no otras de las !unciones
agregadas de "#L(.
SELECT
Min(Gastos) AS ElMin
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
34
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
FROM
Pedidos
WHERE
Pais = 'Espaa'
SELECT
Max(Gastos) AS ElMax
FROM
Pedidos
WHERE
Pais = 'Espaa'
).:.,. St*evE St*evP
Devuelve estimaciones de la desviacin estndar para la poblacin %el total de los registros de la tabla( o una muestra de la
poblacin representada %muestra aleatoria(. "u sintaxis es0
StDev(expr)
StDevP(expr)
En donde expr representa el nombre del campo que contiene los datos que desean evaluarse o una expresin que realia un
clculo utiliando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla,
una constante o una !uncin %la cual puede ser intrnseca o de!inida por el usuario pero no otras de las !unciones agregadas
de "#L(.
"tDev' eval/a una poblacin, y "tDev eval/a una muestra de la poblacin. "i la consulta contiene menos de dos registros %o
ning/n registro para "tDev'(, estas !unciones devuelven un valor 5ull %el cual indica que la desviacin estndar no puede
calcularse(.
SELECT
StDev(Gastos) AS Desviacin
FROM
Pedidos
WHERE
Pas = 'Espaa'
SELECT
StDevP(Gastos) AS Desviacin
FROM
Pedidos
WHERE
Pas = 'Espaa'
).:.4. Sum
Devuelve la suma del conjunto de valores contenido en un campo especi!ico de una consulta. "u sintaxis es0
Sum(expr)
En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresin que realia un
clculo utiliando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla,
una constante o una !uncin %la cual puede ser intrnseca o de!inida por el usuario pero no otras de las !unciones agregadas
de "#L(.
SELECT
Sum(PrecioUnidad * Cantidad) AS Total
FROM
DetallePedido
).:.9. 7arE 7arP
Devuelve una estimacin de la variana de una poblacin %sobre el total de los registros( o una muestra de la poblacin
%muestra aleatoria de registros( sobre los valores de un campo. "u sintaxis es0
Var(expr)
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
35
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
VarP(expr)
9ar' eval/a una poblacin, y 9ar eval/a una muestra de la poblacin. Expr el nombre del campo que contiene los datos que
desean evaluarse o una expresin que realia un clculo utiliando los datos de dichos campos. Los operandos de expr
pueden incluir el nombre de un campo de una tabla, una constante o una !uncin %la cual puede ser intrnseca o de!inida por
el usuario pero no otras de las !unciones agregadas de "#L(
"i la consulta contiene menos de dos registros, 9ar y 9ar' devuelven 5ull %esto indica que la variana no puede calcularse(.
'uede utiliar 9ar y 9ar' en una expresin de consulta o en una 4nstruccin "#L.
SELECT
Var(Gastos) AS Varianza
FROM
Pedidos
WHERE
Pas = 'Espaa'
SELECT
VarP(Gastos) AS Varianza
FROM
Pedidos
WHERE
Pas = 'Espaa'
).:.:. C1MP8$0 de S!"S0R70R
Esta clusula a7ade una !ila en el conjunto de datos que se est recuperando, se utilia para realiar clculos en campos
num*ricos. -8)'.3E act/a siempre sobre un campo o expresin del conjunto de resultados y esta expresin debe !igurar
exactamente igual en la clusula "ELE-3 y siempre se debe ordenar el resultado por la misma o al memos agrupar el
resultado. Esta expresin no puede utiliar ning/n &L4&".
SELECT
IdCliente, Count(IdPedido)
FROM
Pedidos
GROUP BY
IdPedido
HAVING
Count(IdPedido) > 20
COMPUTE
Sum(Count(IdPedido))
SELECT
IdPedido, (PrecioUnidad * Cantidad - Descuento)
FROM
[Detalles de Pedidos]
ORDER BY
IdPedido
COMPUTE
Sum((PrecioUnidad * Cantidad - Descuento)) // Calcula el Total
BY IdPedido // Calcula el Subtotal
Artculo por Claudio
).;. Subconsultas en S!"
!efenimos lo que significa subconsulta y mostramos las diferentes subconsultas que se pueden #acer.
.na subconsulta es una instruccin "ELE-3 anidada dentro de una instruccin "ELE-3, "ELE-3...4538,
45"E63...4538, DELE3E, o .'D&3E o dentro de otra subconsulta. 'uede utiliar tres !ormas de sintaxis para crear una
subconsulta0
comparacin [ANY | ALL | SOME] (instruccin sql) expresin [NOT] IN (instruccin sql) [NOT]
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
36
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
EXISTS (instruccin sql)
En donde0
comparaci'n
Es una e2presi'n % un operador de comparaci'n "ue compara la e2presi'n
con el resultado de la subconsulta.
e2presi'n
Es una e2presi'n por la "ue se busca el con)unto resultante de la
subconsulta.
instrucci'n
*+$
Es una instrucci'n *E$E-;, "ue sigue el mismo .ormato % reglas "ue cual"uier
otra instrucci'n *E$E-;. Debe ir entre par6ntesis.
"e puede utiliar una subconsulta en lugar de una expresin en la lista de campos de una instruccin "ELE-3 o en una
clusula :$E6E o $&945=. En una subconsulta, se utilia una instruccin "ELE-3 para proporcionar un conjunto de
uno o ms valores especi!icados para evaluar en la expresin de la clusula :$E6E o $&945=.
"e puede utiliar el predicado &5< o "8)E, los cuales son sinnimos, para recuperar registros de la consulta principal, que
satis!agan la comparacin con cualquier otro registro recuperado en la subconsulta. El ejemplo siguiente devuelve todos los
productos cuyo precio unitario es mayor que el de cualquier producto vendido con un descuento igual o mayor al AB por
ciento0
SELECT *
FROM
Productos
WHERE
PrecioUnidad
ANY
(
SELECT
PrecioUnidad
FROM
DetallePedido
WHERE
Descuento = 0 .25
)
El predicado &LL se utilia para recuperar /nicamente aquellos registros de la consulta principal que satis!acen la
comparacin con todos los registros recuperados en la subconsulta. "i se cambia &5< por &LL en el ejemplo anterior, la
consulta devolver /nicamente aquellos productos cuyo precio unitario sea mayor que el de todos los productos vendidos
con un descuento igual o mayor al AB por ciento. Esto es mucho ms restrictivo.
El predicado 45 se emplea para recuperar /nicamente aquellos registros de la consulta principal para los que algunos
registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los productos vendidos con un
descuento igual o mayor al AB por ciento0
SELECT *
FROM
Productos
WHERE
IDProducto
IN
(
SELECT
IDProducto
FROM
DetallePedido
WHERE
Descuento = 0.25
)
4nversamente se puede utiliar 583 45 para recuperar /nicamente aquellos registros de la consulta principal para los que
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
37
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
no hay ning/n registro de la subconsulta que contenga un valor igual.
El predicado E;4"3" %con la palabra reservada 583 opcional( se utilia en comparaciones de verdadD!also para determinar
si la subconsulta devuelve alg/n registro. "upongamos que deseamos recuperar todos aquellos clientes que hayan realiado al
menos un pedido0
SELECT
Clientes.Compaa, Clientes.Telfono
FROM
Clientes
WHERE EXISTS (
SELECT
FROM
Pedidos
WHERE
Pedidos.IdPedido = Clientes.IdCliente
)
Esta consulta es equivalente a esta otra0
SELECT
Clientes.Compaa, Clientes.Telfono
FROM
Clientes
WHERE
IdClientes
IN
(
SELECT
Pedidos.IdCliente
FROM
Pedidos
)
"e puede utiliar tambi*n alias del nombre de la tabla en una subconsulta para re!erirse a tablas listadas en la clusula ?68)
!uera de la subconsulta. El ejemplo siguiente devuelve los nombres de los empleados cuyo salario es igual o mayor que el
salario medio de todos los empleados con el mismo ttulo. & la tabla Empleados se le ha dado el alias 310
SELECT
Apellido, Nombre, Titulo, Salario
FROM
Empleados AS T1
WHERE
Salario =
(
SELECT
Avg(Salario)
FROM
Empleados
WHERE
T1.Titulo = Empleados.Titulo
)
ORDER BY Titulo
En el ejemplo anterior, la palabra reservada &" es opcional.
SELECT
Apellidos, Nombre, Cargo, Salario
FROM
Empleados
WHERE
Cargo LIKE 'Agente Ven*'
AND
Salario ALL
(
SELECT
Salario
FROM
Empleados
WHERE
Cargo LIKE '*Jefe*'
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
38
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
OR
Cargo LIKE '*Director*'
)
%8btiene una lista con el nombre, cargo y salario de todos los agentes de ventas cuyo salario es mayor que el de todos los
je!es y directores.(
SELECT DISTINCT
NombreProducto, Precio_Unidad
FROM
Productos
WHERE
PrecioUnidad =
(
SELECT
PrecioUnidad
FROM
Productos
WHERE
NombreProducto = 'Almbar anisado'
)
%8btiene una lista con el nombre y el precio unitario de todos los productos con el mismo precio que el almbar anisado.(
SELECT DISTINCT
NombreContacto, NombreCompania, CargoContacto, Telefono
FROM
Clientes
WHERE
IdCliente IN (
SELECT DISTINCT IdCliente
FROM Pedidos
WHERE FechaPedido <#07/01/1993#
)
%8btiene una lista de las compa7as y los contactos de todos los clientes que han realiado un pedido en el segundo
trimestre de 1MM2.(
SELECT
Nombre, Apellidos
FROM
Empleados AS E
WHERE EXISTS
(
SELECT *
FROM
Pedidos AS O
WHERE O.IdEmpleado = E.IdEmpleado
)
%"elecciona el nombre de todos los empleados que han reservado al menos un pedido.(
SELECT DISTINCT
Pedidos.Id_Producto, Pedidos.Cantidad,
(
SELECT
Productos.Nombre
FROM
Productos
WHERE
Productos.IdProducto = Pedidos.IdProducto
) AS ElProducto
FROM
Pedidos
WHERE
Pedidos.Cantidad = 150
ORDER BY
Pedidos.Id_Producto
%6ecupera el -digo del 'roducto y la -antidad pedida de la tabla pedidos, extrayendo el nombre del producto de la tabla de
productos.(
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
39
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com
SELECT
NumVuelo, Plazas
FROM
Vuelos
WHERE
Origen = 'Madrid'
AND Exists (
SELECT T1.NumVuelo FROM Vuelos AS T1
WHERE T1.PlazasLibres > 0 AND T1.NumVuelo=Vuelos.NumVuelo)
%6ecupera n/meros de vuelo y capacidades de aquellos vuelos con destino )adrid y plaas libres
"upongamos ahora que tenemos una tabla con los identi!icadores de todos nuestros productos y el stocW de cada uno de
ellos. En otra tabla se encuentran todos los pedidos que tenemos pendientes de servir. "e trata de averiguar que productos
no se podemos servir por !alta de stocW.
SELECT
PedidosPendientes.Nombre
FROM
PedidosPendientes
GROUP BY
PedidosPendientes.Nombre
HAVING
SUM(PedidosPendientes.Cantidad <
(
SELECT
Productos.Stock
FROM
Productos
WHERE
Productos.IdProducto = PedidosPendientes.IdProducto
)
)
"upongamos que en nuestra tabla de empleados deseamos buscar todas las mujeres cuya edad sea mayor a la de cualquier
hombre0
SELECT
Empleados.Nombre
FROM
Empleados
WHERE
Sexo = 'M' AND Edad > ANY
(SELECT Empleados.Edad FROM Empleados WHERE Sexo ='H')
lo que sera lo mismo:
SELECT
Empleados.Nombre
FROM
Empleados
WHERE
Sexo = 'M' AND Edad >
(SELECT Max( Empleados.Edad )FROM Empleados WHERE Sexo ='H')
La siguiente tabla muestra alg/n ejemplo del operador &5< y &LL
7alor
1
1%erador 7alor # Resultado
3 P 5&: (0,1,! -ierto
3 R 5&: (0,1,! <also
3 R 5&:
(0,3,1,!
-ierto
Tuorial de SQL: http://www.desarrolloweb.com/manuales/9/
# $os manuales de DesarrolloWeb.com tienen el cop%right de sus autores. &o reproducir sin autorizaci'n.
40
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com