Structured Query Language: diferenças entre revisões

Fonte: aprendis
Saltar para a navegaçãoSaltar para a pesquisa
Sem resumo de edição
 
(Há 70 edições intermédias do mesmo utilizador que não estão a ser apresentadas)
Linha 4: Linha 4:
|Surgido em=1974
|Surgido em=1974
|Criado por=Donald D. Chamberlin e Raymond F. Boyce
|Criado por=Donald D. Chamberlin e Raymond F. Boyce
|Aplicações=Armazenar, consultar, alterar informação de uma base de dados
|Aplicações=Armazenar, consultar, alterar informação de uma [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados]
|Conceitos relacionados=Bases de Dados, Manipulação de Dados
|Conceitos relacionados=Bases de Dados, Manipulação de Dados
}}
}}
<p align="justify">'''Structured Query Language''', usualmente conhecido por '''SQL''', é uma linguagem para criar e manipular bases de dados relacionais. <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> De um modo simples, uma empresa precisa de guardar e consultar informação. Por exemplo, um banco precisa de guardar informação relativamente aos utilizadores, ao valor existente nas contas, às transações efetuadas, etc. Para efetuar essas ações são utilizadas bases de dados que fornecem funcionalidades para adicionar, modificar e consultar de forma a obter resultados através de 'Querys' (pedidos à base de dados) em SQL.</p>
<p align="justify">'''''Structured Query Language''''', usualmente conhecido por '''SQL''', é uma linguagem para criar e manipular bases de dados relacionais. <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> De um modo simples, uma empresa precisa de guardar e consultar informação. Por exemplo, um banco precisa de guardar informação relativamente aos utilizadores, ao valor existente nas contas, às transações efetuadas, etc. Para efetuar essas ações são utilizadas bases de dados que fornecem funcionalidades para adicionar, modificar e consultar de forma a obter resultados através de 'Querys' (pedidos à [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados]) em SQL. <ref name="Darwen"> Darwen, C.J. Date e Hugh. A Guide to The SQL Standard. s.l. : Addison Wesley Professional, 1996. ISBN 0-201-96426-0.</ref></p>
 
<p align="justify">'''''Na área da Saúde''''' a utilização de Tecnologias da Informação (IT) é crucial, uma vez que, os dados da Instituição se encontram armazenados em base de dados que se encontram alojadas em servidores. Assim, quando é necessário realizar um estudo de indicadores ou procurar informação do doente, será facilmente acedida através da utilização de comandos SQL, sem que o utilizador se aperceba do procedimento.
Com a crescente quantidade de informação em suporte digital, a complexidade da mesma e a globalização dos cuidados de saúde, é necessário o desenvolvimento de novos métodos, com o intuito de disponibilizar a informação correta, adequada e num <i>timing</i> curto. </p>


==Introdução==
==Introdução==
<p align="justify">A sigla SQL denomina Structured Query Language ou, em português, Linguagem de Consulta Estruturada é uma linguagem para interação com Bases de Dados Relacionais. Não constitui uma linguagem completa para o desenvolvimento de aplicações sendo a sua principal função a de suportar a definição, manipulação e controlo dos dados numa base de dados <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref>. É uma linguagem de alto nível pois, apenas se tem que dizer ao sistema o que fazer e não como, nem onde o tem de realizar.</p>
<p align="justify">A sigla SQL denomina ''Structured Query Language'' ou, em português, Linguagem de Consulta Estruturada é uma linguagem para interação com Bases de Dados Relacionais. Não constitui uma linguagem completa para o desenvolvimento de aplicações sendo a sua principal função a de suportar a definição, manipulação e controlo dos dados numa [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref>. É uma linguagem de alto nível pois, apenas se tem que dizer ao sistema o que fazer e não como, nem onde o tem de realizar.</p>


==Base de Dados==
==Base de Dados==
<p align="justify">De uma forma muito simplista, pode-se afirmar que uma base de dados consiste numa coleção de dados estruturados, organizados e armazenados de forma persistente sendo que é necessário que os dados tenham algum tipo de significado e organização <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>.</p>
<p align="justify">De uma forma muito simplista, pode-se afirmar que uma [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] consiste numa coleção de dados estruturados, organizados e armazenados de forma persistente sendo que é necessário que os dados tenham algum tipo de significado e organização <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>.</p>
<p align="justify">O Sistema Gestor de Bases de Dados (SGBD) é uma aplicação informática que fornece a interface entre os dados que são armazenados fisicamente na base de dados e o utilizador. É o SGBD que vai fornecer o conjunto completo de serviços para acesso à informação da base de dados utilizando, para isso, uma linguagem que permita a realização dessas operações: o SQL <ref name="Date"> Date, C. J. SQL e Teoria Relaciona. Brasil : O'REILLY novatec, 2015. ISBN 978-85-7522-433-5.</ref>.</p>
<p align="justify">O [http://aprendis.gim.med.up.pt/index.php/Sistema_Gestor_de_Bases_de_Dados Sistema Gestor de Bases de Dados] (SGBD) é uma aplicação informática que fornece a interface entre os dados que são armazenados fisicamente na [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] e o utilizador. É o [http://aprendis.gim.med.up.pt/index.php/Sistema_Gestor_de_Bases_de_Dados SGBD] que vai fornecer o conjunto completo de serviços para acesso à informação da [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] utilizando, para isso, uma linguagem que permita a realização dessas operações: o SQL <ref name="Date"> Date, C. J. SQL e Teoria Relaciona. Brasil : O'REILLY novatec, 2015. ISBN 978-85-7522-433-5.</ref>.</p>
<p align="justify">Nem todos os sistemas que gerem as bases de dados usam a linguagem SQL. No entanto, o SQL é usado na grande maioria dos sistemas atualmente disponíveis e naqueles que adotam o modelo relacional <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>. Este modelo, de uma forma resumida, baseia-se no princípio em que todos os dados estão guardados em tabelas tendo em conta as relações entre os atributos. Toda a sua definição é teórica e baseada na lógica de predicados e na teoria dos conjuntos  cobrindo os três aspetos que qualquer SGBD deveria cobrir relativamente aos dados:  estrutura, integridade e manipulação
<p align="justify">Nem todos os sistemas que gerem as bases de dados usam a linguagem SQL. No entanto, o SQL é usado na grande maioria dos sistemas atualmente disponíveis e naqueles que adotam o modelo relacional <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>. Este modelo, de uma forma resumida, baseia-se no princípio em que todos os dados estão guardados em tabelas tendo em conta as relações entre os atributos. Toda a sua definição é teórica e baseada na lógica de predicados e na teoria dos conjuntos  cobrindo os três aspetos que qualquer [http://aprendis.gim.med.up.pt/index.php/Sistema_Gestor_de_Bases_de_Dados SGBD]deveria cobrir relativamente aos dados:  estrutura, integridade e manipulação
<ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref> <ref name="Date"> Date, C. J. SQL e Teoria Relaciona. Brasil : O'REILLY novatec, 2015. ISBN 978-85-7522-433-5.</ref>. </p>
<ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref> <ref name="Date"> Date, C. J. SQL e Teoria Relaciona. Brasil : O'REILLY novatec, 2015. ISBN 978-85-7522-433-5.</ref>. </p>


[[Ficheiro:bd_conceitos.png|500px]]
[[Ficheiro:bd_conceitos.png|500px|thumb|center|Composição de uma [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados Base de Dados]Relacional <ref name="MichaleJ"> Michael J. Donahoo, Gregory David Speegle. SQL: Practical Guide for Developers. San Francisco : Morgan Kaufmann Publishers, 2005. ISBN 0-12-220531-6</ref>]]


<p align="justify">Para descrever os dados e as suas estruturas numa base de dados relacional usam-se os seguintes termos/conceitos (Fig. 1) <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> <ref name="MichaleJ"> Michael J. Donahoo, Gregory David Speegle. SQL: Practical Guide for Developers. San Francisco : Morgan Kaufmann Publishers, 2005. ISBN 0-12-220531-6</ref>:</p>
<p align="justify">Para descrever os dados e as suas estruturas numa [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] relacional usam-se os seguintes termos/conceitos (Fig. 1) <ref name="SilvaLibório"> Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1</ref> <ref name="MichaleJ"> Michael J. Donahoo, Gregory David Speegle. SQL: Practical Guide for Developers. San Francisco : Morgan Kaufmann Publishers, 2005. ISBN 0-12-220531-6</ref>:</p>
* '''Tabela (ou Relação)''': Conjunto de linhas do mesmo tipo, onde não existem linhas repetidas nem significado na ordem das linhas da tabela.
* '''Tabela (ou Relação)''': Conjunto de linhas do mesmo tipo, onde não existem linhas repetidas nem significado na ordem das linhas da tabela.
* '''Coluna (ou Atributo)''': Identificada por um nome e com um único valor por linha sendo que é constituída por um conjunto de dados do mesmo tipo.
* '''Coluna (ou Atributo)''': Identificada por um nome e com um único valor por linha sendo que é constituída por um conjunto de dados do mesmo tipo.
Linha 27: Linha 30:
* '''Chave Primária (PK)''': É a identificação de uma ou várias colunas de uma tabela. O valor da chave primária identifica unicamente uma linha de uma tabela.
* '''Chave Primária (PK)''': É a identificação de uma ou várias colunas de uma tabela. O valor da chave primária identifica unicamente uma linha de uma tabela.
* '''Chave Estrangeira (FK)''': É uma ou mais colunas na tabela tal que os seus valores são valores da chave primária de outra.
* '''Chave Estrangeira (FK)''': É uma ou mais colunas na tabela tal que os seus valores são valores da chave primária de outra.
Após o entendimento dos conceitos principais de uma base de dados, é agora possível a compreensão das operações que podem ser realizadas com recurso a SQL.
Após o entendimento dos conceitos principais de uma [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados], é agora possível a compreensão das operações que podem ser realizadas com recurso a SQL.


<p align="justify">De seguida, é possível observar três tabelas que representam uma entidade/pessoa e servem para armazenar informação. A tabela Médico guarda informação como: o código (chave primária), o nome, a idade, a especialidade e a sua cidade. A tabela Paciente tem o número de utente, o nome, a idade, a cidade e a doença pela qual se deslocou ao hospital. Já na tabela Consulta pode-se visualizar a relação existente entre estas duas entidades: o Médico e o Paciente tendo, como chaves estrangeiras o código do médico e o número do paciente. Além disso, contêm ainda a data e hora da consulta, a sala onde se realizou e a doença diagnosticada ao paciente.</p>
<p align="justify">De seguida, é possível observar três tabelas que representam uma entidade/pessoa e servem para armazenar informação. A tabela Médico guarda informação como: o código (chave primária), o nome, a idade, a especialidade e a sua cidade. A tabela Paciente tem o número de utente, o nome, a idade, a cidade e a doença pela qual se deslocou ao hospital. Já na tabela Consulta pode-se visualizar a relação existente entre estas duas entidades: o Médico e o Paciente tendo, como chaves estrangeiras o código do médico e o número do paciente. Além disso, contêm ainda a data e hora da consulta, a sala onde se realizou e a doença diagnosticada ao paciente.</p>


{|class="wikitable"
{|class="wikitable" style="width:40%; text-align: left;"
! Código
! Código
! Nome
! Nome
Linha 40: Linha 43:
|-
|-
| 12687871
| 12687871
| Alberto Caiero
| Alberto Caeiro
| 36
| 36
| Ortopedia
| Ortopedia
Linha 64: Linha 67:
|}
|}


{| class="wikitable" style="width:100%;
{| class="wikitable" style="width:40%; text-align: left;"
! Nº de Utente
! Nº de Utente
! Nome
! Nome
Linha 87: Linha 90:
|}
|}


{| class="wikitable" style="width:100%;
{| class="wikitable" style="width:40%; text-align: left;"
! CodMedico
! CodMedico
! NumPaciente
! NumPaciente
Linha 119: Linha 122:


==História do SQL==
==História do SQL==
<p align="justify">A sigla SQL denomina Structured Query Language ou, em português, Linguagem de Consulta Estruturada é uma linguagem para interação com Bases de Dados </p>
<p align="justify"> A linguagem de [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] SQL nem sempre foi como a conhecemos atualmente. Tem sofrido constantes mudanças de forma a tornar-se mais responsiva. A figura seguinte pode ilustrar algumas das evoluções de SQL. </p>
 
[[Ficheiro:Historia.png|850px|thumb|center|Resumo da História do SQL]]


==Operações que podem ser realizadas==
==Funcionalidades==
<p align="justify">A linguagem SQL permite utilizar diferentes operações que são entendidas como standard reduzindo as incompatibilidades entre os sistemas e evitando que sejam utilizadas arquiteturas proprietárias que implicam maiores custos de desenvolvimento e maior esforço financeiro e humano por parte dos intervenientes.</p>
<p align="justify">A linguagem SQL permite utilizar diferentes operações que são entendidas como <i>standard</i> reduzindo as incompatibilidades entre os sistemas e evitando que sejam utilizadas arquiteturas proprietárias que implicam maiores custos de desenvolvimento e maior esforço financeiro e humano por parte dos intervenientes. <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref> <ref name="Darwen"> Darwen, C.J. Date e Hugh. A Guide to The SQL Standard. s.l. : Addison Wesley Professional, 1996. ISBN 0-201-96426-0.</ref></p>
<p align="justify">Segundo Luís Dama <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>, através de SQL é possível:</p>
<p align="justify">Segundo Luís Dama <ref name="DamasLuís"> Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2</ref>, através de SQL é possível:</p>
<p align="justify">''" - Criar, alterar e remover todas as componentes de uma Base de Dados, como tabelas, view, índices, etc;” ''</p>
*<p align="justify">''"Criar, alterar e remover todas as componentes de uma [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados],como tabelas, view, índices, etc;” ''</p>
<p align="justify">''" - Inserir, Alterar, Apagar dados;” ''</p>
*<p align="justify">''"Inserir, alterar, apagar dados;” ''</p>
<p align="justify">''" - Interrogar a Base de Dados;” ''</p>
*<p align="justify">''"Interrogar a [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados];” ''</p>
<p align="justify">''" - Controlar o acesso dos utilizadores à Base de Dados e as operações a que cada um deles pode ter acesso;” ''</p>
*<p align="justify">''"Controlar o acesso dos utilizadores à [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] e as operações a que cada um deles pode ter acesso;” ''</p>
<p align="justify">''" - Obter a garantia da consistência e integridade dos dados.” ''</p>
*<p align="justify">''"Obter a garantia da consistência e integridade dos dados.” ''</p>


<p align="justify">Assim pode-se subdividir a linguagem SQL em três sublinguagens:</p>
<p align="justify">Assim pode-se subdividir a linguagem SQL em três sublinguagens:</p>
* '''DML''': Data Manipulation Language (SELECT, INSERT, UPDATE, DELETE, etc)
* '''DML''': ''Data Manipulation Language'' (SELECT, INSERT, UPDATE, DELETE, etc)
* '''DDL''':  Data Definition Language (CREATE, ALTER, DROP, etc)
* '''DDL''':  ''Data Definition Language'' (CREATE, ALTER, DROP, etc)
* '''DCL''': Data Controle Language (GRANT, REVOKE, etc)
* '''DCL''': ''Data Controle Language'' (GRANT, REVOKE, etc)
 
 


'''CREATE TABLE'''
==Queries e Operadores==
<p align="justify">De seguida, é possível analisar diversos comandos SQL (CREATE, SELECT, ORDER BY,...) que podem ser realizados para guardar e consultar informação numa base de dados relacional além de alguns exemplos que facilitam o seu entendimento.</p>
<p><b> <font size='5'>&#8658;</font> CREATE TABLE</b></p>
<p align="justify">O comando CREATE TABLE é utilizado para a criação de tabelas sendo a sintaxe básica do comando a seguinte:</p>
<p align="justify">O comando CREATE TABLE é utilizado para a criação de tabelas sendo a sintaxe básica do comando a seguinte:</p>
''<pre>CREATE TABLE nome_tabela {
''<pre>CREATE TABLE nome_tabela {
Linha 154: Linha 159:
<p align="justify">Aliado ao uso do comando CREATE TABLE, encontra-se também o INSERT INTO que serve para inserir valores numa certa tabela tal como é possível observar no exemplo seguinte.</p>
<p align="justify">Aliado ao uso do comando CREATE TABLE, encontra-se também o INSERT INTO que serve para inserir valores numa certa tabela tal como é possível observar no exemplo seguinte.</p>


''<p align="justify">Ex: CREATE TABLE Médicos (Código INTEGER PRIMARY KEY, Nome TEXT, Idade INTEGER, Especialidade TEXT, Cidade TEXT);</p>''
''<p align="justify">Ex: CREATE TABLE Médico (Código INTEGER PRIMARY KEY, Nome TEXT, Idade INTEGER, Especialidade TEXT, Cidade TEXT);</p>''
''<p align="justify">INSERT INTO Médicos VALUES (14429875, "Ricardo Reis", 51, "Cardiologia", "Porto" );</p>''
''<p align="justify">INSERT INTO Médico VALUES (14429875, "Ricardo Reis", 51, "Cardiologia", "Porto" );</p>''
 
<p><b> <font size='5'>&#8658;</font>SELECT e FROM</b> </p>
<p align="justify">O comando SELECT permite selecionar as colunas que se situam após a cláusula, da tabela ou tabelas que se seguem à cláusula FROM.</p>
''<pre>SELECT Nome
FROM Médico
</pre> ''
<p align="justify">Com a execução desta query, o resultado esperado será uma listagem de todos os Nomes existentes na tabela Médico.</p>


{| class="wikitable" style="width:25%; text-align: left;"
! Nome
|+Tabela 4 - Resultado da query anterior
|-
| Alberto Caeiro
|-
| Bernardo Soares
|-
| Ricardo Reis
|-
| Álvaro de Campos
|}


<p align="justify">'''NOTA:''' No caso de se pretender selecionar todas as colunas da tabela opta-se pela utilização do * que irá substituir a seleção manual de cada uma das colunas.</p>


'''SELECT e FROM'''
<p align="justify">No que diz respeito à ordenação das colunas selecionadas, deve-se numerar pela ordem que se pretende:</p>
<p align="justify">O comando SELECT permite selecionar as colunas que se situam após a cláusula, da tabela ou tabelas que se seguem à cláusula FROM.</p>
''<pre>SELECT Idade, Nome, Código
FROM Médico
</pre> ''
{| class="wikitable" style="width:30%; text-align: left;"
! Idade
! Nome
! Código
|+Tabela 5 - Resultado da query anterior
|-
| 36
| Alberto Caeiro
| 12687871
|-
| 36
| Bernardo Soares
| 14372844
|-
| 51
| Ricardo Reis
| 14429875
|-
| 48
| Álvaro de Campos
| 16918243
|}
 
<p><b> <font size='5'>&#8658;</font>WHERE</b> </p>
<p align="justify">O comando WHERE permite restringir o número de linhas selecionadas, utilizando sempre em consonância as cláusulas SELECT e FROM.</p>
''<pre>SELECT Nome
FROM Médico
WHERE Cidade = Porto
</pre> ''
 
{| class="wikitable" style="width:25%; text-align: left;"
! Nome
|+Tabela 6 - Resultado da query anterior
|-
| Ricardo Reis
|}
 
<p align="justify">Na cláusula WHERE utilizam-se operadores relacionais que permitem estabelecer relações entre os elementos, sendo o seu resultado um valor lógico <i>TRUE</i> ou <i>FALSE</i>.</p>
 
{| class="wikitable" style="width:100%;
! Operador
! Descrição
! Exemplo
! Resultado
|+Tabela 7 - Operadores Relacionais
|-
| =
| Igual a
| 4=2
| FALSE
|-
| <
| Menor que
| 4<2
| FALSE
|-
| >
| Maior que
| 4>2
| TRUE
|-
| <=
| Menor ou igual que
| 4<=2
| FALSE
|-
| >
| Maior ou igual que
| 4>=2
| TRUE
|-
| <>
| Diferente
| 4!=2
| TRUE
|-
|}
 
<p align="justify">Na cláusula WHERE utilizam-se também operadores lógicos.</p>
 
{| class="wikitable" style="width:25%; text-align: left;"
! Operador
! Exemplo
|+Tabela 8 - Operadores Lógicos
|-
| AND
| Cond4 AND Cond2
|-
| OR
| Cond4 OR Cond2
|-
| NOT
| NOT Condição
|}
 
<p><b> <font size='5'>&#8658;</font> ORDER BY </b> </p>
<p align="justify">Para ordenar os resultados selecionados previamente na cláusula SELECT pode-se utilizar a cláusula ORDER BY. Por defeito os resultados apresentados são organizados de forma ascendente. Caso pretendido pode-se optar por organizar de forma descendente utilizando a cláusula DESC.</p>
<p align="justify">'''NOTA:''' ASC - ordenação ascendente; DESC - ordenação descendente</p>
 
''<pre>SELECT *
FROM Médico
ORDER BY Idade DESC
</pre> ''
{| class="wikitable" style="width:40%; text-align: left;"
! Código
! Nome
! Idade
! Especialidade
! Cidade
|+Tabela 9 - Resultado da query anterior
|-
| 14429875
| Ricardo Reis
| 51
| Cardiologia
| Porto
|-
| 16918243
| Álvaro de Campos
| 48
| Pediatria
| Lisboa
|-
| 12687871
| Alberto Caeiro
| 36
| Ortopedia
| Braga
|-
| 14372844
| Bernardo Soares
| 36
| Oncologia
| Lisboa
|}
 
<p align="justify">No caso de ser necessário organizar os valores da diversas colunas deve-se optar por: ordenar pela primeira coluna, e entre os valores iguais é ordenada pela segunda coluna.</p>
 
''<pre>SELECT *
FROM Médico
ORDER BY Idade, Código
</pre> ''
{| class="wikitable" style="width:40%; text-align: left;"
! Idade
! Código
! Nome
! Especialidade
! Cidade
|+Tabela 10 - Resultado da query anterior
|-
| 36
| 12687871
| Alberto Caeiro
| Ortopedia
| Braga
|-
| 36
| 14372844
| Bernardo Soares
| Oncologia
| Lisboa
|-
| 48
| 16918243
| Álvaro de Campos
| Pediatria
| Lisboa
|-
| 51
| 14429875
| Ricardo Reis
| Cardiologia
| Porto
|}
 
<p><b> <font size='5'>&#8658;</font> DISTINCT E ALL </b> </p>
<p> (Cláusula de Eliminação de Repetições)</p>
<p align="justify">A cláusula DISTINCT utiliza-se para eliminar um conjunto de linhas/dados repetidos onde apenas se quer visualizar uma ocorrência. Esta cláusula deve ser utilizada imediatamente a seguir à cláusula SELECT.</p>
''<pre>SELECT DISTINCT Cidade
FROM Médico
</pre> ''
 
{| class="wikitable" style="width:20%; text-align: left;"
! Cidade
|+Tabela 11 - Resultado da query anterior
|-
|Braga
|-
| Lisboa
|-
| Porto
|}
 
<p align="justify">A cláusula ALL está relacionada com o comando SELECT e entra-se por defeito associada.</p>
''<pre>SELECT ALL Nome
FROM Médico
</pre> ''
<p align="justify">Igual resultado</p>
''<pre>SELECT Nome
''<pre>SELECT Nome
FROM Médico
FROM Médico
</pre> ''
</pre> ''
Com a execução desta query, o resultado esperado será uma listagem de todos os Nomes existentes na tabela Médico.


{| class="wikitable" style="width:25%; text-align: left;"
! Nome
|+Tabela 12 - Resultado da query anterior
|-
| Alberto Caeiro
|-
| Bernardo Soares
|-
| Ricardo Reis
|-
| Álvaro de Campos
|}
<p><b> <font size='5'>&#8658;</font> JOIN</b> </p>
<p> (Claúsula de Junção) </p>
<p align="justify">A cláusula JOIN permite obter informação de diferentes tabelas, apenas com a cláusula SELECT. Através da ligação entre as chaves estrangeiras e as chaves primárias respetivas será mais fácil manipular diferentes tabelas. Assim é possível fazer uma junção de tabelas sem a utilização da Cláusula JOIN. Esta pode ser utilizada de diferentes formas para obter diferentes resultados em termos de junções.
O comando seguinte demonstra a utilização da Cláusula Equi-Join. </p>
''<pre>SELECT *
FROM Médico m, Clínica c
WHERE m.código = c.codMedico
</pre> ''
<p align="justify">O resultado deste comando seriam todas as linhas das tabelas Médico e Clínica onde a condição assim se verificasse. Contudo, também é possível executar esta operação (com o mesmo resultado) com recurso à cláusula JOIN tal como se pode observar de seguida:
</p>
''<pre>SELECT *
FROM Médico m
JOIN Clínica c
ON m.código = c.codMedico
</pre> ''
'''Diferentes tipos de JOIN'''
<ul>
<li><p align="justify"> <b>INNER JOIN</b> – Retorna os valores iguais das duas tabelas; </p></li>
<li><p align="justify"> <b>LEFT JOIN </b> – Retorna todos os valores da tabela “1” e apenas retorna os valores iguais da tabela “2”; </p></li>
<li><p align="justify"> <b>RIGHT JOIN </b> – Retorna todos os valores da tabela “2” e apenas retorna os valores iguais da tabela “1”; </p></li>
<li><p align="justify"> <b>FULL JOIN </b> – Retorna todos os valores onde existem valores iguais na tabela “1” e tabela “2”;</p></li>
</ul>
[[Ficheiro:Join.png|500px|thumb|center|Diferentes tipos de JOIN <ref name="SQLJoins">SQL Joins. (s.d.). Obtido de w3schools.com: https://www.w3schools.com/sql/sql_join.asp</ref>]]
<p><b> <font size='5'>&#8658;</font> GROUP BY</b> </p>
<p align="justify">A cláusula GROUP BY utiliza-se para agrupar informação, dividindo o resultado de um SELECT num grupo de resultados que serão processados pelas funções de agregação.</p>
'''Funções de Agregação'''
<p align="justify">A utilização destas funções permite obter informação sobre conjuntos de linhas específicos na cláusula WHERE ou em grupos de linhas indicados na cláusula GROUP BY.</p>
{| class="wikitable" style="width:100%;
! Operador
! Descrição
|+Tabela 14 - Funções de Agregação
|-
| COUNT
| Devolve o número de linhas.
|-
| MAX
| Devolve o maior valor da coluna.
|-
| MIN
| Devolve o menor valor da coluna.
|-
| SUM
| Devolve a soma de todos os valores da coluna.
|-
| AVG
| Devolve a média de todos os valores da coluna.
|}
<p><b> <font size='5'>&#8658;</font> HAVING </b> </p>
<p align="justify">A cláusula HAVING utiliza-se para restringir ao nível dos grupos que são processados, atuando sobre o resultado dos grupos.</p>
<p><b> <font size='5'>&#8658;</font> WHERE vs HAVING</b> </p>
<p align="justify">A quando da utiliza-se das clausulas HAVING e WHERE podem surgir dúvidas no momento de escolher uma para restringir o conjunto de registos a apresentar. </p>
<p align="justify">Assim a cláusula WHERE deve-se utilizar quando se pretende restringir os registos a considerar na seleção. A cláusula HAVING serve para restringir os grupos formados após a realização do comando WHERE.
</p>
==Exemplo de operações SQL==
<p align="justify">Tendo em conta a [http://aprendis.gim.med.up.pt/index.php/Bases_de_Dados base de dados] com as tabelas Médico, Paciente e Clínica expostas anteriormente, observe-se de seguida alguns exemplos de condições/querys que podem ser realizadas para aceder a dados nestas 3 tabelas.
<ul>
<b><li> Mostrar o nome do médico com o Código 12687871</li></b></ul>
''<pre>SELECT nome
FROM Médico
WHERE código = 12687871
</pre> ''
<ul>
<b><li> Mostrar os pacientes com menos de 65 anos</li></b></ul>
''<pre>SELECT p.*
FROM Pacientes
WHERE idade < 65
</pre> ''
<ul>
<b><li> Mostrar as datas e a horas das consultas dadas pelo médico Alberto Caeiro</li></b></ul>
''<pre>SELECT c.data, c.hora
FROM Médico m, Consulta c
WHERE m.nome=”Alberto Caeiro” AND c.codMedico = m.código
</pre> ''
<ul>
<b><li> Qual a doença diagnosticada pelo médico com especialidade Cardiologista que diagnosticou o doente Pedro Santos</li></b></ul>
''<pre>SELECT c.doença
FROM Médico m, Paciente p, Consulta c
WHERE m.especialidade = “Cardiologia” AND p.nome = “Pedro Santos” AND c.codMedico = m.código AND c.numPaciente = p.numUtente
</pre> ''
==Este conteúdo em vídeo==
Não deixe de ver o nosso vídeo explicativo sobre bases de dados, a história do SQL, as suas funcionalidades e ver exemplos práticos de comandos que podem ser realizados para aceder a dados na base de dados. [https://uporto.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=43401f95-09fc-41a2-bc26-5bdf4a592050 Clique aqui]


== Referências ==
== Referências ==


<references/>
<references/>

Edição atual desde as 14h11min de 31 de maio de 2017

Structured Query Language
Sigla SQL
Aplicações Armazenar, consultar, [[Aplicações do Conceito::alterar informação de uma base de dados]]
Conceitos relacionados Bases de Dados, Manipulação de Dados

Structured Query Language, usualmente conhecido por SQL, é uma linguagem para criar e manipular bases de dados relacionais. [1] De um modo simples, uma empresa precisa de guardar e consultar informação. Por exemplo, um banco precisa de guardar informação relativamente aos utilizadores, ao valor existente nas contas, às transações efetuadas, etc. Para efetuar essas ações são utilizadas bases de dados que fornecem funcionalidades para adicionar, modificar e consultar de forma a obter resultados através de 'Querys' (pedidos à base de dados) em SQL. [2]

Na área da Saúde a utilização de Tecnologias da Informação (IT) é crucial, uma vez que, os dados da Instituição se encontram armazenados em base de dados que se encontram alojadas em servidores. Assim, quando é necessário realizar um estudo de indicadores ou procurar informação do doente, será facilmente acedida através da utilização de comandos SQL, sem que o utilizador se aperceba do procedimento. Com a crescente quantidade de informação em suporte digital, a complexidade da mesma e a globalização dos cuidados de saúde, é necessário o desenvolvimento de novos métodos, com o intuito de disponibilizar a informação correta, adequada e num timing curto.

Introdução

A sigla SQL denomina Structured Query Language ou, em português, Linguagem de Consulta Estruturada é uma linguagem para interação com Bases de Dados Relacionais. Não constitui uma linguagem completa para o desenvolvimento de aplicações sendo a sua principal função a de suportar a definição, manipulação e controlo dos dados numa base de dados [1]. É uma linguagem de alto nível pois, apenas se tem que dizer ao sistema o que fazer e não como, nem onde o tem de realizar.

Base de Dados

De uma forma muito simplista, pode-se afirmar que uma base de dados consiste numa coleção de dados estruturados, organizados e armazenados de forma persistente sendo que é necessário que os dados tenham algum tipo de significado e organização [3].

O Sistema Gestor de Bases de Dados (SGBD) é uma aplicação informática que fornece a interface entre os dados que são armazenados fisicamente na base de dados e o utilizador. É o SGBD que vai fornecer o conjunto completo de serviços para acesso à informação da base de dados utilizando, para isso, uma linguagem que permita a realização dessas operações: o SQL [4].

Nem todos os sistemas que gerem as bases de dados usam a linguagem SQL. No entanto, o SQL é usado na grande maioria dos sistemas atualmente disponíveis e naqueles que adotam o modelo relacional [3]. Este modelo, de uma forma resumida, baseia-se no princípio em que todos os dados estão guardados em tabelas tendo em conta as relações entre os atributos. Toda a sua definição é teórica e baseada na lógica de predicados e na teoria dos conjuntos cobrindo os três aspetos que qualquer SGBDdeveria cobrir relativamente aos dados: estrutura, integridade e manipulação [1] [3] [4].

Composição de uma Base de DadosRelacional [5]

Para descrever os dados e as suas estruturas numa base de dados relacional usam-se os seguintes termos/conceitos (Fig. 1) [1] [5]:

  • Tabela (ou Relação): Conjunto de linhas do mesmo tipo, onde não existem linhas repetidas nem significado na ordem das linhas da tabela.
  • Coluna (ou Atributo): Identificada por um nome e com um único valor por linha sendo que é constituída por um conjunto de dados do mesmo tipo.
  • Linha (ou Tuplo): Conjunto de valores válidos, tal que cada linha tem um valor para cada coluna, e onde todas as linhas de uma tabela têm as mesmas colunas.
  • Campo: Correspondem a uma informação de uma tabela. Os campos devem ser designados como um determinado tipo de dados, seja texto, data ou hora, número,…
  • Chave Primária (PK): É a identificação de uma ou várias colunas de uma tabela. O valor da chave primária identifica unicamente uma linha de uma tabela.
  • Chave Estrangeira (FK): É uma ou mais colunas na tabela tal que os seus valores são valores da chave primária de outra.

Após o entendimento dos conceitos principais de uma base de dados, é agora possível a compreensão das operações que podem ser realizadas com recurso a SQL.

De seguida, é possível observar três tabelas que representam uma entidade/pessoa e servem para armazenar informação. A tabela Médico guarda informação como: o código (chave primária), o nome, a idade, a especialidade e a sua cidade. A tabela Paciente tem o número de utente, o nome, a idade, a cidade e a doença pela qual se deslocou ao hospital. Já na tabela Consulta pode-se visualizar a relação existente entre estas duas entidades: o Médico e o Paciente tendo, como chaves estrangeiras o código do médico e o número do paciente. Além disso, contêm ainda a data e hora da consulta, a sala onde se realizou e a doença diagnosticada ao paciente.

Código Nome Idade Especialidade Cidade
Tabela 1 - Tabela Médico
12687871 Alberto Caeiro 36 Ortopedia Braga
14372844 Bernardo Soares 36 Oncologia Lisboa
14429875 Ricardo Reis 51 Cardiologia Porto
16918243 Álvaro de Campos 48 Pediatria Lisboa
Nº de Utente Nome Idade Cidade
Tabela 2 - Tabela Paciente
15567721 Joana Aguiar 12 Maia
13221376 Pedro Santos 79 Braga
12851320 Inês Silva 53 Setúbal
CodMedico NumPaciente Data Hora Doença Sala
Tabela 3 - Tabela Consulta
14429875 13221376 21/03/2017 16:30 Trombose B1.154
12687871 12851320 30/01/2017 09:45 Joanete A3.058
16918243 15567721 22/02/2017 18:15 Gripe L5.133

História do SQL

A linguagem de base de dados SQL nem sempre foi como a conhecemos atualmente. Tem sofrido constantes mudanças de forma a tornar-se mais responsiva. A figura seguinte pode ilustrar algumas das evoluções de SQL.

Resumo da História do SQL

Funcionalidades

A linguagem SQL permite utilizar diferentes operações que são entendidas como standard reduzindo as incompatibilidades entre os sistemas e evitando que sejam utilizadas arquiteturas proprietárias que implicam maiores custos de desenvolvimento e maior esforço financeiro e humano por parte dos intervenientes. [3] [2]

Segundo Luís Dama [3], através de SQL é possível:

  • "Criar, alterar e remover todas as componentes de uma base de dados,como tabelas, view, índices, etc;”

  • "Inserir, alterar, apagar dados;”

  • "Interrogar a base de dados;”

  • "Controlar o acesso dos utilizadores à base de dados e as operações a que cada um deles pode ter acesso;”

  • "Obter a garantia da consistência e integridade dos dados.”

Assim pode-se subdividir a linguagem SQL em três sublinguagens:

  • DML: Data Manipulation Language (SELECT, INSERT, UPDATE, DELETE, etc)
  • DDL: Data Definition Language (CREATE, ALTER, DROP, etc)
  • DCL: Data Controle Language (GRANT, REVOKE, etc)

Queries e Operadores

De seguida, é possível analisar diversos comandos SQL (CREATE, SELECT, ORDER BY,...) que podem ser realizados para guardar e consultar informação numa base de dados relacional além de alguns exemplos que facilitam o seu entendimento.

CREATE TABLE

O comando CREATE TABLE é utilizado para a criação de tabelas sendo a sintaxe básica do comando a seguinte:

CREATE TABLE nome_tabela {
coluna_1	tipo_col1 [NOT NULL],
coluna_2	tipo_col2 [NOT NULL]
}

Onde:

  • CREATE TABLE indica o comando para criação da tabela;
  • nome_tabela é o nome dado à tabela que está a ser criada;
  • coluna1, coluna2 é o nome das colunas de nome_tabela;
  • tipo_col1, tipo_col2 é o tipo de dados das colunas coluna1 e coluna2;
  • NOT NULL é opcional sendo que indica que o valor NULL não é permitido na coluna em questão.

Aliado ao uso do comando CREATE TABLE, encontra-se também o INSERT INTO que serve para inserir valores numa certa tabela tal como é possível observar no exemplo seguinte.

Ex: CREATE TABLE Médico (Código INTEGER PRIMARY KEY, Nome TEXT, Idade INTEGER, Especialidade TEXT, Cidade TEXT);

INSERT INTO Médico VALUES (14429875, "Ricardo Reis", 51, "Cardiologia", "Porto" );

SELECT e FROM

O comando SELECT permite selecionar as colunas que se situam após a cláusula, da tabela ou tabelas que se seguem à cláusula FROM.

SELECT Nome
FROM Médico

Com a execução desta query, o resultado esperado será uma listagem de todos os Nomes existentes na tabela Médico.

Nome
Tabela 4 - Resultado da query anterior
Alberto Caeiro
Bernardo Soares
Ricardo Reis
Álvaro de Campos

NOTA: No caso de se pretender selecionar todas as colunas da tabela opta-se pela utilização do * que irá substituir a seleção manual de cada uma das colunas.

No que diz respeito à ordenação das colunas selecionadas, deve-se numerar pela ordem que se pretende:

SELECT Idade, Nome, Código
FROM Médico

Idade Nome Código
Tabela 5 - Resultado da query anterior
36 Alberto Caeiro 12687871
36 Bernardo Soares 14372844
51 Ricardo Reis 14429875
48 Álvaro de Campos 16918243

WHERE

O comando WHERE permite restringir o número de linhas selecionadas, utilizando sempre em consonância as cláusulas SELECT e FROM.

SELECT Nome
FROM Médico
WHERE Cidade = Porto

Nome
Tabela 6 - Resultado da query anterior
Ricardo Reis

Na cláusula WHERE utilizam-se operadores relacionais que permitem estabelecer relações entre os elementos, sendo o seu resultado um valor lógico TRUE ou FALSE.

Operador Descrição Exemplo Resultado
Tabela 7 - Operadores Relacionais
= Igual a 4=2 FALSE
< Menor que 4<2 FALSE
> Maior que 4>2 TRUE
<= Menor ou igual que 4<=2 FALSE
> Maior ou igual que 4>=2 TRUE
<> Diferente 4!=2 TRUE

Na cláusula WHERE utilizam-se também operadores lógicos.

Operador Exemplo
Tabela 8 - Operadores Lógicos
AND Cond4 AND Cond2
OR Cond4 OR Cond2
NOT NOT Condição

ORDER BY

Para ordenar os resultados selecionados previamente na cláusula SELECT pode-se utilizar a cláusula ORDER BY. Por defeito os resultados apresentados são organizados de forma ascendente. Caso pretendido pode-se optar por organizar de forma descendente utilizando a cláusula DESC.

NOTA: ASC - ordenação ascendente; DESC - ordenação descendente

SELECT *
FROM Médico
ORDER BY Idade DESC

Código Nome Idade Especialidade Cidade
Tabela 9 - Resultado da query anterior
14429875 Ricardo Reis 51 Cardiologia Porto
16918243 Álvaro de Campos 48 Pediatria Lisboa
12687871 Alberto Caeiro 36 Ortopedia Braga
14372844 Bernardo Soares 36 Oncologia Lisboa

No caso de ser necessário organizar os valores da diversas colunas deve-se optar por: ordenar pela primeira coluna, e entre os valores iguais é ordenada pela segunda coluna.

SELECT *
FROM Médico
ORDER BY Idade, Código

Idade Código Nome Especialidade Cidade
Tabela 10 - Resultado da query anterior
36 12687871 Alberto Caeiro Ortopedia Braga
36 14372844 Bernardo Soares Oncologia Lisboa
48 16918243 Álvaro de Campos Pediatria Lisboa
51 14429875 Ricardo Reis Cardiologia Porto

DISTINCT E ALL

(Cláusula de Eliminação de Repetições)

A cláusula DISTINCT utiliza-se para eliminar um conjunto de linhas/dados repetidos onde apenas se quer visualizar uma ocorrência. Esta cláusula deve ser utilizada imediatamente a seguir à cláusula SELECT.

SELECT DISTINCT Cidade
FROM Médico

Cidade
Tabela 11 - Resultado da query anterior
Braga
Lisboa
Porto

A cláusula ALL está relacionada com o comando SELECT e entra-se por defeito associada.

SELECT ALL Nome
FROM Médico

Igual resultado

SELECT Nome
FROM Médico

Nome
Tabela 12 - Resultado da query anterior
Alberto Caeiro
Bernardo Soares
Ricardo Reis
Álvaro de Campos

JOIN

(Claúsula de Junção)

A cláusula JOIN permite obter informação de diferentes tabelas, apenas com a cláusula SELECT. Através da ligação entre as chaves estrangeiras e as chaves primárias respetivas será mais fácil manipular diferentes tabelas. Assim é possível fazer uma junção de tabelas sem a utilização da Cláusula JOIN. Esta pode ser utilizada de diferentes formas para obter diferentes resultados em termos de junções. O comando seguinte demonstra a utilização da Cláusula Equi-Join.

SELECT *
FROM Médico m, Clínica c
WHERE m.código = c.codMedico

O resultado deste comando seriam todas as linhas das tabelas Médico e Clínica onde a condição assim se verificasse. Contudo, também é possível executar esta operação (com o mesmo resultado) com recurso à cláusula JOIN tal como se pode observar de seguida:

SELECT *
FROM Médico m
JOIN Clínica c
ON m.código = c.codMedico

Diferentes tipos de JOIN

  • INNER JOIN – Retorna os valores iguais das duas tabelas;

  • LEFT JOIN – Retorna todos os valores da tabela “1” e apenas retorna os valores iguais da tabela “2”;

  • RIGHT JOIN – Retorna todos os valores da tabela “2” e apenas retorna os valores iguais da tabela “1”;

  • FULL JOIN – Retorna todos os valores onde existem valores iguais na tabela “1” e tabela “2”;

Diferentes tipos de JOIN [6]

GROUP BY

A cláusula GROUP BY utiliza-se para agrupar informação, dividindo o resultado de um SELECT num grupo de resultados que serão processados pelas funções de agregação.

Funções de Agregação

A utilização destas funções permite obter informação sobre conjuntos de linhas específicos na cláusula WHERE ou em grupos de linhas indicados na cláusula GROUP BY.

Operador Descrição
Tabela 14 - Funções de Agregação
COUNT Devolve o número de linhas.
MAX Devolve o maior valor da coluna.
MIN Devolve o menor valor da coluna.
SUM Devolve a soma de todos os valores da coluna.
AVG Devolve a média de todos os valores da coluna.

HAVING

A cláusula HAVING utiliza-se para restringir ao nível dos grupos que são processados, atuando sobre o resultado dos grupos.

WHERE vs HAVING

A quando da utiliza-se das clausulas HAVING e WHERE podem surgir dúvidas no momento de escolher uma para restringir o conjunto de registos a apresentar.

Assim a cláusula WHERE deve-se utilizar quando se pretende restringir os registos a considerar na seleção. A cláusula HAVING serve para restringir os grupos formados após a realização do comando WHERE.

Exemplo de operações SQL

Tendo em conta a base de dados com as tabelas Médico, Paciente e Clínica expostas anteriormente, observe-se de seguida alguns exemplos de condições/querys que podem ser realizadas para aceder a dados nestas 3 tabelas.

  • Mostrar o nome do médico com o Código 12687871
SELECT nome
FROM Médico
WHERE código = 12687871

  • Mostrar os pacientes com menos de 65 anos
SELECT p.*
FROM Pacientes
WHERE idade < 65

  • Mostrar as datas e a horas das consultas dadas pelo médico Alberto Caeiro
SELECT c.data, c.hora
FROM Médico m, Consulta c
WHERE m.nome=”Alberto Caeiro” AND c.codMedico = m.código

  • Qual a doença diagnosticada pelo médico com especialidade Cardiologista que diagnosticou o doente Pedro Santos
SELECT c.doença
FROM Médico m, Paciente p, Consulta c
WHERE m.especialidade = “Cardiologia” AND p.nome = “Pedro Santos” AND c.codMedico = m.código AND c.numPaciente = p.numUtente

Este conteúdo em vídeo

Não deixe de ver o nosso vídeo explicativo sobre bases de dados, a história do SQL, as suas funcionalidades e ver exemplos práticos de comandos que podem ser realizados para aceder a dados na base de dados. Clique aqui

Referências

  1. 1,0 1,1 1,2 1,3 Silva, Libório. SQL Avançado. Lisboa : Editorial Presença, 1998. ISBN 972-23-1306-1
  2. 2,0 2,1 Darwen, C.J. Date e Hugh. A Guide to The SQL Standard. s.l. : Addison Wesley Professional, 1996. ISBN 0-201-96426-0.
  3. 3,0 3,1 3,2 3,3 3,4 Damas, Luís. SQL. Lousã : FCA - Editora de Informática, 2005. ISBN 978-972-722-443-2
  4. 4,0 4,1 Date, C. J. SQL e Teoria Relaciona. Brasil : O'REILLY novatec, 2015. ISBN 978-85-7522-433-5.
  5. 5,0 5,1 Michael J. Donahoo, Gregory David Speegle. SQL: Practical Guide for Developers. San Francisco : Morgan Kaufmann Publishers, 2005. ISBN 0-12-220531-6
  6. SQL Joins. (s.d.). Obtido de w3schools.com: https://www.w3schools.com/sql/sql_join.asp