Linguagem de Consulta Estruturada é uma linguagem padrão de base de dados que é utilizada para criar, manter e recuperar a base de dados relacional. Seguem-se alguns factos interessantes sobre SQL.
- SQL é insensível a maiúsculas e minúsculas. Mas é uma prática recomendada utilizar palavras-chave (como SELECT, UPDATE, CREATE, etc) em maiúsculas e utilizar coisas definidas pelo utilizador (como nome de tabela, nome de coluna, etc) em letras pequenas.
- Podemos escrever comentários em SQL usando “-“. (hífen duplo) no início de qualquer linha.
- SQL é a linguagem de programação para bases de dados relacionais (explicada abaixo) como MySQL, Oracle, Sybase, SQL Server, Postgre, etc. Outras bases de dados não relacionais (também chamadas NoSQL) como MongoDB, DynamoDB, etc. não utilizam SQL
- Embora exista uma norma ISO para SQL, a maioria das implementações varia ligeiramente em termos de sintaxe. Assim, podemos encontrar consultas que funcionam no SQL Server mas não funcionam no MySQL.
O que é Base de Dados Relacional?
Base de Dados Relacional significa que os dados são armazenados assim como recuperados sob a forma de relações (tabelas). A tabela 1 mostra a base de dados relacional com apenas uma relação chamada STUDENT que armazena ROLL_NO, NAME, ADDRESS, PHONE e IDADE dos estudantes.
STUDANTE
ROLLL_NO | NAME | ADDRESS | PHONE | AGE |
1 | RAM | DELHI | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9652431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 | 4 | SURESH | DELHI | 9156768971 | 18 |
TABELA 1
p> Estas são algumas terminologias importantes que são utilizadas em termos de relação.
Attributo: Atributos são as propriedades que definem uma relação. por exemplo; ROLL_NO, NAME etc.
Tuple: Cada linha na relação é conhecida como tuple. A relação acima contém 4 tuple, um dos quais é mostrado como:
1 | RAM | DELHI | 9455123451 | 18 |
Degree: O número de atributos na relação é conhecido como grau da relação. A relação ESTUDANTE definida acima tem grau 5.
Cardinalidade: O número de tuplos numa relação é conhecido como cardinalidade. A relação ESTUDANTE definida acima tem cardinalidade 4.
Coluna: Coluna representa o conjunto de valores para um determinado atributo. A coluna ROLL_NO é extraída da relação STUDENT.
ROLLL_NO
br>>>br>>br>>br>>br>>p>p>As consultas para lidar com a base de dados relacional podem ser categorias como:
Linguagem de Definição de Dados: É utilizada para definir a estrutura da base de dados. por exemplo: CREATE TABLE, ADD COLUMN, DROP COLUMN e assim por diante.
>p>Linguagem de Manipulação de Dados: É utilizada para manipular dados nas relações. e.g.; INSERIR, APAGAR, ACTUALIZAR e assim por diante.
Linguagem de Consulta de Dados: É utilizada para extrair os dados das relações. por exemplo; SELECT
P>P>Primeiro consideraremos a Linguagem de Consulta de Dados. Uma consulta genérica a recuperar de uma base de dados relacional é:
- SELECT Attribute_List FROM R1,R2….RM
- ]
- ];
Parte da consulta representada pela declaração 1 é obrigatória se se pretender recuperar de uma base de dados relacional. As declarações escritas no interior são opcionais. Analisaremos a possível combinação de consulta sobre a relação mostrada na Tabela 1.
Caso 1: Se quisermos recuperar os atributos ROLL_NO e NOME de todos os estudantes, a consulta será:
SELECT ROLL_NO, NAME FROM STUDENT;
ROLLL_NO | NAME |
1 | RAM |
2 | RAMESH |
3 | SUJIT |
4 | SURESH |
Casa 2: Se quisermos recuperar ROLL_NO e NOME dos alunos cujo ROLL_NO é superior a 2, a consulta será
SELECT ROLL_NO, NAME FROM STUDENT WHERE ROLL_NO>2;
ROLLL_NO | NAME |
3 | SUJIT |
4 | SURESH |
CASE 3: Se quisermos recuperar todos os atributos dos estudantes, podemos escrever * no lugar de escrever todos os atributos como:
SELECT * FROM STUDENT WHERE ROLL_NO>2;
ROLLL_NO | NAME | ADDRESS | PHONE | AGE |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | DELHI | 9156768971 | 18 |
CASE 4: Se quisermos representar a relação em ordem ascendente por IDADE, podemos usar a cláusula ORDER BY como:
SELECT * FROM STUDENT ORDER BY AGE;
ROLLL_NO | NAME | ADDRESS | PHONE | AGE |
1 | RAM | DELHI | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9652431543 | 18 |
4 | SURESH | DELHI | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
Nota: ORDEM POR IDADE é equivalente à ORDEM POR IDADE ASC. Se quisermos recuperar os resultados por ordem decrescente de IDADE, podemos usar ORDEM POR IDADE DESC.
CASE 5: Se pretendemos recuperar valores distintos de um atributo ou grupo de atributos, DISTINCT é utilizado como em:
SELECT DISTINCT ADDRESS FROM STUDENT;
ADDRESS
br>>p>DELHIbr>>p>GURGAONbr>>p>>ROHTAKbr>>p>Se o DISTINCT não for utilizado, o DELHI será repetido duas vezes no conjunto de resultados. Antes de compreender GROUP BY e HAVING, precisamos de compreender as funções de agregação em SQL.
FUNÇÕES DEAGRAVAÇÃO: As funções de agregação são utilizadas para realizar operações matemáticas sobre valores de dados de uma relação. Algumas das funções de agregação comuns utilizadas em SQL são:
- li> COUNT: A função de contagem é utilizada para contar o número de linhas numa relação. por exemplo;
SELECT COUNT (PHONE) FROM STUDENT;
p>COUNT(PHONE)br>>>br>>>ul>>>li> SUM: A função SUM é utilizada para adicionar os valores de um atributo numa relação. Por exemplo;
SELECT SUM (Age) FROM STUDENT;
br>>p>>SUM(AGE)br>>>br>>p> da mesma forma, MIN, MAX e AVG podem ser utilizados. Como vimos acima, todas as funções de agregação retornam apenas 1 fila.
AVERAGE: Fornece os valores médios dos tupples. Também é definido como soma dividida por valores de contagem.
Sintax:AVG(attributename)
OR
Syntax:SUM(attributename)/COUNT(attributename)
A sintaxe acima mencionada também recupera o valor médio dos tupples.
p>MAXIMUM:Extrai o valor máximo entre o conjunto de tupples.
Sintaxe:MAX(attributename)p>MINIMUM:Extrai o valor mínimo entre o conjunto de todos os tupples.
Sintaxe:MIN(attributename)p>GRUPO POR: Agrupar por é utilizado para agrupar os tupples de uma relação baseada num atributo ou grupo de atributo. É sempre combinado com a função de agregação que é calculada em grupo. por exemplo;
SELECT ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
Nesta consulta, SUM(AGE) será calculado mas não para toda a tabela mas para cada endereço. ou seja; soma de AGE para endereço DELHI(18+18=36) e de forma semelhante também para outros endereços. A saída é:
ADDRESS | SUM(AGE) |
DELHI | 36 |
GURGAON | 18 |
ROHTAK | 20 |
Se tentarmos executar a consulta indicada abaixo, resultará em erro porque embora tenhamos calculado SUM(AGE) para cada endereço, há mais de 1 ROLL_NO para cada endereço que agrupámos. Portanto, não pode ser exibido no conjunto de resultados. Precisamos de utilizar funções agregadas nas colunas após a declaração SELECT para dar sentido ao conjunto resultante sempre que utilizarmos GROUP BY.
SELECT ROLL_NO, ADDRESS, SUM(AGE) FROM STUDENTGROUP BY (ADDRESS);
NOTE: Um atributo que não faça parte da cláusula GROUP BY não pode ser utilizado para selecção. Qualquer atributo que faça parte da cláusula GROUP BY CLAUSE pode ser utilizado para selecção, mas não é obrigatório. Mas poderíamos utilizar atributos que não fazem parte da cláusula GROUP BY numa função agregada.
Quiz em SQL