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.