LAB 7
7.1. Stwórz widok, który zawiera wyłącznie numer pracownika, imię, nazwisko, nazwę departamentu, adres i miasto. Uporządkuj wyniki alfabetycznie po nazwach miast.
7.2. Zmodyfikuj powyższy widok, dodając kolumnę email, w której zamiast adresów pracowników znajdzie się literał "*****@****".
7.3. Stwórz nowy widok, korzystający z ww. widoku.
7.4. Usuń stworzone widoki.
7.1
CREATE VIEW my_view AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name, l.street_address, l.city
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
ORDER BY l.city ASC;
7.2
CREATE OR REPLACE VIEW my_view AS
SELECT e.employee_id, e.first_name, e.last_name,'*****@****' as "email", d.department_name, l.street_address, l.city
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
ORDER BY l.city ASC;
7.3
CREATE VIEW my_view2 AS
SELECT employee_id, first_name, last_name
FROM my_view;
7.4
DROP VIEW my_view2;
DROP VIEW my_view;
LAB 8
8.1. Stwórz indeks dla pojedynczej kolumny.
8.2. Stwórz indeks dla kilku kolumn (indeksowanie tylko niepustych wartości).
8.3. Stwórz unikatowy indeks.
8.4. Usuń utworzony indeks.
8.5. Stwórz sekwencję, która zaczyna się od 1, zwiększa o 2, a jej maksymalna wartość to 1000.
8.6. Zmodyfikuj stworzoną sekwencję, dodając opcje cykliczności sekwencji.
8.7. Dodaj do utworzonej tabeli wiersz, którego jedna z kolumn używa następnej dostępnej wartości z utworzonej sekwencji.
8.8. Usuń utworzoną sekwencję.
CREATE TABLE STUDENCI(
"Numer_indeksu" NUMBER(6) PRIMARY KEY,
"Imie" VARCHAR(16) NOT NULL,
"Nazwisko" VARCHAR(32) NOT NULL,
"Data_ur" DATE,
"Srednia_ocen" NUMBER(2,1),
"Plec" CHAR(1) NOT NULL,
CONSTRAINT so CHECK("Srednia_ocen">=2.0 AND "Srednia_ocen"<=5.5),
CONSTRAINT p CHECK("Plec" IN ('M','F'))
);
INSERT INTO studenci VALUES(232323, 'imie', 'nazwisko', NULL, 2.3, 'M');
8.1
CREATE INDEX indeks
ON studenci('data_ur') ;
8.2
CREATE INDEX indeks2
ON studenci(CASE WHEN 'imie' IS NOT NULL AND 'nazwisko' IS NOT NULL THEN 1 END);
8.3
CREATE UNIQUE INDEX indeks3
ON studenci('numer_indeksu') ;
8.4
DROP INDEX indeks;
8.5
CREATE SEQUENCE s1
START WITH 1
INCREMENT BY 2
MINVALUE 1
MAXVALUE 1000;
8.6
CREATE SEQUENCE s2
START WITH 1
INCREMENT BY 2
MINVALUE 1
MAXVALUE 1000
CYCLE;
8.7
ALTER TABLE studenci
ADD num NUMBER(4) DEFAULT VALUE(s2.NEXTVAL);
8.8
DROP SEQUENCE s1;
LAB 9
1. Używając operatora UNION, połącz zbiory:
- identyfikator stanowiska i minimalna wypłata, gdzie minimalna wypłata jest mniejsza niż 3000
- identyfikator stanowiska i minimalna wypłata, gdzie minimalna wypłata jest większa od 12000
wyniki posortuj po wysokości minimalnej wypłaty.
2. Używając operatora INTERSECT, znajdź część wspólną zbiorów:
- identyfikator stanowiska i minimalna wypłata, gdzie minimalna wypłata zawiera się w zakresie od 2000 do 5000
- identyfikator stanowiska i minimalna wypłata, gdzie identyfikator stanowiska kończy się literałem "ACCOUNT"
wyniki posortuj po wysokości minimalnej wypłaty.
3. Używając operatora MINUS, znajdź różnicę zbiorów:
- identyfikator pracownika, imię, nazwisko i wypłata, gdzie identyfikator pracownika jest większy od 150
- identyfikator pracownika, imię, nazwisko i wypłata, gdzie wypłata jest mniejsza niż 10000
wyniki posortuj po wysokości wypłaty.
1.
SELECT job_id, MIN(salary) AS "min_salary"
FROM hr.employees
GROUP BY job_id
HAVING MIN(salary) < 3000
UNION
SELECT job_id, MIN(salary) AS "min_salary"
FROM hr.employees
GROUP BY job_id
HAVING MIN(salary) > 12000
ORDER BY "min_salary";
2.
SELECT job_id, MIN(salary) AS "min_salary"
FROM hr.employees
GROUP BY job_id
HAVING MIN(salary) BETWEEN 2000 AND 5000
INTERSECT
SELECT job_id, MIN(salary) AS "min_salary"
FROM hr.employees
GROUP BY job_id
HAVING job_id LIKE '%ACCOUNT'
ORDER BY "min_salary";
3.
SELECT employee_id, first_name, last_name, salary
FROM hr.employees
WHERE employee_id > 150
MINUS
SELECT employee_id, first_name, last_name, salary
FROM hr.employees
WHERE salary < 10000
ORDER BY salary;