Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Peticin SQL
Datos
El programa informtico que controla base de datos, se denomina Sistema de gestin de Base de
Datos o DBMS.
Cuando se necesita recuperar datos de la base de datos, se utiliza el lenguaje SQL para efectuar la
peticin. El DBMS procesa la peticin SQL, recupera los datos solicitados y los devuelve. Este
proceso de solicitar datos de la base de datos y de recibir los resultados se denomina
consulta(query) a la base de datos; de aqu el nombre Structured Query Language.
El SQL es ms que una herramienta de consulta, tambin incluye las siguientes funciones:
1.
Definicin de datos
2.
Recuperacin de datos
3.
Manipulacin de Datos
4.
Control de acceso
5.
Comparticin de datos
6.
Integridad de datos
Por tanto SQL es un lenguaje completo de control e interaccin con un sistema de gestin de base
de datos.
2.
3.
4.
5.
6.
CARACTERSTICAS DE SQL
1.
2.
3.
4.
El apoyo de IBM
5.
Su fundamento relacional
6.
7.
8.
9.
HISTORIA DE SQL
El concepto de base de datos relacional fue desarrollado originalmente por Ted Codd, de IBM en
1970. Este fue el origen del modelo relacional y de SQL. Veamos:
-
MDL
El SQL DML incluye un lenguaje de consultas basado en el lgebra relacional y el clculo relacional
de tuplas. Tambin incluye rdenes para insertar, suprimir y modificar tuplas de la base de datos.
TIPOS DE SQL
SQL DINAMICO
Permite hacer consultas o definir datos en tiempo real, es decir de acuerdo a un contexto
determinado.
SQL
QUERY BY EXAMPLE
QUEL
MYSQL
Barra de
herramientas
Ayuda
contextual
Zona de
codificacin
Bases de
datos
columna puede contener valores NULL, Key indica si la columna est indexada,
y Default informa el valor por defecto de la columna.
Si una tabla tiene ndices, SHOW INDEX FROM tbl_name muestra informacin sobre ellos.
En ambientes Unix/Linux, los nombres de las bases de datos son case sensitive (al
contrario que las palabras clave), de modo que siempre debe referirse a su base de
6
ACTIVIDAD
values('0002','mouse','01',65,34.65219,'1');
values('0003','Monitor','01',65,3456.659,'1');
values('0004','Memoria','01',165,23,'1');
as total_item from productos;
into
into
into
into
into
into
det_pedidos
det_pedidos
det_pedidos
det_pedidos
det_pedidos
det_pedidos
values('0001','0002',12);
values('0001','0001',12);
values('0001','0004',12);
values('0002','0002',12);
values('0002','0004',12);
values('0003','0001',12);
APRENDIENDO MYSQL
Mostrare cmo usar el programa cliente MYSQL para crear y usar una simple base de
datos MYSQL (al que algunas veces nos referimos como "monitor terminal" o
simplemente "monitor") es un programa interactivo que te permite conectarte a un
servidor MYSQL, ejecutar consultas y observar los resultados. MYSQL puede ser
usado tambin en modo batch: escribes tus consultas en un fichero de texto, para
despus pedirle a MYSQL que ejecute el contenido del fichero. Se cubren aqu esas
dos formas de usar de MYSQL.
Para ver una lista de opciones de ayuda proporcionadas por MYSQL, lnzalo con las
opcin help :
MYSQL> help
Se asume que MYSQL est instalado en tu mquina, y que hay disponible un servidor
al que te puedes conectar. Si esto no es as, contacta con tu administrador MYSQL
Se describe el proceso completo de configurar y usar una base de datos. Si ests
interesado slo en acceder una base de datos ya existente, querrs saltar las
secciones que describen cmo crear la base de datos y las tablas que la contienen.
Conectando y desconectando del servidor
===========================================
Para conectarse al servidor, generalmente necesitars facilitar un nombre de usuario
MYSQL cuando lances el cliente MYSQL y, lo ms probable, tambin un password. Si
el servidor se est ejecutando en una mquina distinta a la que ests conectado,
necesitars especificar tambin un nombre de host. Contacta con tu administrador
para averiguar qu parmetros de conexin necesitas usar para conectar (es decir,
qu host, nombre de usuario y password usar). Una vez que conozcas los parmetros
adecuados, debers ser capaz de conectar de la siguiente forma:
shell> MYSQL -h host -u user -p
Enter password: *******
Welcome to the MYSQL monitor. Commands end with ; or \g.
Your MYSQL connection id is 459 to server version: 3.22.20a-log
10
combinacin
He aqu otra consulta. Demuestra que puedes usar MYSQL como una calculadora
sencilla:
MYSQL> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 |
25 |
+-------------+---------+
Los comandos vistos hasta aqu han sido relativamente cortos, sentencias de una sola
lnea. Tambin puedes insertar mltiples sentencias en una sola lnea. Simplemente,
termina cada una con un punto y coma:
MYSQL> SELECT VERSION(); SELECT NOW();
+-----------+
| version() |
+-----------+
| 3.22.23b |
+-----------+
+---------------------+
| NOW()
|
+---------------------+
| 2000-01-05 17:33:16 |
+---------------------+
12
Significado
Listo para un nuevo comando
Esperando una nueva lnea de una consulta multi-lnea
Esperando la siguiente lnea, se ha insertado una lnea que comienza con
Esperando la siguiente lnea, se ha insertado una lnea que comienza con
Las sentencias multi-lnea ocurren comnmente "por accidente" cuando intentas lanzar
un comando en una nica lnea, pero olvidas el punto y coma del final. En este caso,
MYSQL espera ms entrada:
MYSQL> SELECT USER()
->
13
propietario
Harold
Gwen
Harold
Benny
Diane
especie
gato
gato
perro
perro
perro
m
f
m
m
18
sexo nacimiento
muerte
f
1993-02-04
1994-03-17
1989-05-13
1990-08-27
1998-08-31
1995-07-29
Gwen
Gwen
Benny
pjaro
pjaro
serpiente
1998-09-11
1997-12-09
m
1996-04-29
Dado que ests comenzando con una tabla vaca, una forma sencilla de poblarla
consiste en crear un fichero de texto conteniendo una fila para cada uno de tus
animales, y despus cargar el contenido del fichero en la tabla con una sola sentencia.
Puedes crear un fichero de texto "mascota.txt" conteniendo un registro por lnea, con
valores separados por tabuladores, y dados en el orden en el que las columnas fueron
listadas en la sentencia CREATE TABLE. Para valores perdidos (como sexos
desconocidos, o fechas de muerte de animales que an estn vivos), puedes usar
valores NULL. Para representar estos en tu fichero de texto, use \N. Por ejemplo, el
registro para Whistler el pjaro sera algo como esto (donde el espacio en blanco entre
valores es un simple carcter de tabulacin):
Whistler Gwen
pjaro
\N
1997-12-09
\N
Para cargar el fichero de texto "mascota.txt" en la tabla mascota, usa este comando:
MYSQL> LOAD DATA LOCAL INFILE "mascota.txt" INTO TABLE mascota;
Puedes especificar el valor de separacin de columna y el marcador de final de lnea
explcitamente en la sentencia LOAD DATA si lo deseas, pero por defecto equivalen a
TAB y LF (intro). Estos valores por defecto son suficientes para que la sentencia que
lee el fichero "mascota.txt" funcione
correctamente.
Cuando quieras aadir nuevos registros uno a uno, la sentencia INSERT es muy til.
En su forma ms simple, ofreces valores para cada columna, en el orden en el que las
columnas fueron listadas en la sentencia CREATE TABLE. Supn que Diane consige
un nuevo hamster llamado Puffball. Podras aadir un nuevo registro usando una
sentencia INSERT como esta:
MYSQL> INSERT INTO mascota
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Observa que los valores string y fecha se espefican encerrados entre comillas.
Observa tambin que, con INSERT, puedes insertar NULL directamente para
representar un valor perdido. No usamos \N como hacamos con LOAD DATA.
De este ejemplo, deberas ser capaz de ver que hubiera dido mucho ms costoso
teclear todos los datos necesarios en la tabla mascota con sentencias INSERT que
hacerlo como lo hemos hecho con una nica sentencia LOAD DATA.
Extrayendo informacin de una tabla
===============================================
La sentencia SELECT se usa para recabar informacin de una tabla. La forma general
de la sentencia es:
SELECT qu_seleccionar
FROM de_qu_tabla
WHERE condiciones_a_satisfacer
19
mascota
SET
nacimiento="1989-08-31"
WHERE
OR
25
30
1995-05-15
1993-06-23
1994-06-19
1999-03-21 veterinario
necesit un enderezamiento de pico
1997-08-03 veterinario
costilla rota
1991-10-12 perrera
__________________
1991-10-12 perrera
__________________
1998-08-28 cumpleaos Se le regala un nuevo juguete de goma
1998-03-17 cumpleaos Se le regala un nuevo collar de pulgas
1998-12-09 cumpleaos Primer cumpleaos
36
PRACTICA
Conseguir la Base de datos PUBS de SQL Server y desarrollar los siguientes ejercicios
BASE DE DATOS
:
PUBS
TABLAS
:
Articulos, Authors(*), Employee(*), Titles(*), Titleauthor(*)
1. mostrar los campos de la tabla employee:
3. Puede cambiar la consulta anterior y cambiar el orden de las columnas, se devuelve la misma
informacin pero se exhibe con un orden diferente.
38
aos.
aos.
aos.
aos.
9. visualice los campos emp_id, lname, fname para la tabla employee con la condicin de
pub_id=0877
Helen
10. Encontrar a los empleados que trabajan para editores con la clave pub_id 0877 o 9999
19.9900
19.9900
2.9900
NULL
42
0877
Nombres
Ana Maria
E02
E03
Elena Iris
Rita Miriel
Apellidos
Mendez
Torres
Lopez Tunes
Luna Pizarro
Dni
10250623
Direccion
Los Portales
Telefono
4628960
10262392
10245630
Javier Prado
Las Flores
5622360
5602314
Tipo
CODIGO(primary key)
NOMBRES
APEPAT
APEMAT
EDAD
CHAR
VARCHAR
VARCHAR
VARCHAR
CHAR
43
Amplitud
3
30
15
15
2
SEXO
ESTCIV
CHAR
CHAR
1
1
APEMAT EDA
D
Torres
20
Manco
Orihuela
Quispe
Navarro
22
23
25
27
SEX
O
M
ESTCI
V
S
M
F
F
M
S
S
S
C
44
1. mysql>
SELECT ...................................................................................................
Resultado:
+---------------------+
| NOW()
|
+---------------------+
| 2000-01-05 17:33:16 |
+---------------------+
+---------------------+
| CURRENT_DATE
+---------------------+
| 2000-01-05
|
+---------------------+
mysql>
SELECT ..................................................................................................
Resultado:
45
Realice una consulta que presente los clientes cuyos distritos empiecen con
la letra S.
mysql>
Realice una consulta que presente los campos cdigo de artculo, nombre de
artculo y precio de costo ordenando este ltimo en forma ascendente.
mysql>
Realice una subconsulta que seleccione los nombres de los clientes con su
respectivo distrito.
mysql>
47
Resultado:
Realice una comparacin de cadenas: hola, hola utiliza: operador de
asignacin: SET, funcin de comparacin de cadenas: STRCMP
mysql>
Resultado:
ventas
392.00
367.00
474.00
299.00
142.00
305.00
361.00
286.00
186.00
OFICINAS
oficina
ciudad
region
dir objetivo ventas
--------------- -------------------- ---------- ---- -------------------- --------48
New York
Chicago
Atlanta
Los Angeles
Denver
Este
Este
Este
Oeste
Oeste
106 575
104
NULL
108
108
692
800
350
725
300
735
367
835
186
RESULTADOS
nombre
-----------------------------Mary Jones
Bill Adams
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
Nancy Angelli
(9 filas afectadas)
ciudad
region
-------------------- ---------New York
Este
Atlanta
Este
Los Angeles
Oeste
New York
Este
Chicago
Este
Chicago
Este
Los Angeles
Oeste
Chicago
Este
Denver
Oeste
nombre
-----------------------------Sue Smith
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
(5 filas afectadas)
ciudad
objetivo
-------------------- -------------------Los Angeles
725
Chicago
800
Chicago
800
Los Angeles
725
Chicago
800
ciudad
-------------------Chicago
New York
(2 filas afectadas)
nombre
------------------------------ -----------------------Mary Jones
592.25
Sam Clark
592.25
(2 filas afectadas)
50
ventas
-------------------392.00
367.00
474.00
299.00
142.00
305.00
361.00
286.00
186.00
---------------------------------------417.500000
(1 filas afectadas)
nombre
oficina_rep cuota ventas
oficina ciudad
region dir
objetivo ventas
------------------------------ -------------------- -------------- ---- --------------------------------------Mary Jones
11
300.00 392.00 11
New York Este 106
575
692
Bill Adams
13
350.00 367.00 13
Atlanta
Este NULL
350
367
Sue Smith
21
350.00 474.00 21
Los Angeles Oeste 108
725
835
Sam Clark
11
275.00 299.00 11
New York Este
106
575
692
Bob Smith
12
200.00 142.00 12
Chicago
Este
104 800
735
Dan Roberts
12
300.00 305.00 12
Chicago
Este
104 800 735
Larry Fitch
21
350.00 361.00 21
Los Angeles Oeste 108
725
835
Paul Cruz
12
275.00 286.00 12
Chicago
Este
104 800 735
Nancy Angelli
22
300.00 186.00 22
Denver
Oeste 108
300 186
(9 filas afectadas)
---------------------------------------- ---------------------------------------645.777777
2700.00
(1 filas afectadas)
---------------------------------------575.00
775.00
350.00
700.00
300.00
(5 filas afectadas)
Advertencia: valor NULL eliminado por el agregado u otra operacin SET.
51
CONSULTAS SUMARIAS
PRACTICA DE SQL
/****PUBS********/
1. /*seleccione el codigo y el nombre de los editores usando un alias para la tabla use pubs
SELECT p.pub_id, p.pub_name
FROM publishers AS p */
3. /*Hallar todas las combinaciones posibles entre autores y editores Mostrar el apellido del autor y
el nombre del publicista odernados ascendentemente
SELECT au_lname, pub_name
FROM authors CROSS JOIN publishers
ORDER BY au_lname ASC, pub_name ASC*/
4. /*Mostrar todos los autores con su respectivo ttulo eincluir en el resultado los autores que no
tuvieran titulo publicados
SELECT authors.au_lname AS Apellido, authors.au_fname AS Nombre, titleauthor.title_id
FROM authors LEFT OUTER JOIN titleauthor
ON authors.au_id = titleauthor.au_id*/
52
6. /*Mostrar todos los titulos con sus editores e incluir en la consulta los editores aun no tengan
titulos publicados
SELECT titles.title AS 'Title', publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name*/
7. /*Mostrar todos los autores con sus respectivos titulos donde el titulo empiece con la letra B
usando uyna tabla derivada
SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, (SELECT title_id, au_id FROM titleauthor where title_id like 'B%') AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname*/
/******NORTHWIND****/
9. /*Mostrar todos los productos con su respectivo stock, donde su stock este entre 15 y 25
unidades
SELECT ProductID, ProductName,UnitsInStock
FROM Northwind.dbo.Products
WHERE UnitsInStock BETWEEN 15 AND 25
ORDER BY productid*/
10. /*Mostrar todos los productos con su respectivo stock, donde su stock sea 15 o 25 unidades
53
11. /*Mostrar todos los productos con su respectivo stock, donde su stock este entre 15 y 25
unidades sin usar between y ordenado por stock
SELECT UnitsInStock, ProductID, ProductName
FROM Northwind.dbo.Products
WHERE UnitsInStock >= 15 AND UnitsInStock <= 25
ORDER BY UnitsInStock*/
12. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25:
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE (UnitsInStock NOT BETWEEN 15 AND 25) and (UnitsInStock NOT BETWEEN 30 AND
40)
ORDER BY UnitsInStock*/
13. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25:
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE UnitsInStock < 15 or UnitsInStock > 25
ORDER BY UnitsInStock*/
14. /*buscar todos los productos cuyo nmero de unidades en el almacn no se encuentre en el
intervalo 15 a 25 y tampoco entre 30 y 40
SELECT ProductID, ProductName,UnitsInStock
FROM Products
WHERE (UnitsInStock NOT BETWEEN 15 AND 25) and (UnitsInStock NOT BETWEEN 30 AND
40)
54
15. Seleccionar todos los editores con titulo publicados de tipo "business" usando EXISTS
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')*/
16. /*Seleccionar todos los editores con titulo publicados de tipo "business" usando IN
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')*/
17. /*Mostrar autores que vivan en la misma ciudad que algun editor usando exists SELECT
au_lname, au_fname
FROM authors
WHERE exists
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)*/
18. /*Mostrar autores que vivan en la misma ciudad que algun editor usando ANY
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
(SELECT city
55
19. /*buscar ttulos de libros publicados por algn editor ubicado en una ciudad que comience
con la letra B usando IN
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE 'B%')*/
20. /*buscar ttulos de libros publicados por algn editor ubicado en una ciudad que comience
con la letra B usando EXIST
SELECT title
FROM titles
WHERE EXISTS
(SELECT *
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE 'B%')*/
21. /*busca nombres de editores que no publiquen libros de tipo business. SELECT pub_name
FROM publishers
WHERE NOT EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
ORDER BY pub_name*/
22. /*Seleccione el codigo y el advance de los titulos cuyo advance(anticipo) sea menor a 5000
56
23. /*Seleccione el codigo y el advance de los titulos cuyo advance(anticipo) sea menor a 5000
o sea NULL, ordenado por el codigo
USE pubs
SELECT title_id, advance
FROM titles
WHERE advance < $5000 OR advance IS NULL
ORDER BY title_id */
25. /*Mostrar los tipos(type) de titulos con su promedio de precios siempre que el anticipo por
cada titulo sea mayor a 5000
USE pubs
SELECT type, AVG(price)
FROM titles
WHERE advance > $500
GROUP BY type*/
57
fecha actual,
28. /*En esta consulta se buscan publicadores cuyas ventas anuales hasta la fecha hayan sido
superiores a 40.000 dlares.
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING SUM(ytd_sales) > 40000*/
29. Seleccionar el codigo de editor o publicador que tengan como mnimo seis libros publicados
SELECT pub_id
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5
30. Seleccionar el codigo de editor y el importe vendido hasta ahora (ytd_sales) de los
publicadores o editores que tengan como mnimo seis libros publicados
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5
58
32. Seleccione los tipos de titulo de los tipos que empiecen con "p"
SELECT type
FROM titles
GROUP BY type
HAVING type LIKE 'p%'
33. Seleccionar el codigo de los editores incluyendo slo aquellos cuyo nmero de
identificacin sea superior a 0800, hayan pagado ms de 15.000 dlares en adelantos totales y
vendan libros por un promedio de menos de 20 dlares.
SELECT pub_id, SUM(advance) AS AmountAdvanced,
AVG(price) AS AveragePrice
FROM pubs.dbo.titles
WHERE pub_id > '0800'
GROUP BY pub_id
HAVING SUM(advance) > $15000
AND AVG(price) < $20
59
60
61