
COMMENT ON TABLE regions IS 'Regions table that contains region numbers and names. Contains 4 rows; references with the Countries table.';
COMMENT ON COLUMN regions.region_id IS 'Primary key of regions table.';
COMMENT ON COLUMN regions.region_name IS 'Names of regions. Locations are in the countries of these regions.';

COMMENT ON TABLE locations IS
  'Locations table that contains specific address of a specific office,
warehouse, and/or production site of a company. Does not store addresses /
locations of customers. Contains 23 rows; references with the
departments and countries tables. ';

COMMENT ON COLUMN locations.location_id IS
  'Primary key of locations table';

COMMENT ON COLUMN locations.street_address IS
  'Street address of an office, warehouse, or production site of a company.
Contains building number and street name';

COMMENT ON COLUMN locations.postal_code IS
  'Postal code of the location of an office, warehouse, or production site 
of a company. ';

COMMENT ON COLUMN locations.city IS
  'A not null column that shows city where an office, warehouse, or 
production site of a company is located. ';

COMMENT ON COLUMN locations.state_province IS
  'State or Province where an office, warehouse, or production site of a 
company is located.';

COMMENT ON COLUMN locations.country_id IS
  'Country where an office, warehouse, or production site of a company is
located. Foreign key to country_id column of the countries table.';

COMMENT ON TABLE departments IS
  'Departments table that shows details of departments where employees 
work. Contains 27 rows; references with locations, employees, and job_history tables.';

COMMENT ON COLUMN departments.department_id IS
  'Primary key column of departments table.';

COMMENT ON COLUMN departments.department_name IS
  'A not null column that shows name of a department. Administration, 
Marketing, Purchasing, Human Resources, Shipping, IT, Executive, Public 
Relations, Sales, Finance, and Accounting. ';

COMMENT ON COLUMN departments.manager_id IS
  'Manager_id of a department. Foreign key to employee_id column of employees table. The manager_id column of the employee table references this column.';

COMMENT ON COLUMN departments.location_id IS
  'Location id where a department is located. Foreign key to location_id column of locations table.';

COMMENT ON TABLE job_history IS
  'Table that stores job history of the employees. If an employee 
changes departments within the job or changes jobs within the department, 
new rows get inserted into this table with old job information of the 
employee. Contains a complex primary key: employee_id+start_date.
Contains 25 rows. References with jobs, employees, and departments tables.';

COMMENT ON COLUMN job_history.employee_id IS
  'A not null column in the complex primary key employee_id+start_date.
Foreign key to employee_id column of the employee table';

COMMENT ON COLUMN job_history.start_date IS
  'A not null column in the complex primary key employee_id+start_date. 
Must be less than the end_date of the job_history table. (enforced by 
constraint jhist_date_interval)';

COMMENT ON COLUMN job_history.end_date IS
  'Last day of the employee in this job role. A not null column. Must be 
greater than the start_date of the job_history table. 
(enforced by constraint jhist_date_interval)';

COMMENT ON COLUMN job_history.job_id IS
  'Job role in which the employee worked in the past; foreign key to 
job_id column in the jobs table. A not null column.';

COMMENT ON COLUMN job_history.department_id IS
  'Department id in which the employee worked in the past; foreign key to deparment_id column in the departments table';

COMMENT ON TABLE countries IS
  'country table. Contains 25 rows. References with locations table.';

COMMENT ON COLUMN countries.country_id IS
  'Primary key of countries table.';

COMMENT ON COLUMN countries.country_name IS
  'Country name';

COMMENT ON COLUMN countries.region_id IS
  'Region ID for the country. Foreign key to region_id column in the departments table.';

COMMENT ON TABLE jobs IS
  'jobs table with job titles and salary ranges. Contains 19 rows.
References with employees and job_history table.';

COMMENT ON COLUMN jobs.job_id IS
  'Primary key of jobs table.';

COMMENT ON COLUMN jobs.job_title IS
  'A not null column that shows job title, e.g. AD_VP, FI_ACCOUNTANT';

COMMENT ON COLUMN jobs.min_salary IS
  'Minimum salary for a job title.';

COMMENT ON COLUMN jobs.max_salary IS
  'Maximum salary for a job title';

COMMENT ON TABLE employees IS
  'employees table. Contains 107 rows. References with departments, 
jobs, job_history tables. Contains a self reference.';

COMMENT ON COLUMN employees.employee_id IS
  'Primary key of employees table.';

COMMENT ON COLUMN employees.first_name IS
  'First name of the employee. A not null column.';

COMMENT ON COLUMN employees.last_name IS
  'Last name of the employee. A not null column.';

COMMENT ON COLUMN employees.email IS
  'Email id of the employee';

COMMENT ON COLUMN employees.phone_number IS
  'Phone number of the employee; includes country code and area code';

COMMENT ON COLUMN employees.hire_date IS
  'Date when the employee started on this job. A not null column.';

COMMENT ON COLUMN employees.job_id IS
  'Current job of the employee; foreign key to job_id column of the 
jobs table. A not null column.';

COMMENT ON COLUMN employees.salary IS
  'Monthly salary of the employee. Must be greater 
than zero (enforced by constraint emp_salary_min)';

COMMENT ON COLUMN employees.commission_pct IS
  'Commission percentage of the employee; Only employees in sales 
department elgible for commission percentage';

COMMENT ON COLUMN employees.manager_id IS
  'Manager id of the employee; has same domain as manager_id in 
departments table. Foreign key to employee_id column of employees table.
(useful for reflexive joins and CONNECT BY query)';

COMMENT ON COLUMN employees.department_id IS
  'Department id where employee works; foreign key to department_id 
column of the departments table';


CREATE SEQUENCE locations_seq START WITH 3300 INCREMENT BY 100 MAXVALUE 9900 NO CYCLE;
ALTER TABLE locations ALTER COLUMN location_id SET DEFAULT nextval('locations_seq');

CREATE SEQUENCE departments_seq START WITH 280 INCREMENT BY 10 MAXVALUE 9990 NO CYCLE;
ALTER TABLE departments ALTER COLUMN department_id SET DEFAULT nextval('departments_seq');

CREATE SEQUENCE employees_seq START WITH 207 INCREMENT BY 1 NO CYCLE;
ALTER TABLE employees ALTER COLUMN employee_id SET DEFAULT nextval('employees_seq');

CREATE OR REPLACE VIEW emp_details_view (
	employee_id, job_id, manager_id, department_id, location_id, country_id, first_name, last_name, salary, commission_pct, department_name, job_title, city, state_province, country_name, region_name
) AS SELECT e.employee_id,
		e.job_id,
		e.manager_id,
		e.department_id,
		d.location_id,
		l.country_id,
		e.first_name,
		e.last_name,
		e.salary,
		e.commission_pct,
		d.department_name,
		j.job_title,
		l.city,
		l.state_province,
		c.country_name,
		r.region_name
	FROM employees e,
		departments d,
		jobs j,
		locations l,
		countries c,
		regions r
  WHERE e.department_id = d.department_id
  AND d.location_id     = l.location_id
  AND l.country_id      = c.country_id
  AND c.region_id       = r.region_id
  AND j.job_id          = e.job_id;


CREATE INDEX emp_department_ix ON employees(department_id);

CREATE INDEX emp_job_ix ON employees(job_id);

CREATE INDEX emp_manager_ix ON employees(manager_id);

CREATE INDEX emp_name_ix ON employees(last_name, first_name);
