MySQLi - Guia rápido
O que é banco de dados?
Um banco de dados é um aplicativo separado que armazena uma coleção de dados. Cada banco de dados possui uma ou mais APIs distintas para criar, acessar, gerenciar, pesquisar e replicar os dados que contém.
Outros tipos de armazenamento de dados podem ser usados, como arquivos no sistema de arquivos ou grandes tabelas hash na memória, mas a obtenção e gravação de dados não seria tão rápida e fácil com esses tipos de sistemas.
Então, hoje em dia, usamos sistemas de gerenciamento de banco de dados relacional (RDBMS) para armazenar e gerenciar um grande volume de dados. Isso é chamado de banco de dados relacional porque todos os dados são armazenados em tabelas diferentes e as relações são estabelecidas usando chaves primárias ou outras chaves conhecidas como chaves estrangeiras.
UMA Relational DataBase Management System (RDBMS) é um software que -
Permite implementar um banco de dados com tabelas, colunas e índices.
Garante a integridade referencial entre linhas de várias tabelas.
Atualiza os índices automaticamente.
Interpreta uma consulta SQL e combina informações de várias tabelas.
Terminologia RDBMS
Antes de prosseguirmos para explicar o sistema de banco de dados MySQLi, vamos revisar algumas definições relacionadas ao banco de dados.
Database - Um banco de dados é uma coleção de tabelas, com dados relacionados.
Table- Uma tabela é uma matriz com dados. Uma tabela em um banco de dados parece uma planilha simples.
Column - Uma coluna (elemento de dados) contém dados do mesmo tipo, por exemplo, o código postal da coluna.
Row - Uma linha (= tupla, entrada ou registro) é um grupo de dados relacionados, por exemplo, os dados de uma assinatura.
Redundancy - Armazenamento de dados duas vezes, de forma redundante para tornar o sistema mais rápido.
Primary Key- Uma chave primária é única. Um valor-chave não pode ocorrer duas vezes em uma tabela. Com uma chave, você pode encontrar no máximo uma linha.
Foreign Key - Uma chave estrangeira é o pino de ligação entre duas tabelas.
Compound Key - Uma chave composta (chave composta) é uma chave que consiste em várias colunas, porque uma coluna não é suficientemente exclusiva.
Index - Um índice em um banco de dados é semelhante a um índice no final de um livro.
Referential Integrity - Integridade referencial garante que um valor de chave estrangeira sempre aponte para uma linha existente.
Banco de dados MySQLi
MySQLi é um RDBMS rápido e fácil de usar, sendo usado por muitas pequenas e grandes empresas. A extensão MySQLi é desenvolvida, comercializada e suportada pelo MySQL. O MySQL está se tornando tão popular por vários bons motivos -
O MySQLi é lançado sob uma licença de código aberto. Então você não tem que pagar para usá-lo.
MySQLi é um programa muito poderoso por si só. Ele lida com um grande subconjunto de funcionalidade dos pacotes de banco de dados mais caros e poderosos.
O MySQLi usa uma forma padrão da conhecida linguagem de dados SQL.
MySQLi funciona em muitos sistemas operacionais e com várias linguagens, incluindo PHP, PERL, C, C ++, JAVA, etc.
O MySQLi funciona muito rapidamente e funciona bem mesmo com grandes conjuntos de dados.
MySQLi é muito amigável ao PHP, a linguagem mais apreciada para desenvolvimento web.
O MySQLi suporta grandes bancos de dados, até 50 milhões de linhas ou mais em uma tabela. O limite de tamanho de arquivo padrão para uma tabela é de 4 GB, mas você pode aumentá-lo (se seu sistema operacional puder lidar com isso) para um limite teórico de 8 milhões de terabytes (TB).
O MySQLi é personalizável. A licença GPL de código aberto permite que os programadores modifiquem o software MySQL para se adequar a seus próprios ambientes específicos.
Antes de você começar
Antes de iniciar este tutorial, você deve ter um conhecimento básico das informações abordadas em nossos tutoriais de PHP e HTML.
Este tutorial se concentra fortemente no uso do MySQLi em um ambiente PHP. Muitos exemplos dados neste tutorial serão úteis para programadores de PHP.
Recomendamos que você verifique nosso Tutorial de PHP para sua referência.
Baixando MySQL
A extensão MySQLi foi projetada para funcionar com o MySQL versão 4.1.13 ou mais recente, portanto, é necessário baixar o MySQL. Todos os downloads do MySQL estão localizados em Downloads do MySQL . Escolha o número da versão mais recente do MySQL Community Server que você deseja e, o mais exatamente possível, a plataforma desejada.
Instalação do MySQL no Linux / UNIX
A maneira recomendada de instalar o MySQL em um sistema Linux é via RPM. MySQL AB disponibiliza os seguintes RPMs para download em seu site -
MySQL - O servidor de banco de dados MySQL, que gerencia bancos de dados e tabelas, controla o acesso do usuário e processa consultas SQL.
MySQL-client - Programas cliente MySQL, que possibilitam a conexão e a interação com o servidor.
MySQL-devel - Bibliotecas e arquivos de cabeçalho que são úteis ao compilar outros programas que usam MySQL.
MySQL-shared - Bibliotecas compartilhadas para o cliente MySQL.
MySQL-bench - Ferramentas de benchmark e teste de desempenho para o servidor de banco de dados MySQL.
Os RPMs do MySQL listados aqui são todos construídos em um sistema SuSE Linux, mas geralmente funcionam em outras variantes do Linux sem dificuldade.
Agora, siga as seguintes etapas para prosseguir para a instalação -
Faça login no sistema usando root do utilizador.
Mude para o diretório que contém os RPMs -
Instale o servidor de banco de dados MySQL executando o seguinte comando. Lembre-se de substituir o nome do arquivo em itálico pelo nome do arquivo do seu RPM.
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
Esta é uma etapa opcional, mas recomendada para instalar os RPMs restantes da mesma maneira -
O comando acima cuida da instalação do servidor MySQL, criando um usuário do MySQL, criando a configuração necessária e iniciando o servidor MySQL automaticamente.
Você pode encontrar todos os binários relacionados ao MySQL em / usr / bin e / usr / sbin. Todas as tabelas e bancos de dados serão criados no diretório / var / lib / mysql.
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
Instalando MySQL no Windows
A instalação padrão em qualquer versão do Windows agora é muito mais fácil do que costumava ser, pois o MySQL agora vem perfeitamente empacotado com um instalador. Simplesmente baixe o pacote do instalador, descompacte-o em qualquer lugar e execute setup.exe.
O instalador padrão setup.exe irá guiá-lo através do processo trivial e, por padrão, irá instalar tudo em C: \ mysql.
Teste o servidor ativando-o no prompt de comando pela primeira vez. Vá para a localização do servidor mysqld que provavelmente é C: \ mysql \ bin e digite -
mysqld.exe --console
NOTE - Se você estiver no NT, você terá que usar mysqld-nt.exe ao invés de mysqld.exe
Se tudo correr bem, você verá algumas mensagens sobre a inicialização e o InnoDB. Caso contrário, você pode ter um problema de permissão. Certifique-se de que o diretório que contém seus dados seja acessível a qualquer usuário (provavelmente mysql) sob o qual os processos do banco de dados são executados.
O MySQL não se adiciona ao menu iniciar, e também não há uma maneira GUI particularmente agradável de parar o servidor. Portanto, se você tende a iniciar o servidor clicando duas vezes no executável mysqld, deve se lembrar de interromper o processo manualmente usando mysqladmin, Lista de Tarefas, Gerenciador de Tarefas ou outros meios específicos do Windows.
Verificando a instalação do MySQL
Depois que o MySQL foi instalado com sucesso, as tabelas de base foram inicializadas e o servidor foi iniciado, você pode verificar se tudo está funcionando como deveria através de alguns testes simples.
Use o utilitário mysqladmin para obter o status do servidor
Usar mysqladminbinário para verificar a versão do servidor. Este binário estaria disponível em / usr / bin no linux e em C: \ mysql \ bin no windows.
[root@host]# mysqladmin --version
Ele produzirá o seguinte resultado no Linux. Pode variar dependendo da sua instalação -
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
Se você não receber essa mensagem, pode haver algum problema na instalação e você precisará de ajuda para corrigi-lo.
Execute comandos SQL simples usando o cliente MySQL
Você pode se conectar ao seu servidor MySQL usando o cliente MySQL usando mysqlcomando. Neste momento, você não precisa fornecer nenhuma senha, pois por padrão ela estará em branco.
Então, basta usar o seguinte comando
[root@host]# mysql
Deve ser recompensado com um prompt mysql>. Agora, você está conectado ao servidor MySQL e pode executar todos os comandos SQL no prompt mysql> da seguinte forma -
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.13 sec)
Etapas de pós-instalação
O MySQL é fornecido com uma senha em branco para o usuário raiz do MySQL. Assim que tiver instalado com sucesso o banco de dados e o cliente, você precisará definir uma senha de root da seguinte forma -
[root@host]# mysqladmin -u root password "new_password";
Agora, para fazer uma conexão com seu servidor MySQL, você teria que usar o seguinte comando -
[root@host]# mysql -u root -p
Enter password:*******
Os usuários do UNIX também irão querer colocar seu diretório MySQL em seu PATH, então você não terá que digitar o caminho completo toda vez que quiser usar o cliente de linha de comando. Para o bash, seria algo como -
export PATH = $PATH:/usr/bin:/usr/sbin
Executando o MySQL no momento da inicialização
Se você deseja executar o servidor MySQL na hora da inicialização, certifique-se de ter a seguinte entrada no arquivo /etc/rc.local.
/etc/init.d/mysqld start
Além disso, você deve ter o binário mysqld no diretório /etc/init.d/.
Executando e desligando o servidor MySQLi
O MySQLi é estendido do MySQL, portanto, primeiro verifique se o servidor MySQL está funcionando ou não. Você pode usar o seguinte comando para verificar isso -
ps -ef | grep mysqld
Se o seu MySql estiver rodando, você verá mysqldprocesso listado em seu resultado. Se o servidor não estiver rodando, você pode iniciá-lo usando o seguinte comando -
root@host# cd /usr/bin
./safe_mysqld &
Agora, se você deseja desligar um servidor MySQL que já está em execução, você pode fazer isso usando o seguinte comando -
root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
Configurando uma conta de usuário MySQLi
Para adicionar um novo usuário ao MySQLi, que é uma versão aprimorada do MySQL, você só precisa adicionar uma nova entrada para user tabela no banco de dados mysql.
Abaixo está um exemplo de adição de novo usuário guest com os privilégios SELECT, INSERT e UPDATE com a senha guest123; a consulta SQL é -
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> INSERT INTO user (
host, user, password, select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest', PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host | user | password |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
Ao adicionar um novo usuário, lembre-se de criptografar a nova senha usando a função PASSWORD () fornecida pelo MySQL. Como você pode ver no exemplo acima, a senha mypass é criptografada para 6f8c114b58f2ce9e.
Observe a instrução FLUSH PRIVILEGES. Isso diz ao servidor para recarregar as tabelas de permissões. Se você não o usar, não será capaz de se conectar ao mysql usando a nova conta de usuário pelo menos até que o servidor seja reinicializado.
Você também pode especificar outros privilégios para um novo usuário, definindo os valores das seguintes colunas na tabela do usuário para 'Y' ao executar a consulta INSERT ou você pode atualizá-los posteriormente usando a consulta UPDATE.
- Select_priv
- Insert_priv
- Update_priv
- Delete_priv
- Create_priv
- Drop_priv
- Reload_priv
- Shutdown_priv
- Process_priv
- File_priv
- Grant_priv
- References_priv
- Index_priv
- Alter_priv
Outra maneira de adicionar conta de usuário é usando o comando GRANT SQL; o exemplo a seguir adicionará o usuáriozara com senha zara123 para um banco de dados específico chamado TUTORIALS.
root@host# mysql -u root -p password;
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
Isso também criará uma entrada na tabela do banco de dados mysql chamada user.
NOTE - O MySQL não termina um comando até que você coloque um ponto e vírgula (;) no final do comando SQL.
A configuração do arquivo /etc/my.cnf
Na maioria dos casos, você não deve tocar neste arquivo. Por padrão, ele terá as seguintes entradas -
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
[mysql.server]
user = mysql
basedir = /var/lib
[safe_mysqld]
err-log = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
Aqui, você pode especificar um diretório diferente para o log de erros, caso contrário, você não deve alterar nenhuma entrada nesta tabela.
Comando administrativo do MySQLi
Aqui está a lista de comandos importantes do MySQLi, que você usará de vez em quando para trabalhar com o banco de dados MySQL -
USE Databasename - Isso será usado para selecionar um banco de dados específico na área de trabalho do MySQLi.
SHOW DATABASES - Lista os bancos de dados que podem ser acessados pelo DBMS MySQLi.
SHOW TABLES - Mostra as tabelas no banco de dados, uma vez que um banco de dados foi selecionado com o comando use.
SHOW COLUMNS FROM tablename - Mostra os atributos, tipos de atributos, informações principais, se NULL é permitido, padrões e outras informações para uma tabela.
SHOW INDEX FROM tablename - Apresenta os detalhes de todos os índices da tabela, incluindo a CHAVE PRIMÁRIA.
SHOW TABLE STATUS LIKE tablename\G - Relata detalhes do desempenho e estatísticas do DBMS MySQLi.
MySQLi funciona muito bem na combinação de várias linguagens de programação como PERL, C, C ++, JAVA e PHP. Dentre essas linguagens, PHP é a mais popular por causa de seus recursos de desenvolvimento de aplicativos da web.
Este tutorial se concentra fortemente no uso do MySQLi em um ambiente PHP. PHP fornece várias funções para acessar o banco de dados MySQLi e manipular registros de dados dentro do banco de dados MySQLi. Você precisaria chamar funções PHP da mesma maneira que chama qualquer outra função PHP.
As funções PHP para uso com MySQLi têm o seguinte formato geral -
mysqli_function(value,value,...);
A segunda parte do nome da função é específica para a função, geralmente uma palavra que descreve o que a função faz. A seguir estão duas das funções, que usaremos em nosso tutorial -
mysqli_connect($connect);
mysqli_query($connect,"SQL statement");
O exemplo a seguir mostra uma sintaxe genérica de PHP para chamar qualquer função MySQLi.
<html>
<head>
<title>PHP with MySQLi</title>
</head>
<body>
<?php
$retval = mysqli_function(value, [value,...]);
if( !$retval ){
die ( "Error: a related error message" );
}
// Otherwise MySQLi or PHP Statements
?>
</body>
</html>
A partir do próximo capítulo, veremos todas as funcionalidades importantes do MySQLi junto com o PHP.
Conexão MySQLi usando o binário mysql
Você pode estabelecer o banco de dados MySQLi usando mysql binário no prompt de comando.
Exemplo
Aqui está um exemplo simples para se conectar ao servidor MySQL para estabelecer o banco de dados mysqli a partir do prompt de comando -
[root@host]# mysql -u root -p
Enter password:******
Isso lhe dará o prompt de comando mysql> onde você poderá executar qualquer comando SQL. A seguir está o resultado do comando acima -
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
No exemplo acima, usamos rootcomo um usuário, mas você pode usar qualquer outro usuário. Qualquer usuário poderá realizar todas as operações SQL permitidas a esse usuário.
Você pode se desconectar do banco de dados MySQL a qualquer momento usando exit comando no prompt mysql>.
mysql> exit
Bye
Conexão MySQLi usando PHP Script
PHP fornece mysqli_connect()função para abrir uma conexão de banco de dados. Esta função recebe cinco parâmetros e retorna um identificador de link MySQLi em caso de sucesso ou FALSE em caso de falha.
Sintaxe
connection mysqli_connect(server,user,passwd,new_link,client_flag);
Sr. Não. | Parâmetro e Descrição |
---|---|
1 | server Opcional - o nome do host que executa o servidor de banco de dados. Se não for especificado, o valor padrão élocalhost:3306. |
2 | user Opcional - o nome de usuário que acessa o banco de dados. Se não for especificado, o padrão é o nome do usuário que possui o processo do servidor. |
3 | passwd Opcional - A senha do usuário que acessa o banco de dados. Se não for especificado, o padrão é uma senha vazia. |
4 | new_link Opcional - Se uma segunda chamada for feita para mysqli_connect () com os mesmos argumentos, nenhuma nova conexão será estabelecida; em vez disso, o identificador da conexão já aberta será retornado. |
5 | client_flags Opcional - uma combinação das seguintes constantes -
|
Você pode se desconectar do banco de dados MySQLi a qualquer momento usando outra função PHP mysqli_close(). Esta função leva um único parâmetro, que é uma conexão retornada pormysqli_connect() função.
Sintaxe
bool mysqli_close ( resource $link_identifier );
Se um recurso não for especificado, o último banco de dados aberto será fechado. Esta função retorna verdadeiro se fechar a conexão com sucesso, caso contrário, retorna falso.
Exemplo
Experimente o seguinte exemplo para se conectar a um servidor MySQL -
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306'; $dbuser = 'guest';
$dbpass = 'guest123'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ){
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully';
mysqli_close($conn);
?>
</body>
</html>
Se o exemplo acima estiver conectado ao MySQLi, a saída deve ser assim no seu navegador -
Connected successfully
Criar banco de dados usando mysqladmin
Você precisaria de privilégios especiais para criar ou excluir um banco de dados MySQLi. Então, supondo que você tenha acesso ao usuário root, você pode criar qualquer banco de dados usando mysqlmysqladmin binário.
Exemplo
Aqui está um exemplo simples para criar um banco de dados chamado TUTORIALS -
[root@host]# mysqladmin -u root -p create TUTORIALS
Enter password:******
Isso criará um banco de dados MySQLi TUTORIALS.
Criar banco de dados usando script PHP
PHP usa mysqli_queryfunção para criar ou excluir um banco de dados MySQLi. Esta função recebe dois parâmetros e retorna TRUE em caso de sucesso ou FALSE em caso de falha.
Exemplo
Experimente o seguinte exemplo para criar um banco de dados -
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '<password here>';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){ echo 'Connected failure<br>'; } echo 'Connected successfully<br>'; $sql = "CREATE DATABASE TUTORIALS";
if (mysqli_query($conn, $sql)) {
echo "Database created successfully";
} else {
echo "Error creating database: " . mysqli_error($conn); } mysqli_close($conn);
?>
</body>
</html>
Se conectado e criado o banco de dados com sucesso, a saída de amostra deve ser assim -
Connected successfully
Database created successfully
Eliminar banco de dados usando mysqladmin
Você precisaria de privilégios especiais para criar ou excluir um banco de dados MySQLi. Então, supondo que você tenha acesso ao usuário root, você pode criar qualquer banco de dados usando mysqlmysqladmin binário.
Tenha cuidado ao excluir qualquer banco de dados porque você perderá todos os dados disponíveis em seu banco de dados.
Aqui está um exemplo para excluir um banco de dados criado no capítulo anterior -
[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******
Isso lhe dará um aviso e confirmará se você realmente deseja excluir este banco de dados ou não.
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'TUTORIALS' database [y/N] y
Database "TUTORIALS" dropped
Eliminar banco de dados usando script PHP
PHP usa queryfunção para criar ou excluir um banco de dados MySQLi. Esta função recebe dois parâmetros e retorna TRUE em caso de sucesso ou FALSE em caso de falha.
Exemplo
Experimente o seguinte exemplo para excluir um banco de dados -
<html>
<head>
<title>Connecting MySQLi Server>/title>
</head>
<body>
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = '<Password Here>'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ){
echo 'Connected failure<br>';
}
echo 'Connected successfully<br>';
$sql = "DROP DATABASE TUTORIALS"; if (mysqli_query($conn, $sql)) { echo "Record deleted successfully"; } else { echo "Error deleting record: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
</body>
</html>
WARNING- Ao excluir um banco de dados usando o script PHP, ele não solicita nenhuma confirmação. Portanto, tome cuidado ao excluir um banco de dados MySQLi.
Se o banco de dados foi conectado e excluído com sucesso, a saída de amostra deve ser assim -
Connected successfully
Database deleted successfully
Depois de obter a conexão com o servidor MySQLi, é necessário selecionar um banco de dados específico para trabalhar. Isso ocorre porque pode haver mais de um banco de dados disponível com o servidor MySQLi.
Sintaxe
bool mysqli_select_db( db_name, connection );
Sr. Não. | Parâmetro e Descrição |
---|---|
1 | db_name Obrigatório - nome do banco de dados MySQLi a ser selecionado |
2 | connection Opcional - se não for especificado, a última conexão aberta por mysqli_connect será usada. |
Exemplo
Aqui está o exemplo que mostra como selecionar um banco de dados.
<html>
<head>
<title>Connecting MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '<Password Here>';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) { echo 'Connected failure<br>'; } echo 'Connected successfully<br>'; mysqli_select_db( 'TUTORIALS' ); //Write some code here mysqli_close($conn);
?>
</body>
</html>
Se o banco de dados estiver conectado e selecionado com sucesso, a saída de amostra deve ser assim -
Connected successfully
Definir adequadamente os campos em uma tabela é importante para a otimização geral do seu banco de dados. Você deve usar apenas o tipo e o tamanho do campo que realmente precisa; não defina um campo com 10 caracteres de largura se você sabe que usará apenas 2 caracteres. Esses tipos de campos (ou colunas) também são chamados de tipos de dados, após otype of data você estará armazenando nesses campos.
O MySQLi usa muitos tipos de dados diferentes divididos em três categorias: numérico, data e hora e tipos de string.
Tipos de dados numéricos
O MySQLi usa todos os tipos de dados numéricos ANSI SQL padrão, portanto, se você estiver chegando ao MySQLi de um sistema de banco de dados diferente, essas definições parecerão familiares para você. A lista a seguir mostra os tipos de dados numéricos comuns e suas descrições -
INT- Um número inteiro de tamanho normal que pode ser assinado ou não assinado. Se assinado, o intervalo permitido é de -2147483648 a 2147483647. Se não assinado, o intervalo permitido é de 0 a 4294967295. Você pode especificar uma largura de até 11 dígitos.
TINYINT- Um número inteiro muito pequeno que pode ser assinado ou não assinado. Se assinado, o intervalo permitido é de -128 a 127. Se não assinado, o intervalo permitido é de 0 a 255. Você pode especificar uma largura de até 4 dígitos.
SMALLINT- Um pequeno número inteiro que pode ser assinado ou não assinado. Se assinado, o intervalo permitido é de -32768 a 32767. Se não assinado, o intervalo permitido é de 0 a 65535. Você pode especificar uma largura de até 5 dígitos.
MEDIUMINT- Um inteiro de tamanho médio que pode ser assinado ou não assinado. Se assinado, o intervalo permitido é de -8388608 a 8388607. Se não assinado, o intervalo permitido é de 0 a 16777215. Você pode especificar uma largura de até 9 dígitos.
BIGINT − A large integer that can be signed or unsigned. If signed, the allowable range is from -9223372036854775808 to 9223372036854775807. If unsigned, the allowable range is from 0 to 18446744073709551615. You can specify a width of up to 20 digits.
FLOAT(M,D) − A floating-point number that cannot be unsigned. You can define the display length (M) and the number of decimals (D). This is not required and will default to 10,2, where 2 is the number of decimals and 10 is the total number of digits (including decimals). Decimal precision can go to 24 places for a FLOAT.
DOUBLE(M,D) − A double precision floating-point number that cannot be unsigned. You can define the display length (M) and the number of decimals (D). This is not required and will default to 16,4, where 4 is the number of decimals. Decimal precision can go to 53 places for a DOUBLE. REAL is a synonym for DOUBLE.
DECIMAL(M,D) − An unpacked floating-point number that cannot be unsigned. In unpacked decimals, each decimal corresponds to one byte. Defining the display length (M) and the number of decimals (D) is required. NUMERIC is a synonym for DECIMAL.
Date and Time Types
The MySQL date and time datatypes are −
DATE − A date in YYYY-MM-DD format, between 1000-01-01 and 9999-12-31. For example, December 30th, 1973 would be stored as 1973-12-30.
DATETIME − A date and time combination in YYYY-MM-DD HH:MM:SS format, between 1000-01-01 00:00:00 and 9999-12-31 23:59:59. For example, 3:30 in the afternoon on December 30th, 1973 would be stored as 1973-12-30 15:30:00.
TIMESTAMP − A timestamp between midnight, January 1, 1970 and sometime in 2037. This looks like the previous DATETIME format, only without the hyphens between numbers; 3:30 in the afternoon on December 30th, 1973 would be stored as 19731230153000 ( YYYYMMDDHHMMSS ).
TIME − Stores the time in HH:MM:SS format.
YEAR(M) − Stores a year in 2-digit or 4-digit format. If the length is specified as 2 (for example YEAR(2)), YEAR can be 1970 to 2069 (70 to 69). If the length is specified as 4, YEAR can be 1901 to 2155. The default length is 4.
String Types
Although numeric and date types are fun, most data you'll store will be in string format. This list describes the common string datatypes in MySQLi.
CHAR(M) − A fixed-length string between 1 and 255 characters in length (for example CHAR(5)), right-padded with spaces to the specified length when stored. Defining a length is not required, but the default is 1.
VARCHAR(M) − A variable-length string between 1 and 255 characters in length; for example VARCHAR(25). You must define a length when creating a VARCHAR field.
BLOB or TEXT − A field with a maximum length of 65535 characters. BLOBs are "Binary Large Objects" and are used to store large amounts of binary data, such as images or other types of files. Fields defined as TEXT also hold large amounts of data; the difference between the two is that sorts and comparisons on stored data are case sensitive on BLOBs and are not case sensitive in TEXT fields. You do not specify a length with BLOB or TEXT.
TINYBLOB or TINYTEXT − A BLOB or TEXT column with a maximum length of 255 characters. You do not specify a length with TINYBLOB or TINYTEXT.
MEDIUMBLOB or MEDIUMTEXT − A BLOB or TEXT column with a maximum length of 16777215 characters. You do not specify a length with MEDIUMBLOB or MEDIUMTEXT.
LONGBLOB or LONGTEXT − A BLOB or TEXT column with a maximum length of 4294967295 characters. You do not specify a length with LONGBLOB or LONGTEXT.
ENUM − An enumeration, which is a fancy term for list. When defining an ENUM, you are creating a list of items from which the value must be selected (or it can be NULL). For example, if you wanted your field to contain "A" or "B" or "C", you would define your ENUM as ENUM ('A', 'B', 'C') and only those values (or NULL) could ever populate that field.
The table creation command requires −
- Name of the table
- Names of fields
- Definitions for each field
Syntax
Here is generic SQL syntax to create a MySQLi table −
CREATE TABLE table_name (column_name column_type);
Now, we will create following table in TUTORIALS database.
CREATE TABLE tutorials_inf(
id INT AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
primary key (id),
);
Here few items need explanation −
Field Attribute NOT NULL is being used because we do not want this field to be NULL. So if user will try to create a record with NULL value, then MySQLi will raise an error.
Field Attribute AUTO_INCREMENT tells MySQLi to go ahead and add the next available number to the id field.
Keyword PRIMARY KEY is used to define a column as primary key. You can use multiple columns separated by comma to define a primary key.
Creating Tables from Command Prompt
This is easy to create a MySQLi table from mysql> prompt. You will use SQL command CREATE TABLE to create a table.
Example
Here is an example, which creates tutorials_tbl −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_inf(
id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL,primary key (id));
Query OK, 0 rows affected (0.16 sec)
mysql>
NOTE − MySQLi does not terminate a command until you give a semicolon (;) at the end of SQL command.
Creating Tables Using PHP Script
To create new table in any existing database you would need to use PHP function mysqli_query(). You will pass its second argument with proper SQL command to create a table.
Example
Here is an example to create a table using PHP script −
<html>
<head>
<title>Creating MySQLi Tables</title>
</head>
<body>
<?php
$host = 'localhost:3306'; $user = 'root';
$pass = '<Password Here>'; $dbname = 'TUTORIALS';
$conn = mysqli_connect($host, $user, $pass,$dbname); if(!$conn){
die('Could not connect: '.mysqli_connect_error());
}
echo 'Connected successfully<br/>';
$sql = "create table tutorials_inf( id INT AUTO_INCREMENT,name VARCHAR(20) NOT NULL,primary key (id))"; if(mysqli_query($conn, $sql)){ echo "Table created successfully"; } else { echo "Table is not created successfully "; } mysqli_close($conn);
?>
</body>
</html>
The sample output should be like this −
Connected successfully
Table created successfully
It is very easy to drop an existing MySQLi table, but you need to be very careful while deleting any existing table because data lost will not be recovered after deleting a table.
Syntax
Here is generic SQL syntax to drop a MySQLi table −
DROP TABLE table_name ;
Dropping Tables from Command Prompt
This needs just to execute DROP TABLE SQL command at mysql> prompt.
Example
Here is an example, which deletes tutorials_inf −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DROP TABLE tutorials_inf
Query OK, 0 rows affected (0.8 sec)
mysql>
Dropping Tables Using PHP Script
To drop an existing table in any database, you would need to use PHP function mysqli_query(). You will pass its second argument with proper SQL command to drop a table.
Example
<html>
<head>
<title>Dropping MySQLi Tables</title>
</head>
<body>
<?php
$host = 'localhost:3306'; $user = 'root';
$pass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($host, $user, $pass,$dbname); if(!$conn) {
die('Could not connect: '.mysqli_connect_error());
}
echo 'Connected successfully<br/>';
$sql = "DROP TABLE tutorials_inf"; if(mysqli_query($conn, $sql)) { echo "Table is deleted successfully"; } else { echo "Table is not deleted successfully\n"; } mysqli_close($conn);
?>
</body>
</html>
The sample output should be like this −
Connected successfully
Table is deleted successfully
To insert data into MySQLi table, you would need to use SQL INSERT INTO command. You can insert data into MySQLi table by using mysql> prompt or by using any script like PHP.
Syntax
Here is generic SQL syntax of INSERT INTO command to insert data into MySQLi table:
INSERT INTO table_name
( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
To insert string data types, it is required to keep all the values into double or single quote, for example:- "value".
Inserting Data from Command Prompt
This will use SQL INSERT INTO command to insert data into MySQLi table tutorials_inf.
Example
Following example will create 3 records into tutorials_tbl table −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_inf
->(id, name)
->VALUES
->(10, "John Poul");
Query OK, 1 row affected (0.01 sec)
NOTE − Please note that all the arrow signs (->) are not part of SQL command; they are indicating a new line and they are created automatically by MySQL prompt while pressing enter key without giving a semicolon at the end of each line of the command.
Inserting Data Using PHP Script
You can use same SQL INSERT INTO command into PHP function mysqli_query() to insert data into a MySQLi table.
Example
This example will take three parameters from user and will insert them into MySQLi table −
<html>
<head>
<title>Add New Record in MySQLi Database</title>
<link rel = "stylesheet" type = "text/css" href = "style.css">
</head>
<body>
<div id = "main">
<form action = "" method = "post">
<label>Name :</label>
<input type = "text" name = "name" id = "name" />
<br />
<br />
<input type = "submit" value ="Submit" name = "submit"/>
<br />
</form>
</div>
<?php
if(isset($_POST["submit"])){ $servername = "localhost:3306";
$username = "root"; $password = "<Password here>";
$dbname = "TUTORIALS"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO tutorials_inf(name)VALUES ('".$_POST["name"]."')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "" . mysqli_error($conn);
}
$conn->close();
}
?>
</body>
</html>
The sample output should be like this −
New record created successfully
The SQL SELECT command is used to fetch data from MySQLi database. You can use this command at mysql> prompt as well as in any script like PHP.
Syntax
Here is generic SQL syntax of SELECT command to fetch data from MySQLi table −
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
You can use one or more tables separated by comma to include various conditions using a WHERE clause, but WHERE clause is an optional part of SELECT command.
You can fetch one or more fields in a single SELECT command.
You can specify star (*) in place of fields. In this case, SELECT will return all the fields.
You can specify any condition using WHERE clause.
You can specify an offset using OFFSET from where SELECT will start returning records. By default offset is zero.
You can limit the number of returns using LIMIT attribute.
Fetching Data from Command Prompt −
This will use SQL SELECT command to fetch data from MySQLi table tutorials_tbl
Example
Following example will return all the records from tutorials_inf table −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf;
+----+------+
| id | name |
+----+------+
| 1 | sai |
| 2 | kit |
| 3 | ram |
+----+------+
3 rows in set (0.00 sec)
mysql>
Fetching Data Using PHP Script
You can use same SQL SELECT command into PHP function mysqli_query(). This function is used to execute SQL command and later another PHP function mysqli_fetch_assoc() can be used to fetch all the selected data. This function returns row as an associative array, a numeric array, or both. This function returns FALSE if there are no more rows.
Below is a simple example to fetch records from tutorials_inf table.
Example
Try out the following example to display all the records from tutorials_inf table.
<html>
<head>
<title>Selecting Table in MySQLi Server</title>
</head>
<body>
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = 'SELECT name FROM tutorials_inf';
$result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "Name: " . $row["name"]. "<br>"; } } else { echo "0 results"; } mysqli_close($conn);
?>
</body>
</html>
The content of the rows are assigned to the variable $row and the values in row are then printed.
NOTE − Always remember to put curly brackets when you want to insert an array value directly into a string.
The sample output should be like this −
Connected successfully
Name: ram
Name: kit
Name: abc
We have seen SQL SELECT command to fetch data from MySQLi table. We can use a conditional clause called WHERE clause to filter out results. Using WHERE clause, we can specify a selection criteria to select required records from a table.
Syntax
Here is generic SQL syntax of SELECT command with WHERE clause to fetch data from MySQLi table −
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
You can use one or more tables separated by comma to include various conditions using a WHERE clause, but WHERE clause is an optional part of SELECT command.
You can specify any condition using WHERE clause.
You can specify more than one conditions using AND or OR operators.
A WHERE clause can be used along with DELETE or UPDATE SQL command also to specify a condition.
The WHERE clause works like an if condition in any programming language. This clause is used to compare given value with the field value available in MySQLi table. If given value from outside is equal to the available field value in MySQLi table, then it returns that row.
Here is the list of operators, which can be used with WHERE clause.
Suponha que o campo A tenha 10 e o campo B tenha 20, então -
Operador | Descrição | Exemplo |
---|---|---|
= | Verifica se os valores dos dois operandos são iguais ou não, se sim a condição torna-se verdadeira. | (A = B) não é verdade. |
! = | Verifica se os valores de dois operandos são iguais ou não, se os valores não são iguais, a condição se torna verdadeira. | (A! = B) é verdade. |
> | Verifica se o valor do operando esquerdo é maior que o valor do operando direito, se sim então a condição torna-se verdadeira. | (A> B) não é verdade. |
< | Verifica se o valor do operando esquerdo é menor que o valor do operando direito; se sim, a condição torna-se verdadeira. | (A <B) é verdade. |
> = | Verifica se o valor do operando esquerdo é maior ou igual ao valor do operando direito, se sim a condição torna-se verdadeira. | (A> = B) não é verdade. |
<= | Verifica se o valor do operando esquerdo é menor ou igual ao valor do operando direito; em caso afirmativo, a condição torna-se verdadeira. | (A <= B) é verdadeiro. |
A cláusula WHERE é muito útil quando você deseja buscar linhas selecionadas de uma tabela, especialmente quando você usa MySQLi Join. As junções são discutidas em outro capítulo.
É uma prática comum pesquisar registros usando Primary Key para tornar a pesquisa rápida.
Se a condição fornecida não corresponder a nenhum registro na tabela, a consulta não retornará nenhuma linha.
Buscando dados do prompt de comando
Isso usará o comando SQL SELECT com a cláusula WHERE para buscar dados selecionados da tabela tutorials_inf do MySQLi.
Exemplo
O exemplo a seguir retornará todos os registros de tutorials_inf mesa cujo nome é sai -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql>SELECT * from tutorials_inf where name = 'sai';
+----+------+
| id | name |
+----+------+
| 1 | SAI |
+----+------+
1 row in set (0.00 sec)
mysql>
A menos que execute um LIKEcomparação em uma string, a comparação não diferencia maiúsculas de minúsculas. Você pode tornar sua pesquisa sensível a maiúsculas e minúsculas usandoBINARY palavra-chave da seguinte forma -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf \WHERE BINARY name = 'sai';
Empty set (0.02 sec)
mysql>
Buscando dados usando script PHP:
Você pode usar o mesmo comando SQL SELECT com WHERE CLAUSE na função PHP mysqli_query().
Exemplo
O exemplo a seguir retornará todos os registros de tutorials_inf mesa cujo nome é sai -
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = 'SELECT * from tutorials_inf where name="sai"';
$result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) {
while($row = mysqli_fetch_assoc($result)) {
echo "Name: " . $row["name"]. "<br>"; } } else { echo "0 results"; } mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
Name: SAI
Pode haver um requisito no qual os dados existentes em uma tabela MySQLi precisam ser modificados. Você pode fazer isso usando SQLUPDATEcomando. Isso modificará qualquer valor de campo de qualquer tabela MySQLi.
Sintaxe
Aqui está a sintaxe SQL genérica do comando UPDATE para modificar dados na tabela MySQLi -
UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause]
Você pode atualizar um ou mais campos completamente.
Você pode especificar qualquer condição usando a cláusula WHERE.
Você pode atualizar os valores em uma única tabela por vez.
A cláusula WHERE é muito útil quando você deseja atualizar as linhas selecionadas em uma tabela.
Atualizar dados do prompt de comando
Isso usará o comando SQL UPDATE com a cláusula WHERE para atualizar os dados selecionados na tabela tutorials_inf do MySQLi.
Exemplo
O exemplo a seguir será atualizado name campo para um registro com tutorial_inf.
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> UPDATE tutorials_inf
-> SET name = 'johar'
-> WHERE name = 'sai';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
Atualizando dados usando script PHP
Você pode usar o comando SQL UPDATE com ou sem WHERE CLAUSE na função PHP mysqli_query(). Esta função executará o comando SQL de forma semelhante ao prompt mysql>.
Exemplo
Experimente o seguinte exemplo para atualizar name campo para um registro.
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully<br>';
$sql = ' UPDATE tutorials_inf SET name="althamas" WHERE name="ram"'; if (mysqli_query($conn, $sql)) { echo "Record updated successfully"; } else { echo "Error updating record: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
Record updated successfully
Se você deseja excluir um registro de qualquer tabela MySQLi, você pode usar o comando SQL DELETE FROM. Você pode usar este comando no prompt mysql> assim como em qualquer script como PHP.
Sintaxe
Aqui está a sintaxe SQL genérica do comando DELETE para excluir dados de uma tabela MySQLi -
DELETE FROM table_name [WHERE Clause]
Se a cláusula WHERE não for especificada, todos os registros serão excluídos da tabela MySQLi fornecida.
Você pode especificar qualquer condição usando a cláusula WHERE.
Você pode excluir registros em uma única tabela por vez.
A cláusula WHERE é muito útil quando você deseja excluir linhas selecionadas em uma tabela.
Exclusão de dados do prompt de comando
Isso usará o comando SQL DELETE com a cláusula WHERE para excluir os dados selecionados na tabela tutorials_inf do MySQLi.
Exemplo
O exemplo a seguir excluirá um registro em tutorial_inf cujo nome é johar.
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DELETE FROM tutorials_inf where name = 'johar';
Query OK, 1 row affected (0.23 sec)
mysql>
Excluindo dados usando script PHP
Você pode usar o comando SQL DELETE com ou sem WHERE CLAUSE na função PHP mysqli_query(). Esta função executará o comando SQL de forma semelhante ao prompt mysql>.
Exemplo
Experimente o exemplo a seguir para excluir um registro de tutorial_inf cujo nome é althamas.
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully<br>'; $sql = ' DELETE FROM tutorials_inf WHERE name = "althamas"';
if (mysqli_query($conn, $sql)) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . mysqli_error($conn); } mysqli_close($conn);
?>
O exemplo de saída deve ser assim-
Connected successfully
Record deleted successfully
Vimos SQL SELECTcomando para buscar dados da tabela MySQLi. Também podemos usar uma cláusula condicional chamadaWHERE cláusula para selecionar os registros necessários.
Uma cláusula WHERE com sinal de igual (=) funciona bem onde queremos fazer uma correspondência exata. Como se "nome = 'sai'". Mas pode haver um requisito em que queremos filtrar todos os resultados em que o nome deve conter "johar". Isso pode ser tratado usando SQLLIKE cláusula junto com a cláusula WHERE.
Se a cláusula SQL LIKE for usada junto com os caracteres%, ela funcionará como um metacaractere (*) no UNIX ao listar todos os arquivos ou diretórios no prompt de comando.
Sem um caractere%, a cláusula LIKE é muito semelhante ao sinal de igual junto com a cláusula WHERE.
Sintaxe
Aqui está a sintaxe SQL genérica do comando SELECT junto com a cláusula LIKE para buscar dados da tabela MySQLi -
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
Você pode especificar qualquer condição usando a cláusula WHERE.
Você pode usar a cláusula LIKE junto com a cláusula WHERE.
Você pode usar a cláusula LIKE no lugar do sinal de igual.
Quando LIKE é usado junto com o sinal%, ele funcionará como uma pesquisa de metacaracteres.
Você pode especificar mais de uma condição usando AND ou OR operadores.
Uma cláusula WHERE ... LIKE pode ser usada junto com o comando DELETE ou UPDATE SQL também para especificar uma condição.
Usando a cláusula LIKE no prompt de comando
Isso usará o comando SQL SELECT com a cláusula WHERE ... LIKE para buscar dados selecionados da tabela tutorials_inf do MySQLi.
Exemplo
O exemplo a seguir retornará todos os registros de tutorials_inf tabela para a qual o nome do autor termina com johar -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf
-> WHERE name LIKE '%johar';
+----+-------+
| id | name |
+----+-------+
| 2 | johar |
+----+-------+
1 row in set (0.00 sec)
mysql>
Usando a cláusula LIKE dentro do script PHP
Você pode usar a sintaxe semelhante da cláusula WHERE ... LIKE na função PHP mysqli_query(). Esta função é usada para executar o comando SQL e posteriormente outra função PHPmysqli_fetch_array() pode ser usado para buscar todos os dados selecionados se a cláusula WHERE ... LIKE for usada junto com o comando SELECT.
Mas se a cláusula WHERE ... LIKE estiver sendo usada com o comando DELETE ou UPDATE, nenhuma outra chamada de função PHP será necessária.
Exemplo
Experimente o seguinte exemplo para retornar todos os registros de tutorials_inf tabela para a qual o nome contém johar -
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully<br>';
$sql = 'SELECT * FROM tutorials_inf WHERE name LIKE "%johar%"'; $result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
printf ("%s \n",$row["name"]); mysqli_free_result($result);
mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
johar
Vimos SQL SELECTcomando para buscar dados da tabela MySQLi. Quando você seleciona linhas, o servidor MySQLi está livre para retorná-las em qualquer ordem, a menos que você instrua de outra forma, dizendo como classificar o resultado. Mas você classifica um conjunto de resultados adicionando uma cláusula ORDER BY que nomeia a coluna ou colunas pelas quais deseja classificar.
Sintaxe
Aqui está a sintaxe SQL genérica do comando SELECT junto com a cláusula ORDER BY para classificar dados da tabela MySQL -
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
Você pode classificar o resultado retornado em qualquer campo, desde que o campo esteja listado.
Você pode classificar o resultado em mais de um campo.
Você pode usar a palavra-chave ASC ou DESC para obter o resultado em ordem crescente ou decrescente. Por padrão, é a ordem crescente.
Você pode usar a cláusula WHERE ... LIKE da maneira usual para colocar a condição.
Usando a cláusula ORDER BY no Prompt de Comando
Isso usará o comando SQL SELECT com a cláusula ORDER BY para buscar dados da tabela tutorials_inf do MySQLi.
Exemplo
Experimente o exemplo a seguir, que retorna o resultado em ordem decrescente.
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_inf ORDER BY id desc;
+----+-------+
| id | name |
+----+-------+
| 4 | ram |
| 3 | raghu |
| 2 | johar |
| 1 | sai |
+----+-------+
4 rows in set (0.00 sec)
mysql>
Verifique se todos os IDs estão listados em ordem decrescente.
Usando a cláusula ORDER BY dentro do script PHP
Você pode usar uma sintaxe semelhante da cláusula ORDER BY na função PHP mysqli_query(). Esta função é usada para executar o comando SQL e posteriormente outra função PHPmysqli_fetch_array() pode ser usado para buscar todos os dados selecionados.
Exemplo
Experimente o exemplo a seguir, que retorna o resultado em ordem decrescente do autor do tutorial.
<?php
$dbhost = 'localhost:3306';
$dbuser = 'root'; $dbpass = '';
$dbname = 'TUTORIALS'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname);
if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo 'Connected successfully</br>'; $sql = 'SELECT * from tutorials_inf ORDER BY id desc';
if($result = mysqli_query($conn, $sql)){ if(mysqli_num_rows($result) > 0){
echo "<table>";
echo "<tr>";
echo "<th>id</th>";
echo "<th>name</th>";
echo "</tr>";
while($row = mysqli_fetch_array($result)){
echo "<tr>";
echo "<td>" . $row['id'] . "</td>"; echo "<td>" . $row['name'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result); } else { echo "No records matching your query were found."; } } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn); } mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
id name
4 ram
3 raghu
2 johar
1 sai
Até agora, só obtemos dados de uma tabela por vez. Isso é bom para tomadas simples, mas na maioria dos usos do MySQL no mundo real, você frequentemente precisará obter dados de várias tabelas em uma única consulta.
Você pode usar várias tabelas em sua única consulta SQL. O ato de ingressar no MySQLi refere-se a quebrar duas ou mais tabelas em uma única tabela.
Você pode usar JOINS em instruções SELECT, UPDATE e DELETE para unir tabelas MySQLi. Veremos um exemplo de LEFT JOIN também, que é diferente do simples MySQLi JOIN.
Usando associações no prompt de comando
Suponha que temos duas tabelas tutorials_bks e tutorials_inf, em TUTORIAIS. Uma lista completa é fornecida abaixo -
Exemplo
Experimente os seguintes exemplos -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_bks;
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
+----+---------+
5 rows in set (0.00 sec)
mysql> SELECT * from tutorials_inf;
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 2 | johar |
| 3 | raghu |
| 4 | ram |
+----+-------+
4 rows in set (0.00 sec)
mysql>
Agora podemos escrever uma consulta SQL para unir essas duas tabelas. Esta consulta irá selecionar todos os nomes da tabelatutorials_inf e obterá o número correspondente de tutoriais detutorials_bks.
mysql> SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id;
+----+-------+----+
| id | name | id |
+----+-------+----+
| 1 | sai | 1 |
| 2 | johar | 2 |
| 3 | raghu | 3 |
| 4 | ram | 4 |
+----+-------+----+
4 rows in set (0.00 sec)
mysql>
Na tabela tutorials_bks, temos 5 registros, mas no exemplo acima ele filtra e dá apenas 4 registros de id de acordo com a consulta
Usando Joins em PHP Script
Você pode usar qualquer uma das consultas SQL mencionadas acima no script PHP. Você só precisa passar a consulta SQL para a função PHPmysqli_query() e então você buscará os resultados da maneira usual.
Exemplo
Experimente o seguinte exemplo -
<?php
$dbhost = 'localhost:3306'; $dbuser = 'root';
$dbpass = ''; $dbname = 'TUTORIALS';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$dbname); if(! $conn ) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully</br>';
$sql = 'SELECT a.id, a.name,b.id FROM tutorials_inf a,tutorials_bks b WHERE a.id = b.id'; if($result = mysqli_query($conn, $sql)) {
if(mysqli_num_rows($result) > 0) { echo "<table>"; echo "<tr>"; echo "<th>id</th>"; echo "<th>name</th>"; echo "<th>id</th>"; echo "</tr>"; while($row = mysqli_fetch_array($result)){ echo "<tr>"; echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['id'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_free_result($result); } else { echo "No records matching your query were found."; } } else { echo "ERROR: Could not able to execute $sql. " . mysqli_error($conn); } mysqli_close($conn);
?>
O exemplo de saída deve ser assim -
Connected successfully
id name id
1 sai 1
2 johar 2
3 raghu 3
4 ram 4
MySQL LEFT JOIN
Uma junção à esquerda do MySQLi é diferente de uma junção simples. Um MySQLi LEFT JOIN dá consideração extra à tabela que está à esquerda.
Se eu fizer um LEFT JOIN, obtenho todos os registros que correspondem da mesma maneira e, ALÉM DISSO, obtenho um registro extra para cada registro não correspondido na tabela à esquerda do join - garantindo assim (no meu exemplo) que cada nome receba um menção -
Exemplo
Experimente o seguinte exemplo para entender LEFT JOIN -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql>SELECT a.id, a.name,b.id FROM tutorials_inf a LEFT JOIN tutorials_bks b ON a.id = b.id;
Você precisaria praticar mais para se familiarizar com JOINS. Este é um conceito um pouco complexo em MySQL / SQL e ficará mais claro ao fazer exemplos reais.
Vimos SQL SELECT comando junto com WHERE cláusula para buscar dados da tabela MySQLi, mas quando tentamos dar uma condição, que compara o valor do campo ou coluna para NULL, ele não funciona corretamente.
Para lidar com tal situação, o MySQLi oferece três operadores
IS NULL - o operador retorna verdadeiro se o valor da coluna for NULL.
IS NOT NULL - o operador retorna verdadeiro se o valor da coluna não for NULL.
<=> - operador compara valores, que (ao contrário do operador =) é verdadeiro mesmo para dois valores NULL.
Condições envolvendo NULL são especiais. Você não pode usar = NULL ou! = NULL para procurar valores NULL nas colunas. Essas comparações sempre falham porque é impossível dizer se são ou não verdadeiras. Mesmo NULL = NULL falha.
Para procurar colunas que são ou não NULL, use IS NULL ou IS NOT NULL.
Usando valores NULL no prompt de comando
Suponha uma mesa tutorials_bks no banco de dados TUTORIALS e contém duas colunas id e name, onde um nome NULL indica que o valor é desconhecido -
Exemplo
Experimente os seguintes exemplos -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tutorials_bks (book) values('NULL');
Query OK, 1 row affected (0.08 sec)
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+---------+
11 rows in set (0.00 sec)
mysql>
Para encontrar registros onde a coluna de nome é ou não NULL, as consultas devem ser escritas assim -
mysql> SELECT * FROM tutorials_bks WHERE book = "null";
+----+------+
| id | book |
+----+------+
| 9 | NULL |
| 10 | NULL |
| 11 | NULL |
+----+------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book ! = "null";
+----+---------+
| id | book |
+----+---------+
| 1 | java |
| 2 | java |
| 3 | html |
| 4 | c++ |
| 5 | Android |
| 6 | |
| 7 | |
| 8 | |
+----+---------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM tutorials_bks WHERE book = "";
+----+------+
| id | book |
+----+------+
| 6 | |
| 7 | |
| 8 | |
+----+------+
3 rows in set (0.01 sec)
Manipulação de valores NULL em script PHP
Você pode usar a condição if ... else para preparar uma consulta com base no valor NULL.
Exemplo
O exemplo a seguir pega tutorial_count externo e o compara com o valor disponível na tabela.
<?php
$dbhost = 'localhost:3036'; $dbuser = 'root';
$dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) {
die('Could not connect: ' . mysql_error());
}
if( isset($tutorial_count )) { $sql = 'SELECT tutorial_author, tutorial_count FROM tcount_tbl
WHERE tutorial_count = $tutorial_count'; } else { $sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl WHERE tutorial_count IS $tutorial_count'; } mysql_select_db('TUTORIALS'); $retval = mysql_query( $sql, $conn );
if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully\n"; mysql_close($conn);
?>
Você viu o padrão MySQLi correspondente com LIKE ...%. O MySQLi suporta outro tipo de operação de correspondência de padrões com base em expressões regulares e oREGEXPoperador. Se você conhece PHP ou PERL, é muito simples de entender, porque essa correspondência é muito semelhante às expressões regulares de script.
A seguir está a tabela de padrões, que pode ser usada junto com REGEXP operador.
padronizar | O que o padrão corresponde |
---|---|
^ | Começo da corda |
$ | Fim da corda |
. | Qualquer personagem |
[...] | Qualquer caractere listado entre colchetes |
[^ ...] | Qualquer caractere não listado entre colchetes |
p1 | p2 | p3 | Alternação; corresponde a qualquer um dos padrões p1, p2 ou p3 |
* | Zero ou mais instâncias do elemento anterior |
+ | Uma ou mais instâncias do elemento anterior |
{n} | n instâncias do elemento anterior |
{m, n} | m a n instâncias do elemento anterior |
Exemplos
Agora, com base na tabela acima, você pode dispositivos vários tipos de consultas SQL para atender aos seus requisitos. Aqui, estou listando alguns para sua compreensão. Considere que temos uma tabela chamada tutorials_inf e ela tem um campo chamado name -
Consulta para encontrar todos os nomes que começam com 'sa'
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^sa';
O exemplo de saída deve ser assim -
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
Consulta para encontrar todos os nomes que terminam com 'ai'
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'ai$';
O exemplo de saída deve ser assim -
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
Consulte para encontrar todos os nomes que contenham 'a'
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'a';
O exemplo de saída deve ser assim -
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 3 | ram |
| 4 | johar |
+----+-------+
3 rows in set (0.00 sec)
Consulta para encontrar todos os nomes que começam com uma vogal
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^[aeiou]';
Uma transação é um grupo sequencial de operações de manipulação de banco de dados, que é executado como se fosse uma única unidade de trabalho. Em outras palavras, uma transação nunca será concluída a menos que cada operação individual dentro do grupo seja bem-sucedida. Se qualquer operação dentro da transação falhar, toda a transação falhará.
Praticamente, você agrupará muitas consultas SQL em um grupo e executará todas elas juntas como parte de uma transação.
Propriedades das transações
As transações têm as quatro propriedades padrão a seguir, geralmente conhecidas pela sigla ACID -
Atomicity- garante que todas as operações dentro da unidade de trabalho sejam concluídas com sucesso; caso contrário, a transação é abortada no ponto de falha e as operações anteriores são revertidas para seu estado anterior.
Consistency - garante que o banco de dados mude de estado corretamente após uma transação confirmada com sucesso.
Isolation - permite que as transações operem de forma independente e transparente entre si.
Durability - garante que o resultado ou efeito de uma transação confirmada persiste em caso de falha do sistema.
No MySQL, as transações começam com a instrução BEGIN WORK e terminam com uma instrução COMMIT ou ROLLBACK. Os comandos SQLi entre as instruções inicial e final formam a maior parte da transação.
COMMIT e ROLLBACK
Essas duas palavras-chave Commit e Rollback são usados principalmente para transações MySQL.
Quando uma transação bem-sucedida é concluída, o comando COMMIT deve ser emitido para que as alterações em todas as tabelas envolvidas tenham efeito.
Se ocorrer uma falha, um comando ROLLBACK deve ser emitido para retornar todas as tabelas referenciadas na transação ao seu estado anterior.
Você pode controlar o comportamento de uma transação definindo a variável de sessão chamada AUTOCOMMIT. Se AUTOCOMMIT for definido como 1 (o padrão), cada instrução SQL (dentro de uma transação ou não) é considerada uma transação completa e confirmada por padrão quando termina. Quando AUTOCOMMIT é definido como 0, emitindo o comando SET AUTOCOMMIT = 0, a série subsequente de instruções age como uma transação e nenhuma atividade é confirmada até que uma instrução COMMIT explícita seja emitida.
Você pode executar esses comandos SQL em PHP usando mysqli_query() função.
Exemplo genérico na transação
Essa sequência de eventos é independente da linguagem de programação usada; o caminho lógico pode ser criado em qualquer idioma que você usar para criar seu aplicativo.
Você pode executar esses comandos SQL em PHP usando mysqli_query() função.
Comece a transação emitindo o comando SQL BEGIN WORK.
Emita um ou mais comandos SQL como SELECT, INSERT, UPDATE ou DELETE.
Verifique se não há erro e tudo está de acordo com sua exigência.
Se houver algum erro, emita o comando ROLLBACK, caso contrário, emita um comando COMMIT.
Tipos de tabela de transações seguras no MySQLi
Você não pode usar as transações diretamente, pode, mas elas não seriam seguras e garantidas. Se você planeja usar transações em sua programação MySQLi, então precisa criar suas tabelas de uma maneira especial. Existem muitos tipos de tabelas, que suportam transações, mas o mais popular éInnoDB.
O suporte para tabelas InnoDB requer um parâmetro de compilação específico ao compilar o MySQLi da fonte. Se sua versão do MySQLi não tiver suporte para InnoDB, peça ao seu provedor de serviços de Internet para construir uma versão do MySQLi com suporte para tipos de tabela InnoDB ou baixe e instale a distribuição binária MySQL-Max para Windows ou Linux / UNIX e trabalhe com o tipo de tabela em um ambiente de desenvolvimento.
Se sua instalação do MySQLi suporta tabelas InnoDB, basta adicionar um TYPE = InnoDBdefinição para a instrução de criação da tabela. Por exemplo, o código a seguir cria uma tabela InnoDB chamada tutorials_innodb -
root@host# mysql -u root -p;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_innodb
-> (
-> tutorial_author varchar(40) NOT NULL,
-> tutorial_count INT
-> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
Verifique o seguinte link para saber mais sobre - InnoDB
Você pode usar outros tipos de tabela como GEMINI ou BDB, mas depende da sua instalação se ele suporta esses dois tipos.
MySQLi ALTER O comando é muito útil quando você deseja alterar o nome de sua tabela, qualquer campo da tabela ou se deseja adicionar ou excluir uma coluna existente em uma tabela.
Vamos começar com a criação de uma tabela chamada tutorials_alter.
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_alter
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.27 sec)
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.02 sec)
Descartando, Adicionando ou Reposicionando uma Coluna
Suponha que você queira eliminar uma coluna existente i da tabela MySQLi acima, então você usará DROP cláusula junto com ALTER comando da seguinte forma -
mysql> ALTER TABLE tutorials_alter DROP i;
UMA DROP não funcionará se a coluna for a única que resta na tabela.
Para adicionar uma coluna, use ADD e especifique a definição da coluna. A seguinte declaração restaura oi coluna para tutorials_alter -
mysql> ALTER TABLE tutorials_alter ADD i INT;
Depois de emitir essa instrução, testalter conterá as mesmas duas colunas que tinha quando você criou a tabela pela primeira vez, mas não terá exatamente a mesma estrutura. Isso ocorre porque novas colunas são adicionadas ao final da tabela por padrão. Então, emborai originalmente era a primeira coluna em mytbl, agora é a última.
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
Para indicar que você deseja uma coluna em uma posição específica dentro da tabela, use FIRST para torná-la a primeira coluna ou AFTER nome_col para indicar que a nova coluna deve ser colocada após nome_coluna. Tente as seguintes instruções ALTER TABLE, usando SHOW COLUMNS após cada uma para ver o efeito que cada uma tem -
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
Os especificadores FIRST e AFTER funcionam apenas com a cláusula ADD. Isso significa que se você quiser reposicionar uma coluna existente dentro de uma tabela, primeiro você deve DROP e, em seguida, ADICIONÁ-la na nova posição.
Alterar uma definição ou nome de coluna
Para alterar a definição de uma coluna, use MODIFY ou CHANGEcláusula junto com o comando ALTER. Por exemplo, para alterar a colunac de CHAR (1) a CHAR (10), faça isso -
mysql> ALTER TABLE tutorials_alter MODIFY c CHAR(10);
Com CHANGE, a sintaxe é um pouco diferente. Após a palavra-chave CHANGE, você nomeia a coluna que deseja alterar e, a seguir, especifica a nova definição, que inclui o novo nome. Experimente o seguinte exemplo:
mysql> ALTER TABLE tutorials_alter CHANGE i j BIGINT;
Se você agora usar CHANGE para converter j de BIGINT de volta para INT sem alterar o nome da coluna, a instrução será a esperada -
mysql> ALTER TABLE tutorials_alter CHANGE j j INT;
O efeito de ALTER TABLE em atributos de valor nulo e padrão -
Ao MODIFICAR ou ALTERAR uma coluna, você também pode especificar se a coluna pode ou não conter valores NULL e qual é seu valor padrão. Na verdade, se você não fizer isso, o MySQLi atribuirá valores automaticamente para esses atributos.
Aqui está o exemplo, onde a coluna NOT NULL terá o valor 100 por padrão.
mysql> ALTER TABLE tutorials_alter
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
Se você não usar o comando acima, o MySQLi preencherá os valores NULL em todas as colunas.
Alteração do valor padrão de uma coluna
Você pode alterar um valor padrão para qualquer coluna usando o comando ALTER. Experimente o seguinte exemplo.
mysql> ALTER TABLE tutorials_alter ALTER j SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | 1000 | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
Você pode remover a restrição padrão de qualquer coluna usando a cláusula DROP junto com o comando ALTER.
mysql> ALTER TABLE tutorials_alter ALTER j DROP DEFAULT;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
Alterar um tipo de tabela
Você pode usar um tipo de tabela usando TYPE cláusula junto com o comando ALTER.
Para descobrir o tipo atual de uma tabela, use a instrução SHOW TABLE STATUS.
mysql> SHOW TABLE STATUS LIKE 'tutorials_alter'\G
*************************** 1. row ***************************
Name: tutorials_alter
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-02-17 11:30:29
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
Renomeando uma Tabela
Para renomear uma tabela, use o RENAMEopção da instrução ALTER TABLE. Experimente o exemplo a seguir para renomear tutorials_alter para tutorials_bks.
mysql> ALTER TABLE tutorials_alter RENAME TO tutorials_bks;
Você pode usar o comando ALTER para criar e soltar INDEX em um arquivo MySQL. Veremos esse recurso no próximo capítulo.
Um índice de banco de dados é uma estrutura de dados que melhora a velocidade das operações em uma tabela. Os índices podem ser criados usando uma ou mais colunas, fornecendo a base para pesquisas aleatórias rápidas e ordenação eficiente de acesso aos registros.
Ao criar o índice, deve-se considerar quais são as colunas que serão utilizadas para fazer consultas SQL e criar um ou mais índices nessas colunas.
Praticamente, os índices também são tipos de tabelas, que mantêm a chave primária ou campo de índice e um ponteiro para cada registro na tabela real.
Os usuários não podem ver os índices, eles são usados apenas para agilizar as consultas e serão usados pelo Database Search Engine para localizar registros muito rapidamente.
As instruções INSERT e UPDATE levam mais tempo em tabelas com índices onde, conforme as instruções SELECT, se tornam rápidas nessas tabelas. O motivo é que, ao fazer a inserção ou atualização, o banco de dados também precisa inserir ou atualizar os valores do índice.
Índice Simples e Único
Você pode criar um índice exclusivo em uma tabela. Um índice exclusivo significa que duas linhas não podem ter o mesmo valor de índice. Aqui está a sintaxe para criar um índice em uma tabela.
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
Você pode usar uma ou mais colunas para criar um índice. Por exemplo, podemos criar um índice em tutorials_inf usando NAME_INDEX.
CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf(name);
Você pode criar um índice simples em uma tabela. Apenas omita a palavra-chave UNIQUE da consulta para criar um índice simples. O índice simples permite valores duplicados em uma tabela.
Se quiser indexar os valores em uma coluna em ordem decrescente, você pode adicionar a palavra reservada DESC após o nome da coluna.
mysql> CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf (name DESC);
Comando ALTER para adicionar e eliminar INDEX
Existem quatro tipos de instruções para adicionar índices a uma tabela -
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) - Esta instrução adiciona uma PRIMARY KEY, o que significa que os valores indexados devem ser exclusivos e não podem ser NULL.
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list) - Esta instrução cria um índice para o qual os valores devem ser exclusivos (com exceção dos valores NULL, que podem aparecer várias vezes).
ALTER TABLE tbl_name ADD INDEX index_name (column_list) - Isso adiciona um índice comum no qual qualquer valor pode aparecer mais de uma vez.
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) - Isso cria um índice FULLTEXT especial que é usado para fins de pesquisa de texto.
Aqui está o exemplo para adicionar índice em uma tabela existente.
mysql> ALTER TABLE tutorials_inf ADD INDEX (id);
Você pode eliminar qualquer INDEX usando a cláusula DROP junto com o comando ALTER. Experimente o seguinte exemplo para eliminar o índice criado acima.
mysql> ALTER TABLE tutorials_inf DROP INDEX (c);
Você pode eliminar qualquer INDEX usando a cláusula DROP junto com o comando ALTER. Experimente o seguinte exemplo para eliminar o índice criado acima.
Comando ALTER para adicionar e soltar PRIMARY KEY
Você também pode adicionar a chave primária da mesma maneira. Mas certifique-se de que a chave primária funcione em colunas, que NÃO são NULL.
Aqui está o exemplo para adicionar uma chave primária em uma tabela existente. Isso tornará uma coluna NOT NULL primeiro e depois a adicionará como uma chave primária.
mysql> ALTER TABLE tutorials_inf MODIFY id INT NOT NULL;
mysql> ALTER TABLE tutorials_inf ADD PRIMARY KEY (id);
Você pode usar o comando ALTER para descartar uma chave primária da seguinte maneira:
mysql> ALTER TABLE tutorials_inf DROP PRIMARY KEY;
Para eliminar um índice que não seja uma PRIMARY KEY, você deve especificar o nome do índice.
Exibindo informações INDEX
Você pode usar o comando SHOW INDEX para listar todos os índices associados a uma tabela. A saída de formato vertical (especificada por \ G) geralmente é útil com esta instrução, para evitar o contorno de linhas longas -
Experimente o seguinte exemplo
mysql> SHOW INDEX FROM table_name\G
........
As tabelas temporárias podem ser muito úteis em alguns casos para manter dados temporários. A coisa mais importante que deve ser conhecida sobre as tabelas temporárias é que elas serão excluídas quando a sessão atual do cliente terminar.
Conforme declarado anteriormente, as tabelas temporárias durarão apenas enquanto a sessão estiver ativa. Se você executar o código em um script PHP, a tabela temporária será destruída automaticamente quando a execução do script terminar. Se você estiver conectado ao servidor de banco de dados MySQL por meio do programa cliente MySQLi, a tabela temporária existirá até que você feche o cliente ou destrua manualmente a tabela.
Exemplo
Aqui está um exemplo que mostra o uso de uma mesa temporária. O mesmo código pode ser usado em scripts PHP usandomysqli_query() função.
mysql> CREATE TEMPORARY TABLE SalesSummary (
-> product_name VARCHAR(50) NOT NULL
-> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
-> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
-> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
-> (product_name, total_sales, avg_unit_price, total_units_sold)
-> VALUES
-> ('cucumber', 100.25, 90, 2);
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
Quando você executa um comando SHOW TABLES, sua tabela temporária não aparece na lista. Agora, se você fizer logout da sessão do MySQLi e emitir um comando SELECT, não encontrará dados disponíveis no banco de dados. Mesmo sua mesa temporária também não existiria.
Descartando tabelas temporárias
Por padrão, todas as tabelas temporárias são excluídas pelo MySQLi quando sua conexão com o banco de dados é encerrada. Ainda assim, se você deseja excluí-los no meio, você o faz emitindo o comando DROP TABLE.
A seguir está o exemplo de descartar uma mesa temporária -
mysql> DROP TABLE SalesSummary;
mysql> SELECT * FROM SalesSummary;
ERROR 1146: Table 'TUTORIALS.SalesSummary' doesn't exist
Pode haver uma situação em que você precise de uma cópia exata de uma tabela e CREATE TABLE ... SELECT não atende aos seus propósitos porque a cópia deve incluir os mesmos índices, valores padrão e assim por diante.
Você pode lidar com essa situação seguindo as etapas -
Use SHOW CREATE TABLE para obter uma instrução CREATE TABLE que especifica a estrutura da tabela de origem, índices e tudo.
Modifique a instrução para alterar o nome da tabela para aquele da tabela clone e execute a instrução. Dessa forma, você terá uma tabela de clones exata.
Opcionalmente, se você também precisar que o conteúdo da tabela seja copiado, emita uma instrução INSERT INTO ... SELECT também.
Exemplo
Experimente o seguinte exemplo para criar uma tabela clone para tutorials_inf.
Passo 1
Obtenha uma estrutura completa sobre a mesa.
mysql> SHOW CREATE TABLE tutorials_inf \G;
*************************** 1. row ***************************
Table: tutorials_inf
Create Table: CREATE TABLE `tutorials_inf` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `AUTHOR_INDEX` (`name`),
UNIQUE KEY `NAME_INDEX` (`name`),
KEY `id` (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1
1 row in set (0.05 sec)
ERROR: No query specified
Passo 2
Renomeie esta tabela e crie outra.
mysql> CREATE TABLE tutorials_clone(
-> id int(11) NOT NULL,
-> name varchar(20) NOT NULL,
-> PRIMARY KEY (id),
> UNIQUE KEY AUTHOR_INDEX (name),
-> UNIQUE KEY NAME_INDEX (name),
-> KEY id (id));
Query OK, 0 rows affected (1.80 sec)
etapa 3
Após executar a etapa 2, você criará uma tabela clone em seu banco de dados. Se você deseja copiar os dados da tabela antiga, pode fazê-lo usando a instrução INSERT INTO ... SELECT.
mysql> INSERT INTO tutorials_clone(id,name) SELECT id,name from tutorials_inf;
Query OK, 4 rows affected (0.19 sec)
Records: 4 Duplicates: 0 Warnings: 0
Por fim, você terá a tabela de clones exata que deseja.
Existem três informações que você gostaria de obter do MySQLi.
Information about the result of queries - Isso inclui o número de registros afetados por qualquer instrução SELECT, UPDATE ou DELETE.
Information about tables and databases - Isso inclui informações relativas à estrutura de tabelas e bancos de dados.
Information about the MySQLi server - Isso inclui o status atual do servidor de banco de dados, número da versão, etc.
É muito fácil obter todas essas informações no prompt do mysqli, mas ao usar APIs PERL ou PHP, precisamos chamar várias APIs explicitamente para obter todas essas informações. A seção a seguir mostrará como obter essas informações.
Obtenção do número de linhas afetadas por uma consulta
PERL Exemplo
Em scripts DBI, a contagem de linhas afetadas é retornada por do () ou por execute (), dependendo de como você executa a consulta -
# Method 1
# execute $query using do( ) my $count = $dbh->do ($query);
# report 0 rows if an error occurred
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
# Method 2
# execute query using prepare( ) plus execute( )
my $sth = $dbh->prepare ($query); my $count = $sth->execute ( ); printf "%d rows were affected\n", (defined ($count) ? $count : 0);
Exemplo de PHP
Em PHP, invoque a função mysqli_affected_rows () para descobrir quantas linhas uma consulta mudou -
$result_id = mysqli_query ($query, $conn_id);
# report 0 rows if the query failed
$count = ($result_id ? mysqli_affected_rows ($conn_id) : 0); print ("$count rows were affected\n");
Listando tabelas e bancos de dados
É muito fácil listar todos os bancos de dados e tabelas disponíveis com o servidor de banco de dados. Seu resultado pode ser nulo se você não tiver privilégios suficientes.
Além do método que mencionei abaixo, você pode usar as consultas SHOW TABLES ou SHOW DATABASES para obter uma lista de tabelas ou bancos de dados em PHP ou em PERL.
PERL Exemplo
# Get all the tables available in current database.
my @tables = $dbh->tables ( ); foreach $table (@tables ){
print "Table Name $table\n";
}
Exemplo de PHP
<?php
$servername = "localhost:3306";
$username = "root"; $password = "";
$dbname = "TUTORIALS"; $conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);
}
echo"Database connected";
$sql="SHOW DATABASES"; if (!($result = mysqli_query($conn,$sql))) {
printf("Error: %s\n", mysqli_error($conn)); } while( $row = mysqli_fetch_row( $result ) ){ if (($row[0]!="information_schema") && ($row[0]!="mysql")) { echo $row[0]."\r\n";
}
}
$conn->close();
?>
Obtendo Metadados do Servidor
Existem os seguintes comandos no MySQL que podem ser executados no prompt do mysql ou usando qualquer script como PHP para obter várias informações importantes sobre o servidor de banco de dados.
Sr. Não. | Comando e Descrição |
---|---|
1 | SELECT VERSION( ) String da versão do servidor |
2 | SELECT DATABASE( ) Nome do banco de dados atual (vazio se nenhum) |
3 | SELECT USER( ) Nome de usuário atual |
4 | SHOW STATUS Indicadores de status do servidor |
5 | SHOW VARIABLES Variáveis de configuração do servidor |
Uma sequência é um conjunto de inteiros 1, 2, 3, ... que são gerados em ordem sob demanda. As sequências são frequentemente usadas em bancos de dados porque muitos aplicativos exigem que cada linha de uma tabela contenha um valor exclusivo e as sequências fornecem uma maneira fácil de gerá-los. Este capítulo descreve como usar sequências no MySQLi.
Usando a coluna AUTO_INCREMENT
A maneira mais simples no MySQLi de usar Sequências é definir uma coluna como AUTO_INCREMENT e deixar o restante das coisas para o MySQLi cuidar.
Exemplo
Experimente o seguinte exemplo. Isso criará a tabela e depois disso irá inserir algumas linhas nesta tabela onde não é necessário fornecer o ID do registro porque ele é incrementado automaticamente pelo MySQLi.
mysql>CREATE TABLE tutorials_auto(
id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL,PRIMARY KEY(id));
Query OK, 0 rows affected (0.28 sec)
mysql>INSERT INTO tutorials_auto(id,name) VALUES(NULL,'sai'),(NULL,'ram');
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+------+
| id | name |
+----+------+
| 1 | sai |
| 2 | ram |
+----+------+
2 rows in set (0.05 sec)
Obtenha os valores AUTO_INCREMENT
LAST_INSERT_ID () é uma função SQL, então você pode usá-la de dentro de qualquer cliente que saiba como emitir instruções SQL. Caso contrário, os scripts PERL e PHP fornecem funções exclusivas para recuperar o valor incrementado automaticamente do último registro.
PERL Exemplo
Use o atributo mysql_insertid para obter o valor AUTO_INCREMENT gerado por uma consulta. Este atributo é acessado por meio de um identificador de banco de dados ou um identificador de instrução, dependendo de como você emite a consulta. O exemplo a seguir faz referência a ele por meio do identificador do banco de dados:
$dbh->do ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysqli_insertid};
Exemplo de PHP
Depois de emitir uma consulta que gera um valor AUTO_INCREMENT, recupere o valor chamando mysql_insert_id () -
mysql_query ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id); $seq = mysqli_insert_id ($conn_id);
Renumerando uma sequência existente
Pode haver um caso em que você excluiu muitos registros de uma tabela e deseja sequenciar novamente todos os registros. Isso pode ser feito usando um truque simples, mas você deve ter muito cuidado ao fazê-lo se sua mesa estiver tendo associações com outra mesa.
Se você determinar que o novo sequenciamento de uma coluna AUTO_INCREMENT é inevitável, a maneira de fazer isso é remover a coluna da tabela e adicioná-la novamente. O exemplo a seguir mostra como renumerar os valores de id na tabela de insetos usando esta técnica -
mysql> ALTER TABLE tutorials_auto DROP id;
mysql> ALTER TABLE tutorials_auto
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
Iniciando uma sequência em um valor particular
Por padrão, o MySQLi iniciará a sequência em 1, mas você também pode especificar qualquer outro número no momento da criação da tabela. A seguir está o exemplo em que o MySQLi iniciará a sequência de 100.
mysql> CREATE TABLE tutorials_auto
-> (
-> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
-> PRIMARY KEY (id),
-> name VARCHAR(30) NOT NULL,
-> );
Como alternativa, você pode criar a tabela e definir o valor da sequência inicial com ALTER TABLE.
mysql> ALTER TABLE tutorials_auto AUTO_INCREMENT = 100;
As tabelas ou conjuntos de resultados às vezes contêm registros duplicados. Às vezes, é permitido, mas às vezes é necessário para impedir registros duplicados. Às vezes, é necessário identificar registros duplicados e removê-los da tabela. Este capítulo descreverá como evitar a ocorrência de registros duplicados em uma tabela e como remover registros duplicados já existentes.
Evitando que ocorram duplicatas em uma tabela
Você pode usar um PRIMARY KEY ou UNIQUEÍndice em uma tabela com campos apropriados para evitar registros duplicados. Vejamos um exemplo: a tabela a seguir não contém esse índice ou chave primária, portanto, permitiria registros duplicados para first_name e last_name.
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
Para evitar que vários registros com os mesmos valores de nome e sobrenome sejam criados nesta tabela, adicione uma PRIMARY KEY à sua definição. Ao fazer isso, também é necessário declarar as colunas indexadas como NOT NULL, porque uma PRIMARY KEY não permite valores NULL -
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
A presença de um índice exclusivo em uma tabela normalmente causa a ocorrência de um erro se você inserir um registro na tabela que duplica um registro existente na coluna ou colunas que definem o índice.
Usar INSERT IGNORE ao invés de INSERT. Se um registro não duplica um registro existente, o MySQLi o insere normalmente. Se o registro for uma duplicata, a palavra-chave IGNORE diz ao MySQLi para descartá-lo silenciosamente sem gerar um erro.
O exemplo a seguir não apresenta erros e, ao mesmo tempo, não insere registros duplicados.
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
Usar REPLACEem vez de INSERT. Se o registro for novo, ele é inserido da mesma forma que com INSERT. Se for uma duplicata, o novo registro substitui o antigo -
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
INSERT IGNORE e REPLACE devem ser escolhidos de acordo com o comportamento de tratamento de duplicatas que você deseja efetuar. INSERT IGNORE mantém o primeiro de um conjunto de registros duplicados e descarta o restante. REPLACE mantém o último de um conjunto de duplicatas e apaga as anteriores.
Outra maneira de impor exclusividade é adicionar um índice UNIQUE em vez de uma PRIMARY KEY a uma tabela.
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
Contando e Identificando Duplicados
A seguir está a consulta para contar registros duplicados com first_name e last_name em uma tabela.
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
Esta consulta retornará uma lista de todos os registros duplicados na tabela person_tbl. Em geral, para identificar conjuntos de valores que estão duplicados, faça o seguinte -
Determine quais colunas contêm os valores que podem ser duplicados.
Liste essas colunas na lista de seleção de coluna, junto com COUNT (*).
Liste também as colunas na cláusula GROUP BY.
Adicione uma cláusula HAVING que elimina valores exclusivos exigindo que as contagens de grupo sejam maiores que um.
Eliminando duplicatas de um resultado de consulta:
Você pode usar DISTINCT junto com a instrução SELECT para descobrir os registros exclusivos disponíveis em uma tabela.
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
Uma alternativa para DISTINCT é adicionar uma cláusula GROUP BY que nomeia as colunas que você está selecionando. Isso tem o efeito de remover duplicatas e selecionar apenas as combinações exclusivas de valores nas colunas especificadas -
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
Removendo Duplicados Usando Substituição de Mesa
Se você tiver registros duplicados em uma tabela e quiser remover todos os registros duplicados dessa tabela, então aqui está o procedimento -
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
Uma maneira fácil de remover registros duplicados de uma tabela é adicionar um INDEX ou PRIMAY KEY a essa tabela. Mesmo se esta tabela já estiver disponível, você pode usar esta técnica para remover registros duplicados e você estará seguro no futuro também.
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);