Salta el contingut

BD Reserves

Descripció

Aquesta base de dades representa un sistema de reserves d'instal·lacions esportives. S'utilitza com a BD de referència per a les miniactivitats dels temes de Consultes SQL (RA4) que fan referència a la "BD de pràctiques".

La base de dades té 3 taules amb les relacions següents:

erDiagram
    instal_lacions {
        int id_instal_lacio PK
        varchar nom
        varchar tipus
        numeric preu_hora
        boolean actiu
    }
    usuaris {
        int id_usuari PK
        char dni
        varchar nom
        varchar cognoms
        varchar email
        date data_alta
    }
    reserves {
        int id_reserva PK
        int id_usuari FK
        int id_instal_lacio FK
        date data_reserva
        time hora_inici
        time hora_fi
        varchar estat
        numeric preu_total
    }

    usuaris ||--o{ reserves : "realitza"
    instal_lacions ||--o{ reserves : "acull"

Dades de la BD

instal_lacions (8 files)

id nom tipus preu_hora actiu
1 Pista de pàdel A Pàdel 15.00 cert
2 Pista de pàdel B Pàdel 15.00 cert
3 Pista de tennis Tennis 20.00 cert
4 Piscina coberta Natació 5.00 cert
5 Sala de fitness Fitness 8.00 cert
6 Sala polivalent Polivalent 30.00 cert
7 Camp de futbol Futbol 50.00 fals
8 Pista de bàsquet Bàsquet 25.00 cert

usuaris (7 files)

id dni nom cognoms email data_alta
1 12345678A Joan Garcia Puig joan.garcia@example.com 2024-01-10
2 87654321B Maria Lopez Serra maria.lopez@example.com 2024-02-05
3 11111111C Pere Bosch Vila pere.bosch@example.com 2024-03-20
4 22222222D Anna Mas Ribas anna.mas@example.com 2024-04-15
5 33333333E Carles Puig Torres carles.puig@example.com 2024-05-30
6 44444444F Laura Valls Ferrer laura.valls@example.com 2024-07-01
7 55555555G Miquel Soler Costa miquel.soler@example.com 2024-09-12

Usuari sense reserves

L'usuari 7 (Miquel Soler) no té cap reserva. Això permet practicar consultes amb NOT IN, NOT EXISTS i LEFT JOIN ... WHERE IS NULL.

reserves (22 files)

preu_total = preu_hora × durada en hores

id usuari instal data hora_inici hora_fi estat preu_total
1 1 1 2025-01-05 10:00 11:30 entregada 22.50
2 1 3 2025-01-12 09:00 10:00 entregada 20.00
3 2 4 2025-01-15 11:00 12:00 entregada 5.00
4 1 5 2025-01-20 08:00 09:00 entregada 8.00
5 4 6 2025-01-08 09:00 12:00 entregada 90.00
6 2 6 2025-01-22 14:00 17:00 entregada 90.00
7 3 1 2025-02-03 16:00 17:30 entregada 22.50
8 2 1 2025-02-10 10:00 11:30 entregada 22.50
9 1 2 2025-02-15 12:00 13:30 entregada 22.50
10 1 6 2025-02-12 09:00 12:00 entregada 90.00
11 3 6 2025-02-26 14:00 17:00 entregada 90.00
12 3 3 2025-03-02 10:00 11:00 confirmada 20.00
13 5 5 2025-03-08 07:00 08:00 confirmada 8.00
14 5 6 2025-03-05 09:00 12:00 confirmada 90.00
15 2 8 2025-03-12 15:00 16:00 confirmada 25.00
16 1 1 2025-03-18 10:00 11:30 pendent 22.50
17 4 4 2025-03-20 09:00 10:00 pendent 5.00
18 5 1 2025-03-22 11:00 12:30 cancel·lada 22.50
19 6 3 2025-03-25 16:00 17:00 pendent 20.00
20 3 5 2025-03-26 08:00 09:00 pendent 8.00
21 1 8 2025-03-27 19:00 20:00 pendent 25.00
22 2 6 2025-03-28 17:00 20:00 pendent 90.00

Reserves per usuari: Joan→7, Maria→5, Pere→4, Carles→3, Anna→2, Laura→1, Miquel→0

Recaptació per tipus: Polivalent→540€, Pàdel→112.50€, Bàsquet→50€, Tennis→60€, Fitness→24€, Natació→10€


Script de creació

-- ============================================================
-- BD Reserves - PostgreSQL
-- ============================================================

DROP TABLE IF EXISTS reserves CASCADE;
DROP TABLE IF EXISTS instal_lacions CASCADE;
DROP TABLE IF EXISTS usuaris CASCADE;

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE instal_lacions (
    id_instal_lacio  SERIAL          PRIMARY KEY,
    nom              VARCHAR(100)    NOT NULL,
    tipus            VARCHAR(50)     NOT NULL,
    preu_hora        NUMERIC(8,2)    NOT NULL CHECK (preu_hora > 0),
    actiu            BOOLEAN         NOT NULL DEFAULT TRUE
);

CREATE TABLE usuaris (
    id_usuari   SERIAL          PRIMARY KEY,
    dni         CHAR(9)         NOT NULL UNIQUE,
    nom         VARCHAR(100)    NOT NULL,
    cognoms     VARCHAR(200)    NOT NULL,
    email       VARCHAR(150)    NOT NULL UNIQUE,
    data_alta   DATE            NOT NULL DEFAULT CURRENT_DATE
);

CREATE TABLE reserves (
    id_reserva       SERIAL          PRIMARY KEY,
    id_usuari        INTEGER         NOT NULL,
    id_instal_lacio  INTEGER         NOT NULL,
    data_reserva     DATE            NOT NULL,
    hora_inici       TIME            NOT NULL,
    hora_fi          TIME            NOT NULL,
    estat            VARCHAR(20)     NOT NULL DEFAULT 'pendent'
                     CHECK (estat IN ('pendent','confirmada','entregada','cancel·lada')),
    preu_total       NUMERIC(8,2),
    CONSTRAINT chk_hores CHECK (hora_fi > hora_inici),
    CONSTRAINT fk_res_usu FOREIGN KEY (id_usuari)
        REFERENCES usuaris(id_usuari) ON DELETE RESTRICT,
    CONSTRAINT fk_res_ins FOREIGN KEY (id_instal_lacio)
        REFERENCES instal_lacions(id_instal_lacio) ON DELETE RESTRICT
);

-- ── INSTAL·LACIONS ────────────────────────────────────────

INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) VALUES
    (1, 'Pista de pàdel A',   'Pàdel',      15.00, TRUE),
    (2, 'Pista de pàdel B',   'Pàdel',      15.00, TRUE),
    (3, 'Pista de tennis',    'Tennis',     20.00, TRUE),
    (4, 'Piscina coberta',    'Natació',     5.00, TRUE),
    (5, 'Sala de fitness',    'Fitness',     8.00, TRUE),
    (6, 'Sala polivalent',    'Polivalent', 30.00, TRUE),
    (7, 'Camp de futbol',     'Futbol',     50.00, FALSE),
    (8, 'Pista de bàsquet',   'Bàsquet',   25.00, TRUE);

SELECT setval('instal_lacions_id_instal_lacio_seq', 8);

-- ── USUARIS ───────────────────────────────────────────────

INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-10'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-05'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-20'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-15'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-30'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-07-01'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-12');

SELECT setval('usuaris_id_usuari_seq', 7);

-- ── RESERVES ──────────────────────────────────────────────

INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) VALUES
    (1,  1, 1, '2025-01-05', '10:00', '11:30', 'entregada',    22.50),
    (2,  1, 3, '2025-01-12', '09:00', '10:00', 'entregada',    20.00),
    (3,  2, 4, '2025-01-15', '11:00', '12:00', 'entregada',     5.00),
    (4,  1, 5, '2025-01-20', '08:00', '09:00', 'entregada',     8.00),
    (5,  4, 6, '2025-01-08', '09:00', '12:00', 'entregada',    90.00),
    (6,  2, 6, '2025-01-22', '14:00', '17:00', 'entregada',    90.00),
    (7,  3, 1, '2025-02-03', '16:00', '17:30', 'entregada',    22.50),
    (8,  2, 1, '2025-02-10', '10:00', '11:30', 'entregada',    22.50),
    (9,  1, 2, '2025-02-15', '12:00', '13:30', 'entregada',    22.50),
    (10, 1, 6, '2025-02-12', '09:00', '12:00', 'entregada',    90.00),
    (11, 3, 6, '2025-02-26', '14:00', '17:00', 'entregada',    90.00),
    (12, 3, 3, '2025-03-02', '10:00', '11:00', 'confirmada',   20.00),
    (13, 5, 5, '2025-03-08', '07:00', '08:00', 'confirmada',    8.00),
    (14, 5, 6, '2025-03-05', '09:00', '12:00', 'confirmada',   90.00),
    (15, 2, 8, '2025-03-12', '15:00', '16:00', 'confirmada',   25.00),
    (16, 1, 1, '2025-03-18', '10:00', '11:30', 'pendent',      22.50),
    (17, 4, 4, '2025-03-20', '09:00', '10:00', 'pendent',       5.00),
    (18, 5, 1, '2025-03-22', '11:00', '12:30', 'cancel·lada',  22.50),
    (19, 6, 3, '2025-03-25', '16:00', '17:00', 'pendent',      20.00),
    (20, 3, 5, '2025-03-26', '08:00', '09:00', 'pendent',       8.00),
    (21, 1, 8, '2025-03-27', '19:00', '20:00', 'pendent',      25.00),
    (22, 2, 6, '2025-03-28', '17:00', '20:00', 'pendent',      90.00);

SELECT setval('reserves_id_reserva_seq', 22);
-- ============================================================
-- BD Reserves - MySQL / MariaDB
-- ============================================================

DROP DATABASE IF EXISTS bd_reserves;
CREATE DATABASE bd_reserves
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
USE bd_reserves;

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE instal_lacions (
    id_instal_lacio  INT             AUTO_INCREMENT PRIMARY KEY,
    nom              VARCHAR(100)    NOT NULL,
    tipus            VARCHAR(50)     NOT NULL,
    preu_hora        DECIMAL(8,2)    NOT NULL CHECK (preu_hora > 0),
    actiu            TINYINT(1)      NOT NULL DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuaris (
    id_usuari   INT             AUTO_INCREMENT PRIMARY KEY,
    dni         CHAR(9)         NOT NULL UNIQUE,
    nom         VARCHAR(100)    NOT NULL,
    cognoms     VARCHAR(200)    NOT NULL,
    email       VARCHAR(150)    NOT NULL UNIQUE,
    data_alta   DATE            NOT NULL DEFAULT (CURRENT_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE reserves (
    id_reserva       INT             AUTO_INCREMENT PRIMARY KEY,
    id_usuari        INT             NOT NULL,
    id_instal_lacio  INT             NOT NULL,
    data_reserva     DATE            NOT NULL,
    hora_inici       TIME            NOT NULL,
    hora_fi          TIME            NOT NULL,
    estat            VARCHAR(20)     NOT NULL DEFAULT 'pendent',
    CONSTRAINT chk_estat CHECK (estat IN ('pendent','confirmada','entregada','cancel·lada')),
    preu_total       DECIMAL(8,2),
    CONSTRAINT chk_hores CHECK (hora_fi > hora_inici),
    CONSTRAINT fk_res_usu FOREIGN KEY (id_usuari)
        REFERENCES usuaris(id_usuari) ON DELETE RESTRICT,
    CONSTRAINT fk_res_ins FOREIGN KEY (id_instal_lacio)
        REFERENCES instal_lacions(id_instal_lacio) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── INSTAL·LACIONS ────────────────────────────────────────

INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) VALUES
    (1, 'Pista de pàdel A',   'Pàdel',      15.00, 1),
    (2, 'Pista de pàdel B',   'Pàdel',      15.00, 1),
    (3, 'Pista de tennis',    'Tennis',     20.00, 1),
    (4, 'Piscina coberta',    'Natació',     5.00, 1),
    (5, 'Sala de fitness',    'Fitness',     8.00, 1),
    (6, 'Sala polivalent',    'Polivalent', 30.00, 1),
    (7, 'Camp de futbol',     'Futbol',     50.00, 0),
    (8, 'Pista de bàsquet',   'Bàsquet',   25.00, 1);

-- ── USUARIS ───────────────────────────────────────────────

INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-10'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-05'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-20'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-15'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-30'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-07-01'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-12');

-- ── RESERVES ──────────────────────────────────────────────

INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) VALUES
    (1,  1, 1, '2025-01-05', '10:00', '11:30', 'entregada',    22.50),
    (2,  1, 3, '2025-01-12', '09:00', '10:00', 'entregada',    20.00),
    (3,  2, 4, '2025-01-15', '11:00', '12:00', 'entregada',     5.00),
    (4,  1, 5, '2025-01-20', '08:00', '09:00', 'entregada',     8.00),
    (5,  4, 6, '2025-01-08', '09:00', '12:00', 'entregada',    90.00),
    (6,  2, 6, '2025-01-22', '14:00', '17:00', 'entregada',    90.00),
    (7,  3, 1, '2025-02-03', '16:00', '17:30', 'entregada',    22.50),
    (8,  2, 1, '2025-02-10', '10:00', '11:30', 'entregada',    22.50),
    (9,  1, 2, '2025-02-15', '12:00', '13:30', 'entregada',    22.50),
    (10, 1, 6, '2025-02-12', '09:00', '12:00', 'entregada',    90.00),
    (11, 3, 6, '2025-02-26', '14:00', '17:00', 'entregada',    90.00),
    (12, 3, 3, '2025-03-02', '10:00', '11:00', 'confirmada',   20.00),
    (13, 5, 5, '2025-03-08', '07:00', '08:00', 'confirmada',    8.00),
    (14, 5, 6, '2025-03-05', '09:00', '12:00', 'confirmada',   90.00),
    (15, 2, 8, '2025-03-12', '15:00', '16:00', 'confirmada',   25.00),
    (16, 1, 1, '2025-03-18', '10:00', '11:30', 'pendent',      22.50),
    (17, 4, 4, '2025-03-20', '09:00', '10:00', 'pendent',       5.00),
    (18, 5, 1, '2025-03-22', '11:00', '12:30', 'cancel·lada',  22.50),
    (19, 6, 3, '2025-03-25', '16:00', '17:00', 'pendent',      20.00),
    (20, 3, 5, '2025-03-26', '08:00', '09:00', 'pendent',       8.00),
    (21, 1, 8, '2025-03-27', '19:00', '20:00', 'pendent',      25.00),
    (22, 2, 6, '2025-03-28', '17:00', '20:00', 'pendent',      90.00);
-- ============================================================
-- BD Reserves - SQL Server
-- ============================================================

IF EXISTS (SELECT name FROM sys.databases WHERE name = 'bd_reserves')
    DROP DATABASE bd_reserves;
GO
CREATE DATABASE bd_reserves;
GO
USE bd_reserves;
GO

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE instal_lacions (
    id_instal_lacio  INT             IDENTITY(1,1) PRIMARY KEY,
    nom              NVARCHAR(100)   NOT NULL,
    tipus            NVARCHAR(50)    NOT NULL,
    preu_hora        DECIMAL(8,2)    NOT NULL CONSTRAINT chk_preu CHECK (preu_hora > 0),
    actiu            BIT             NOT NULL DEFAULT 1
);

CREATE TABLE usuaris (
    id_usuari   INT             IDENTITY(1,1) PRIMARY KEY,
    dni         CHAR(9)         NOT NULL UNIQUE,
    nom         NVARCHAR(100)   NOT NULL,
    cognoms     NVARCHAR(200)   NOT NULL,
    email       NVARCHAR(150)   NOT NULL UNIQUE,
    data_alta   DATE            NOT NULL DEFAULT GETDATE()
);

CREATE TABLE reserves (
    id_reserva       INT             IDENTITY(1,1) PRIMARY KEY,
    id_usuari        INT             NOT NULL,
    id_instal_lacio  INT             NOT NULL,
    data_reserva     DATE            NOT NULL,
    hora_inici       TIME            NOT NULL,
    hora_fi          TIME            NOT NULL,
    estat            NVARCHAR(20)    NOT NULL DEFAULT 'pendent'
                     CONSTRAINT chk_estat CHECK (estat IN ('pendent','confirmada','entregada','cancel·lada')),
    preu_total       DECIMAL(8,2),
    CONSTRAINT chk_hores CHECK (hora_fi > hora_inici),
    CONSTRAINT fk_res_usu FOREIGN KEY (id_usuari)
        REFERENCES usuaris(id_usuari) ON DELETE NO ACTION,
    CONSTRAINT fk_res_ins FOREIGN KEY (id_instal_lacio)
        REFERENCES instal_lacions(id_instal_lacio) ON DELETE NO ACTION
);
GO

-- ── INSTAL·LACIONS ────────────────────────────────────────

SET IDENTITY_INSERT instal_lacions ON;
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) VALUES
    (1, 'Pista de pàdel A',   'Pàdel',      15.00, 1),
    (2, 'Pista de pàdel B',   'Pàdel',      15.00, 1),
    (3, 'Pista de tennis',    'Tennis',     20.00, 1),
    (4, 'Piscina coberta',    'Natació',     5.00, 1),
    (5, 'Sala de fitness',    'Fitness',     8.00, 1),
    (6, 'Sala polivalent',    'Polivalent', 30.00, 1),
    (7, 'Camp de futbol',     'Futbol',     50.00, 0),
    (8, 'Pista de bàsquet',   'Bàsquet',   25.00, 1);
SET IDENTITY_INSERT instal_lacions OFF;
GO

-- ── USUARIS ───────────────────────────────────────────────

SET IDENTITY_INSERT usuaris ON;
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) VALUES
    (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  '2024-01-10'),
    (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  '2024-02-05'),
    (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   '2024-03-20'),
    (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     '2024-04-15'),
    (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  '2024-05-30'),
    (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  '2024-07-01'),
    (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', '2024-09-12');
SET IDENTITY_INSERT usuaris OFF;
GO

-- ── RESERVES ──────────────────────────────────────────────

SET IDENTITY_INSERT reserves ON;
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) VALUES
    (1,  1, 1, '2025-01-05', '10:00', '11:30', 'entregada',    22.50),
    (2,  1, 3, '2025-01-12', '09:00', '10:00', 'entregada',    20.00),
    (3,  2, 4, '2025-01-15', '11:00', '12:00', 'entregada',     5.00),
    (4,  1, 5, '2025-01-20', '08:00', '09:00', 'entregada',     8.00),
    (5,  4, 6, '2025-01-08', '09:00', '12:00', 'entregada',    90.00),
    (6,  2, 6, '2025-01-22', '14:00', '17:00', 'entregada',    90.00),
    (7,  3, 1, '2025-02-03', '16:00', '17:30', 'entregada',    22.50),
    (8,  2, 1, '2025-02-10', '10:00', '11:30', 'entregada',    22.50),
    (9,  1, 2, '2025-02-15', '12:00', '13:30', 'entregada',    22.50),
    (10, 1, 6, '2025-02-12', '09:00', '12:00', 'entregada',    90.00),
    (11, 3, 6, '2025-02-26', '14:00', '17:00', 'entregada',    90.00),
    (12, 3, 3, '2025-03-02', '10:00', '11:00', 'confirmada',   20.00),
    (13, 5, 5, '2025-03-08', '07:00', '08:00', 'confirmada',    8.00),
    (14, 5, 6, '2025-03-05', '09:00', '12:00', 'confirmada',   90.00),
    (15, 2, 8, '2025-03-12', '15:00', '16:00', 'confirmada',   25.00),
    (16, 1, 1, '2025-03-18', '10:00', '11:30', 'pendent',      22.50),
    (17, 4, 4, '2025-03-20', '09:00', '10:00', 'pendent',       5.00),
    (18, 5, 1, '2025-03-22', '11:00', '12:30', 'cancel·lada',  22.50),
    (19, 6, 3, '2025-03-25', '16:00', '17:00', 'pendent',      20.00),
    (20, 3, 5, '2025-03-26', '08:00', '09:00', 'pendent',       8.00),
    (21, 1, 8, '2025-03-27', '19:00', '20:00', 'pendent',      25.00),
    (22, 2, 6, '2025-03-28', '17:00', '20:00', 'pendent',      90.00);
SET IDENTITY_INSERT reserves OFF;
GO
-- ============================================================
-- BD Reserves - Oracle (connectat a XEPDB1 o la PDB de treball)
-- ============================================================

BEGIN EXECUTE IMMEDIATE 'DROP TABLE reserves CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL; END;
/
BEGIN EXECUTE IMMEDIATE 'DROP TABLE instal_lacions CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL; END;
/
BEGIN EXECUTE IMMEDIATE 'DROP TABLE usuaris CASCADE CONSTRAINTS PURGE'; EXCEPTION WHEN OTHERS THEN NULL; END;
/

-- ── CREACIÓ DE TAULES ─────────────────────────────────────

CREATE TABLE instal_lacions (
    id_instal_lacio  NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom              VARCHAR2(100)   NOT NULL,
    tipus            VARCHAR2(50)    NOT NULL,
    preu_hora        NUMBER(8,2)     NOT NULL CHECK (preu_hora > 0),
    actiu            NUMBER(1)       DEFAULT 1 NOT NULL CHECK (actiu IN (0,1))
);

CREATE TABLE usuaris (
    id_usuari   NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    dni         CHAR(9)         NOT NULL UNIQUE,
    nom         VARCHAR2(100)   NOT NULL,
    cognoms     VARCHAR2(200)   NOT NULL,
    email       VARCHAR2(150)   NOT NULL UNIQUE,
    data_alta   DATE            DEFAULT SYSDATE NOT NULL
);

-- A Oracle no existeix el tipus TIME. s'usen DATE per emmagatzemar hora_inici i hora_fi
-- com a timestamps amb data fixa (1970-01-01), o VARCHAR2 per simplificar.
-- Aquí usem VARCHAR2(5) per claredat pedagògica.
CREATE TABLE reserves (
    id_reserva       NUMBER          GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    id_usuari        NUMBER          NOT NULL,
    id_instal_lacio  NUMBER          NOT NULL,
    data_reserva     DATE            NOT NULL,
    hora_inici       VARCHAR2(5)     NOT NULL,
    hora_fi          VARCHAR2(5)     NOT NULL,
    estat            VARCHAR2(20)    DEFAULT 'pendent' NOT NULL
                     CHECK (estat IN ('pendent','confirmada','entregada','cancel·lada')),
    preu_total       NUMBER(8,2),
    CONSTRAINT fk_res_usu FOREIGN KEY (id_usuari)
        REFERENCES usuaris(id_usuari) ON DELETE NO ACTION,
    CONSTRAINT fk_res_ins FOREIGN KEY (id_instal_lacio)
        REFERENCES instal_lacions(id_instal_lacio) ON DELETE NO ACTION
);

-- ── INSTAL·LACIONS ────────────────────────────────────────

INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (1, 'Pista de padel A',  'Padel',      15.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (2, 'Pista de padel B',  'Padel',      15.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (3, 'Pista de tennis',   'Tennis',     20.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (4, 'Piscina coberta',   'Natacio',     5.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (5, 'Sala de fitness',   'Fitness',     8.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (6, 'Sala polivalent',   'Polivalent', 30.00, 1);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (7, 'Camp de futbol',    'Futbol',     50.00, 0);
INSERT INTO instal_lacions (id_instal_lacio, nom, tipus, preu_hora, actiu) OVERRIDING SYSTEM VALUE VALUES (8, 'Pista de basquet',  'Basquet',   25.00, 1);

-- ── USUARIS ───────────────────────────────────────────────

INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (1, '12345678A', 'Joan',   'Garcia Puig',  'joan.garcia@example.com',  DATE '2024-01-10');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (2, '87654321B', 'Maria',  'Lopez Serra',  'maria.lopez@example.com',  DATE '2024-02-05');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (3, '11111111C', 'Pere',   'Bosch Vila',   'pere.bosch@example.com',   DATE '2024-03-20');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (4, '22222222D', 'Anna',   'Mas Ribas',    'anna.mas@example.com',     DATE '2024-04-15');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (5, '33333333E', 'Carles', 'Puig Torres',  'carles.puig@example.com',  DATE '2024-05-30');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (6, '44444444F', 'Laura',  'Valls Ferrer', 'laura.valls@example.com',  DATE '2024-07-01');
INSERT INTO usuaris (id_usuari, dni, nom, cognoms, email, data_alta) OVERRIDING SYSTEM VALUE VALUES (7, '55555555G', 'Miquel', 'Soler Costa',  'miquel.soler@example.com', DATE '2024-09-12');

-- ── RESERVES ──────────────────────────────────────────────

INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (1,  1, 1, DATE '2025-01-05', '10:00', '11:30', 'entregada',    22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (2,  1, 3, DATE '2025-01-12', '09:00', '10:00', 'entregada',    20.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (3,  2, 4, DATE '2025-01-15', '11:00', '12:00', 'entregada',     5.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (4,  1, 5, DATE '2025-01-20', '08:00', '09:00', 'entregada',     8.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (5,  4, 6, DATE '2025-01-08', '09:00', '12:00', 'entregada',    90.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (6,  2, 6, DATE '2025-01-22', '14:00', '17:00', 'entregada',    90.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (7,  3, 1, DATE '2025-02-03', '16:00', '17:30', 'entregada',    22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (8,  2, 1, DATE '2025-02-10', '10:00', '11:30', 'entregada',    22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (9,  1, 2, DATE '2025-02-15', '12:00', '13:30', 'entregada',    22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (10, 1, 6, DATE '2025-02-12', '09:00', '12:00', 'entregada',    90.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (11, 3, 6, DATE '2025-02-26', '14:00', '17:00', 'entregada',    90.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (12, 3, 3, DATE '2025-03-02', '10:00', '11:00', 'confirmada',   20.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (13, 5, 5, DATE '2025-03-08', '07:00', '08:00', 'confirmada',    8.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (14, 5, 6, DATE '2025-03-05', '09:00', '12:00', 'confirmada',   90.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (15, 2, 8, DATE '2025-03-12', '15:00', '16:00', 'confirmada',   25.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (16, 1, 1, DATE '2025-03-18', '10:00', '11:30', 'pendent',      22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (17, 4, 4, DATE '2025-03-20', '09:00', '10:00', 'pendent',       5.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (18, 5, 1, DATE '2025-03-22', '11:00', '12:30', 'cancel·lada',  22.50);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (19, 6, 3, DATE '2025-03-25', '16:00', '17:00', 'pendent',      20.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (20, 3, 5, DATE '2025-03-26', '08:00', '09:00', 'pendent',       8.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (21, 1, 8, DATE '2025-03-27', '19:00', '20:00', 'pendent',      25.00);
INSERT INTO reserves (id_reserva, id_usuari, id_instal_lacio, data_reserva, hora_inici, hora_fi, estat, preu_total) OVERRIDING SYSTEM VALUE VALUES (22, 2, 6, DATE '2025-03-28', '17:00', '20:00', 'pendent',      90.00);

COMMIT;

Verificació ràpida

SELECT 'instal_lacions' AS taula, COUNT(*) AS files FROM instal_lacions UNION ALL
SELECT 'usuaris',                 COUNT(*)           FROM usuaris        UNION ALL
SELECT 'reserves',                COUNT(*)           FROM reserves;
Heu d'obtenir: 8 · 7 · 22 files respectivament.

Oracle: tipus TIME

Oracle no té un tipus TIME natiu. En aquesta BD s'ha simplificat usant VARCHAR2(5) per a hora_inici i hora_fi. En un entorn de producció caldria usar DATE o TIMESTAMP i emmagatzemar data i hora conjuntament.