Una mirada a SQL (IV)

Para esta miradita repasaremos lo que tenemos. Ya hemos puesto en marcha los servidores SQL y http con php, hemos creado una base de datos, tablar e insertado algunos datos y contreñas seguras. Ahora continuemos con un paso muy sencillo. Rellenemos las bases de datos con mas datos asi que

INSERT INTO base_de_datos.usuarios (id, nick, pass) VALUES
 (NULL, 'pedro', MD5('algunpa$$')),
 (NULL, 'jorge', PASSWORD('0trop4$$'))
 (NULL, 'alguntroll', SHA1('123456'))

Bien como vimos en la leccion pasada podemos usar informacion especifica usando la forma padre.hijo con padre = base de datos e hijo=tabla en este caso. Por lo siguiente dentro de la seccion de valores pasamos los pares de valores (cosas entre parentesis) para cada registe que deseamos hacer, siendo en este caso 3 usuarios. Cabe mencionar tambien que el primer campo «id» esta siendo mandado como NULL en la consulta ya que id se definio como un campo de autoincremento asi que el id se incrementa en uno cada vez q se manda una consulta. Claro somos unos admins muy descuidados y nuestro pass esta en plano aun asi que debemos corregir ese error usando la sentencia REPLACE que busca en un campo especifico de la tabla y reemplaza los valores. OJO: reemplaza los valores es una palabra literal por el momento ya que si buscamos algo muy generico como «e», reemplazara esa «e» en todos los registros por lo que le mandemos y por el momento no tenemos manera de generar una consulta mas inteligente.

SELECT REPLACE( pass, 'root', MD5( 'pass' ) ) FROM usuarios

Y de nuevo mandamos una consulta [tt]SELECT * FROM[tt] usuarios para revisar lo que llevamos al momento. Ahora ingresemos datos en la tabla faltante ya que la hemos olvidado, para hacerlo usaremos los id de nuestros usuarios registrados, el mensaje y la fecha. Y lo hicimos de nuevo, somos unos programadores algo despistados pues necesitamos tener una manera de identificar nuestro post como unico por lo que debemos incluir otro campo, esta vez llamado pubid que sera el id de la publicacion.

ALTER TABLE publicaciones ADD pubid INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST 

La sentencia ALTER TABLE nos midifica la tabla. Los posibles tipos de modificacion son:

  • ADD (añadir columna), con una sintaxis similar a CREATE TABLE para insertar los campos.
  • MODIFY (cambiar columna), donde los parametros son el nombre del campo y el nuevo tipo de este para cambiar por ejemplo de VARCHAR a INT.
  • CHANGE (cambiar el nombre) donde primero se pone el nombre a cambiar y despues el nuevo nombre.
  • DROP (tirar), con esto eliminamos una tabla con sus correspondientes registros.

Asi que ya con todo listo podemos pasar a agregar nuestros registros.

INSERT INTO publicaciones( pubid, id, mensaje, fecha ) VALUES
 (NULL , 1, 'Bienvenidos al nuevo sistema de publicaciones', NOW( )),
 (NULL , 1, 'Activado sistema de registro mejorado', NOW( )),
 (NULL , 2, 'Nuevo admin presente ;)', NOW( )),
 (NULL , 3, 'Hey admin que tal?', NOW( )),
 (NULL , 1, 'Muy bien', NOW( )),
 (NULL , 2, 'Oye yo soy el admin :@', NOW( )),
 (NULL , 5, 'spam', NOW( )),
 (NULL , 5, 'mas spam', NOW( )),
 (NULL , 5, 'mucho spam', NOW( )),
 (NULL , 5, 'no me harto del spam', NOW( )),
 (NULL , 5, 'otro mensaje de spam', NOW( )),
 (NULL , 5, 'cuanto spam', NOW( )),
 (NULL , 5, 'mas muchisimo mas spam', NOW( ));
Solo podre agregar que al usar la funcion NOW() se escribe la fehca y hora actual. Esta ocasion al hacer la consulta:
SELECT usuarios.nick, usuarios.pass, publicaciones.pubid FROM usuarios, publicaciones

Los resultados son muy interesantes ya que obtenemos todos los datos de la tabla usuarios para cada pubid de la tabla publicaciones por lo que el siguiente paso debe ser, refinar los datos que nos regresa.

Otra sentencia de ayuda es la sentencia WHERE que nos ayuda a encontrar registros con alguna propiedad particular. Ademas esta sentencia nos permite utilizar los operadores logicos AND y OR. Busquemos los datos generados antes de la fecha actual, escritos por cualquiera de los dos administradores.

SELECT *  FROM `publicaciones` WHERE (`id` = 1 OR `id` = 2) AND `fecha` < 'NOW()'

Para evitar confusiones los nombres pertenecientes a la base de datos estan escritos entre un acento inverso. Para la busqueda usamos un valor numerico gracias a que los campos usados son del tipo INT (numerico), y el valor de la fecha tiene un formato conocido, sin embargo se puede utilizar la forma EPOCH el cual es el numero de segundos que han pasado desde que empezo 1970 y claro, es un numero, por lo que la fecha puede ser mayor, menor o igual al tiempo EPOCH con el que lo comparemos.

Otra forma parecida es la sentencia IN que junto a WHERE nos permite obtener los registros que contengan la informacion que deseamos, tanto numerica como alfanumericamente.

SELECT *  FROM `usuarios` WHERE `nick` IN ("admin","jorge")

En esta consulta veremos el registro admin, pero no el de admin2 ya que no lo solicitamos de forma explicita.

Id nick pass
1 admin root
4 jorge *4B3B4F2B5B210B677C6B656E68789

Otra manera para obtener los registros sin tener que usar los simbolos «<» y «>» es BETWEEN. Esto nos da como resultado los registros entre los valores que pedimos en la consulta.

SELECT *  FROM `publicaciones` WHERE `pubid` BETWEEN 3 AND 8

Y por ultimo usaremos la instruccion LIKEy NOT LIKE que sirve para distinguir campos alfanumericos. Entre las multiples opciones que tenemos para usarlo podemos incluir los caracteres:

  • «%» como comodin universal, es decir, para ocupar un numero indistinto de caracteres desconocidos.
  • «_» que sirve como comodin unitario que reemplaza un solo caracter desconocidos.

Tambien se pueden usar expresiones regulares con los siguientes comodines en la condicion REGEXP:

  • «[abc]» para buscar cualquiera de los caracteres usados, para una secuencia mas amplia puede usarse [a-z] para buscar todo el alfabeto, [0-9] para los numeros
  • «*» efectua el reconocimiento de los caracteres cualquier numero de veces, por ejemplo para buscar solo numeros dentro de un campo de texto podemos usar [0-9]*
  • «.» tiene el mismo efecto que «_» de la clausula LIKE
  • «{n}»  realiza la comparacion durante n veces, por ejemplo buscar un numero con 7 veces el numero cero «0{7}»
  • «^» obliga a que el caracter este al principio de la cadena como, ^a buscara todo lo que empieze por «a»
  • «$» obliga a que el caracter este al final de la cadena como, z$ busca las palabras terminadas en «z»

Procederemos a buscar a aquellos que sean administradores o tengan la letra «e» en su nombre:

SELECT *  FROM `usuarios` WHERE (`nick` LIKE 'admin_') OR (`nick` LIKE '%e%')

El uso de LIKE es un operador de comparacion se pone un OR entre cada LIKE y no un OR entre cada expresion literal a compara y como se notara el resultado excluye a «admin» pero no a «admin2» ya que el caracter «_» en busqueda requiere la existencia de un caracter despues del termino admin, caso contrario al ocupar «%» asi que usemoslo y veamos que sucede.

SELECT *  FROM `usuarios` WHERE `nick` LIKE 'admin%' OR `nick` LIKE '%e%'

Y ahora si, podemos ver a los dos administradores ya que con «%» incluimos cualquier letra en cualquier cantidad, incluyendo la cantidad cero. Para terminar el dia de hoy encontraremos todos los mensajes publicados por nuestros administradores y nos iremos con mucho gusto a descansar despues de un buen rato de aprendizaje.

SELECT  `publicaciones`.`mensaje`, `usuarios`.`nick` FROM `usuarios`, `publicaciones` WHERE `nick` LIKE 'admin%'

Aunque claro todavia existe un poco de desorden, aunque se puede ver un enorme avanze si pensamos que estamos aqui desde 0.

Espero oir las opiniones sobre este tutorial para tener idea de los puntos que serian de ayuda y aun no he abarcado en este texto.

Deja un comentario