tyrion

homeworkBD2.sql

Nov 4th, 2012
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.33 KB | None | 0 0
  1. /* Ho provato a fare gli esercizi anche in SQL usando SQLite come db. */
  2.  
  3. /************* SCHEMA **********************************************/
  4.  
  5. CREATE TABLE "libri" (
  6.     "isbn" INTEGER NOT NULL PRIMARY KEY,
  7.     "titolo" VARCHAR(100) NOT NULL,
  8.     "editore" VARCHAR(100) NOT NULL,
  9.     "anno" INTEGER,
  10.     "costo" INTEGER
  11. );
  12. CREATE TABLE "scrittori" (
  13.     "cf" INTEGER NOT NULL PRIMARY KEY,
  14.     "nome" VARCHAR(100) NOT NULL,
  15.     "cognome" VARCHAR(100) NOT NULL,
  16.     "nazione" VARCHAR(100) NOT NULL
  17. );
  18. CREATE TABLE "autori" (
  19.     "libro" INTEGER NOT NULL REFERENCES "libri" ("isbn"),
  20.     "scrittore" INTEGER NOT NULL REFERENCES "scrittori" ("cf"),
  21.     PRIMARY KEY ("libro", "scrittore")
  22. );
  23.  
  24.  
  25. /************* VALORI INIZIALI *************************************/
  26.  
  27. INSERT INTO "libri" VALUES
  28.     (1234, "Titolo1", "Editore1", 1999, 234),
  29.     (4245, "Titolo2", "Editore2", 1870, 15),
  30.     (2123, "Novelle Sudamericane", "Feltrinelli", 2000, 10),
  31.     (4355, "Guerra e Pace", "Feltrinelli", 2010, 13);
  32.  
  33. INSERT INTO "scrittori" VALUES
  34.     (1, "Giovanni", "Moravia", "Frascati"),
  35.     (2, "Francesco", "Totti", "Italia"),
  36.     (3, "Alex", "Del Piero", "Cile");
  37.  
  38. INSERT INTO "autori" VALUES
  39.     (1234, 1),
  40.     (4245, 1),
  41.     (4245, 2),
  42.     (4355, 2),
  43.     (2123, 2),
  44.     (2123, 3);
  45.  
  46.  
  47. /************* QUERY ***********************************************/
  48. /* alcune sono fatte sia con JOIN esplicito che implicito.         */
  49.  
  50. /* 1) */
  51. SELECT titolo, editore FROM autori, scrittori, libri
  52. WHERE scrittore = cf
  53.   AND libro = isbn
  54.   AND cognome = 'Moravia';
  55.  
  56. SELECT titolo, editore FROM autori
  57.   JOIN scrittori ON (scrittore = cf)
  58.   JOIN libri ON (libro = isbn)
  59. WHERE cognome = 'Moravia';
  60.  
  61. /* 2) */
  62. SELECT nome, cognome FROM autori
  63.   JOIN scrittori ON (scrittore = cf)
  64.   JOIN libri ON (libro = isbn)
  65. WHERE
  66.   titolo = 'Novelle Sudamericane' AND
  67.   nazione = 'Cile';
  68.  
  69. /* 3) */
  70. SELECT titolo FROM libri
  71. WHERE costo > (SELECT costo FROM libri WHERE titolo = 'Guerra e Pace');
  72.  
  73. /* 4) */
  74. SELECT nome, cognome FROM scrittori
  75. EXCEPT
  76. SELECT nome, cognome FROM autori
  77.   JOIN scrittori ON (scrittore = cf)
  78.   JOIN libri ON (libro = isbn)
  79. WHERE anno > 2000;
  80.  
  81. /* 5) */
  82. SELECT DISTINCT titolo FROM autori a1, autori a2, libri
  83. WHERE a1.libro = isbn
  84.   AND a1.libro = a2.libro
  85.   AND a1.scrittore != a2.scrittore;
  86.  
  87. SELECT DISTINCT titolo FROM autori a1
  88.   JOIN libri ON (a1.libro = isbn)
  89.   JOIN autori a2 ON (a1.libro = a2.libro)
  90. WHERE a1.scrittore != a2.scrittore;
  91.  
  92. /* 6 */
  93. SELECT titolo FROM libri EXCEPT
  94. SELECT DISTINCT titolo FROM autori a1, autori a2, libri
  95. WHERE a1.libro = isbn
  96.   AND a1.libro = a2.libro
  97.   AND a1.scrittore != a2.scrittore;
  98.  
  99. /* 7 */
  100. SELECT nome, cognome FROM scrittori EXCEPT
  101. SELECT DISTINCT nome, cognome FROM autori
  102.   JOIN libri ON (libro = isbn)
  103.   JOIN scrittori ON (scrittore = cf)
  104. WHERE editore != 'Feltrinelli'
  105.  
  106. /* 8 */
  107. SELECT nome, cognome FROM scrittori EXCEPT
  108. SELECT DISTINCT nome, cognome FROM autori a1
  109.   JOIN autori a2 ON (a1.scrittore = a2.scrittore)
  110.   JOIN scrittori ON (a1.scrittore = cf)
  111. WHERE a1.libro != a2.libro;
  112.  
  113. /* 9 */
  114. SELECT scrittore, anno, COUNT(*), avg(cost)
  115. FROM autori, libri WHERE libro = isbn
  116. GROUP BY scrittore, anno;
  117.  
  118. /* 10 */
  119. SELECT editore, anno FROM (
  120.     SELECT editore, anno, COUNT(*) AS num
  121.     FROM libri GROUP BY editore, anno
  122. ) GROUP BY anno HAVING num = MAX(num);
Advertisement
Add Comment
Please, Sign In to add comment