# Projeto Banco de Dados - Escola de Idiomas ## Primeiro passo: Diagrama de Relações e Tabelas ![Diagrama de Entidade Relacionamento](https://hackmd.io/_uploads/B1uAmPjbgl.png) Realizei o diagrama no **draw.io** para melhor visualização de como as tabelas se relacionam. Neste processo, percebi a necessidade da criação de novas tabelas como `aluno_turma` e `items` para evitar relações do tipo "n para n". ### Tabelas Criadas: - **Alunos**: Armazena as informações dos alunos. - **Aluno_turma**: Relaciona os alunos com as turmas para permitir comunicação entre essas entidades. - **Turmas**: Armazena as informações das turmas e associa cada uma a um curso. - **Cursos**: Armazena as informações dos cursos ofertados. - **Livros**: Armazena informações dos livros disponíveis. - **Items**: Tabela intermediária que permite a venda de cursos e livros. - Se `fk_curso` for `NULL`, trata-se de venda de livro. - Se `fk_livro` for `NULL`, trata-se de venda de curso. - **Vendas**: Registra as vendas, ligando-as ao aluno que realizou a compra. --- ## Segundo passo: Convenção das Tabelas e Atributos Os nomes foram traduzidos para o inglês e padronizados conforme as boas práticas do MySQL. --- ## Terceiro passo: Script MySQL para criação das tabelas ```sql CREATE DATABASE language_school; CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, cpf VARCHAR(14) UNIQUE NOT NULL ); CREATE TABLE courses ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255) NOT NULL, workload INT NOT NULL, language VARCHAR(50), price DECIMAL(10,2) ); CREATE TABLE classes ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, schedule VARCHAR(50), course_id INT, FOREIGN KEY (course_id) REFERENCES courses(id) ); CREATE TABLE student_class ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT, class_id INT, FOREIGN KEY (student_id) REFERENCES students(id), FOREIGN KEY (class_id) REFERENCES classes(id) ); CREATE TABLE books ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, price DECIMAL(10,2), language VARCHAR(50), type VARCHAR(50) ); CREATE TABLE sales ( id INT AUTO_INCREMENT PRIMARY KEY, student_id INT, date DATE NOT NULL, FOREIGN KEY (student_id) REFERENCES students(id) ); CREATE TABLE items ( id INT AUTO_INCREMENT PRIMARY KEY, quantity INT NOT NULL, unit_price DECIMAL(10,2) NOT NULL, sale_id INT, course_id INT, book_id INT, FOREIGN KEY (sale_id) REFERENCES sales(id), FOREIGN KEY (course_id) REFERENCES courses(id), FOREIGN KEY (book_id) REFERENCES books(id) ); ``` ![IMG_8117](https://hackmd.io/_uploads/rkM_lhRbeg.jpg) ## Quarto Passo: Consultas SQL (Respostas para Vanessa) --- ### 1 Alunos que mais gastam na escola ```sql SELECT s.student_id, st.name, SUM(i.quantity * i.unit_price) AS total_spent FROM sales s JOIN students st ON s.student_id = st.id JOIN items i ON s.id = i.sale_id GROUP BY s.student_id, st.name ORDER BY total_spent DESC; ``` ### 2. Idiomas mais vendidos ```sql SELECT c.language, SUM(i.quantity) AS total_sold FROM items i JOIN courses c ON i.course_id = c.id GROUP BY c.language ORDER BY total_sold DESC; ``` ### 3. Quantidade de alunos por idioma ```sql SELECT c.language, COUNT(DISTINCT sc.student_id) AS total_students FROM student_class sc JOIN classes cl ON sc.class_id = cl.id JOIN courses c ON cl.course_id = c.id GROUP BY c.language ORDER BY total_students DESC; ``` ### 4 Faturamento por idioma ```sql SELECT c.language, SUM(i.quantity * i.unit_price) AS total_revenue FROM items i JOIN courses c ON i.course_id = c.id GROUP BY c.language ORDER BY total_revenue DESC; ```