db.sql 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. CREATE TABLE Marka (
  2. kod_marki SERIAL PRIMARY KEY,
  3. nazvanie_marki VARCHAR(100) NOT NULL
  4. );
  5. select from marka
  6. CREATE TABLE Model (
  7. id_modeli SERIAL PRIMARY KEY,
  8. kod_marki INT NOT NULL REFERENCES Marka(kod_marki)
  9. ON DELETE RESTRICT ON UPDATE CASCADE,
  10. kod_modeli VARCHAR(20) NOT NULL,
  11. nazvanie_modeli VARCHAR(100) NOT NULL
  12. );
  13. select from model
  14. CREATE TABLE Avtomobil (
  15. id_avtomobilya SERIAL PRIMARY KEY,
  16. id_modeli INT NOT NULL REFERENCES Model(id_modeli)
  17. ON DELETE RESTRICT ON UPDATE CASCADE,
  18. VIN_nomer CHAR(17) NOT NULL UNIQUE,
  19. cena DECIMAL(12,2) NOT NULL,
  20. klass_avtomobilya VARCHAR(50),
  21. tehnicheskie_dannye TEXT
  22. );
  23. SELECT COUNT(*) FROM model
  24. CREATE TABLE Klient (
  25. id_klienta SERIAL PRIMARY KEY,
  26. adres VARCHAR(255),
  27. nomer_telefona VARCHAR(20),
  28. gorod VARCHAR(100)
  29. );
  30. SELECT * FROM klient;
  31. CREATE TABLE Zakaz (
  32. id_zakaza SERIAL PRIMARY KEY,
  33. id_klienta INT NOT NULL REFERENCES Klient(id_klienta)
  34. ON DELETE RESTRICT ON UPDATE CASCADE,
  35. id_avtomobilya INT NOT NULL REFERENCES Avtomobil(id_avtomobilya)
  36. ON DELETE RESTRICT ON UPDATE CASCADE,
  37. data_pokupki DATE NOT NULL
  38. );
  39. SELECT * FROM users;
  40. CREATE TABLE users (
  41. id SERIAL PRIMARY KEY,
  42. login VARCHAR(50) UNIQUE NOT NULL,
  43. password VARCHAR(100) NOT NULL,
  44. role VARCHAR(20) NOT NULL
  45. );
  46. INSERT INTO users(login, password, role)
  47. VALUES
  48. ('admin', '12345', 'Администратор'),
  49. ('manager', '11111', 'Менеджер'),
  50. ('guest', '00000', 'Гость');
  51. --хранимая процедура по нахождению списка городов
  52. CREATE OR REPLACE FUNCTION GetCitiesByMarkAndPeriod(
  53. p_nazvanie_marki VARCHAR,
  54. p_date_from DATE,
  55. p_date_to DATE
  56. )
  57. RETURNS TABLE(gorod VARCHAR, nazvanie_marki VARCHAR, kolichestvo_zakaz BIGINT)
  58. LANGUAGE plpgsql
  59. AS $$
  60. BEGIN
  61. RETURN QUERY
  62. SELECT
  63. k.gorod,
  64. ma.nazvanie_marki,
  65. COUNT(z.id_zakaza) AS kolichestvo_zakaz
  66. FROM Zakaz z
  67. JOIN Klient k ON z.id_klienta = k.id_klienta
  68. JOIN Avtomobil a ON z.id_avtomobilya = a.id_avtomobilya
  69. JOIN Model mo ON a.id_modeli = mo.id_modeli
  70. JOIN Marka ma ON mo.kod_marki = ma.kod_marki
  71. WHERE ma.nazvanie_marki = p_nazvanie_marki
  72. AND z.data_pokupki BETWEEN p_date_from AND p_date_to
  73. GROUP BY k.gorod, ma.nazvanie_marki
  74. ORDER BY kolichestvo_zakaz DESC;
  75. END;
  76. $$;
  77. SELECT * FROM GetCitiesByMarkAndPeriod('Toyota',
  78. '2023-01-01',
  79. '2026-06-03');
  80. TRUNCATE TABLE zakaz RESTART IDENTITY CASCADE;
  81. TRUNCATE TABLE avtomobil RESTART IDENTITY CASCADE;
  82. TRUNCATE TABLE klient RESTART IDENTITY CASCADE;
  83. TRUNCATE TABLE model RESTART IDENTITY CASCADE;
  84. TRUNCATE TABLE marka RESTART IDENTITY CASCADE;
  85. SELECT COUNT(*)
  86. FROM zakaz
  87. WHERE data_pokupki BETWEEN '2023-01-01' AND '2026-06-03';
  88. SELECT nazvanie_marki FROM marka;
  89. --расчетный атрибут
  90. CREATE OR REPLACE VIEW vw_avtomobil AS
  91. SELECT
  92. id_avtomobilya,
  93. VIN_nomer,
  94. cena,
  95. cena * 1.20 AS cena_s_nds,
  96. klass_avtomobilya
  97. FROM Avtomobil;
  98. SELECT * FROM vw_avtomobil;