viernes, 29 de marzo de 2013

MYSQL MIniTutorial parte 4

Introducion al minitutorial parte 4

Bievenidos ya la parte 4 :P Uff rapido que pasa el tiempo jejeje.... bueno en esta parte espero ver funciones de mysql, una cosa que cabe aclarar aqui no creamos nuestros "Scripts" como al final de cada capitulo de estas series, simplemente por que como son funciones solo es cuestion de saber aplicarlas, es decir, ya sabemos todo lo anterior, entonces definire un pequeño concepto de cada funcion, con su sintaxis y ejemplo :D de esta manera ustedes pueden aplicarlo en cualquier consulta a la base de datos :D


Funciones

Bueno no se como explicarselos, asi que pondre un ejemplo a mi modo, has visto alguna ves una ¿funcion de php? donde tu describes lo que haga esa funcion y les pasas unos parametros, por ejemplo:

function nombre(parametro1,parametro2,parametron){
y aqui va lo que realiza dicha funcion :D
}

en este caso entonces digamos que mysql tiene una funcion, por ejemplo una que vimos en un capitulo anterior asi de "rapidin" fue la funcion count() que contaba el numero de registros, entonces, digamos que es algo asi:

function count(tabla){
cuenta los numeros de registros del parametro tabla y me lo devuelve
}

en este caso la accion es lo importante que es lo que realiza :P
entonces, una cosa bien clara aqui es que no puse el codigo de count por que realmente no lo se :P XD pero eso es lo que realizaria, asi que las funciones sirven para no hacer tanto trabajo y ayudarnos en muchas ocasiones :D


Bueno empezare poniendo funciones que pueden ser realmente utiles.... si se me pasa alguna, por favor en los comentarios haganmelo saber :D

Estas son algunas de las funciones que utilizan valores numericos.....antes decirles que sino agrego la sintaxis en alguna de estas funciones es por que son utilizadas en las columnas aunque no solo ahi sino en subconsultas... clausula where.. como hemos venido viendo :P

Funciones Matematicas
No no estoy hablando de las funciones que te enseñan en el cole, donde tienes que saber que numero se acerca a tal... xD sino a las funciones de mysql donde utilizamos valores numericos y se utiliza matematicas, aunque en este caso pondre ejemplo de pura aritmetica para no acomplejarlos :P

Count()
Cuenta los registros

Sintaxis:

Select count(nombre_columna) from nombre_tabla;
select count(*) from tabla;

en este caso tenemos dos sintaxis, veremos los ejemplos y explicaremos un poco :D

Primero seleccionamos todos los registros desde la tabla personas....
como ves tenemos 3 filas....
entonces seleccionamos count(apellido) as contando desde personas....
explico esta parte de count....

count(apellido) decimos que nos cuente el numero de registros de la columna apellidos, en este caso son 3
y luego le damos un alias para que se llame contando
y es exactamente lo que nos muestra :D

pero que pasa si agregamos un registro nuevo ¿con un valor nulo o vacio?

Entonces como puedes ver, el valor nulo no es contado y sigue seleccionando 3...

Entonces podriamos usar * (todos) para contar todos los registros, count(*), de esta manera si no sabemos si un valor es nulo, pues igual no seleccionaria todos los registros :D


Una sintaxis que no mencione arriba por que no es muy usada la verdad, pero aveces puede resultarle util, es usar distinct, asi seleccionaria valores distintos, es decir, que no esten repetidos, un ejemplo lo hariamos con la tabla  pedidos:

 Como ves en este caso, tenemos 6 clientes, pero resulta ser que hay clientes que estan repetidos y son los mismos clientes, entonces seleccionamos valores que no esten repetidos con distinct, lo que nos contaria en realidad que son 3 clientes....

seleccionar y contar valores distintos de la columna clientes desde la tabla pedidos;

seria una forma de interpretarlo....

Otro ejemplo usando count es como lo vimos en los minitutos anteriores donde agregabamos group by para poder ordenar registros utilizando funciones, lo recuerdas?


Avg()

Viene del ingles Average siendo su sustantivo en español Promedio aunque tambien se le puede llamar media, el promedio se saca de la siguiente manera....
la suma de todos los registros dividido entre el numero de registros
bueno si es que no me di a entender muy bien les dejo un ejemplo que encontre en kioskea.net
Promedio:
Es la media aritmética y se calcula sumando un grupo de números y dividiendo a continuación por el recuento de dichos números.
Por ejemplo,
el promedio de 2, 3, 3, 5, 7 y 10
es: 30 dividido por 6, que es 5.

Ahi tienen el ejemplo mas claro :)

 Sintaxis:

select avg(nombre_columna) from tabla;

Veamos un ejemplo:

Lo primero que hemos hecho en el ejemplo es seleccionar todos los registros desde la tabla pedidos....
si te fijas luego seleccionamos el promedio de la columna precio_pedido desde la tabla pedidos.
Si sacamos el promedio vemos que esta en lo correcto....
200+1000+1600+700+300+100=5700/6=950

Max()

Devuelve el maximo valor  de una columna.
Sintaxis:
Select max(nombre_columna) from tabla;

En este caso tenemos que el valor maximo de la columna precio_pedido es 2000 y es lo que nos devuelve cuando usamos la sintaxis :D

Min()

Al contrario de la anterior devuelve el valor minimo de una columna....
Sintaxis:
select min(nombre_columna) from tabla;


Como puedes ver en el ejemplo anterior, solo aplicamos la sintaxis y podemos ver que el valor minimo de la columna precio_pedido es 100.

Sum()

Devuelve la suma de una columna.
Sintaxis:
select sum(nombre_columna) from tabla;


Como puedes ver solo realizamos la sintaxis, en este caso puedes ver mas arriba donde seleccionamos todos los campos para comprobar esto, igual habiamos realizado la suma en la funcion avg() que era para el promedio....

Round()

Redondea un valor numerico con punto decimal al valor mas cercano.
Sintaxis:
select round(nombre_columna) from tabla where id=1;

en este caso le digo que eliga un solo valor por que es necesario un solo valor numerico ...
Como en este ejemplo no tengo alguna con valores con punto decimal mostrare un ejemplo utilizando la clausula select, de todas maneras es aplicable con la sintaxis que describi arriba :P, solo que en vez de especificar la columna especificare el valor numerico para que vean como funciona :D


Truncate()
Esto lo que hace es truncar un numero matematicamente hablando, para ello les dejo un concepto de wikipedia bien definido:
(Truncamiento) En el subcampo matemático del análisis numérico, truncamiento es el término usado para reducir el número de dígitos a la derecha del punto decimal, descartando los menos significativos.

Sintaxis:
Truncate(valor_numerico,cuantos_valores_numericos_despues_del_punto_decimal)

 Entonces un ejemplo:

Para no hacerlo muy largo explicare asi "rapidin" :p
1.- truncamos 1.56 y le decimos que queremos 1 decimal despues del punto a la derecha
2.- truncamos 1.56 y le decimos que queremos 0 decimales despues del punto a la derecha
3.- truncamos 1.5666666 y le decimos que queremos 2 decimales despues del punto a la derecha

Como puedes ver es facil de comprender :P

Floor()
Este lo que hace es redondear hacia "abajo" en el caso de round() digamos que redondea al valor mas "cercano" en este caso redondeamos hacia abajo. por ejemplo:

tenemos un numero 1.56 si lo redondeamos hacia abajo seria 1, en el otro caso esto es interesante por que si te fijas bien el numero esta hacia abajo ya, es decir, el numero es negativo... entonces si lo redondeas hacia abajo seria 2 por que? simplemente por que es un numero negativo es decir si lo hacemos mas negativo seria 2 :D

SQRT()

 Con esta funcion podemos devolver la raiz cuadrada de un numero, que es la raiz cuadrada? XDDD pues es un numero que elevado 2 veces da el mismo numero que teniamos... mmm creo que no me explique bien, pero para ello les traigo la definicion de wikipedia, que siempre nos salva :D

En las ciencias matemáticas, se llama raíz cuadrada de un número (a veces abreviada como raíz a secas) a aquel otro que siendo mayor o igual que cero, elevado al cuadrado, es igual al primero.

Entonces ya sabemos la definicion ^^, pues veamos un ejemplo :D


Entonces aplicando el concepto o la definicion bien dicha de wikipedia sabemos que 4x4 es 16 siendo esto se pasa de 14 entonces tenemos que recurrir a puntos decimales siendo 3.7416573867739413^2 igual a 14
los dos ultimos ejemplos son mas faciles
2^2 es 4
3^2 es 9

 Pow() o Power()

Como vimos en la funcion sqtr() deciamos que elevavamos el valor a la potencia 2, pues pow o power es eso mismo elevar a una potencia indicada...
Una potencia es un numero multiplicado por si mismo un numero n de veces....

pow(numero_a_elevar,potencia_a_elevar);

Aplicando el concepto anterior, ponemos que
3^2 es 9 con esto tambien como en el ejemplo anterior sabemos que 3 es la raiz de 9
^ significa la potencia, elevar a la....
como ves en el ejemplo utilizamos pow y power que viene siendo lo mismo nada mas que a mi se me hace mas facil de recordar power por su abreviacion jejeje

2^2 es 2
3.7416573867739413^2 es 14
5^3 es 125

Como dije arriba casi al principio de este minituto en este caso no me adentrare mucho en las funciones y solo es para dar una pequeña explicacion de como se usan y pues casi todo es saber matematicas en estas funciones que les estoy poniendo :P

CRC32()

Este es muy utilizado en las paginas web cuando deseas comprobar un archivo, es decir, por ejemplo, digamos que te subes una archivo a mega :D y el archivo se corrompio al subirlo o al bajarlo si tu das un codigo crc32 para que verifiquen que no le esta roto o corrompido el archivo, es decir, para que ellos se den cuenta que es identico a tu archivo, entonces funciona perfectamente, aunque tambien suelen utilizarse los md5 y demas encriptaciones.... que no son nada mas que matematicas :D

Despues de darle una "pequeña platica ahi xD" entonces veamos un ejemplo:

Lo que hace es indicarle un parametro y devuelve un valor de redundancia ciclica, para entenderlo mejor es un valor random o aleatorio.... ahorita abajo veremos un ejemplo con una funcion random :D

Rand()

Esta nos devuelve un valor aleatorio del 0 al 1 ,  si le especificamos parametro nos devuelve valores repetidos segun el numero... por ejemplo:


Si te fijas rand() nos ha generado numeros aleatorios del 0 al 1, pero en caso de rand(6) que tiene como parametro 6 nos genera un valor del 0 al 1 pero si lo volvemos a llamar nos arroja el mismo valor...

Existen otras funciones numericas pero creo que estas son las que ami me parecieron mas interesantes :P

Funciones con caracteres
Como lo dice el titulo veremos algunas de las funciones con caracteres, estan en lo personal son las que mas me gustan jeje :P

Empecemos....

Ascii() o Ord()

Devuelve el valor en decimal (0-9) de una letra o numero de la tabla ascii (en este caso solo acepta valores del 0-255), el ascii es un codigo que tiene cada tecla de nuestro teclado.... Pero si quieres una mejor definicion tenemos wikipedia jeje :D

El código ASCII (acrónimo inglés de American Standard Code for Information Interchange — Código Estadounidense Estándar para el Intercambio de Información), pronunciado generalmente , es un código de caracteres basado en el alfabeto latino tal como se usa en inglés moderno y en otras lenguas...

 aqui les dejo una tabla del codigo ascii, les puede servir :D


Pongamos un ejemplo, de como lo usamos:

 En este caso como ves solo partimos de un solo caracter por que si indicaramos mas, seria lo mismo solo nos devolveria el codigo ascii del primer caracter, en este caso devolvemos el codigo ascii de a que es 97 lo puedes verificar en la tabla ascii de arriba donde dice Dec (decimal) y en el segundo el numero 0 que seria 48 :)

Bueno con ord() puedes realizar la misma accion :P


Char()

En este caso tenemos esta funcion char() que lo que hace es devolvernos el caracter que le demos en ascii, por ejemplo:


Bin()

Devuelve el valor binario (ceros y unos) de un entero...
Antes que nada vamos a ver que nos dice wikipedia de lo que es un binario ;)

El sistema binario , en matemáticas e informática, es un sistema de numeración en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1


Como ves nos devuelve el binario de cada uno de esos numeros :P

Compress() Y Uncompress()
 Compress()
Comprime una cadena de caracteres que le indiques
Uncompress()
Descomprime una cadena de caracter comprimida con la funcion compress

Un ejemplo de esto:

 Es facil de utilizar, esto funciona con sql injection en muchos casos jeje por eso tambien la he mencionado :P

Concat()

Lo que hace es concatenar caracteres separados por comas...


tenemos tambien la funcion concat_ws(separador,concatenando,concatenando);

concat_ws lo que hace es agregar un separador y concatenar las cadenas....
prueba con:
select concat(0x3a3a,'testing','concat');
lo que hace es concatenar testing concart y agregar como separador :: que 0x3a3a es su significado esta en hexadecimal(0-9A-F) :P vendria quedando asi:

testing::concat

Find_in_set()

 find in set - en ingles lo traduciria algo como buscar en la lista...
su sintaxis es la siguiente:
select find_in_set('buscar','lista');

donde la lista es nuestra lista de caracteres que van separados por comas y buscar es la cadena a buscar, entonces vendria siendo buscame este caracter en la lista si se encuentra devuelve de 1 a n(n es cualquier caracter arriba de 1) sino se encuentra devuelve cero y si los dos valores son nulos entonces devuelve null (valor desconocido :P)... En ejemplo para que se queden con la idea:


Aqui buscamos en la lista a,b,c,d,e el caracter b si se encuentra devuelve 1 o arriba de 1
en el siguiente ejemplo buscamos en la lista a,b,c,d,e el caracter x si no se encuentra devuelve 0 :P

Hex() y Unhex()

hex() - convierte a hexadecimal lo que indiquemos como parametro
unhex() - convierte a un caracter un hexadecimal, hace el reverso del hex()

Veamos un ejemplo usando estas funciones:

Lo que hacemos arriba es convertir arthusu a hex nos devuelve 61727468757375 que es su valor hexadecimal
Luego lo "desconvertimos" y nos devuelve arthusu
luego lo seleccionamos solamente para poder hacerlo agregamos 0x para decirle que es un valor hexadecimal :P

Lcase () o lower()

Con los dos realizas la misma accion que es pasar todas las cadenas que esten dentro a minusculas... ejemplo:

Como puedes ver es muy facil tenemos ARTHUSU en mayusculas y con las funciones lower o lcase lo pasamos a minusculas :P




Ucase() o Upper()
con estas dos funciones puedes realizar lo mismo que seria convertir el texto en minusculas....es decir lo inverso a las dos anteriores.... un ejemplo:



Length()

Esta funcion nos devuelve la longitud de una cadena, a la longitud me refiero al tamaño, pero si quieres una mejor definicion ta wikipedia:

La longitud es la magnitud que expresa la distancia existente entre dos puntos, a lo largo de un cuerpo unidimensional que los une.

entonces sabiendo esto veamos un ejemplo....


Entonces viendo el ejemplo tenemos que contamos el tamaño o la longitud de la cadena arthusu entonces seria 7 1-a-2-r-3-t-4-h-5-u-6-s-7-u lo podria contar asi para que noten la diferencia en el caso de arthusu BLOG contiene un espacio y el espacio tambien es contado, esto no solo se puede aplicar asi con esta clausula select recuerden que todo esto puede ser aplicado a las columnas....

Load_file()

Esta funcion lo que hace es leer un archivo con la ruta que le indiquemos del archivo, para poder utilizar esta funcion necesitas permisos de FILE si el archivo no existe o no tienes permisos devuelve un valor NULL...
Un ejemplo seria:


Bueno cuando agregue esta funcion me acorde load data local infile y mirando mis otros tutoriales me di cuenta que no agregue into outfile o into dumpfile entonces agregare aqui un pequeño apartado donde mencione como funciona into outfile y into dumpfile....

Into Outfile y Into Dumfile

Como dije arriba esto no tiene nada que ver con funciones pero al haber recordado que no lo puse en otros minitutos y al recordarla gracias a la funcion load_file() las pondre por que son muy importantes de verdad...
Into outfile lo que hace es se podria decir exportar un registro... por ejemplo:

Al principio intento crear un archivo llamado personas2.txt en la ruta de mi home /home/arthusu pero al intentar crearlo no puedo, por que? simple, por que nuestro usuario que estamos usando es decir Nobody<-- no tiene permisos para escribir en esa carpeta, esto lo podemos ver de la siguiente manera:
Como puedes mirar solo tienen permiso el usuario arthusu y root.... y com nuestro usuario es nobody entonces no tenemos permisos y no podemos escribir a menos que le demos permisos usando chmod con el usuario root o buscar otro directorio donde tengamos permisos como por ejemplo /tmp que es la ruta temporal como puedes ver tenemos permisos y ahi esta nuestro archivo personas2.txt

Y como puedes ver sacamos a esa carpeta /tmp el archivo personas2.txt sacamos toda la columna nombre..... y la mostramos luego con la funcion load_file()....

select nombre into outfile '/tmp/personas.txt';

tambien podriamos usar into dumpfile para realizar la misma accion solo que into dumpfile solo puede guardar 1 registro y no más...

Como puedes ver al principio nos sale que contiene mas de 1 fila por lo cual no puede exportar los registros como les comente into dumpfile solo puede exportar 1 registro con esto si lo leemos con la funcion load_file() entonces vemos que solo agarro el primer registro como ves yo use luego la clausula where donde era 1 fila aunque no era necesario por que el archivo ya existia y ya tenia ese el 1 p_id pero en caso de seleccionar otro registro que no sea el primero (p_id=1) especificariamos otro....

y como puedes ver nos devolveria otro registro, bueno como dije no tiene nada que ver con las funciones pero como no lo habia agregado antes lo agrego ahora, "mas vale tarde que nunca XD"....

locate()

Como su significado al español lo dice localiza, nos devuelve la primera ocurrencia de la cadena a buscar.... su sintaxis:

locate(cadena_buscar,cadena_donde_buscas,posicion_empezar)
locate(cadena_buscar,cadena_donde_buscas)

Puedes indicar la posicion a comenzar o no indicarla... por ejemplo:

tenemos la cadena_donde_buscar la siguiente cadena 'one two three testing one two three testing' y buscamos en esa cadena test... lo que hace es devolvernos la posicion donde se encuentra esa cadena que es 15 pero si le indicamos que empieze o comienze desde 22 entonces tenemos que en 15 estaba el primer testing por lo que en el 37 se encuentra el segundo, como la cadena testing tiene un tamaño de 7 entonces 15+7=22 entonces nos brincamos esa cadena la primera y por eso encuentra la segunda... no se si los confundi pero si es asi practiquenlo viendo la sintaxis y es facil de predecir lo que realiza de todas maneras al principio esta el concepto :D

Substring() o substr() o mid()

Cualquiera de estas realiza la misma funcion que substring son "sinonimos"...

Substring en ingles significa subcadena, lo que hace esta funcion es extraer una posicion en una cadena... vamos a ver sus sintaxis:

substring(cadena,posicion)
substring(cadena from posicion)
substring(cadena,posicion,longitud)
substring(cadena from posicion for longitud)

bueno vamos a seguir la sintaxis y veamos unos ejemplos:

Nota Importante: antes de comenzar quiero decirles que empezamos a contar desde 1 y que los espacios tambien cuentan en la longitud de la cadena :P

Como ves en el ejemplo es facil de comprender solo siguiendo la sintaxis, al principio tenemos la cadena:
arthusu BLOG y lo que hacemos es recorrernos 3 posiciones y extraer la cadena por eso que ahora ya no es una cadena sino una subcadena (entiendes el concepto :P)
en la segunda consulta hacemos lo mismo solo que usamos from de todas maneras puedes ver la sintaxis arriba y lo comprendes bien facil :P
ahora en esta parte 3 tenemos la cadena:
arthusu BLOG entonces desde la posicion 8 extraemos 5 caracteres de longitud o tamaño con esto nos devuelve solo BLOG
abajo hacemos lo mismo pero usando from y for puedes ver la sintaxis arriba....

ahora puedes realizar todo esto con la funcion substr() y con la funcion mid() que es equivalente a substring()....

 Bueno hasta aqui la parte 4 espero les haya gustado recuerden que me pueden faltar muchas funciones asi que les recomendaria pasarse por dev.mysql.com y le peguen una checadita a las funciones y como tarea les dejo que las practiquen

Como dicen "La Practica hace al maestro" .....

+-----End----+ Nos vemos la proxima parte

lunes, 25 de marzo de 2013

Como obtener mejores resultados al poner dorks en google

Les ha pasado alguna ves que utilizan algun dork en google para buscar paginas vulnerables y no les sale mas que resultados donde dicen que utilicen esos dorks :P 
Bueno pues aqui les dare unos "TIPS" para bypassear los resultados de Google en este caso y en ves de darnos ese tipo de resultados no de lo que realmente queremos que son las paginas vulnerables :)

Para ello un dork normal seria este:

inurl: index.php?id=

Para bypassear el resultado podriamos utilizar lo siguiente:

&inurl: index.php?id=
^inurl: index.php?id=
%inurl: index.php?id=
*inurl: index.php?id=

Los que mejor funcionan son estos dos:

inward:index.php?id=
%inward:index.php?id=

Espero que les sean de utilidad estos tips, salu2

MYSQL MiniTutorial Parte 3

Seguimos con estas partes de los minitutoriales de mysql, espero que la primera y segunda parte les haya gustado :D
En esta parte nos adentraremos en modificar tablas, eliminarlas, eliminar base de datos,etc....

Alias

Un alias es un apodo que le damos a una columna o tabla, esto lo hacemos por que aveces tenemos que hacer unas declaraciones muy largas, para no hacerlo asi le ponemos un apodo y solo hacemos referencia al apodo :D

La sintaxis es facil:

select nombre_columna as alias from tabla;
select nombre_columna from tabla as alias;
select nombre_columna  alias from tabla;
select nombre_columna from tabla  alias;

No siempre es necesario agregar alias con solamente agregar el apodo es suficiente.... para quedar todo mas claro veamos un ejemplo :D


como ves arriba seleccionamos apellido y nombre desde la tabla personas a esas dos columnas las llamamos nombre_completo seria su alias(apodo) y la ordenamos por nombre_completo, es decir, como ya estan concatenadas( concat() esta funcion la veremos mas adelante lo que hace es concatenar o juntar dos o mas columnas, en este caso 0x3a son los dos : en hexadecimal) order by como dijimos en la anterior parte de minitutorial de mysql lo que hace es ordenar por columna en este caso alfabeticamente como puedes ver el apellido va en orden ascendente :D


Si te das cuenta ahora la columna 1 se llama nombre_completo, si en este caso no le dieramos un nombre se llamaria algo como: concat(apellido,0x3a,nombre) aunque para hacer referencia a ella en order by podriamos hacer referencia como su numero de posicion, es decir, order by 1 :P

Les muestro una imagen como ejemplo:



Aqui de todas maneras no usamos para lo que verdaderamente seria de utilidad un alias que es para una consulta larga en columna o tabla hacer referencia a ella, pero vemos su funcionamiento que es el de dar un apodo a una columna/tabla.

Limit

Limit lo que hace es limitar como su nombre lo dice, limitar los registros que quieres seleccionar, su sintaxis es la siguiente:

select columna from tabla limit numero,numero;
select columna from tabla limit numero;

Veamos un ejemplo, como lo hacemos en todos los minitutos xD :D


Como puedes ver limitamos los registros es decir en la primera vemos como limitamos que comienze desde el registro 2 y nos devuelva 3 registros comenzando desde el mismo 2...
Nota importante: Los registros comienzan desde 0
La segunda limitamos que nos devuelva 2 registros desde el comienzo :D

Joins

En mysql existen 4 tipos de joins los cuales son: inner join,left join, rigth join, full join

Join su significado en ingles seria algo como juntar y es lo que hacemos en este caso, juntar las tablas :D siempre y cuando tengan una columna en comun....
Para no confundirlos mas vamos a ver ejemplos :D

Primero veremos la sintaxis de inner join que es lo mismo que usar join:

select columna from tabla1 inner join tabla2 on tabla1.columna1=tabla2.columna2;


Como ves en el ejemplo de arriba, juntamos las dos tablas personas y pedidos donde estan relacionados con p_id es decir tienen registros que son identicos...

entonces la consulta es mas o menos la siguiente:
selecionar apellido,nombre,fecha_pedido desde personas juntarla con pedidos donde personas.p_id=pedidos.p_id; 

en este caso no es necesario que la columna tengan los nombres identicos sino que lo importante aqui son los registros como ves al devolver los valores devuelve los registros relacionados, es decir, en personas.p_id esta 1,2,3 y en pedidos.p_id esta 1,2,3,4,5,6 los relacionados son 1,2,3 entonces devuelve 3 registros con los tres valores juntados relacionados ya :D

 Left join
Este realiza lo mismo que un join normal solo que en este caso devuelve todos los registros de la primera tabla(left) aunque esos registros sean nulos (NULL).... Veamos un ejemplo realizando lo anterior solo que como en este caso tenemos mas p_id en pedidos entonces lo realizaremos ahi el left join para que vean el resultado que produce....



Como puedes ver en este caso tenemos la misma consulta de arriba, solo que en este caso utilizamos left join y pedimos primero la tabla pedidos(left o primera tabla) entonces lo que haria es devolver todos los valores hasta que termine los p_id (identificadores) de fecha_pedido, devolviendo asi a la segunda tabla que sus columnas que son solo 3 y las otras 3 resultando nulas :D


En el caso de right join aplicamos el mismo concepto de arriba solo que en caso de ser la primera tabla por la que tomaria los registros sin importar si coinciden, seria la segunda tabla donde no tomaria si los registros coinciden que son pedidos.p_id=personas.p_id o alreves que vendria siendo lo mismo :P


Full Join 
Lo que hace un full join en si es devolver las dos tablas la izquierda(tabla1) y la derecha (tabla2).
Bueno en este caso al parecer mysql no soporta full join por lo que hay que emular hacer un full join para ello usamos union o union all (lo veremos mas adelante) para las claves repetidas :D

Un ejemplo de esto es:


Como puedes ver solamente lo que hacemos es unir un left join con un right join obteniendo asi un full join.... :D


Union y Union all

Union como su nombre lo dice lo que hace es unir dos o mas declaraciones select, es decir, podemos seleccionar dos tablas haciendo una union, pero en estos casos union tiene unas "reglas" estas son:

1.-Deben tener el mismo numero de columnas
2.-Deben contener datos similares (tipos de datos vimos en el minitutorial 1)

La sintaxis de esta es la siguiente:

select columna1,columna2 from nombre_tabla
union
select columna1,columna2 from nombre_tabla

Diferencia entre Union y Union All

Bueno la diferencia entre estas dos es solo que union selecciona valores distintos, con esto me refiero a que si tenemos valores repetidos en las columnas no los selecciona (es parecido a select distinct que vimos en el minitutorial 2)...
Pero en caso que usemos union all entonces seleccionaria todos los valores incluyendo si existen repetidos....

Veamos un ejemplo de cada uno:


Como ves tenemos 2 tablas personas y pedidos y las vamos a unir....
seleccionamos la columna nombre y la unimos con la columna clientes....
nombre y clientes son del mismo tipo varchar... y como ves seleccionamos una columna en ambos select....

entonces nos devuelve las columnas unidas...

Si se fijan bien en la columna cliente de la tabla pedidos tenemos registros repetidos y cuando usamos union no los muestra todos :/, pero para ello podemos usar en este caso union all....



Variables de usuario

Las variables son iguales que en todos los lenguajes de programacion, solo que al establecerlas lo hacemos de diferente manera, en este caso puse variables de usuario por que tambien hay variables de sistema como en cualquier otro lenguaje.....
Una variable como su nombre lo dice Cambia cuando lo aplicas en matematicas una variable es un valor desconocido pero en este caso puede cambiar en el transcurso que vayas programando....

Su sintaxis es:

SET @nombre_variable = expresion
SELECT @nombre_variable := expresion

Veamos unos ejemplos:


Lo que hacemos en la consulta anterior es establecer la variable con el nombre de version y luego seleccionamos dicha variable que contiene la version de mysql....

SET @version=version();
SELECT  @version;


Para usar := la asignacion es mas recomendable que usar = por que puede confundir con los operadores de comparacion....

Aqui como estamos asignando y no estableciendo la variable necesitamos usar select sino causariamos un error en la base de datos...

Select @num_version:=(Select+version());

Como ves aqui he usado subconsultas que veremos mas adelante... pero igual podemos usarla como en el ejemplo anterior...

select @num_version:=version();

De las dos maneras funciona en una establecemos una variable y en la otra asignamos un valor  entonces podriamos modificar la variable anterior asignandole otro valor :P


Comentarios

Los comentarios sirven para cuando estas "codeando" puedas dejar para que sirve esa parte de codigo, para cuando otros lo vean o cuando tu lo retomes entiendas que era esa parte del codigo....

En mysql existen varias formas de comentar:

/* este es un comentario multilinea */
-- comentario de una linea
# comentario de una linea



Como ves no aparece nada por que no se cuenta como algo que ejecute una accion, solo son comentarios para "comentar" codigo... xD

Subconsultas

Las subconsultas es cuando agregas parentesis en alguna declaracion esto puede ser para que sea mas "entendible" para cualquiera que lea el codigo... un ejemplo de esto:


Como ves aqui seleccionamos todas las columnas desde la tabla pedidos donde precio_pedido=100 o cliente='Nilsen' (va entre comillas simples o dobles por que es un tipo varchar....) agregamos subconsultas para que sea mas entendible al leerlo....

Una forma de verlo mas claramente seria de esta manera:


Este seria como un tipo de join limitado (join + limit LOL XD)
Com ves en la primera consulta devuelve "Subquery returns more than 1 row" esto quiere decir "Subconsulta devuelve mas que 1 fila", es decir, estamos seleccionando mas de una fila en una clausula where lo que no es correcto a como lo dice la sintaxis de where....

es por eso que luego usamos la subconsulta seleccionando un campo de la columna p_id siendo asi como un minijoin xD por que estamos seleccionando todo esto de manera que vean la diferencia de una subconsulta, aunque en este caso no seria necesario, por que es un consulta demasiado larga.....


Modificar columnas de una tabla

En este apartado veremos como modificar las tablas para agregar una nueva columna, modificar una columna, eliminar una columna :D
Veremos la sintaxis que usaremos:

ALTER TABLE nombre_tabla CHANGE nombre_viejo nombre_nuevo tipo_de_dato

ALTER TABLE nombre_tabla MODIFY nombre_columna tipo_de_dato_nuevo not null primary key,etc...

ALTER TABLE nombre_tabla ADD nombre_columna tipo_de_dato

ALTER TABLE nombre_tabla DROP COLUMN nombre_columna

Entonces solo hay que guiarnos de la sintaxis, usaremos la misma database con la que hemos estado trabajando desde el principio de los minitutos :D


En la imagen de arriba mostramos lo siguiente, tenemos 2 tablas, personas y pedidos, describimos la tabla personas para que nos muestre su columnas e informacion, despues hacemos el cambio de nombre que seria lo mas interesante y esta parte, alteramos la tabla personas cambiando el nombre donde la columna es p_id la cambiamos a id y el tipo de datos es int, cuando volvemos a describir personas podemos ver que hemos cambiado el nombre de p_id a id...

alter table personas change p_id id int;

En este caso, pues no hay mucho que explicar solo hayq ue saber la sintaxis y la logica tu la traes por defecto xD, lo que hace es modificar el tipo de datos de apellido a char enves de varchar, aunque es un ejemplo algo "estupido", puede lograrse entender el concepto :P

alter table personas modify apellido char(30);



En este caso lo que hacemos es agregar una nueva columna llamada edad, alteramos la tabla personas agregando edad como valor int sin que este nulo o vacio...

alter table personas add edad int not null;

cuando describimos la tabla podemos ver que se ha agregado la columna edad.

En este caso eliminamos una columna, alteramos la tabla personas eliminando la columna edad....
luego cuando volvemos a describir la columna edad o se encuentra por que simplemente la hemos eliminado

alter table personas drop column edad;

ya que estamos en ello una cosa que me gustaria comentar es que en el minitutorial numero 1, mostramos como podiamos eliminar todos los datos de una tabla (delete from nombre_tabla), queria comentarles que hay una manera de realizar lo mismo pero con otra consulta:

TRUNCATE TABLE nombre_tabla

Como vemos realizamos lo mismo que en el primer tutorial solo que con otra consulta :P

Modificando tablas

Con esto hemos visto como hacer para modificar todas las columnas de una tabla, pero que pasa si queremos cambiarle el nombre a una tabla? o eliminarla?
para ello solo hay que saber la sintaxis del lenguaje :P
Sintaxis...

renombrar tabla:

RENAME TABLE nombre_tabla_viejo TO nombre_tabla_nuevo

eliminar tabla:

DROP TABLE nombre_tabla

bueno veamos unos ejemplo de como usarlos.....


Como puedes ver en el ejemplo de arriba renombramos una tabla (pedidos) a orders....

rename table pedidos to orders;

la podemos renombrar como queramos solo sigue la sintaxis de arriba :P


En el ejemplo vemos como eliminamos por completo la tabla orders... mostramos las tablas y no se encuentra la tabla orders por que la hemos eliminado :D

drop table orders;


Eliminar la base de datos completa

Para eliminar una base de datos, usamos la siguiente sintaxis:

DROP DATABASE nombre_db;

Veamos un ejemplo:

Para verificar esto puedes ir al minitutorial numero 1... :D

Realizando una copia de seguridad

Para realizar copias de seguridad utilizamos un archivo binario que lo encontramos dentro de la carpeta bin de mysql en este caso uso xampp :P....


Como puedes observar ese archivo pertenece al usuario root por lo que tendremos que usar el comando sudo... entonces veamos los "tipos" de copias de seguridad que puedes realizar (Si le podemos llamar asi), puede que no este listando todos pero pueden comentar abajo si me hace falta alguno y lo agrego al minituto :D

Copia de seguridad de todas las bases de datos
como puedes ver el subtitulo en este caso hariamos una copia de seguridad de TODAS las DB ....

mysqldump --user=usuario --password=password -A > "/ruta/todas_dbs.sql"

en este caso -A significa all databases (todas las bases de datos) tambien lo podemos usar de la siguiente forma: --all-databases, si quieren mas informacion acerca de como usar mysqldump solo hay que usar la ayuda mysqldump --help

Veamos un ejemplo utilizando la opcion de arriba de hacer una copia de seguridad de todas las bases de datos:

Copia de seguridad de 1 o varias bases de datos

Pues como vistes anterior hicimos una copia de segurida de todas las bases de datos, en este caso sera 1 base de datos o varias (las que tu selecciones especificamente)....

mysqldump --user=usuario --password=password --databases DB_nombre1 DB_nombre2 DB_nombreN > "/ruta/varias_dbs.sql"

aplicando la sintaxis, veamos el ejemplo:

Copia de seguridad de 1 o varias tablas

mysqldump --user=usuario --password=password --databases DB_nombre --tables Tabla_nombre1 Tabla_nombre2 Tabla_nombreN > "/ruta/varias_tablas.sql"


Restaurar datos

Esto lo haremos conectando a mysql....

mysql --verbose -u usuario -p contraseña nombre_db < "/ruta/archivo.sql" 

tenemos los siguientes archivos creados:
solo es cuestion de usarlos....
Con el comando de arriba recupere el archivo que contenia todas las bases de datos como puedes ver abarcaria mucho asi que no puedo dejarles una "imagen completa"



Conclusion

Bueno la mayoria de lo que vimos en este tutorial es aplicable por ejemplo en el minitutorial anterior, podemos hacer por ejemplo, con limit (limitar el numero de registros que se muestran con un campo de entrada), con join juntar dos tablas donde el id sea igual(en el caso anterior no teniamos algo asi....),etc.... pero lo que mas me interesaba que aprendieran era como modificar las tablas, como modificar las columnas, como eliminar las tablas, como eliminar la base de datos, en este caso no utilizaremos un script parecido, ¿Por que? simplemente por que es peligroso utilizar esos comandos en un script ademas de que tenemos tener privilegios no es bueno hacerlo y no es muy comun hacerlo desde front-end sino desde el back-end como lo acabamos de hacer :D, en este caso utilizaremos algo para ver como juntar todo lo aprendido, o mejor dicho todo lo creado hasta ahora, haremos un sistema de login.... y si el usuario es correcto entonces que nos muestre la aplicacion del 2 minitutorial, si la contraseña es incorrecta que nos muestre un mensaje de error con el login de nuevo, y abajo en el footer que nos muestre sino estas registrado puedes hacerlo :D

Codigo fuente sistema de login: 


Login
0){
		$intento_logeo=1; //se guarda una variable donde el intento de logeo es igual a verdadero (se proporcionaron correctamente los datos)
		$_SESSION['logged']=TRUE; //creamos la sesion logged que es igual a verdadero
		$_SESSION['usuario']=$usuario; //creamos la sesion usuario que contiene el nombre de usuario
		header("Location: adm_datos.php"); //redirigimos a la pagina de administracion de datos
	}else{
		$intento_logeo=0; //sino es cierto el intento de logeo es falso (no se proporcionaron los datos correctamente)
		echo 'Usuario o password incorrectos';
		echo '
		

Iniciar sesion

Usuario:
Password:

No estas registrado?
'; } }else{ echo '

Iniciar sesion

Usuario:
Password:

No estas registrado?
'; } } ?>

El analizarlo es trabajo de ustedes :P, aunque no he explicado que count() sirve para contar pero de todas maneras, para que lo comprendan mejor esto les dejare una imagen:

Como has visto hemos modificado el script adm_datos.php por lo que colgare los dos archivos:


Administrador de datos

Administrador de datos

";
		}
mysqli_select_db($con,"alumnos");
echo '
'; echo '

Se listan todos los alumnos que asistieron a clases incluyendo su calificacion.

'; echo ''; echo ''; $registros = mysqli_query($con,"SELECT * FROM alumnos"); while($fila = mysqli_fetch_array($registros)){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
IdentificadorAlumnoCalificacionesAsistencias
'.$fila['id'].''.$fila['alumno'].''.$fila['calificaciones'].''.$fila['asistencias'].'
'; echo '
'; echo '

'; mysqli_close($con); } /* ###### Fin de seleccionar los registros y mostrarlos ####### */ /* #### Realiza una busqueda y muestra los resultados #### */ function buscar(){ if(isset($_POST['btn_buscar'])){ $busqueda=htmlentities($_POST['buscar'],ENT_QUOTES); $con=mysqli_connect("localhost","root","popope123"); if(mysqli_connect_errno()){ echo "Fallo al conectar con MySQL: ".mysqli_connect_error()."
"; } mysqli_select_db($con,"alumnos"); $busqueda=mysqli_real_escape_string($con,$busqueda); $seleccionar_busqueda=mysqli_query($con,"SELECT * FROM alumnos WHERE alumno like '%$busqueda%' or calificaciones like '%$busqueda%' or asistencias like '%$busqueda%' "); $coincidencias=mysqli_num_rows($seleccionar_busqueda); if($coincidencias>0){ echo '
'; echo '


'; echo ''; echo ''; while($fila2=mysqli_fetch_assoc($seleccionar_busqueda)){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
IdentificadorAlumnoCalificacionesAsistencias
'.$fila2['id'].''.$fila2['alumno'].''.$fila2['calificaciones'].''.$fila2['asistencias'].'
'; echo '
'; mysqli_close($con); }else{ echo "

No se encontraron resultados

"; echo '

Puedes realizar una busqueda de un registro por medio de la columna nombre,calificacion o asistencia...

'; } }else{ echo '

Puedes realizar una busqueda de un registro por medio de la columna nombre,calificacion o asistencia...

'; } /* #### Fin Realiza una busqueda y muestra los resultados #### */ } /* #### Inserta nuevos registros #### */ function insertar(){ if (isset($_POST['enviar'])){ $alumno=htmlentities($_POST['alumno'],ENT_QUOTES); $calificaciones=htmlentities($_POST['calificaciones'],ENT_QUOTES); $asistencias=htmlentities($_POST['asistencias'],ENT_QUOTES); $con=mysqli_connect("localhost","root","popope123"); if(mysqli_connect_errno()){ echo "Fallo al conectar con MySQL: ".mysqli_connect_error()."
"; } mysqli_select_db($con,"alumnos"); $rango= array("options"=>array("min_range"=>5,"max_range"=>10)); $rango2= array("options"=>array("min_range"=>0,"max_range"=>20)); if(!empty($alumno) && !empty($calificaciones) && !empty($asistencias) && filter_var($calificaciones,FILTER_VALIDATE_INT,$rango) && filter_var($asistencias,FILTER_VALIDATE_INT,$rango2) ){ $alumno=mysqli_real_escape_string($con,$alumno); $calificaciones=mysqli_real_escape_string($con,$calificaciones); $asistencias=mysqli_real_escape_string($con,$asistencias); $insert="INSERT INTO alumnos (alumno,calificaciones,asistencias) values ('$alumno','$calificaciones','$asistencias')"; if(mysqli_query($con,$insert)){ echo "

Los datos fueron insertados correctamente

"; echo '

Insertar un nuevo registro

Alumno:
Calificaciones:
Asistencias:

'; mysqli_close($con); }else{ echo "

Ocurrio un error al insertar los datos: ".mysqli_error($con) ."

"; } }else{ echo "

Los datos no se llenaron correctamente

"; echo '

Insertar un nuevo registro

Alumno:
Calificaciones:
Asistencias:

'; } }else{ echo '

Insertar un nuevo registro

Alumno:
Calificaciones:
Asistencias:

';} } /* #### Fin de Inserta nuevos registros #### */ /* #### Eliminar registros #### */ function eliminar(){ echo '

Eliminar Registros

'; $con=mysqli_connect("localhost","root","popope123"); if(mysqli_connect_errno()){ echo "Fallo al conectar con MySQL: ".mysqli_connect_error()."
"; } mysqli_select_db($con,"alumnos"); $server=htmlentities($_SERVER['PHP_SELF'],ENT_QUOTES); if(isset($_GET['id_eliminar'])){ $id_eliminar=htmlentities($_GET['id_eliminar'],ENT_QUOTES); $id_eliminar=mysqli_real_escape_string($con,$id_eliminar); $borrar="DELETE from alumnos WHERE id=$id_eliminar"; if(mysqli_query($con,$borrar)){ echo "

Registro eliminado correctamente

"; }else{ echo "

Ocurrio un error al eliminar el registro:

" .mysqli_error($con)."
"; } } echo '
'; echo '

Se listan todos los alumnos que asistieron a clases incluyendo su calificacion.Dar clic en eliminar.

'; echo ''; echo ''; $registros = mysqli_query($con,"SELECT * FROM alumnos"); while($fila = mysqli_fetch_array($registros)){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
IdentificadorAlumnoCalificacionesAsistenciasEliminar
'.$fila['id'].''.$fila['alumno'].''.$fila['calificaciones'].''.$fila['asistencias'].'Eliminar
'; echo '
'; echo '

'; mysqli_close($con); } /* #### Fin Eliminar registros #### */ /* #### Modificar un registro #### */ function modificar(){ echo '

Modificar Registros

'; $con=mysqli_connect("localhost","root","popope123"); if(mysqli_connect_errno()){ echo "Fallo al conectar con MySQL: ".mysqli_connect_error()."
"; } mysqli_select_db($con,"alumnos"); $server=htmlentities($_SERVER['PHP_SELF'],ENT_QUOTES); if(isset($_GET['id_modificar'])){ $id_modificar=htmlentities($_GET['id_modificar'],ENT_QUOTES); $id_modificar=mysqli_real_escape_string($con,$id_modificar); $registros = mysqli_query($con,"SELECT * FROM alumnos WHERE id=$id_modificar"); $fila = mysqli_fetch_array($registros); echo '

Alumno:
Calificaciones:
Asistencias:

'; if(isset($_POST['enviar'])){ $alumno=htmlentities($_POST['alumno'],ENT_QUOTES); $calificaciones=htmlentities($_POST['calificaciones'],ENT_QUOTES); $asistencias=htmlentities($_POST['asistencias'],ENT_QUOTES); $rango= array("options"=>array("min_range"=>5,"max_range"=>10)); $rango2= array("options"=>array("min_range"=>0,"max_range"=>20)); if(!empty($alumno) && !empty($calificaciones) && !empty($asistencias) && filter_var($calificaciones,FILTER_VALIDATE_INT,$rango) && filter_var($asistencias,FILTER_VALIDATE_INT,$rango2) ){ $alumno=mysqli_real_escape_string($con,$alumno); $calificaciones=mysqli_real_escape_string($con,$calificaciones); $asistencias=mysqli_real_escape_string($con,$asistencias); $actualizar_datos="UPDATE alumnos SET alumno='$alumno',calificaciones='$calificaciones',asistencias='$asistencias' WHERE id='$id_modificar'"; if(mysqli_query($con,$actualizar_datos)){ echo "

Los datos fueron insertados correctamente

"; }else{ echo "

Ocurrio un error al modificar los datos: ".mysqli_error($con) ."

"; } } } } echo '
'; echo '

Se listan todos los alumnos que asistieron a clases incluyendo su calificacion.Dar clic en modificar.

'; echo ''; echo ''; $registros = mysqli_query($con,"SELECT * FROM alumnos"); while($fila = mysqli_fetch_array($registros)){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } echo '
IdentificadorAlumnoCalificacionesAsistenciasModificar
'.$fila['id'].''.$fila['alumno'].''.$fila['calificaciones'].''.$fila['asistencias'].'Modificar
'; echo '
'; echo '

'; mysqli_close($con); } /* #### Fin Modificar un registro #### */ /* #### Salir de la sesion #### */ function salir(){ unset($_SESSION['logged']); unset($_SESSION['usuario']); session_destroy(); header("Location: inicio_sesion.php"); } /* #### Fin Salir de la sesion #### */ /* #### Sistema de modulacion #### */ $redireccion=htmlentities($_SERVER['PHP_SELF'],ENT_QUOTES); if(isset($_GET['seccion'])){ $seccion=htmlentities($_GET['seccion'],ENT_QUOTES); switch ($seccion) { case 'mostrar': seleccionar(); break; case 'buscar': buscar(); break; case 'insertar': insertar(); break; case 'eliminar': eliminar(); break; case 'actualizar': modificar(); break; case 'salir': salir(); break; default: echo "No se encontro la seccion"; break; } }else{ echo '

Administrador para los datos de la base de datos alumnos.

'; } if(isset($_GET['id_eliminar'])){ $id_eliminar=htmlentities($_GET['id_eliminar'],ENT_QUOTES); eliminar(); } if(isset($_GET['id_modificar'])){ $id_modificar=htmlentities($_GET['id_modificar'],ENT_QUOTES); modificar(); } /* #### Fin Del Sistema de modulacion #### */ ?>

Veamos el funcionamiento de todo lo que hemos visto hasta ahora :D

Los espero en el proximo minituto :D