Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Este tutorial te va a mostrar como manejar bases de datos en MySQL, SQL Server, MS Access, Oracle, Sybase, DB2 y
otras bases de datos
Que es SQL?
SQL es un standar un lenguaje estructurado para consultas
SQL te permite aceder y manejar bases dedatos
SQL es un Estandar (ANSI American National Standards Institute)
SQL es un estandar pero Apesar de que es un estandar ANSI (American National Standards Institute) hay diferentes
versiones del lenguaje SQL
Y de cualquier modo, siguen cumpliendo el estandar ANSI pues estas versiones soportan la mayoria de los comandos
tales como SELECT, UPDATE, DELETE, INSERT, WHERE
Para construir un sitio web que muestre datos de una base de datos necesitaras lo siguiente:
Tablas
Una base de datos contienen uno o mas tablas. Cada tabla esta identificada por un nombre (ejemplo Clientes o
Ordenes). Las tablas contienen registros (filas) con datos
Sentencias SQL
Manten en mente lo siguiente: las sentencias SQL no son sencibles a las mayusculas o minisculas
Algunos sistemas de bases de datos requieren un punto y coma al final de cada sentencia SQL
El punto y como es un estandar que se para cada sentencia SQL en sistemas de bases de datos que habilitan mas de
una sentencia SQL ejecutada en la misma llamada al servidor
SQL puede ser dividido en dos partes: El Lenguaje de Manipulacion de Datos (DML) y el Lenguaje de Definicion de
Datos (DDL)
DLL del SQL que permite a bases de datos y tablas ser creadas o borradas.
Tambien define indices(llaves). especifica enlaces entre tablas, y impone relaciones entre tablas.
La parte DLL del SQL, las sentencias mas importante DDL en SQL son:
CREATE DATABASE - crea una nueva base de datos
ALTER DATABASE - modifica una base de datos
CREATE TABLE - crea una nueva tabla
ALTER TABLE - modifica una tabla
DROP TABLE - borra una tabla
CREATE INDEX - crea un indice (llave de busqueda)
DROP INDEX - borra un indice
La sentencia SELECT
1) SELECT nombre_columna(s)
FROM nombre_tabla
Ejemplo 1
SELECT nombre_columna(s)
FROM nombre_tabla
SELECT Nombre,Apellidos,Ciudad
FROM Personas
Ejemplo 2
SELECT * FROM nombre_tabla
Muchos sistemas de bases de datos permiten la navegacion en la tabla de resultados programando funciones como:
Moverse-Al-Primero, Obtener-Contenido-Registro, Moverse-Al-Siguiente-Registro, etc.
Funciones de programacion como estas no son parte de este tutorial. Para aprender a accesar a datos con la llamada
a funciones espera mi siguiente tutorial ADO y PHP.
Dentro de una tabla, algunas columnas pueden contener valores duplicados. Esto no es un problema, algunas veces
tu querras listar solo los valores diferentes (distintos) en la tabla
La palabra DISTINCT puede ser usada como llave para regresar solo los valores distintos(diferentes).
Ejemplo:
SQL WHERE
La sentencia where es usada para extraer solo los registros que cumplen con el criterio especificad
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna operador valor
SELECT *
FROM Personas
WHERE Apellidos ='Trejo Lemus'
SQL usa comillas simples en los valores de texto (muchos sitemas manejadores de bases de datos aceptan comillas
dobles).Para SQL los valores de texto deben ser puestos entre comillas simples
SELECT *
FROM Personas
WHERE Nombre=Lucero
SELECT *
FROM Personas
WHERE P_id = 9
SELECT *
FROM Personas
WHERE P_id = '9'
Los operadores AND y OR son usados para filtrar registros basados en mas de una condicion
Operador AND
El operador AND muestra el registro si la primera condicion y la segunda condicion son verdaderas
El resultado seria:
Operador OR
Ahora seleccionaremos las personas con el campo Nombre igual a "Martha" o el campo Nombre igual a "Elvira"
Ahora seleccionaremos solo las personas con el campo Apellidos igual a "Sobrevilla Trejo" AND Nombre igual a
"Marcel Abisag" OR igual a "Jose Abraham"
Usaremos la siguiente sentencia SELECT:
SQL ORDER BY
La sentencia ORDER BY es usada para ordenar los registros en orden ascendente por default
SELECT nombre_columna(s)
FROM nombre_tabla
ORDER BY nombre_column(s) ASCDESC
Ahora vamos a seleccionar todas las personas de la tabla, pero mostrando en orden por el campo Nombre
ORDER BY DESC
Ahora vamos a seleccionar a todas las personas de la tabla pero mostrandolas en un orden descendente por el campo
Nombre con la palabra DESC
La sentencia INSERT INTO se usa para insertar un registro o fila en una tabla
La primera forma no especifica los nombres de las columnas donde los datos seran insertados solo los valores:
La segunda forma especifica los nombres de las columnas y los valores insertados
Mostrara lo siguiente:
Sentencia SQL UPDATE Statement
UPDATE nombre_tabla
SET columna1=valor, column2=valor,...
WHERE alguna_columna=algun_valor
Nota: La sentencia WEHRE en la sintaxis UPDATE, especifica cual de los registros va a ser actualizado. Si omites la
sentencia WHERE todos los registros seran actualizados.
UPDATE Personas
SET Direccion='Canoga Park', Ciudad='L.A.'
WHERE Nombre='Antonio' AND Apellido='Trejo Campos'
El resultado seria:
Nota: La sentencia WHERE en la sintaxis DELETE especifica el registro o los registros que seran borrados, si omites la
sentencia WHERE, todos los registros seran borrados de la tabla
Ahora vamos a borrar la persona "Marco Antonio Trejo Lemus" en la tabla Personas con la siguiente sentencia:
Es posible borrar todas las filas en una table sin borrar la tabla en si. Esto significa que la estructura de la tabla,
atributos e indices quedaran intactos:
or
Nota: Debes tener cuidado cuando borres registros. Ya que no podras deshacer lo que hagas con esta sentencia.
APENDICE 1
El siguiente codigo creara la base de datos en el servidor SQL EXPRESS
1.- Hacer clic en Inicio --> Todos los Programas --> Microsoft SQL SERVER 2008 --> SQL Server Management Studio
3.- Hacer clic Nueva Consulta (se encuentra en el margen superior izquierdo)
Seleccionar y Copiar el siguiente "CODIGO GENERADOR
DE BASE DE DATOS" empresa:
______________________________________________________
USE master
if exists (select * from sysdatabases where name='empresa')
begin
raiserror('La base de datos existe; eliminndola....',0,1)
DROP database empresa
end
GO
raiserror('Creando base de datos empresa....',0,1)
go
CREATE DATABASE empresa
GO
USE empresa
GO
CREATE TABLE Personas(
P_id int PRIMARY KEY IDENTITY,
Nombre nchar(20) NOT NULL,
Apellidos nchar(30) NOT NULL,
Direccion nchar(40) NOT NULL,
Ciudad nchar(10) NOT NULL)
GO
GO
INSERT INTO Personas VALUES ('Marco Antonio','Trejo Lemus','Calle E 822','Tampico')INSERT INTO Personas VALUES
('Martha Beatriz','Trejo Lemus','Calle E 822','Tampico')INSERT INTO Personas VALUES ('Juana Elvira','Trejo
Lemus','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Nora Zulma','Trejo Lemus','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Laura Lucero','Sobrevilla Trejo','Calle E 822','Tampico')INSERT INTO Personas
VALUES ('Maria de la luz','Trejo Campos','Calle E 822','Tampico')INSERT INTO Personas VALUES ('Trinidad','Trejo
Bautista','Calle E 822','Tampico')
INSERT INTO Personas VALUES ('Marcel Abisag','Sobrevilla Trejo','Calle E 822','Tampico')INSERT INTO Personas
VALUES ('Jose Abraham','Sobrevilla Trejo','Calle E 822','Tampico')INSERT INTO Personas VALUES ('Samuel
Salomon','Olmeda Trejo','Calle E 822','Tampico')
GO
select * from Personas
quit
______________________________________________________
5.- Ejecutar el codigo SQL haciendo clic sobre la opcion !Ejecutar que se muestra a continuacion:
Ahora seleccionaremos solo los dos primeros registros de la tabla que se muestra abajo:
El operador LIKE se usa en una sentencia WHERE para buscar un patron en una columna
Sintaxis LIKE
SELECT nombre_columna(s)
FROM nombre_tabla
WHERE nombre_columna LIKE patron
Vamos a buscar las personas que viven en la ciudad de Tampico que empiecen con "Ta" de la tabla en cuestion
El signo "%" puede ser usado para definir comodines (letras que faltan en el patron de busqueda) ambas antes o
despues del patron de busqueda
Ahora vamos a seleccionar las personas que viven en la ciudad que comienza con una "T" de la tabla personas
Ahora vamos a seleccionar las personas que viven en la ciudad que contiene el patron "tam" de la tabla personas
Tambien es posible seleccionar las personas que viven en la ciudad que no contienen el patron "tamp" de la tabla
personas, usando la palabra clave NOT
Comodines SQL
Los comodines SQL pueden ser usados en la busqueda de datos en una base de datos
pueden sustituir a uno o mas caracteres cuando se busquen los datos
Usando el comodn %
Ahora seleccionaremos las personas que viven en la ciudad de Tampico que empiecen con "Ta" de la tabla Personas
Ahora buscaremos las personas que viven en la ciudad que contenga el patron "ico" de la tabla Personas
Usando el _ Comodn
Ahora selectionaremos las personas que el primer nombre comience con algun caracter
seguido de "Ma" de la tabla Personas
Como podemos observar, para el da 1 y 2 de Diciembre tenemos 24 y 7 filas( 31 en total ), ahora ejecutemos la
siguiente consulta:
1 SELECT *
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201' AND '20121202'
Como podemos observar solo arroja 24 filas, y que pas con las 7 filas restantes??? Si observamos
detenidamente la consulta:
1 SELECT *
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201' AND '20121202'
La columna fecha es de tipo DATETIME, pero que tipo de dato son los filtros que estamos aplicando? Ejecutemos
la siguiente consulta:
1 SELECT CAST( '20121201' AS DATETIME ) as fecha1
2 , CAST( '20121202' AS DATETIME ) as fecha2
Sorpresa? No, porque est es la forma en que el motor maneja las fechas, observemos y ejecutemos la siguiente
consulta:
1 DECLARE @hoy AS DATETIME
2 SET @hoy = GETDATE()
3 SELECT @hoy AS fechaDATETIME
4 , CAST( @hoy AS DATE ) AS fechaDATE
5 , CAST( CAST( @hoy AS DATE ) AS DATETIME ) AS fecha
Mostramos la fecha hora actual que es de tipo DATETIME, lo convertimos a DATE y nuevamente a DATETIME,
como podemos observar la hora actual no es la misma.
Perfecto, ya qued comprendido, debo utilizar un tipo de dato DATETIME para hacer el filtro de la siguiente
manera:
1 SELECT *
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201 00:00' AND '20121202 23:59'
Claro, qued solucionado, ya podemos filtrar por fechas, pero... que pasa si agregamos una fila con la hora
23:59:59
1 INSERT INTO pruebas VALUES( '2012-12-02 23:59:59' )
Y ejecutamos nuevamente la consulta de agrupacin para observar cuantas filas tenemos por da.
1 SELECT CAST( fecha AS DATE ) as dia, COUNT( id ) as total
2 FROM pruebas
3 GROUP BY CAST( fecha AS DATE )
Observemos que ya tenemos 8 filas en el da 2 y apliquemos el query para extraer las filas del da 1 y 2
nuevamente:
1 SELECT *
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201 00:00' AND '20121202 23:59'
Y ahora que paso? si ya aplicamos la consulta con los filtros fecha-hora... Ok, esto es cierto, pero recordemos
que el tipo DATETIME en SQL SERVER almacena hasta milsimas de segundo, por lo tanto en la consulta
debemos especificar hasta la ultima milsima de segundo del da 2, en este caso solo manejamos hasta
segundos:
1 SELECT fecha
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201 00:00' AND '20121202 23:59:59'
Ahora, hagamos la prueba agregando una fila con milsimas de segundo:
1 INSERT INTO pruebas VALUES( '2012-12-02 23:59:59.997' )
Ejecutamos la consulta de agrupacin:
1 SELECT CAST( fecha AS DATE ) as dia, COUNT( id ) as total
2 FROM pruebas
3 GROUP BY CAST( fecha AS DATE )
Y ahora ya tenemos 9 filas en el da 2 y para poder obtener esas filas es necesario especificar el ultimo
milisegundo del da 2 de la siguiente manera:
1 SELECT fecha
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201 00:00' AND '20121202 23:59:59.999'
Ok, comprendido, pero tambin esto lo consigo entonces filtrando de la siguiente manera???:
1 SELECT fecha
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201' AND '20121203'
Ya que 2012-12-03 es igual a 2012-12-03 00:00:00.000 porque SQL SERVER as lo interpreta cuando se
comparan DATE y un DATETIME.
ERROR, esto funcionar siempre y cuando no tengamos una fila con fecha 2012-12-03 00:00:00.000
1 INSERT INTO pruebas VALUES( '2012-12-03 00:00:00.000' )
Si ejecutamos el mismo query, obtenemos lo siguiente:
Esta bien, ya comprend, entonces esto lo puedo lograr convirtiendo la columna a tipo DATE y filtrando solo por
el da sin horas, minutos y segundos??
Respuesta: SI, pero no es recomendable. Al hacer esto afectaremos la bsqueda del query, supongamos que
nuestra tabla est indexada por este campo:
1 CREATE NONCLUSTERED INDEX IXfecha ON pruebas (fecha);
Despus activamos la Inclusin del Plan de Ejecucin en el resultado de la consulta, a travs de CTRL + M o en
el botn que describe la siguiente imagen:
Y ejecutamos la consulta:
1 SELECT fecha
2 FROM pruebas
3 WHERE fecha BETWEEN '20121201 00:00' AND '20121202 23:59:59.999'
Como podemos observar, hay una pestaa ms en nuestro resultado que es el Plan de Ejecucin y adems
vemos una grfica del proceso que hizo el motor para obtener el resultado; Al ver un Index Seek no nos debemos
preocupar, esto quiere decir que el motor est buscando o filtrando por un ndice, lo cual es correcto. Pero que
pasa si convertimos la columna en tipo DATE para poder lograr lo que unos pasos antes comentabamos:
1 SELECT fecha
2 FROM pruebas
3 WHERE CAST( fecha AS DATE) BETWEEN '20121201' AND '20121202'
Si, tambin obtendremos las mismas 33 filas pero a que costo, observemos el plan de ejecucin de la consulta
nuevamente:
Hizo ms pasos para obtener las mismas filas, entonces esto quiere decir que nuestra consulta no est del todo
bien, ms adelante les explicar que significa tantas imgenes en el plan de ejecucin.
Esto sucede porque al aplicar una funcin sobre una columna que se encuentra indexada, esta pierde su
propiedad y estaremos buscando sobre una columna NO INDEXADA.
Ok ok, ya comprend, pero entonces que puedo hacer para obtener esos 33 registros sin afectar el rendimiento
del query???
Respuesta: Volver a los operadores mayor o igual que( >= ) y menor ( < ) de la siguiente manera:
1 SELECT fecha
2 FROM pruebas
3 WHERE fecha >= '20121201' AND fecha < '20121203'
)
De esta forma estaremos tomando las filas que tengan 2012-12-01 00:00:00.000 y adems aquellas que sean
menores a 2012-12-03 00:00:00.000 como 2012-12-02 23:59:59.999.
En resumen, debemos de conocer cmo funciona el tipo de dato DATETIME para poder aplicar un BETWEEN,
en caso contrario lo mejor siempre ser utilizar los operadores mayor o igual que( >= ) y menor ( < ).