General SQL Operations

Common SQL operations and queries for Oracle Database

Basic CRUD Operations

Basic Create, Read, Update, Delete operations (Access: Table privileges required)

-- Create table
-- Access: Users with CREATE TABLE privilege
CREATE TABLE employees (
    emp_id NUMBER PRIMARY KEY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL,
    email VARCHAR2(100) UNIQUE,
    hire_date DATE DEFAULT SYSDATE,
    salary NUMBER(10,2),
    department_id NUMBER
);

-- Insert data
-- Access: Users with INSERT privilege on table
INSERT INTO employees (emp_id, first_name, last_name, email, salary, department_id)
VALUES (1, 'John', 'Doe', 'john.doe@company.com', 50000, 10);

-- Insert multiple rows
INSERT ALL
    INTO employees VALUES (2, 'Jane', 'Smith', 'jane.smith@company.com', 55000, 10)
    INTO employees VALUES (3, 'Bob', 'Johnson', 'bob.johnson@company.com', 60000, 20)
SELECT * FROM dual;

-- Update data
-- Access: Users with UPDATE privilege on table
UPDATE employees 
SET salary = salary * 1.1 
WHERE department_id = 10;

-- Delete data
-- Access: Users with DELETE privilege on table
DELETE FROM employees WHERE emp_id = 1;

-- Select data
-- Access: Users with SELECT privilege on table
SELECT 
    emp_id,
    first_name,
    last_name,
    email,
    salary,
    department_id
FROM employees
WHERE department_id = 10
ORDER BY salary DESC;
Advanced Queries

Advanced query techniques with joins, subqueries, and window functions (Access: SELECT privilege required)

-- Joins
-- Access: Users with SELECT privilege on involved tables
SELECT 
    e.first_name,
    e.last_name,
    e.salary,
    d.department_name,
    m.first_name || ' ' || m.last_name AS manager_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
LEFT JOIN employees m ON e.manager_id = m.emp_id
WHERE e.salary > 50000
ORDER BY e.salary DESC;

-- Subqueries
-- Access: Users with SELECT privilege on involved tables
SELECT 
    first_name,
    last_name,
    salary
FROM employees
WHERE salary > (
    SELECT AVG(salary) 
    FROM employees
);

-- Window functions
-- Access: Users with SELECT privilege on table
SELECT 
    first_name,
    last_name,
    salary,
    department_id,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_dept,
    RANK() OVER (ORDER BY salary DESC) AS overall_rank,
    LAG(salary) OVER (ORDER BY salary) AS prev_salary,
    LEAD(salary) OVER (ORDER BY salary) AS next_salary
FROM employees
ORDER BY salary DESC;

-- Common Table Expressions (CTE)
-- Access: Users with SELECT privilege on table
WITH dept_stats AS (
    SELECT 
        department_id,
        COUNT(*) AS emp_count,
        AVG(salary) AS avg_salary,
        MAX(salary) AS max_salary
    FROM employees
    GROUP BY department_id
)
SELECT 
    d.department_name,
    ds.emp_count,
    ds.avg_salary,
    ds.max_salary
FROM departments d
JOIN dept_stats ds ON d.department_id = ds.department_id
ORDER BY ds.avg_salary DESC;
Data Manipulation

Advanced data manipulation operations (Access: Appropriate table privileges required)

-- Merge statement
-- Access: Users with INSERT, UPDATE, DELETE privileges on table
MERGE INTO employees e
USING (
    SELECT emp_id, first_name, last_name, email, salary, department_id
    FROM new_employees
) n ON (e.emp_id = n.emp_id)
WHEN MATCHED THEN
    UPDATE SET 
        first_name = n.first_name,
        last_name = n.last_name,
        email = n.email,
        salary = n.salary,
        department_id = n.department_id
WHEN NOT MATCHED THEN
    INSERT (emp_id, first_name, last_name, email, salary, department_id)
    VALUES (n.emp_id, n.first_name, n.last_name, n.email, n.salary, n.department_id);

-- Bulk operations
-- Access: Users with appropriate table privileges
-- Insert with bulk collect
DECLARE
    TYPE emp_array IS TABLE OF employees%ROWTYPE;
    emp_data emp_array;
BEGIN
    SELECT * BULK COLLECT INTO emp_data
    FROM employees
    WHERE department_id = 10;
    
    FORALL i IN 1..emp_data.COUNT
        INSERT INTO emp_backup VALUES emp_data(i);
END;
/

-- Update with case statement
-- Access: Users with UPDATE privilege on table
UPDATE employees
SET salary = CASE 
    WHEN department_id = 10 THEN salary * 1.1
    WHEN department_id = 20 THEN salary * 1.05
    ELSE salary * 1.02
END
WHERE hire_date < DATE '2020-01-01';

-- Delete with exists
-- Access: Users with DELETE privilege on table
DELETE FROM employees e
WHERE EXISTS (
    SELECT 1 FROM departments d
    WHERE d.department_id = e.department_id
    AND d.department_name = 'IT'
);