INSTRUÇÕES SQL - Aspas simples e aspas duplas?

Olá, pessoal, tenho uma dúvida com relação à instruções SQL no código Java.
Estou estudando aqui em um livro e no capítulo sobre conexão com banco de dados deparei-me com uma instrução de inclusão que não estou entendendo o por que das aspas simples e aspas duplas bem como a lógica que está por trás dessas instruções.

Bem, tenho um bando chamdao meuBanco o qual possui uma tabela chamada filmes e devo inserir um novo filme nela onde os campos a serem inseridos são código, título, gênero, produtora, e data da compra.

A instrução SQL que tenho é a seguinte:

Strin sql = "INSERT INTO Filmes (codigo, titulo, genero, "+ "produtora, datacompra) Values (' " + tfCodigo.getText() + " ' , ' " + tfTitulo.getText() + " ' , ' " + tfGenero.getText() + " ' , ' " + tfProdutora.getText() + " ' , ' " + tfDataCompra.getText() + " ')";

Em outro código do livro vi que o autor usou aspas simples para fazer um pesquisa em uma cadeia de valores do campo código e o valor do código estava entre aspas simples. O código está abaixo:

ResultSet rs = meuState.executeQuery("Select codigo, titulo FROM Filmes WHERE codigo > '03129' AND codigo <'03149' ORDER BY codigo");

No código acima o valor do campo código a ser pesquisado está entre aspas simples sendo que toda a instrução SQL está entre aspas duplas. Aí eu entendi, mas o código anterior não entendi a lógica. Acho que estou perdido nesse monte de aspas simples e aspas duplas.

Fiz uma pesquisa aqui no fórum e deparei-me com o seguinte tópico:

http://www.guj.com.br/posts/list/129963.java#700199

A terceira classe que o membro posta é a classe MedicoBD e é quase parecido com o código que tenho no livro a menos dos valores, mas a insttrução é a mesma e a sintaxe também.

Aí fiquei na dúvida.

Alguém poderia esclarecer como funciona as instruções SQL no que tange as aspas simples e aspas duplas, onde devo usar simples e onde devo usar duplas, por favor ?

Desde já agradecido !

As aspas duplas servem apenas p/ concatenar algum objeto ao teu SQL…

Por exemplo:

String sql = "select * from filmes where cdFilme = ’ “+filme.codigo+”’ ";

E as aspas símples ficam sempre antes e depois de algum valor… seria a mesma coisa como no outro exemplo:

String sql = "select * from filmes where cdFilme = ‘3’ ";

Não sei se consegui explicar???

abraço!

SQL aceita tanto aspas simples quanto aspas duplas… vc pode fazer instrucoes sql das duas maneiras, por exemplo:

SELECT *
   FROM some_table
 WHERE some_column = 'some_value';

isso dentro de uma string ficaria assim:

String sql = "SELECT * FROM some_table WHERE some_column = 'some_value' ";

ou dessa forma:

SELECT *
   FROM some_table
 WHERE some_column = "some_value";

que dentro de uma string fica assim:

String sql = "SELECT * FROM some_table WHERE some_column = \"some_value\" ";

portanto, é mais fácil sempre usar aspas simples, para não ter o trabalho de escapar aspas duplas :smiley:
outro motivo de se usar aspas simples, é que fica mais fácil entender a instrução sql, pois não tem as barras de escapa das aspas duplas

espero ter ajudado.

[]'s

Oi.

As aspas simples são usadas como delimitador de strings em um código sql. Vc pode usar duplas tbm.
Então quando vc vê:

String s = "select * from pressoa where nome = 'joão'";

Quer dizer que joão é uma string dentro do código sql.
Vc também pode ver algo como:

String s = "select * from pressoa where nome = \"joão\"";

Quer dizer que joão é uma string dentro do código sql, mas agora o delimitador usado são as aspas duplas. Como uma string em java usa apenas as aspas duplas como delimitador (outras linguagens usam tanto as simples quanto as duplas da mesma forma que no sql), vc precisa então “escapar” o caractere de aspas duplas, dizendo: na minha string eu quero que tenha um caractere de aspas duplas. Vc faz o escape usando a barra invertida, da mesma forma que para o pulo de linha (\n) por exemplo.

Agora uma dica. Se vc está usando JDBC puro, existe uma forma melhor para montar uma query ao invés de fazer uma série de concatenações de String.
Olhe o exemplo:

[code]// perceba os pontos de interrogação! eles são chamados de parâmetros
String query = “SELECT * FROM pessoa WHERE nome LIKE ? AND sobrenome LIKE ? AND quantidadeFilhos = ?”;

// criamos um prepared statement ao invés de um statement
PreparedStatement stmt = suaConexao.prepareStatement( query );

// usando prepared statement conseguimos injetar valores dentro de uma query
// no lugar onde estão os pontos de interrogação

// no primeiro “?”, insira a string joão
stmt.setString( 1, “joão” );

// no segundo “?” insira a string % (que no sql significa qq coisa)
stmt.setString( 2, “%” );

// no terceito “?” insira o inteiro 2
stmt.setInt( 3, 2 );

// executa a query com os valores que foram inseridos
ResultSet rs = stmt.executeQuery();[/code]

Se quiser ver todos os métodos da interface PreparedStatement, dê uma olhada no link http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html

[]´s

Então, pessoal, muito obrigado pela ajuda.

Mas parece que ainda estou com algumas dúvidas.
Olhem no código que postei. Por que no final da primeira linha há aquela aspas duplas e aquele sinal de + e na linha de baixo também há as aspas duplas ?
Na linha de baixo há a continuação de onde devem ser inseridas as informações, ou seja, em quais campos os valores devem ser inseridos. Por que não continuar com apenas as vírgulas para separar os campos ? Por que houve a necessidade de se inserir essas aspas duplas no final da primeira linha segida do sinal de + e no começo da segunda linha uma aspas duplas novamente ?

E os exemplos que vocês deram foram para pesquisas, mas estou precisando de fazer uma inserção no banco. A sintaxe é a mesma ?

jhonatandarosa, quer dizer que eu poderia escrever a instrução da seguinte maneira:

Strin sql = "INSERT INTO Filmes (codigo, titulo, genero, "+ "produtora, datacompra) Values ('tfCodigo.getText()' , 'tfTitulo.getText()' , 'tfGenero.getText()' , 'tfProdutora.getText()' , 'tfDataCompra.getText()')";

aureliolima, obrigado pela explicação, ficou boa, com essa sintaxe somente me resta a dúvida que postei acima.

davidbuzatto,

Legal, gostei dessa sintaxe também, parece-me a mais apropriada, pois acho que o código fica mais limpo e mais fácil de se entender. Vou ler com mais calma a url que passou !

Obrigado pessoal, mas respondam-me a dúvida que postei no começo desse post, por favor !

Grato !

Oi Valder,

Pq a vírgula que está numa string que faz parte do comando sql.
Vc tentou dar um print na sua variável sql?

Olhe só[code]
Strin sql = "INSERT INTO Filmes (codigo, titulo, genero, “+
“produtora, datacompra) Values (’ " +
tfCodigo.getText() + " ’ , ’ " +
tfTitulo.getText() + " ')”)”;

System.out.println( sql );[/code]

Uma possível uma saida seria:
INSERT INTO Filmes (codigo, titulo, genero, produtora, datacompra) Values (’ 1 ’ [color=red],[/color] ’ exterminador do futuro ');

Veja a vírgula depois do ’ 1 ', é ela que está na string.
Outro detalhe que você deve tomar cuidado é com os espaços. A forma que está seu código vc está dando um espaco antes e um depois de cada valor:
’ 1 ’
’ exterminador do futuro ’
Você não vai querer esses espaços no banco não é? Então arrume a query.

Mais um detalhe. Seu código é um valor numérico não é? Então vc não precisa das aspas simples.
Seu código corrigido ficaria: Strin sql = "INSERT INTO Filmes (codigo, titulo, genero, "+ "produtora, datacompra) Values ( " + tfCodigo.getText() + " , '" + tfTitulo.getText() + "' , '" + tfGenero.getText() + "' , '" + tfProdutora.getText() + "' , '" + tfDataCompra.getText() + "')";

Pelo que ví parece que gênero e produtora não são chaves extrangeiras, vc está usando os dados crús, sem nenhuma referência. Seria legal vc tem uma tabela de gêneros e uma de produtoras, e então ter um combo para cada uma onde vc pega o identificador e coloca no filme…

Por fim, vc pergunta porque fica cada um numa linha, sendo concatenado. Isso é para organizar, nada mais. Voltando a vírgula que você pergunta, como falei, ela faz parte do comando sql, então precisa ficar dentro da String.

Legal vc ter gostado do PreparedStatement surigo fortemente que você o use. Vc perguntou sobre a sintaxe que foi usada. Ele dá suporte para qualquer uma. Apenas na hora de executar que muda o método. Se for para fazer um select, vc usa executeQuery(), se for qq comando DML (insert, update e delete) vc usa executeUpdate().

[]´s

Davidbuzato, muito boa sua explicação !!! Muito obrigado por ela.

Consultei aqui o livro do Deitel e realmente não preciso concatenar as instruções se estas estiverem na mesma linha.
Parece que agora estou entendendo bem a sintaxe dos comandos SQL.

Mas minha dúvida persiste. Para que eu preciso dessas aspas duplas e desse sinal de + na primeira linha e também nas demais linhas onde tenho o comando Values (…) quando quero colocar as instruções em linhas diferentes para melhor organização do código ?

A instrução não poderia ficar da seguinte maneira ?:

Strin sql = "INSERT INTO Filmes (codigo, titulo, genero,   
    produtora, datacompra) Values ('   
    tfCodigo.getText()' , '   
    tfTitulo.getText()' , '   
    tfGenero.getText()' , '   
    tfProdutora.getText()' , '   
    tfDataCompra.getText()')";

Não sei se estou confundindo as coisas, mas o final de um comando em Java só termina com o ponto e vírgula (;). Assim, na primeira linha, que não contém o ponto e vírgula, o Java entenderia que o comando SQL continuaria na linha seguinte, sem precisar dessa concatenação.
Então, o código não poderia ficar como coloquei acima ?

Com relação aos valores numéricos que você citou. Bem, não, os valores não são numéricos, são todos Strings a menos do campo dataCompra que é do tipo data. Mas você disse que não preciso das aspas simples se os valores forem numéricos (int, float, double, etc…), mas as coloca no código em que postou. Acho que me confundi com esse código que você postou !

Outra coisa, o banco de dados não sofreu qualquer tipo de modelagem correta, foi feito apenas para fins de aprendizagem. O autor não se preocupou com chaves primárias e chaves estrangeiras, pois o objetivo do capítulo era a aprendizagem de como conectar o código Java com o banco de dados. Mas lógico que quando eu modelar algum banco seguirei seu conselho, uma tabela de produtora e uma de gêneros, caso contrário o banco vira uma zona.

Depois que aprender bem essa sintaxe e testar vários códigos, com certeza irei começar a usar PreparedStatement para as operações, pois à minha primeira vista o código fica muito melhor organizado.

Bem, se responder-me mais essa duvidazinha aí, ficaria muito grato.

Agradecido mjito, valeu aí !

Uai, por que apareceu essa caretinha aí na primeira linha após o código que postei no último post ? Era para aparecer ponto e vírugla entre parenteses.

[quote=Valder Olmo Corrêa]Mas minha dúvida persiste. Para que eu preciso dessas aspas duplas e desse sinal de + na primeira linha e também nas demais linhas onde tenho o comando Values (…) quando quero colocar as instruções em linhas diferentes para melhor organização do código ?

A instrução não poderia ficar da seguinte maneira ?:

Strin sql = "INSERT INTO Filmes (codigo, titulo, genero,   
    produtora, datacompra) Values ('   
    tfCodigo.getText()' , '   
    tfTitulo.getText()' , '   
    tfGenero.getText()' , '   
    tfProdutora.getText()' , '   
    tfDataCompra.getText()')";

Não sei se estou confundindo as coisas, mas o final de um comando em Java só termina com o ponto e vírgula (;). Assim, na primeira linha, que não contém o ponto e vírgula, o Java entenderia que o comando SQL continuaria na linha seguinte, sem precisar dessa concatenação.
Então, o código não poderia ficar como coloquei acima ?[/quote]
Cada comando termina com ‘ponto e vírgula’. Mas um literal (no caso, uma String) deve estar delimitado por aspas, necessariamente na mesma linha. Claro que isso tornaria linhas extensas horríveis de ler. Por isso existe a concatenação, que junta pequenas partes da String (cada parte pode estar em uma linha, mas cada parte está delimitada por suas aspas duplas).

Por isso, o trecho abaixo não é válido:

String s = "parte 1
    parte2";

Mas o abaixo é:

String s = "parte 1" // cada parte delimitada por suas aspas duplas que devem estar na mesma linha
    + "parte 2";

Opa, agora acho que entendi sim !
Obrigado pela explicação, marcobiscaro2112 !

Agora preciso praticar as habilidades com conexão aos bancos. Tenho um livro de MySQL, vou fazendo os exercícios e implementando uma aplicação em Java para conectar com os bancos.

Obrigadão aí, galera !