MySQL core foundation (5)-view and process control

view

Meaning: Virtual tables, like ordinary tables, use
the new features of mysql5.1 version, which are data dynamically generated through tables

​ Whether the keywords used to create the grammar actually occupy physical space

The view create view only saves the sql logic addition, deletion, modification, and check, but it is generally not possible to add, delete, modify

The table create table saves data additions, deletions, and changes

#案例:查询姓张的学生名和专业名
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`
WHERE s.`stuname` LIKE '张%';

CREATE VIEW v1
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;

SELECT * FROM v1 WHERE stuname LIKE '张%';

One, create a view

Syntax:
create view view name
as
query statement;

USE myemployees;

#1.查询姓名中包含a字符的员工名、部门名和工种信息
#①创建
CREATE VIEW myv1
AS

SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id  = d.department_id
JOIN jobs j ON j.job_id  = e.job_id;

#②使用
SELECT * FROM myv1 WHERE last_name LIKE '%a%';

#2. Query the average salary level of each department

#①创建视图查看每个部门的平均工资
CREATE VIEW myv2
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;

#②使用
SELECT myv2.`ag`,g.grade_level
FROM myv2
JOIN job_grades g
ON myv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;


#3. Query information about the department with the lowest average salary

SELECT * FROM myv2 ORDER BY ag LIMIT 1;

#4. Query the department name and salary with the lowest average salary

CREATE VIEW myv3
AS
SELECT * FROM myv2 ORDER BY ag LIMIT 1;

SELECT d.*,m.ag
FROM myv3 m
JOIN departments d
ON m.`department_id`=d.`department_id`;


Second, the modification of the view

method one

/*
create or replace view  视图名
as
查询语句;

*/
SELECT * FROM myv3 

CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;

Way two

/*
语法:
alter view 视图名
as 
查询语句;

*/
ALTER VIEW myv3
AS
SELECT * FROM employees;

Three, delete the view

Syntax: drop view view name, view name,...;

DROP VIEW emp_v1,emp_v2,myv3;

Four, view the view

DESC myv3;

SHOW CREATE VIEW myv3;

Five, the update of the view

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"
FROM employees;

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;

SELECT * FROM myv1;
SELECT * FROM employees;
#1.插入

INSERT INTO myv1 VALUES('张飞','[email protected]');

#2.修改
UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';

#3.删除
DELETE FROM myv1 WHERE last_name = '张无忌';

Views with the following characteristics are not allowed to be updated

① SQL statements containing the following keywords: group function, distinct, group by, having, union or union all

CREATE OR REPLACE VIEW myv1
AS
SELECT MAX(salary) m,department_id
FROM employees
GROUP BY department_id;

SELECT * FROM myv1;

#更新
UPDATE myv1 SET m=9000 WHERE department_id=10;

②Constant view

CREATE OR REPLACE VIEW myv2
AS

SELECT 'john' NAME;

SELECT * FROM myv2;

#更新
UPDATE myv2 SET NAME='lucy';


③Select contains subqueries

CREATE OR REPLACE VIEW myv3
AS

SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
FROM departments;

#更新
SELECT * FROM myv3;
UPDATE myv3 SET 最高工资=100000;

④join

CREATE OR REPLACE VIEW myv4
AS

SELECT last_name,department_name
FROM employees e
JOIN departments d
ON e.department_id  = d.department_id;

#更新

SELECT * FROM myv4;
UPDATE myv4 SET last_name  = '张飞' WHERE last_name='Whalen';
INSERT INTO myv4 VALUES('陈真','xxxx');


⑤From a view that cannot be updated

CREATE OR REPLACE VIEW myv5
AS

SELECT * FROM myv3;

#更新

SELECT * FROM myv5;

UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;

⑥The subquery of the where clause refers to the table in the from clause

CREATE OR REPLACE VIEW myv6
AS

SELECT last_name,email,salary
FROM employees
WHERE employee_id IN(
	SELECT  manager_id
	FROM employees
	WHERE manager_id IS NOT NULL
);

#更新
SELECT * FROM myv6;
UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

# Process control structure

Sequence, branch, loop

One, branch structure

1.if function

Syntax: if (condition, value 1, value 2)
Function: realize double branch
application in or outside begin end

2.case structure

Syntax:
Case 1: Similar to switch
case variable or expression
when value 1 then statement 1;
when value 2 then statement 2;

else statement n;
end

Case 2:
case
when condition 1 then statement 1;
when condition 2 then statement 2;

else statement n;
end

Applied in or outside the begin end

3.if structure

Syntax:
if condition 1 then statement 1;
elseif condition 2 then statement 2;

else statement n;
end if;
function: similar to multiple if

Can only be used in begin end

Case 1: Create a function to realize the incoming score, if the score>90, return A, if the score>80, return B, if the score>60, return C, otherwise return D

CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
BEGIN
	DECLARE ch CHAR DEFAULT 'A';
	IF score>90 THEN SET ch='A';
	ELSEIF score>80 THEN SET ch='B';
	ELSEIF score>60 THEN SET ch='C';
	ELSE SET ch='D';
	END IF;
	RETURN ch;
	
	
END $

SELECT test_if(87)$

Case 2: Create a stored procedure, if the salary is less than 2000, then delete, if 5000> salary> 2000, then the salary will be increased by 1000, otherwise the salary will be increased by 500

CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGIN
	IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
	ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
	ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
	END IF;
	
END $

CALL test_if_pro(2100)$

Case 1: Create a function to realize the incoming score, if the score>90, return A, if the score>80, return B, if the score>60, return C, otherwise return D

CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
BEGIN 
	DECLARE ch CHAR DEFAULT 'A';
	

CASE 
WHEN score>90 THEN SET ch='A';
WHEN score>80 THEN SET ch='B';
WHEN score>60 THEN SET ch='C';
ELSE SET ch='D';
END CASE;

RETURN ch;

END $

SELECT test_case(56)$

Second, the loop structure

Category:
while, loop, repeat

Cycle control:

iterate is similar to continue, continue, end this cycle, continue to the next
leave, similar to break, jump out, end the current cycle

1.while

grammar:

[Label:] while loop condition do
loop body;
end while [label];

Lenovo:

while (loop condition) {

Loop body;

}

2.loop

Syntax:
[label:] loop
loop body;
end loop [label];

Can be used to simulate a simple endless loop

3.repeat

Syntax:
[label:] repeat
loop body;
until condition to
end the loop end repeat [label];

1. No loop control statement added

#案例:批量插入,根据次数插入到admin表中多条记录
DROP PROCEDURE pro_while1$
CREATE PROCEDURE pro_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
		SET i=i+1;
	END WHILE;
	
END $

CALL pro_while1(100)$


int i=1;
while(i<=insertcount){

//insert

i++;

}

2. Add a leave statement

#案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i<=insertCount DO
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	END WHILE a;
END $

CALL test_while1(100)$

3. Add iterate statement

#案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 0;
	a:WHILE i<=insertCount DO
		SET i=i+1;
		IF MOD(i,2)!=0 THEN ITERATE a;
		END IF;
		

	INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
	
END WHILE a;

END $

CALL test_while1(100)$

/*

int i=0;
while(i<=insertCount){
i++;
if(i%2==0){
continue;
}
插入

}

*/

Guess you like

Origin blog.csdn.net/kilotwo/article/details/104355376