PplWare Mobile

Vamos dar uns toques de SQL? IX

                                    
                                

Este artigo tem mais de um ano


Autor: Pedro Pinto


  1. Duarte Brito says:

    Dúvida minha…
    Em mysql não existe cross join tal como em T-SQL????

  2. A função ‘HOUR()’ não faz parte do standard SQL. O mais parecido é a função EXTRACT(), que o MySQL não implementa.

    Segundo o standard SQL, seria assim:

    SELECT tbl_pplware.nome AS nome,
    SUM(
    EXTRACT( HOUR FROM horas.data_saida ) –
    EXTRACT( HOUR FROM horas.data_entrada ) ) AS horas
    FROM `tbl_pplware`
    LEFT JOIN horas ON tbl_pplware.id_pessoa = horas.id_p
    GROUP BY tbl_pplware.id_pessoa

    Existe, pelo menos, pelo PostgreSQL e Oracle. Não existe nem em SyBase, nem MSSQL, nem no MySQL.

  3. Mestre says:

    Muito bom 🙂 parabens

  4. Tiago Silva says:

    Eu tenho um problema….
    tenho uma tabela Produto composta pelos seguintes campos
    Nome,preco….
    a minha questao é como declaro o campo preco se float???
    e como introduzo depois exemplo
    insert valuer Produto (‘Arroz’,2,25) assim da erro como resolver isto???
    Obrigado

    • Duarte Brito says:

      Para criar usas DECIMAL(18,9)
      E para inserir não tenho a certeza mas tem de ser 2.5
      É importante que seja ponto o separador e não virgula…

      Pegando no exemplo anterior e usando o mesmo site para testar tens aqui:

      CREATE TABLE t_dttest(
      a DECIMAL(18,9),
      b TIME,
      c DATETIME);

      INSERT INTO t_dttest VALUES (
      2.5,
      TIME ’10:32:16′,
      TIMESTAMP ‘1962-05-20 10:32:16’);

      SELECT * FROM t_dttest;

      http://sqlzoo.net/howto/source/z.dir/tip816560/mysql

  5. Trambulhao says:

    Eu costumo, quando possível, unir as tabelas no WHERE.

    Tipo:

    SELECT nome, data_entrada, data_saida
    FROM tbl_pplware, tbl_horas
    WHERE tbl_pplware.id_pessoa = tbl_horas.id_p

    Penso que seja mais rápido e fica um código mais limpo

    • Duvido que seja mais rápido, mas dependerá do motor de dados. Não me admiraria que, nalguns SDBMSs até seja mais lento, dado faltar a ‘dica’ para para juntar as várias tabelas.

      Mais “limpo” não será de certeza… imagina só que o join envolve meia dúzia de tabelas ou mais. Além de que se torna mais difícil distinguir a parte da where clause que diz respeito ao join da que diz respeito aos limites da query.

      • Trambulhao says:

        Concordo contigo.

        O que eu queria dizer era: Mesmo assim, usando INNER, LEFT e RIGHT JOIN penso que seja mais rápido e fica com um código mais limpo.

        Só agora dei conta do que tinha enviado.

    • NoSila says:

      Relativamente à rapidez não me posso pronunciar visto que não sei os detalhes de implementação dos engines em si mas, código mais limpo? Liga 5 tabelas com nomes sensivelmente grandes e depois mete mais 4 condições de filtragem de dados, já começa a não ficar assim tão limpo 🙂

      Utilizando um INNER JOIN por exemplo podes separar a parte do código que trata da criação da ponte entre as várias tabelas, acabas por ter o código quase por blocos:

      /*Apresentação final dos dados*/
      SELECT Foo.Name, Bar.Value ….
      /*Ligar tabelas*/
      FROM Foo
      INNER JOIN Bar
      ON Bar.ID = Foo.ID

      /*Condições*/
      WHERE Foo.Name LIKE ‘%Bla%’ OR Bar.Value = 10 …;

      Pelo menos comigo é o que resulta melhor, ambas as formas dariam um resultado correcto!

  6. Daniel says:

    É impressão minha ou o exemplo 3 não funcionaria correctamente, caso um dos “funcionários” tivesse feito o turno das 22h – 02h? É que a subtracção como está feita é directa da hora e assim dará -20! e não +4 como seria esperado. Alguém me corrija se estiver errado…

Deixe um comentário

O seu endereço de email não será publicado.

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. A administração deste site reserva-se, desde já, no direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.