Habilidad 02 / 03
SQL y PostgreSQL
Dos esquemas de bases de datos dibujados a partir de sus archivos SQL, y las consultas de un script de Bash.
- SQL, PostgreSQL y Bash(verificado)
Resumen
Dos proyectos de bases de datos de freeCodeCamp, de mis repositorios públicos: un esquema PostgreSQL de galaxias, estrellas, planetas y lunas, y una agenda de citas para una peluquería escrita en Bash sobre psql. Los diagramas se dibujan a partir de los propios archivos SQL.
En esta página
SQL, PostgreSQL y Bash (verificado)
Ver la prueba
Afirmación
SQL, PostgreSQL y Bash
✓ Verificado
Pruebas
- freeCodeCamp: Relational Database · freecodecamp · comprobado el 29 de septiembre de 2026Emitido el 27 sept 2026. Comprobado en la API pública de freeCodeCamp.
- freeCodeCamp: Relational Database V8 · freecodecamp · comprobado el 29 de septiembre de 2026Emitido el 26 sept 2026. Comprobado en la API pública de freeCodeCamp.
- celestial-bodies-database · github · comprobado el 28 de septiembre de 2026Proyecto de base de datos PostgreSQL (freeCodeCamp).
- salon-appointment-scheduler · github · comprobado el 28 de septiembre de 2026Agenda de citas en Bash + SQL (freeCodeCamp).
- Base de datos de cuerpos celestes: el archivo SQL completo (universe.sql, líneas 1–464) · manual · comprobado el 2 de octubre de 2026Del commit c2b1392 (18 sept 2026) de zurukzuruk1 en el repositorio celestial-bodies-database. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: el archivo SQL completo (salon.sql, líneas 1–267) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: las líneas de consulta del script (salon.sh, líneas 14–57) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
Resultado
Dos certificaciones Relational Database de freeCodeCamp (una con 5 proyectos) y dos proyectos públicos de bases de datos en GitHub.
Quién escribió este código
“Escribí el código de los ejercicios de freeCodeCamp que se muestra en las páginas de habilidades.”
Ver la prueba
Afirmación
Escribí el código de los ejercicios de freeCodeCamp que se muestra en las páginas de habilidades.
Declarado por Danilo
Pruebas
- Código fuente del conversor de mayúsculas y minúsculas: las cuatro funciones (build-a-case-converter/case_converter/index.js, líneas 1–20) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Pruebas del conversor de mayúsculas y minúsculas: cuatro comprobaciones assert.strictEqual (build-a-case-converter/case_converter/index.test.js, líneas 1–18) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente del comprobador de números primos: isPrime (build-a-prime-number-checker-module/index.js, líneas 1–11) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente de las rutas protegidas con JWT: registro e inicio de sesión con bcrypt y JWT (build-jwt-protected-routes/routes/auth.js, líneas 11–52) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente de la Bank API: la ruta de transferencia y sus comprobaciones (build-a-bank-api/server.js, líneas 30–71) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Base de datos de cuerpos celestes: el archivo SQL completo (universe.sql, líneas 1–464) · manual · comprobado el 2 de octubre de 2026Del commit c2b1392 (18 sept 2026) de zurukzuruk1 en el repositorio celestial-bodies-database. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: el archivo SQL completo (salon.sql, líneas 1–267) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: las líneas de consulta del script (salon.sh, líneas 14–57) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
Resultado
El código está copiado literalmente de repositorios públicos, donde los commits los hizo la cuenta de GitHub de Danilo (zurukzuruk1). Que lo escribiera él mismo es una declaración suya del 2 oct 2026.
Esquema
Los dos diagramas se generan al compilar el sitio, leyendo las sentencias CREATE TABLE y las restricciones de claves de los archivos SQL literales: columnas y tipos, claves primarias, columnas únicas y claves foráneas. Nada se dibuja a mano.
Base de datos de cuerpos celestes: universe.sql
Nivel de prueba: Prueba existente · dibujado a partir del archivo
5 tablas · 4 claves foráneas · 27 columnas
universe.sql: 5 tablas y 4 claves foráneas, leídas del archivo al generar este sitio. Cada línea une una columna de clave foránea (○) con la columna a la que hace referencia (●). PK clave primaria, FK clave foránea, UQ única.Tablas, columnas y claves como texto
galaxy
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
galaxy_id | integer | sí | clave primaria |
name | character varying(255) | sí | única |
galaxy_type_id | integer | no | clave foránea |
distance_from_earth | numeric | sí | – |
has_dark_matter | boolean | no | – |
diameter_light_years | integer | no | – |
galaxy_type
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
galaxy_type_id | integer | sí | clave primaria |
name | character varying(255) | sí | única |
description | text | sí | – |
moon
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
moon_id | integer | sí | clave primaria |
name | character varying(255) | sí | única |
planet_id | integer | sí | clave foránea |
has_atmosphere | boolean | no | – |
diameter_km | numeric | no | – |
discovery_year | integer | no | – |
planet
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
planet_id | integer | sí | clave primaria |
name | character varying(255) | sí | única |
star_id | integer | sí | clave foránea |
has_rings | boolean | no | – |
orbital_period_days | numeric | no | – |
moons_count | integer | no | – |
star
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
star_id | integer | sí | clave primaria |
name | character varying(255) | sí | única |
galaxy_id | integer | sí | clave foránea |
mass_solar_masses | numeric | no | – |
is_variable | boolean | no | – |
age_million_years | integer | no | – |
Claves foráneas
| Columna | Referencia |
|---|---|
galaxy.galaxy_type_id | galaxy_type.galaxy_type_id |
moon.planet_id | planet.planet_id |
planet.star_id | star.star_id |
star.galaxy_id | galaxy.galaxy_id |
Mostrar el archivo completo (464 líneas)
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.22 (Ubuntu 12.22-0ubuntu0.20.04.4)
-- Dumped by pg_dump version 12.22 (Ubuntu 12.22-0ubuntu0.20.04.4)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: galaxy; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.galaxy (
galaxy_id integer NOT NULL,
name character varying(255) NOT NULL,
galaxy_type_id integer,
distance_from_earth numeric NOT NULL,
has_dark_matter boolean,
diameter_light_years integer
);
--
-- Name: galaxy_galaxy_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.galaxy_galaxy_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: galaxy_galaxy_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.galaxy_galaxy_id_seq OWNED BY public.galaxy.galaxy_id;
--
-- Name: galaxy_type; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.galaxy_type (
galaxy_type_id integer NOT NULL,
name character varying(255) NOT NULL,
description text NOT NULL
);
--
-- Name: galaxy_type_galaxy_type_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.galaxy_type_galaxy_type_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: galaxy_type_galaxy_type_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.galaxy_type_galaxy_type_id_seq OWNED BY public.galaxy_type.galaxy_type_id;
--
-- Name: moon; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.moon (
moon_id integer NOT NULL,
name character varying(255) NOT NULL,
planet_id integer NOT NULL,
has_atmosphere boolean,
diameter_km numeric,
discovery_year integer
);
--
-- Name: moon_moon_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.moon_moon_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: moon_moon_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.moon_moon_id_seq OWNED BY public.moon.moon_id;
--
-- Name: planet; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.planet (
planet_id integer NOT NULL,
name character varying(255) NOT NULL,
star_id integer NOT NULL,
has_rings boolean,
orbital_period_days numeric,
moons_count integer
);
--
-- Name: planet_planet_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.planet_planet_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: planet_planet_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.planet_planet_id_seq OWNED BY public.planet.planet_id;
--
-- Name: star; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.star (
star_id integer NOT NULL,
name character varying(255) NOT NULL,
galaxy_id integer NOT NULL,
mass_solar_masses numeric,
is_variable boolean,
age_million_years integer
);
--
-- Name: star_star_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.star_star_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: star_star_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.star_star_id_seq OWNED BY public.star.star_id;
--
-- Name: galaxy galaxy_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy ALTER COLUMN galaxy_id SET DEFAULT nextval('public.galaxy_galaxy_id_seq'::regclass);
--
-- Name: galaxy_type galaxy_type_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy_type ALTER COLUMN galaxy_type_id SET DEFAULT nextval('public.galaxy_type_galaxy_type_id_seq'::regclass);
--
-- Name: moon moon_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.moon ALTER COLUMN moon_id SET DEFAULT nextval('public.moon_moon_id_seq'::regclass);
--
-- Name: planet planet_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.planet ALTER COLUMN planet_id SET DEFAULT nextval('public.planet_planet_id_seq'::regclass);
--
-- Name: star star_id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.star ALTER COLUMN star_id SET DEFAULT nextval('public.star_star_id_seq'::regclass);
--
-- Data for Name: galaxy; Type: TABLE DATA; Schema: public; Owner: -
--
COPY public.galaxy (galaxy_id, name, galaxy_type_id, distance_from_earth, has_dark_matter, diameter_light_years) FROM stdin;
1 Milky Way 1 0 t 105700
2 Andromeda 1 2537000 t 220000
3 Triangulum 1 2723000 t 60000
4 Whirlpool 1 23160000 t 76000
5 Cartwheel 3 500000000 t 150000
6 Sombrero 4 29350000 t 50000
\.
--
-- Data for Name: galaxy_type; Type: TABLE DATA; Schema: public; Owner: -
--
COPY public.galaxy_type (galaxy_type_id, name, description) FROM stdin;
1 Spiral A galaxy with a flat, rotating disk containing stars, gas and dust, and a central concentration of stars
2 Elliptical A galaxy with an ellipsoidal shape and a smooth, nearly featureless brightness profile
3 Irregular A galaxy that does not have a distinct regular shape
4 Lenticular A galaxy intermediate between elliptical and spiral galaxies
\.
--
-- Data for Name: moon; Type: TABLE DATA; Schema: public; Owner: -
--
COPY public.moon (moon_id, name, planet_id, has_atmosphere, diameter_km, discovery_year) FROM stdin;
1 The Moon 3 f 3474.8 \N
2 Phobos 4 f 22.2 1877
3 Deimos 4 f 12.4 1877
4 Io 5 f 3643.2 1610
5 Europa 5 f 3121.6 1610
6 Ganymede 5 t 5268.2 1610
7 Callisto 5 f 4820.6 1610
8 Amalthea 5 f 167 1892
9 Titan 6 t 5149.5 1655
10 Rhea 6 f 1527 1672
11 Iapetus 6 f 1469 1671
12 Dione 6 f 1123 1684
13 Tethys 6 f 1062 1684
14 Enceladus 6 f 504 1789
15 Titania 7 f 1578 1787
16 Oberon 7 f 1523 1787
17 Umbriel 7 f 1169 1851
18 Ariel 7 f 1158 1851
19 Miranda 7 f 471 1948
20 Triton 8 t 2706.8 1846
21 Nereid 8 f 340 1949
\.
--
-- Data for Name: planet; Type: TABLE DATA; Schema: public; Owner: -
--
COPY public.planet (planet_id, name, star_id, has_rings, orbital_period_days, moons_count) FROM stdin;
1 Mercury 1 f 88 0
2 Venus 1 f 224.7 0
3 Earth 1 f 365.25 1
4 Mars 1 f 687 2
5 Jupiter 1 t 4331 4
6 Saturn 1 t 10747 5
7 Uranus 1 t 30589 3
8 Neptune 1 t 59800 2
9 Proxima b 6 f 11.2 0
10 Sirius Ab 2 f 300 0
11 Rigel b 4 f 500 0
12 Centauri Bb 5 f 3.2 0
\.
--
-- Data for Name: star; Type: TABLE DATA; Schema: public; Owner: -
--
COPY public.star (star_id, name, galaxy_id, mass_solar_masses, is_variable, age_million_years) FROM stdin;
1 Sun 1 1.0 f 4600
2 Sirius 1 2.02 f 242
3 Betelgeuse 1 16.5 t 10
4 Rigel 1 21 t 8
5 Alpha Centauri A 1 1.1 f 4850
6 Proxima Centauri 1 0.12 t 4850
\.
--
-- Name: galaxy_galaxy_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
SELECT pg_catalog.setval('public.galaxy_galaxy_id_seq', 6, true);
--
-- Name: galaxy_type_galaxy_type_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
SELECT pg_catalog.setval('public.galaxy_type_galaxy_type_id_seq', 4, true);
--
-- Name: moon_moon_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
SELECT pg_catalog.setval('public.moon_moon_id_seq', 21, true);
--
-- Name: planet_planet_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
SELECT pg_catalog.setval('public.planet_planet_id_seq', 12, true);
--
-- Name: star_star_id_seq; Type: SEQUENCE SET; Schema: public; Owner: -
--
SELECT pg_catalog.setval('public.star_star_id_seq', 6, true);
--
-- Name: galaxy galaxy_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy
ADD CONSTRAINT galaxy_name_key UNIQUE (name);
--
-- Name: galaxy galaxy_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy
ADD CONSTRAINT galaxy_pkey PRIMARY KEY (galaxy_id);
--
-- Name: galaxy_type galaxy_type_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy_type
ADD CONSTRAINT galaxy_type_name_key UNIQUE (name);
--
-- Name: galaxy_type galaxy_type_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy_type
ADD CONSTRAINT galaxy_type_pkey PRIMARY KEY (galaxy_type_id);
--
-- Name: moon moon_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.moon
ADD CONSTRAINT moon_name_key UNIQUE (name);
--
-- Name: moon moon_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.moon
ADD CONSTRAINT moon_pkey PRIMARY KEY (moon_id);
--
-- Name: planet planet_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.planet
ADD CONSTRAINT planet_name_key UNIQUE (name);
--
-- Name: planet planet_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.planet
ADD CONSTRAINT planet_pkey PRIMARY KEY (planet_id);
--
-- Name: star star_name_key; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.star
ADD CONSTRAINT star_name_key UNIQUE (name);
--
-- Name: star star_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.star
ADD CONSTRAINT star_pkey PRIMARY KEY (star_id);
--
-- Name: galaxy galaxy_galaxy_type_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.galaxy
ADD CONSTRAINT galaxy_galaxy_type_id_fkey FOREIGN KEY (galaxy_type_id) REFERENCES public.galaxy_type(galaxy_type_id);
--
-- Name: moon moon_planet_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.moon
ADD CONSTRAINT moon_planet_id_fkey FOREIGN KEY (planet_id) REFERENCES public.planet(planet_id);
--
-- Name: planet planet_star_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.planet
ADD CONSTRAINT planet_star_id_fkey FOREIGN KEY (star_id) REFERENCES public.star(star_id);
--
-- Name: star star_galaxy_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.star
ADD CONSTRAINT star_galaxy_id_fkey FOREIGN KEY (galaxy_id) REFERENCES public.galaxy(galaxy_id);
--
-- PostgreSQL database dump complete
--
Nivel de prueba: Prueba existente
Agenda de citas para una peluquería: salon.sql
Nivel de prueba: Prueba existente · dibujado a partir del archivo
3 tablas · 2 claves foráneas · 9 columnas
salon.sql: 3 tablas y 2 claves foráneas, leídas del archivo al generar este sitio. Cada línea une una columna de clave foránea (○) con la columna a la que hace referencia (●). PK clave primaria, FK clave foránea, UQ única.Tablas, columnas y claves como texto
appointments
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
appointment_id | integer | sí | clave primaria |
customer_id | integer | sí | clave foránea |
service_id | integer | sí | clave foránea |
time | character varying(20) | sí | – |
customers
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
customer_id | integer | sí | clave primaria |
phone | character varying(20) | sí | única |
name | character varying(50) | sí | – |
services
| Columna | Tipo | No nulo | Claves |
|---|---|---|---|
service_id | integer | sí | clave primaria |
name | character varying(50) | sí | – |
Claves foráneas
| Columna | Referencia |
|---|---|
appointments.customer_id | customers.customer_id |
appointments.service_id | services.service_id |
Mostrar el archivo completo (267 líneas)
--
-- PostgreSQL database dump
--
-- Dumped from database version 12.22 (Ubuntu 12.22-0ubuntu0.20.04.4)
-- Dumped by pg_dump version 12.22 (Ubuntu 12.22-0ubuntu0.20.04.4)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
DROP DATABASE salon;
--
-- Name: salon; Type: DATABASE; Schema: -; Owner: freecodecamp
--
CREATE DATABASE salon WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';
ALTER DATABASE salon OWNER TO freecodecamp;
\connect salon
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: appointments; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.appointments (
appointment_id integer NOT NULL,
customer_id integer NOT NULL,
service_id integer NOT NULL,
"time" character varying(20) NOT NULL
);
ALTER TABLE public.appointments OWNER TO freecodecamp;
--
-- Name: appointments_appointment_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.appointments_appointment_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.appointments_appointment_id_seq OWNER TO freecodecamp;
--
-- Name: appointments_appointment_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.appointments_appointment_id_seq OWNED BY public.appointments.appointment_id;
--
-- Name: customers; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.customers (
customer_id integer NOT NULL,
phone character varying(20) NOT NULL,
name character varying(50) NOT NULL
);
ALTER TABLE public.customers OWNER TO freecodecamp;
--
-- Name: customers_customer_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.customers_customer_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.customers_customer_id_seq OWNER TO freecodecamp;
--
-- Name: customers_customer_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.customers_customer_id_seq OWNED BY public.customers.customer_id;
--
-- Name: services; Type: TABLE; Schema: public; Owner: freecodecamp
--
CREATE TABLE public.services (
service_id integer NOT NULL,
name character varying(50) NOT NULL
);
ALTER TABLE public.services OWNER TO freecodecamp;
--
-- Name: services_service_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--
CREATE SEQUENCE public.services_service_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE public.services_service_id_seq OWNER TO freecodecamp;
--
-- Name: services_service_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--
ALTER SEQUENCE public.services_service_id_seq OWNED BY public.services.service_id;
--
-- Name: appointments appointment_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.appointments ALTER COLUMN appointment_id SET DEFAULT nextval('public.appointments_appointment_id_seq'::regclass);
--
-- Name: customers customer_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.customers ALTER COLUMN customer_id SET DEFAULT nextval('public.customers_customer_id_seq'::regclass);
--
-- Name: services service_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.services ALTER COLUMN service_id SET DEFAULT nextval('public.services_service_id_seq'::regclass);
--
-- Data for Name: appointments; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
--
-- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
--
-- Data for Name: services; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--
INSERT INTO public.services VALUES (1, 'cut');
INSERT INTO public.services VALUES (2, 'color');
INSERT INTO public.services VALUES (3, 'perm');
INSERT INTO public.services VALUES (4, 'style');
INSERT INTO public.services VALUES (5, 'trim');
--
-- Name: appointments_appointment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.appointments_appointment_id_seq', 6, true);
--
-- Name: customers_customer_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.customers_customer_id_seq', 5, true);
--
-- Name: services_service_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--
SELECT pg_catalog.setval('public.services_service_id_seq', 5, true);
--
-- Name: appointments appointments_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.appointments
ADD CONSTRAINT appointments_pkey PRIMARY KEY (appointment_id);
--
-- Name: customers customers_phone_key; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.customers
ADD CONSTRAINT customers_phone_key UNIQUE (phone);
--
-- Name: customers customers_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.customers
ADD CONSTRAINT customers_pkey PRIMARY KEY (customer_id);
--
-- Name: services services_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.services
ADD CONSTRAINT services_pkey PRIMARY KEY (service_id);
--
-- Name: appointments appointments_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.appointments
ADD CONSTRAINT appointments_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES public.customers(customer_id);
--
-- Name: appointments appointments_service_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: freecodecamp
--
ALTER TABLE ONLY public.appointments
ADD CONSTRAINT appointments_service_id_fkey FOREIGN KEY (service_id) REFERENCES public.services(service_id);
--
-- PostgreSQL database dump complete
--
Nivel de prueba: Prueba existente
Consultas
El script de la peluquería envía su SQL a PostgreSQL mediante psql: 6 sentencias (SELECT, INSERT) en estas líneas, desde listar los servicios hasta reservar la cita.
Las sentencias, en orden
Nivel de prueba: Prueba existente
- línea 14
SELECT service_id, name FROM services ORDER BY service_id - línea 31
SELECT name FROM services WHERE service_id = $SERVICE_ID_SELECTED - línea 42
SELECT name FROM customers WHERE phone = '$CUSTOMER_PHONE' - línea 47
INSERT INTO customers(phone, name) VALUES('$CUSTOMER_PHONE', '$CUSTOMER_NAME') - línea 51
SELECT customer_id FROM customers WHERE phone = '$CUSTOMER_PHONE' - línea 57
INSERT INTO appointments(customer_id, service_id, time) VALUES($CUSTOMER_ID, $SERVICE_ID_SELECTED, '$SERVICE_TIME')
Ejercicio del curso: lo que escribe el usuario va directamente a la cadena SQL; un código de producción usaría consultas parametrizadas.
SERVICES=$($PSQL "SELECT service_id, name FROM services ORDER BY service_id")
echo "$SERVICES" | while read SERVICE_ID BAR NAME
do
if [[ -n $SERVICE_ID ]]
then
echo "$SERVICE_ID) $NAME"
fi
done
read SERVICE_ID_SELECTED
if [[ ! $SERVICE_ID_SELECTED =~ ^[0-9]+$ ]]
then
MAIN_MENU "I could not find that service. What would you like today?"
return
fi
SERVICE_NAME=$($PSQL "SELECT name FROM services WHERE service_id = $SERVICE_ID_SELECTED")
if [[ -z $SERVICE_NAME ]]
then
MAIN_MENU "I could not find that service. What would you like today?"
return
fi
SERVICE_NAME=$(echo $SERVICE_NAME | sed -E 's/^ *| *$//g')
echo -e "\nWhat's your phone number?"
read CUSTOMER_PHONE
CUSTOMER_NAME=$($PSQL "SELECT name FROM customers WHERE phone = '$CUSTOMER_PHONE'")
if [[ -z $CUSTOMER_NAME ]]
then
echo -e "\nI don't have a record for that phone number, what's your name?"
read CUSTOMER_NAME
INSERT_CUSTOMER_RESULT=$($PSQL "INSERT INTO customers(phone, name) VALUES('$CUSTOMER_PHONE', '$CUSTOMER_NAME')")
fi
CUSTOMER_NAME=$(echo $CUSTOMER_NAME | sed -E 's/^ *| *$//g')
CUSTOMER_ID=$($PSQL "SELECT customer_id FROM customers WHERE phone = '$CUSTOMER_PHONE'")
CUSTOMER_ID=$(echo $CUSTOMER_ID | sed -E 's/^ *| *$//g')
echo -e "\nWhat time would you like your $SERVICE_NAME, $CUSTOMER_NAME?"
read SERVICE_TIME
INSERT_APPOINTMENT_RESULT=$($PSQL "INSERT INTO appointments(customer_id, service_id, time) VALUES($CUSTOMER_ID, $SERVICE_ID_SELECTED, '$SERVICE_TIME')")
Nivel de prueba: Prueba existente
Pruebas
Las dos certificaciones Relational Database (un examen, y una certificación con 5 proyectos) y los dos repositorios públicos de los que salen los archivos de arriba.
Certificados
Relational Database
Nivel de prueba: Prueba existente
Relational Database V8
Nivel de prueba: Prueba existente
Repositorios
celestial-bodies-database
Nivel de prueba: Prueba existente
salon-appointment-scheduler
Nivel de prueba: Prueba existente