More SQL

by K. Yue

1. Views

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

Example:

CREATE OR REPLACE VIEW school_summary(
    schoolCode, schoolName, n_departments) AS
SELECT s.schoolCode, s.schoolName,
    COUNT(d.deptCode) AS n_departments
FROM school s LEFT JOIN department d
    ON (s.schoolCode = d.schoolCode)
GROUP BY s.schoolCode, s.schoolName;

SELECT *
FROM school_summary
WHERE n_departments > 0;

Notes:

2. Stored Procedures

Example:


-- A very simple stored procedure.
DROP PROCEDURE dept_info;

-- Redefine the delimiter to end the procedure.
DELIMITER //

CREATE PROCEDURE dept_info(IN dept VARCHAR(4))
BEGIN
    SELECT d.deptName, d.SchoolCode, t1.n_majors, t2.n_minors
    FROM department d INNER JOIN
        (SELECT COUNT(stuId) AS n_majors
         FROM student
         WHERE major = dept) AS t1 INNER JOIN
        (SELECT COUNT(stuId) AS n_minors
         FROM student
         WHERE minor = dept) AS t2
    WHERE d.deptCode = dept;
   
    -- MySQL does not directly support output to console.
    SELECT 'Faculty in the department';
   
    SELECT *
    FROM faculty
    WHERE deptCode = dept;
        
end //

DELIMITER ;

CALL dept_info('CSCI');



Note:

Example:


DROP FUNCTION n_major;

DELIMITER //

CREATE FUNCTION  n_major(dept varchar(4)) RETURNS INT
READS SQL DATA
BEGIN
    DECLARE count INT DEFAULT 0;

    SELECT COUNT(*) INTO count
    FROM student
    WHERE major = dept;

RETURN count;
END //

DELIMITER ;

SELECT n_major('CSCI');


Note:

Stored Program Syntax

Example:


DELIMITER //

CREATE FUNCTION major_students(dept VARCHAR(4))
    RETURNS VARCHAR(1000)
READS SQL DATA
BEGIN
    DECLARE result VARCHAR(1000) DEFAULT '';
    DECLARE name VARCHAR(41) DEFAULT '';
    DECLARE done INT DEFAULT FALSE;

    DECLARE cursor_1 CURSOR FOR
    SELECT DISTINCT CONCAT(fName, ' ', lName) AS name
    FROM student
    WHERE major = dept;
   
    DECLARE continue handler FOR NOT FOUND SET done = TRUE;

    OPEN cursor_1;
    SET result = '';       
       
    compute_loop: LOOP
    -- This is needed as there are other SQL statements that may set done to true.
        SET done = false;
        FETCH cursor_1 INTO name;
        IF done THEN
            LEAVE compute_loop;
        END IF;

        IF (result <> '') THEN
            SET result = CONCAT(result, ', ');
        END IF;

        SET result = CONCAT(result, name);
    END LOOP;

    CLOSE cursor_1;

    RETURN result;
END //

DELIMITER ;

SELECT major_students('CSCI');

SELECT GROUP_CONCAT(CONCAT(fName, ' ', lName) SEPARATOR ', ') AS majors
FROM student
WHERE major = 'CSCI'
;
 

3. Triggers

Example:

An example of using trigger is for auditing. Please see: http://www.databasejournal.com/features/mysql/the-wonderful-and-not-so-wonderful-things-about-mysql-triggers.html.