Universidade Castelo Branco
Projeto Linux
Grupo: Desenvolvimento


Tutorial de MySQL

Esta apostila fornece uma introduo ao MySQL por mostrar ao usurio como criar
e gerenciar um banco de dados. MySQL  um programa interativo que permite voc conectar
com um servidor de MySQL, perguntar e ver os resultados. Tambm veremos MySQL utilizado
em modo de lote: voc coloca suas perguntas em um arquivo de antemo, e MySQL executa os 
contedos do arquivo. Ambos os caminhos de usar o MySQL so descritos aqui. 
Para ver uma lista de opes fornecidas por MySQL, invoque-o com -help: 

shell> mysql --help 

Esta apostila assume que o MySQL est instalado em sua mquina, e que um servidor de MySQL 
est disponvel para que possa conectar. 
A apostila descreve o processo inteiro de como criar e usar um banco de dados. 


Conectando e desconectando do servidor

Para conectar ao servidor, voc usualmente necessitar fornecer um usurio ao MySQL e,
mais provavelmente, uma senha. Se o servidor continua numa mquina que no tem onde se
registrar, tambm necessitar especificar um hostname. Sabendo os parmetros prprios, 
voc poder se conectar: 

shell> mysql -h host -u user -p
Enter password: ********

O ******** representa sua senha; entre com a senha quando MySQL exibir Enter 
password: prompt. 
Se daquela estao, voc deveria ver alguma informao de introduo seguida
por uma mysql> prompt: 

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

Tipo "help" para ajuda.

 mysql> 

O prompt diz que voc est pronto para entrar com os comandos. 
Algumas instalaes do MySQL permite aos usurios conectar com o servidor e continuar
como anfitrio local. Se isto  o caso em sua mquina, voc deveria ser capaz de 
conectar com o servidor ao invocar o MySQL sem quaisquer opes: 

shell> mysql 

Depois que est conectado, voc pode desconectar a qualquer momento,  s digitar QUIT 
no mysql> prompt: 

mysql> QUIT
Bye 

Voc tambm pode desconectar por control-D. 

Na maioria dos exemplos nas seguintes sees, assumem que voc est conectado ao servidor. 
Eles indicam isto por: mysql> prompt. 


Entrando e perguntando

Neste ponto,  mais importante descobrir como emitir perguntas do que criar tabelas, 
carregar e recuperar dados. Esta seo descreve os princpios bsicos de como entrar 
com os comandos, usando vrias perguntas. Voc pode experimentar familiarizando com os 
trabalhos do MySQL. 
Aqui  um comando simples que pergunta ao servidor o nmero de sua verso e a data corrente.

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

Esta pergunta ilustra vrias coisas sobre MySQL: 
* Um comando normalmente consiste de uma declarao do SQL seguida por um ponto-e-vrgula. 
(H algumas excees onde um ponto-e-vrgula no so necessrio. 
QUIT, mencionado anteriormente,  um deles.) 
* Quando voc emite um comando, MySQL envia ao servidor para execuo e exibe os resultados, 
ento exibe mysql>, para indicar que est pronto para outro comando. 
* MySQL exibe a sada da pergunta como uma tabela (filas e colunas). 
A primeira fila contem rtulos s colunas. As demais filas so os resultados da pergunta. 
Normalmente, os rtulos da coluna so os nomes das colunas que traz das tabelas do banco 
de dados. Se voc est recuperando o valor de uma expresso, em vez de uma coluna de tabela,
MySQL rotula a coluna usando a expresso que foi usada. 
* MySQL mostra quantas filas foram exibidas, e quanto tempo a pergunta levou para ser 
executada, dando uma idia rude de performance do servidor. Esses valores so imprecisos 
porque eles representam tempo de relgio de parede (no CPU ou tempo de mquina), 
e porque eles so afetados por certos tipos de fatores. Palavras chaves podem ser inseridas 
em qualquer caixa de entrada . As seguintes perguntas so equivalente: 


mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Aqui  outra pergunta. Isto demonstra que voc pode usar MySQL como uma simples calculadora: 





mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+

Os comandos mostrados tm estado relativamente em declaraes de linhas nicas e curtas.
Voc pode at mesmo entrar com declaraes mltiplas em uma nica linha. 
Somente termine cada uma com um ponto-e-vrgula.

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+

+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

Um comando dado todo em uma nica linha, assim como comandos compridos que requerem vrias 
linhas, no tem nenhum problema. MySQL determina que sua declarao termina por um 
ponto-e-vrgula, e no, o fim de uma linha de entrada. 
Aqui  uma simples declarao de linha mltipla: 

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

Neste exemplo, note como o prompt muda de mysql> para -> depois que entra com a pergunta na 
primeira linha de uma linha mltipla. MySQL indica que no tem uma declarao completa e 
est esperando o resto. O prompt  seu amigo, porque ele fornece retorno valioso. 
Se voc usa aquele retorno, voc sempre estar atento do que MySQL est esperando. 
Se voc decide no executar mais nenhum comando que est no processo de entrada, cancele 
isto, digitando \c 

mysql> SELECT
    -> USER()
    -> \c
mysql>

Note tambm aqui, o prompt. Isto muda o retorno para mysql> depois que voc digita \c, 
MySQL indica o retorno e que est pronto para um novo comando. 
A seguinte tabela mostra cada um dos prompts que pode ser visto e resume que estado 
o MySQL est: 

Prompt
Significado
mysql>
Pronto para um novo comando 
->
Esperando para prxima linha de linha mltipla de comando 
'>
Esperando para prxima linha, colecionando um fio que comea com uma citao nica ("'") 
">
Esperando para prxima linha, colecionando um fio que comea com uma citao duplicada (""") 

Linhas mltiplas de declaraes comuns ocorrem por acaso, quando voc pretende emitir 
um comando em uma nica linha, mas esquece o ponto-e-vrgula. Neste caso, MySQL espera 
para mais entrada: 

mysql> SELECT USER()
    ->

Se isto acontecer (voc pensa que entrou com uma declarao mas a unicamente 
a resposta  um -> prompt), mas provavelmente, MySQL est esperando o ponto-e-vrgula. 
Entre com um ponto-e-vrgula para completar a declarao, e MySQL executar: 

mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@localhost |
+--------------------+

O '> e "> prompts ocorrem durante coleo de fio. No MySQL, pode escrever fios 
circundados por um "'" ou """ caracteres (por exemplo, 'hello' ou "adeus"), e MySQL 
deixa que voc entre com os fios que transpem linhas mltiplas. Quando voc v um '> ou 
"> prompt, este meio que tem de entrar com uma linha contendo um fio que comea com 
caracteres: "'" ou "", no tem ainda que entrar com a citao que termina o fio. 
Seria bom se est realmente entrando com uma linha mltipla de fio, mas como provavelmente 
 isso? Mais freqentemente, o '> e "> prompts indicam que voc descuidou e deixou fora um 
caracter de citao. Por exemplo: 

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    ">

Se voc ao entrar com a declarao SELECT, ele acessa, volta e se voc ficar esperando 
o resultado e nada acontecer, ao invs de admirar, note a pista fornecida pelo "> prompt. 
Isto diz que MySQL est esperando ver o final de um fio.
Neste ponto, o que deve ser feito?  simples,  s cancelar o comando. Entretanto, 
no pode ser somente \c, porque MySQL interpreta isto, como a separao do fio que est 
colecionando. Ao invs, de entrar somente com o fechamento de caracter (assim MySQL saber que 
voc terminou o fio), entre com "\c: 

mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
    "> "\c
mysql>

As mudanas do prompt retornam para mysql>, indicando que MySQL est pronto para um novo 
comando. 
Isto  importante, para saber o que '> e "> prompts expressam, porque se voc entrar 
incorretamente com um fio, mais alm, voc digita a vontade e parece que MySQL ignorou, 
incluindo uma linha contendo QUIT, isto pode ser completamente confuso, se voc no sabe 
o que necessita para fornecer a citao de trmino antes que possa cancelar o comando corrente. 


Exemplos de perguntas comuns

Aqui segue exemplos de como resolver alguns dos problemas mais comuns do MySQL. 
Algum dos exemplos usam a tabela de compras, coloque os preos de cada artigo (nmero de item) 
de cada negociante. Supondo que cada negociante tem um preo fixo por artigo, ento 
(item, negociante)  uma chave primria aos registros. 
Voc pode criar a tabela de exemplo como: 

CREATE TABLE shop (
 article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
 dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
 price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
 PRIMARY KEY(article, dealer));

INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);

Assim os dados de exemplo estaro: 

SELECT * FROM shop

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+


O valor mximo de uma coluna

"Qual  o artigo que tem o preo mais alto?"

SELECT MAX(article) AS article FROM shop

+---------+
| article |
+---------+
|       4 |
+---------+


A fila da coluna com o nmero mximo 

"Encontre o nmero do negociantes, e avalie quem tem o artigo mais caro."

No ANSI SQL isto  facilmente feito com um sub-query: 

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop)

No MySQL (ainda no faz uma sub-seleo) somente faz isto em dois passos: 
1. Obtem o valor mximo e avalia a tabela com uma declarao SELECT. 
2. Usando este valor compila a pergunta real: 

SELECT article, dealer, price
FROM   shop
WHERE  price=19.95

Outra soluo est em classificar todas filas decrescentes por preo e unicamente obter 
uma fila usando o MySQL clusula de LIMIT: 

SELECT article, dealer, price
FROM   shop
ORDER BY price DESC
LIMIT 1

Note: Se h vrios artigos caros, a soluo de LIMIT mostra unicamente um deles.


Mximo da coluna: por grupo e por valores

"Qual  o preo mais alto por artigo?"

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article

+---------+-------+
| article | price |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+


As filas com grupos de campos de valor mximo

"Para cada artigo, encontre o(s) negociante(s) com o preo mais caro." 

No ANSI SQL, pode fazer isto com um sub-query: 



SELECT article, dealer, price
FROM   shop s1
WHERE  price=(SELECT MAX(s2.price)
              FROM shop s2
              WHERE s1.article = s2.article)

No MySQL  melhor ser feito em vrios passos: 
1. Obtenha a lista de artigo e preo mximo. 
2. Para cada artigo obtenha as filas correspondentes que tm o preo mximo armazenado. 

Isto pode ser facilmente feito com uma tabela temporria: 

CREATE TEMPORARY TABLE tmp ( 
        article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, 
        price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);

LOCK TABLES article read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

SELECT article, dealer, price FROM shop, tmp

WHERE shop.article=tmp.article AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;

Se voc usar uma tabela TEMPORRIA, voc deve tambm fechar o "tmp" tabela. 
"Isto pode ser feito com uma pergunta nica?"
Sim, mas pode usar um truque ineficiente que  chamado de "MAX-CONCAT trick": 

SELECT article,
       SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
FROM shop
GROUP BY article;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | C      |  1.69 |
|    0004 | D      | 19.95 |
+---------+--------+-------+


Usando chaves estrangeiras

Voc no necessita de chaves estrangeiras para unir 2 tabelas. 
O MySQL no faz a checagem de certificar que as chaves da tabela so referncias e isto 
no  feito automaticamente apagando as filas da tabela com uma definio de chave 
estrangeira. Se voc usa as chaves normais, ele trabalhar perfeitamente. 



CREATE TABLE persons (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirts (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL, 
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
    PRIMARY KEY (id)
);

INSERT INTO persons VALUES (NULL, 'Antonio Paz');

INSERT INTO shirts VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()), 
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO shirts VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'red', LAST_INSERT_ID()),
(NULL, 'dress', 'blue', LAST_INSERT_ID()),
(NULL, 't-shirt', 'white', LAST_INSERT_ID());

SELECT * FROM persons;
+----+---------------------+
| id | name                | 
+----+---------------------+
| 1  | Antonio Paz         |
| 2  | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM shirts;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
| 1  | polo    | blue   |     1 |
| 2  | dress   | white  |     1 |
| 3  | t-shirt | blue   |     1 |
| 4  | dress   | orange |     2 |
| 5  | polo    | red    |     2 |
| 6  | dress   | blue   |     2 |
| 7  | t-shirt | white  |     2 |
+----+---------+--------+-------+

SELECT s.* FROM persons p, shirts s
 WHERE p.name LIKE 'Lilliana%' 
   AND s.owner = p.id 
   AND s.color <> 'white';

+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+


Pesquisando em duas chaves

MySQL ainda no faz, pesquisa com duas chaves diferentes combinadas com OR 
(Pesquisando com uma chave OR em diferentes partes  bem melhor): 

SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
OR field2_index = '1'

No momento, voc pode resolver isto com muita eficincia, usando uma tabela TEMPORRIA; 
Este tipo de otimizao  tambm muito boa se voc est usando muitas perguntas 
complicadas onde o servidor do SQL faz as otimizaes no pedido errado. 

CREATE TEMPORARY TABLE tmp
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';
INSERT INTO tmp
SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;

Acima est o caminho para resolver a pergunta com efeito de unio de duas perguntas. 


Criando e usando um banco de dados

Agora que voc j sabe como entrar com os comandos, isto , como acessar um banco de dados. 
Suponha que voc tenha vrios animais de estimao em sua casa e tem vontade de 
guardar vrios tipos de informaes sobre eles. Voc pode fazer isto, criando tabelas 
para guardar seus dados e carreg-las com informaes desejada. Ento voc pode responder 
vrias perguntas de diferentes tipos sobre seus animais recuperando os dados das tabelas. 
Esta seo mostra: 
* Como criar um banco de dados 
* Como criar uma tabela 
* Como carregar dados dentro a tabela 
* Como recuperar dados da tabela em vrios caminhos 
* Como usar tabelas mltiplas 

A vantagem de um banco de dados  simples, pense em situaes do mundo real em que um banco 
de dados pde ser utilizado. Por exemplo, um banco de dados pode ser utilizado por um 
fazendeiro para guardar dados da criao, ou por um mdico para guardar dados de registros 
dos pacientes. 
Use a declarao SHOW para descobrir que bancos de dados existem no servidor: 

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

A lista de bancos de dados est provavelmente diferente em sua mquina, mas o MySQL 
testa os bancos de dados que esto provavelmente dentro dele. O banco de dados mysql  
requerido porque isto descreve os privilgios de acesso do usurio. O banco de dados  test 
 freqentemente fornecido como um workspace aos usurios para tentar coisas fora. 
Se o banco de dados de test existe, tenta acessar: 

mysql> USE test
Database changed

Note que USE, QUIT, no requerem um ponto-e-vrgula. (Voc pode terminar tais declaraes 
com um ponto-e-vrgula) A declarao USE tambm  especial em outro caminho: isto deve-se 
a dar em uma nica linha. 
Voc pode usar o banco de dados test com os exemplos que seguem, mas se voc criar algo no 
banco de dados, pode ser removido por qualquer um que tenha acesso. Por esta razo, voc 
deveria pedir ao seu administrador do MySQL, permisso para usar um banco de dados. 
Suponha que voc deseja chamar seu menagerie. O administrador necessita executar um comando: 

mysql> GRANT ALL ON menagerie.* TO your_mysql_name;

onde your_mysql_name  o nome do usurio do MySQL designado a voc. 


Selecionando um banco de dados

Se o administrador criar para voc seu banco de dados com suas permisses, voc pode 
comear a us-lo. De outro modo, voc mesmo necessita cri-lo.

mysql> CREATE DATABASE menagerie;

Sob Unix, nomes de banco de dados so caso sensvel (diferente de palavras chaves do SQL), 
assim voc deve sempre referir para seu banco de dados como menagerie, no como Menagerie, 
MENAGERIE ou alguma outra variante. Isto tambm  vale para nomes de tabela. (Sob o Windows, 
esta restrio no aplica, embora voc deva referir-se a bancos de dados e tabelas usando o 
mesmo lettercase por toda pergunta dada.) 
Criando um banco de dados, voc no o seleciona para uso, deve fazer isto explicitamente. 
Para fazer o menagerie do banco de dados corrente, use este comando: 

mysql> USE menagerie
Database changed

Seu banco de dados necessita ser criado uma unicamente vez, mas deve selecion-lo o 
uso a cada vez que comear uma sesso do MySQL. Voc pode fazer isto ao usar uma declarao 
de USE como mostrada acima. Alternativamente, voc pode selecionar o banco de dados 
na linha de comando, quando voc invocar MySQL. Somente vai especificar seu nome depois 
de quaisquer parmetros de conexo que poder ser necessrio fornecer. Por exemplo: 

shell> mysql -h host -u user -p menagerie
Enter password: ********

Note que menagerie no  sua senha no comando. Se voc deseja fornecer sua senha na 
linha de comando depois da opo -p, voc deve fazer no intervindo espao (e.g., como 
-pmypassword, no como -p mypassword). Entretanto, colocar sua senha na linha de comando no 
 recomendada, porque impede aes que expe a outros usurios registrados em sua mquina. 


Criando uma tabela

Criar um banco de dados  a parte mais fcil, mas neste ponto ele est vazio, 
com SHOW TABLES mostrar: 

mysql> SHOW TABLES;
Empty set (0.00 sec)

A parte mais dura  decidir que estrutura o seu banco de dados dever ter: que tabelas 
voc necessitar, e que colunas deve ter em cada uma delas. 
Voc desejar uma tabela que contm um registro para cada um de seus animais de estimao. 
Isto pode ser chamado de tabela de animal de estimao, e isto deveria conter, no mnimo, 
o nome de cada animal. O nome por si mesmo no est muito interessante, a tabela deveria 
conter outra informao. Por exemplo, se mais de uma pessoa em sua famlia tem animais de 
estimao, voc pde desejar listar o dono de cada animal. Pode registrar alguma informao 
bsica, tal como, espcie e sexo. 
Como sobre idade?  interessante, mas isto, no  uma boa coisa para armazenar em um banco 
de dados. Ao invs da idade, ser melhor armazenar um valor fixo, como a data de nas                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          