Advertisement
Guest User

Untitled

a guest
Jan 5th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. POLECENIE 1
  2. Utworzyć tabelę Studenci w dialekcie języka SQL Oracle zawierającą nast. Pola:
  3. Nr studenta zawiera l.naturalne, klucz głowny tabeli
  4. Nazwisko i imie – pola tekstowe o MAX rozmiarze 15, nie mogą zawierac wartości pustej
  5. Data ur – pole zawierające daty
  6. Plec – może zawierac tylko 2 wartosci K lub M
  7.  
  8. A) utworzyć tabelę studenci bez nazywania ograniczeń
  9.  
  10. CREATE TABLE Studenci(
  11. nr_studenta NUMBER(6) PRIMARY KEY,
  12. nazwisko  VARCHAR2(15) NOT NULL,
  13. imie VARCHAR2(15) NOT NULL,
  14. data_ur DATE,
  15. plec CHAR(1) CHECK(plec='K' OR plec='M'));
  16.  
  17. B) utworzyc tabele studenci nazywajac wszystkie ograniczenia
  18.  
  19. CREATE TABLE Studenci(
  20. nr_studenta NUMBER(6) CONSTRAINT nr_studenta_pk PRIMARY KEY,
  21. nazwisko  VARCHAR2(15) CONSTRAINT nazwisko_nn NOT NULL,
  22. imie VARCHAR2(15) CONSTRAINT imie_nn NOT NULL,
  23. data_ur DATE,
  24. plec CHAR(1) CONSTRAINT plec_CH CHECK(plec='K' OR plec='M'));
  25.  
  26. c) utworzyc tabele
  27. id_oceny zawiera l.n. , klucz glowny
  28. nr studenta zawiera liczby naturalne, klucz obcy łączący tabelę oceny studenta z z tabelą studenci polem nr_studenta
  29. data_oceny pole zawiera daty , nie moze byc NULL,
  30. ocena - zawiera zawiera oceny w postaci punktowej,
  31. slownie - zawiera oceni w postaci slownej
  32.  
  33.  
  34. CREATE TABLE oceny_studentow (
  35. id_oceny NUMBER CONSTRAINT id_oceny_PK PRIMARY KEY,
  36. nr_stud NUMBER,
  37. data_oceny DATE CONSTRAINT data_oceny_nn NOT NULL,
  38. ocena NUMBER(2,1), CONSTRAINT ocena_CH CHECK (ocena=2 OR ocena=2,5 OR ocena=3 OR ocena=3,5 OR ocena=4 OR ocena=4,5 OR ocena=5),
  39. slownie VARCHAR2(15) CONSTRAINT slownie_CH CHECK (slownie='Ndst' OR slownie='Ndst+' OR slownie='Dst' OR slownie='Dst+' OR slownie='Db' OR slownie='Db+' OR slownie='Bdb'),
  40. CONSTRAINT nr_stud_FK FOREIGN KEY (nr_stud) REFERENCES Studenci(nr_studenta)
  41. );
  42.  
  43. RENAME oceny_studentow TO oceny;
  44.  
  45. Podczas tworzenia tabeli studenci utworzono pole nazwisko o MAX rozmiarze 15 znaków. okazało sie zbyt małe, jego MAX rozmiar powinien wynosic 30 znaków. Skorygować pomyłkę bez usuwania tabeli.
  46.  
  47.  
  48. ALTER TABLE Studenci MODIFY(nazwisko VARCHAR2(30));
  49.  
  50. Podczas tworzenia tabelki studenci pominieto pole telefon, które zawiera numery telefonów, składające się z 6 znaków.Skorygować pomyłkę bez usuwania tabeli.
  51.  
  52. ALTER TABLE Studenci ADD(telefon CHAR(6));
  53.  
  54. Okazuje sie jednak ze pole telefon jest zbyteczne i nalezy je usunac. -||-
  55.  
  56. ALTER TABLE Studenci DROP COLUMN telefon;
  57.  
  58. Okazuje sie wiekszosc studentow w tablece studenci stanowią mezczyzni. Uwzglednic ten fakt w strukturze\definicji tabelki Studenci.
  59.  
  60. ALTER TABLE Studenci MODIFY(plec DEFAULT 'M');
  61.  
  62. 1.Zmienić kolejność pól w tabeli Studenci tak, aby pole plec BYło przed polem data_ur. 2. Zmienić kolejność ... aby pole data_ur BYło przed polem plec.
  63.  
  64. ALTER TABLE Studenci DROP COLUMN data_ur;
  65.  
  66. ALTER TABLE Studenci ADD(data_ur DATE); -- 1
  67.  
  68.  
  69. ALTER TABLE Studenci ADD(plec CHAR(1) DEFAULT 'M'
  70. CONSTRAINT plec_CH CHECK ( plec='M' OR plec='K')); --2
  71.  
  72.  
  73. Wprowadzic przykładowe rekordy DO tabeli studenci  
  74. 1. Tkaczyk Jerzy 12/10/1999 M
  75. 2. Krawczyk Monika 19/05/1998 K
  76. 3. Maczyk Maria 09/07/1997 K
  77. 4. Balcerek Janusz 02/09/1999 M  .....
  78.  
  79.  
  80.  
  81. INSERT INTO Studenci(nr_studenta,nazwisko,imie,data_ur,plec) VALUES(1,'Tkaczyk','Jerzy',TO_DATE('12/10/1999','DD/MM/YYYY'),'M');
  82.  
  83. INSERT INTO Studenci(nr_studenta,nazwisko,imie,data_ur,plec) VALUES(2,'Krawczyk','Monika',TO_DATE('19/05/1998','DD/MM/YYYY'),'K');
  84.  
  85. INSERT INTO Studenci(nr_studenta,nazwisko,imie,data_ur,plec) VALUES(3,'Maczyk','Maria',TO_DATE('09/07/1997','DD/MM/YYYY'),'K');
  86.  
  87. INSERT INTO Studenci(nr_studenta,nazwisko,imie,data_ur,plec) VALUES(4,'Balcerek','Janusz',TO_DATE('02/09/1999','DD/MM/YYYY'),'M');
  88.  
  89. INSERT INTO oceny(id_oceny,nr_stud,data_oceny,ocena,slownie) VALUES(1,1,TO_DATE('15/10/2017','DD/MM/YYYY'),5,'Bdb');
  90.  
  91. INSERT INTO oceny(id_oceny,nr_stud,data_oceny,ocena,slownie) VALUES(2,1,TO_DATE('17/10/2017','DD/MM/YYYY'),3,'Dst');
  92.  
  93. INSERT INTO oceny(id_oceny,nr_stud,data_oceny,ocena,slownie) VALUES(3,2,TO_DATE('15/10/2017','DD/MM/YYYY'),4.5,'Db+');
  94.  
  95. INSERT INTO oceny(id_oceny,nr_stud,data_oceny,ocena,slownie) VALUES(4,3,TO_DATE('19/10/2017','DD/MM/YYYY'),3.5,'Dst+');
  96.  
  97. INSERT INTO oceny(id_oceny,nr_stud,data_oceny,ocena,slownie) VALUES(5,4,TO_DATE('20/10/2017','DD/MM/YYYY'),2,'Ndst');
  98.  
  99. Okazało się, że niepoprawnie wprowadzono nazwisko i imie studentki Maczyk Marii, poprawne TO Marczyk Marta. Skorygować błąd bez usuwania rekordu.
  100.  
  101. UPDATE Studenci
  102. SET imie='Marta',
  103. nazwisko='Marczyk'
  104. WHERE nr_studenta=3;
  105.  
  106. Utworzyc dwie sekwencje DO wprowadzania wartości w polach kluczy głównych tabel studenci i oceny:
  107. sekw_student : krok1, MIN.1 MAX 999
  108. sekw_ocena : krok1, MIN .1 MAX 9999
  109.  
  110. Wproawdzenie rekordów ze swoimi danymi.
  111.  
  112. CREATE SEQUENCE sekw_student INCREMENT BY 1 START WITH 5 MINVALUE 1 MAXVALUE 999;
  113.  
  114. CREATE SEQUENCE sekw_ocena INCREMENT BY 1 START WITH 6 MINVALUE 1 MAXVALUE 9999;
  115.  
  116.  
  117. INSERT INTO Studenci
  118. VALUES(sekw_student.NEXTVAL,'Pawelec','Aleksandra',TO_DATE('28/08/1998','DD/MM/YYYY'),'K' );
  119.  
  120. INSERT INTO oceny
  121. VALUES(sekw_student.NEXTVAL,5,TO_DATE('28/08/1998','DD/MM/YYYY'),3,'dst');
  122.  
  123.  
  124. Utyworzyc indeks student w tabeli studenci na polach nazwisko i imie posortowanych alfabetycznie.
  125.  
  126. CREATE  INDEX student ON Studenci (nazwisko ASC, imie ASC );
  127.  
  128. ------------------------------------
  129.  
  130. 1.Wyłączyć ograniczenie dla pola plec w tabeli studenci  - sprawdzić jego wyłączenie.
  131. 2. Wprowadzić rekord DO tabeli Studenci
  132. Kowalski Jan 12/07/1998 A
  133. 3. Spróbować właczyc ograniczenie dla pola plec . Zmodyfikować (bez usuwania) powyższy rekord tak, aby ograniczenie
  134. udało się włączyć.
  135.  
  136.  
  137. 1. ALTER TABLE Studenci DISABLE CONSTRAINT PLEC_CH;
  138. 2. INSERT INTO Studenci(nr_studenta,nazwisko,imie,data_ur,plec) VALUES(5,'Kowalski','Jan',TO_DATE('12/07/1998','DD/MM/YYYY'),'A');
  139. 3.UPDATE
  140. Studenci
  141. SET
  142. plec = 'M'
  143. WHERE nr_studenta= 5;
  144.  
  145. ALTER TABLE Studenci ENABLE CONSTRAINT PLEC_CH;
  146.  
  147. 4. Utworzyć tabelę Studentki, która zawiera wszystkie rekordy z tabeli Studenci opisujące studentki.
  148. ( 2 sposoby)
  149.  
  150. 1 sposob -
  151. CREATE TABLE Studentki1 AS
  152. SELECT * FROM Studenci WHERE plec = 'K';
  153.  
  154. 2 sposob -
  155. CREATE TABLE Studentki2  (
  156. nr_studentki NUMBER(6) CONSTRAINT nr_studentki_pk PRIMARY KEY,
  157. nazwisko  VARCHAR2(15) CONSTRAINT nazwisko_nn_k NOT NULL,
  158. imie VARCHAR2(15) CONSTRAINT imie_nn_k NOT NULL,
  159. data_ur DATE,
  160. plec CHAR(1) CONSTRAINT plec_CH_k CHECK(plec='K'));
  161.  
  162. INSERT INTO Studentki2
  163. SELECT * FROM Studenci WHERE plec='K';
  164.  
  165.  
  166. UZYTKOWNIK KADRY:
  167.  
  168. 1. Wyswietlić listę alfabetyczną osób z tabeli Osoby ( 3 sposoby)
  169.  
  170. ID_OS NAZWISKO_OS IMIE_OS
  171. 15       Duda       Barbara
  172. 20       Nowak      Adam
  173. 5        Nowak      Maria
  174.  
  175. 1 -
  176. SELECT id_os, INITCAP(nazwisko) nazwisko, INITCAP(imie1) imie1
  177. FROM osoby
  178. ORDER BY INITCAP(nazwisko) ASC, INITCAP(imie1) ASC;
  179.  
  180. 2-
  181. ORDER BY nazwisko ASC, imie1 ASC;
  182.  
  183. 3-
  184. ORDER BY 2 ASC, 3 ASC;
  185.  
  186. 2. - || -
  187. ID_OS OSOBA
  188. 15    Duda Barbara
  189. 20    Nowak Adam
  190. 5     Nowak Maria
  191.  
  192. SELECT id_os, INITCAP(nazwisko)||' '||INITCAP(imie1) PRAC
  193. FROM osoby
  194. ORDER BY 2 ASC;
  195.  
  196. 3. Napisac skrypt zwracający nastepujący wydruk
  197.  
  198. WYDZIAŁ        LITERA
  199. -------     ------
  200. FIZYKA      F
  201. MATEMATYKA  M
  202. PRAWO       P
  203.  
  204.  
  205. SELECT UPPER(nazwa) wydzial, UPPER(SUBSTR(nazwa,1,1)) litera
  206. FROM wydzialy
  207. ORDER BY 1 ASC;
  208.  
  209.  
  210. 4. Wyświetlić dla poszczególnych osób ich aktulaną pensję i pensję zaokrągloną DO pełnych tysięcy
  211.  
  212. PRACOWNIK       PENSJA      PELNE_TYS
  213. 5           4500        4
  214. 8           4500        4
  215. 10          4000        4            
  216.  
  217. SELECT id_os PRACOWNIK, PENSJA, TRUNC(PENSJA/1000) PELNE_TYS
  218. FROM zatrudnienia
  219. WHERE DO IS NULL
  220. ORDER BY pensja DESC, id_os ASC;
  221.  
  222. 5. Wyświetlić listę id tych osób, które gdziekolwiek bądź kiedykolwiek BYły zatrudnione lub są nadal zatrudnione.
  223. SELECT DISTINCT id_os pracownik
  224. FROM zatrudnienia
  225. ORDER BY 1 ASC;
  226.  
  227. 6. Wyświetlić dla każdej osoby z tabeli osoby następujący komunikat:
  228. Pan Czech Adam-data urodzenia 71/04/11.
  229. Pani Drops Barbara-data urodzenia 63/05/22.
  230. Pani Duda Barbara-data urodzenia 78/10/21.
  231. Pan Dudek Jan-data urodzenia 48/10/22.
  232.  
  233.  
  234. SELECT DECODE(masa,’kg’, ‘kilogram’,’dag’,’dekagram’,’g’,’gram’,’??)  jednostki_masy FROM dual;
  235.  
  236. SELECT DECODE(plec='M','Pan','K','Pani')
  237. nazwisko||' '||imie1,||'-data urodzenia'||d_w||'.'
  238. KOMUNIKAT FROM osoby
  239. ORDER BY 1 ASC;
  240.  
  241.  
  242. --------------------------------------------------------------
  243. 1.Obliczyć dla poszczególnych osób liczbe pełnych lat, jakie każda z nich przepracowała w aktualnym miejescu zatrudnienia.
  244.  
  245. ID_OS       Lata pracy
  246. 2       15
  247. 7       12
  248. 9       12
  249. 15      12
  250. 3       9
  251. 21      9
  252.  
  253.  
  254. SELECT id_os, TRUNC(MONTHS_BETWEEN(SYSDATE,od)/12) LATA_PRACY
  255. FROM zatrudnienia
  256. WHERE DO IS NULL
  257. ORDER BY 2 DESC, 1 ASC;
  258.  
  259.  
  260.  
  261. 2.Wyświetlić alfabetyczną listę osób, których pierwsze imię zawiera choć jedną literę 'a'.
  262.  
  263. SELECT id_os, INITCAP(imie1)||' '||INITCAP(nazwisko) pracownik
  264. FROM osoby
  265. WHERE LOWER(imie1) LIKE '%a%'
  266. ORDER BY 2 ASC;
  267.  
  268. 3. Wyświetlić dane takich osób, których nazwisko zaczyna się na literę K lub L i urodziły się w czerwcu,
  269. listopadzie i grudniu lub te kobiety, które mają drugie imię.
  270.  
  271. SELECT id_os, INITCAP(nazwisko)||' '||INITCAP(imie1)osoba, d_ur, plec
  272. FROM osoby
  273. WHERE ((SUBSTR(INITCAP(nazwisko),1,1)='K' OR SUBSTR(INITCAP(nazwisko),1,1)='L')
  274. AND (TO_CHAR(d_ur,'MM')='06' OR TO_CHAR(d_ur,'MM')='11' OR TO_CHAR(d_ur,'MM')='12'))
  275. OR (plec='K' AND imie2 IS NOT NULL);
  276.  
  277. -||-
  278. WHERE(SUBSTR(INITCAP(nazwisko),1,1) IN ('K','L') AND TO_CHAR(d_ur,'MM') IN ('06','11','12'))
  279. OR (plec='K' AND imie2 IS NOT NULL);
  280.  
  281. 4.Wyświetlić liczbę osób zarejestrowanych w bazie.
  282.  
  283. SELECT COUNT(id_os) liczba_osob
  284. FROM osoby;
  285.  
  286.  
  287. 5. Wyświetlić liczbę osób z każdej płci.
  288.  
  289. SELECT COUNT(id_os) liczba_osob
  290. FROM osoby
  291. GROUP BY plec;
  292.  
  293. SELECT plec, COUNT(id_os) liczba_osob
  294. FROM osoby
  295. GROUP BY plec
  296. ORDER BY 2 DESC;
  297.  
  298.  
  299. 6.Dla poszczególnych osób ich aktualne pensje( 2 sposoby )
  300. ID_OS   OSOBA       PENSJA
  301. 2   Duda Barbara    4500
  302. 10  Nowak Adam  4000
  303. 21  Nowak Michał   4000
  304. 15  Pielecki Marek  3800
  305.  
  306. SELECT o.id_os, INITCAP(z.imie1)||' '||INITCAP(o.nazwisko) osoba, z.pensja
  307. FROM osoby o,zatrudnienia z
  308. WHERE o.id_os=z.id_os AND z.DO IS NULL
  309. ORDER BY z.pensja DESC, o.imie ASC;
  310.  
  311. FROM osoby o JOIN zatrudnienia ON o.id_os=z.id_os
  312. WHERE z.DO IS NULL;
  313.  
  314.  
  315. 7.Wyswietlić  te osoby, które DO tej pory nie BYły zatrudnione.
  316.  
  317. SELECT o.id_os, INITCAP(o.imie1)||' '||INITCAP(o.nazwisko) osoba
  318. FROM osoby o LEFT JOIN zatrudnienia z ON o.id_os=z.id_os
  319. WHERE z.DO IS NULL;
  320.  
  321.  
  322. 8.Wyświetlić te wydziały, które zatrudniają aktualnie przynajmniej 2 osoby.
  323.  
  324. SELECT INITCAP(w.nazwa) wydzial, COUNT(z.id_os) liczba_osob
  325. FROM wydzialy w JOIN zatrudnienia z ON w.id_w=z.id_w
  326. WHERE z.DO IS NULL
  327. GROUP BY INITCAP(w.nazwa)
  328. HAVING COUNT (z.id_os)>1
  329. ORDER BY 2 DESC, 1 ASC;
  330.  
  331. -----------------------------------------------------
  332. 1. Wyswietlić dane ( identyfikator, nazwisko, imie ,datę urodzenia) najstarszej osoby z tabeli osoby.
  333.  
  334. SELECT id_os, nazwisko, imie1, d_ur
  335. FROM osoby
  336. WHERE d_ur=(SELECT MIN(d_ur) FROM osoby) ;
  337.  
  338. 2. Wyswietlić dane najstarszego mężczyny:
  339.  
  340. SELECT id_os, nazwisko, imie1, d_ur
  341. FROM osoby
  342. WHERE d_ur=(SELECT MIN(d_ur) FROM osoby
  343. WHERE plec='M');
  344.  
  345. 3. Wyswietlić dane najstarszego mężczyny i najstarszej kobiety.
  346.  
  347. SELECT o.plec, o.id_os, o.nazwisko, o.imie1, o.d_ur
  348. FROM osoby o
  349. WHERE o.d_ur=(SELECT MIN (o1.d_ur)
  350. FROM osoby o1
  351. WHERE o1.plec=o.plec);
  352.  
  353. 4. Wyswietlić tę płeć, z której więcej osób jest wpisanych DO tabeli osoby.(2 sposoby)
  354.  
  355. PLEC        LICZBA_OSOB
  356. ---     -----------
  357. K       18
  358.  
  359. Widok słownikowy:
  360. CREATE VIEW max_plec_os AS
  361. SELECT plec, COUNT(id_os) liczba_os
  362. FROM osoby
  363. GROUP BY plec
  364. ORDER BY 2 DESC;
  365.  
  366. SELECT plec, liczba_os
  367. FROM max_plec_os
  368. WHERE liczba_os=(SELECT MAX(liczba_os)
  369. FROM max_plec_os);
  370.  
  371. Widok tymczasowy:
  372. WITH plec_os_max AS
  373. (SELECT plec, COUNT(id_os) liczba_osob
  374. FROM osoby
  375. GROUP BY plec)
  376. SELECT plec, liczba_osob
  377. FROM plec_os_max
  378. WHERE liczba_osob=(SELECT MAX(liczba_osob)
  379. FROM plec_os_max);
  380.  
  381. 5. (2 sposoby) Wyswietlić dla poszczególnych wydziałów tę płeć, z której aktualnie jest zatrudnionych więcej osób na każdym z nich.
  382.  
  383. WYDZIAL     PLEC        LICZBA_OSOB
  384. -------     ----        -----------
  385. Matematyka  K       5
  386. Fizyka      M       4
  387. Prawo       K       4
  388.  
  389.  
  390. 1 sposób:
  391. CREATE VIEW wydzial_max_plec AS
  392. SELECT INITCAP(w.nazwa) wydzial, o.plec, COUNT(o.id_os) liczba_osob
  393. FROM osoby o JOIN zatrudnienia z ON o.id_os=z.id_os
  394. JOIN wydzialy w ON w.id_w=z.id_w
  395. WHERE z.DO IS NULL
  396. GROUP BY INITCAP(w.nazwa), o.plec
  397. ORDER BY 3 DESC;
  398.  
  399. SELECT wmp.wydzial, wmp.plec, wmp.liczba_osob
  400. FROM wydzial_max_plec wmp
  401. WHERE wmp.liczba_osob=(SELECT MAX(wmp1.liczba_osob)
  402. FROM wydzial_max_plec wmp1
  403. WHERE wmp1.wydzial=wmp.wydzial)
  404. ORDER BY 3 DESC, 1 ASC;
  405.  
  406. 2 sposób:
  407. WITH max_plec_wydzial AS
  408. (SELECT INITCAP(w.nazwa) wydzial, o.plec, COUNT(o.id_os) liczba_osob
  409. FROM osoby o, zatrudnienia z , wydzialy w
  410. WHERE o.id_os=z.id_os AND w.id_w=z.id_w AND z.DO IS NULL
  411. GROUP BY INITCAP(w.nazwa), o.plec)
  412. SELECT mpw.wydzial, mpw.plec, mpw.liczba_osob
  413. FROM max_plec_wydzial mpw
  414. WHERE mpw.liczba_osob=(SELECT MAX(mpw1.liczba_osob)
  415. FROM max_plec_wydzial mpw1
  416. WHERE mpw1.wydzial=mpw.wydzial)
  417. ORDER BY 3 DESC, 1 ASC;
  418.  
  419. 6.Wyświetlić osobę/osoby o najdłuższym nazwisku.
  420.  
  421. SELECT INITCAP(nazwisko), INITCAP(imie1)
  422. LENGHT(nazwisko)
  423. FROM osoby
  424. WHERE LENGHT(nazwisko)=(
  425. SELECT MAX(LENGHT(nazwisko))
  426. FROM osoby);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement