MySql DML和 视图 链接

DML(数据库管理语言)

1.简介


DML语言就是增删改
DML(Data MAnIPuLation Language -数据库操纵语言) 可以在下列条件下执行:
向表中插入数据
修改现存的数据
删除现存数据
事物是由完成若干项工作的DML语句组成


1.插入数据

• 使用 INSERT 语句向表中插入数据。
• 使用这种语法一次只能向表中插入一条数据。

			INSERT INTO table [(column [, column...])]
			VALUES (value [, value...]);

• 为每一列添加一个新值。
• 按列的默认顺序列出各个列的值。
• 在 INSERT 子句中随意列出列名和他们的值。
• 字符和日期型数据应包含在单引号中。

	INSERT INTO t_mysql_departments(department_id, department_name, manager_id, location_id)
	VALUES (70, 'Public Relations', 100, 1700);

	INSERT INTO t_mysql_employees(employee_id,last_name,email,hire_date,job_id)
	VALUES (300,’Tom’,’tom@126.com’,to_date(‘2012-3-
	21’,’yyyy-mm-dd’),’SA_RAP’);

向表中插入空值

• 隐式方式: 在列名表中省略该列的值。

		INSERT INTO t_mysql_departments (department_id, department_name )
		VALUES (30, 'Purchasing');

•显示方式: 在VALUES 子句中指定空值。

	INSERT INTO t_mysql_departments
	VALUES (100, 'Finance', NULL, NULL);

2.插入指定的值

	INSERT INTO t_mysql_employees (employee_id, first_name, last_name, email, phone_number,hire_date, job_id, salary, commission_pct, manager_id,department_id)
	VALUES (113, 'Louis', 'Popp', 'LPOPP', '515.124.4567', 
	NOW(), 'AC_ACCOUNT', 6900, NULL, 205, 100);

从其它表中拷贝数据

• 在 INSERT 语句中加入子查询。

	INSERT INTO emp2 
	SELECT * 
	FROM t_mysql_employees
	WHERE department_id = 90;

	INSERT INTO sales_reps(id, name, salary, commission_pct)
	SELECT employee_id, last_name, salary, commission_pct
	FROM t_mysql_employees
	WHERE job_id LIKE '%REP%';

• 不必书写 VALUES 子句。

• 子查询中的值列表应与 INSERT 子句中的列名对应

3.更新数据

• 使用 UPDATE 语句更新数据。

	UPDATE table
	SET column = value [, column = value, ...]
	[WHERE condition];

• 可以一次更新多条数据。
• 如果需要回滚数据,需要保证在DML前,进行

	设置:SET AUTOCOMMIT = FALSE;

案例

一次修改多表的数据

**案例 1:**修改张无忌的女朋友的手机号为114

	UPDATE t_mysql_boys bo
	INNER JOIN t_mysql_beauty b ON bo.`id`=b.`boyfriend_id`
	SET b.`phone`='119',bo.`userCP`=1000
	WHERE bo.`boyName`='张无忌';

**案例2:**修改没有男朋友的女神的男朋友编号都为2号

	UPDATE t_mysql_boys bo
	RIGHT JOIN t_mysql_beauty b ON bo.`id`=b.`boyfriend_id`
	SET b.`boyfriend_id`=2
	WHERE bo.`id` IS NULL;
	
	SELECT * FROM t_mysql_boys;

删除数据

•使用 DELETE 语句从表中删除数据。

		DELETE FROM table
		[WHERE condition];

• 使用 WHERE 子句删除指定的记录。

	DELETE FROM t_mysql_departments
	WHERE department_name = 'Finance';

• 如果省略 WHERE 子句,则表中的全部数据将被删除

		DELETE FROM copy_emp;

一次删除多表的数据

案例:删除张无忌的女朋友的信息

		DELETE b
		FROM t_mysql_beauty b
		INNER JOIN t_mysql_boys bo ON b.`boyfriend_id` = bo.`id`
		WHERE bo.`boyName`='张无忌';

案例:删除黄晓明的信息以及他女朋友的信息

	DELETE b,bo
	FROM t_mysql_beauty b
	INNER JOIN t_mysql_boys bo ON b.`boyfriend_id`=bo.`id`
	WHERE bo.`boyName`='黄晓明';

delete pk truncate

1.delete 可以加where 条件,truncate不能加

2.truncate删除,效率高一丢丢

3.假如要删除的表中有自增长列,
如果用delete删除后,再插入数据,自增长列的值从断点开始,
而truncate删除后,再插入数据,自增长列的值从1开始。

4.truncate删除没有返回值,delete删除有返回值

5.truncate删除不能回滚,delete删除可以回滚.

综合练习

1.运行以下脚本创建表my_employees

		USE myemployees;
		CREATE TABLE my_employees(
			Id INT(10),
			First_name VARCHAR(10),
			Last_name VARCHAR(10),
			Userid VARCHAR(10),
			Salary DOUBLE(10,2)
		);
		CREATE TABLE users(
			id INT,
			userid VARCHAR(10),
			department_id INT
		
		);

2. 显示表my_employees的结构

	DESC my_employees;

3. 向my_employees表中插入下列数据

		ID	FIRST_NAME	LAST_NAME	USERID	SALARY
		1	patel		Ralph		Rpatel	895
		2	Dancs		Betty		Bdancs	860
		3	Biri		Ben		Bbiri	1100
		4	Newman		Chad		Cnewman	750
		5	Ropeburn	Audrey		Aropebur	1550

方式一:

		INSERT INTO my_employees
		VALUES(1,'patel','Ralph','Rpatel',895),
		(2,'Dancs','Betty','Bdancs',860),
		(3,'Biri','Ben','Bbiri',1100),
		(4,'Newman','Chad','Cnewman',750),
		(5,'Ropeburn','Audrey','Aropebur',1550);
		DELETE FROM my_employees;

方式二:

			INSERT INTO my_employees
			SELECT 1,'patel','Ralph','Rpatel',895 UNION
			SELECT 2,'Dancs','Betty','Bdancs',860 UNION
			SELECT 3,'Biri','Ben','Bbiri',1100 UNION
			SELECT 4,'Newman','Chad','Cnewman',750 UNION
			SELECT 5,'Ropeburn','Audrey','Aropebur',1550;

4. 向users表中插入数据

		1	Rpatel	10
		2	Bdancs	10
		3	Bbiri	20
		4	Cnewman	30
		5	Aropebur	40
		
		INSERT INTO users
		VALUES(1,'Rpatel',10),
		(2,'Bdancs',10),
		(3,'Bbiri',20);

5.将3号员工的last_name修改为“drelxer”

		UPDATE my_employees SET last_name='drelxer' WHERE id = 3;

6.将所有工资少于900的员工的工资修改为1000

 UPDATE my_employees SET salary=1000 WHERE salary<900;

7.将userid 为Bbiri的user表和my_employees表的记录全部删除

		DELETE u,e
		FROM users u
		JOIN my_employees e ON u.`userid`=e.`Userid`
		WHERE u.`userid`='Bbiri';

8.删除所有数据

	DELETE FROM my_employees;
	DELETE FROM users;

9.检查所作的修正

	SELECT * FROM my_employees;
	SELECT * FROM users;

10.清空表my_employees

		TRUNCATE TABLE my_employees;

视图

作用:提高了重用性,就像一个函数。
含义:虚拟表,和普通表一样使用
视图是由数据库中的一个表或多个表导出的虚拟表,是
一种虚拟存在的表,方便用户对数据的操作。
mysql5.1版本出现的新特性,是通过表动态生成的数据

案例

案例:查询姓张的学生名和专业名

	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 '张%';

视图的创建

		语法:create view 视图名 as 查询语句;
		
		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.查询各部门的平均工资级别

		①创建视图查看每个部门的平均工资
		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.查询平均工资最低的部门信息

	SELECT * FROM myv2 ORDER BY ag LIMIT 1;

4.查询平均工资最低的部门名和工资

	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`;

视图的修改

语法1: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;

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

		ALTER VIEW myv3
		AS
		SELECT * FROM employees;

视图的删除

语法:drop view 视图名,视图名,…;

语法:drop view 视图名,视图名,…;

查看视图

	DESC myv3;
	
	SHOW CREATE VIEW myv3;

视图的更新

		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('张飞','zf@qq.com');

2.修改

UPDATE myv1 SET last_name = ‘张无忌’ WHERE last_name=‘张飞’;

3.删除

DELETE FROM myv1 WHERE last_name = '张无忌';

具备以下特点的视图不允许更新

		①包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all
		
		CREATE OR REPLACE VIEW myv1
		AS
		SELECT MAX(salary) m,department_id
		FROM employees
		GROUP BY department_id;
		
		SELECT * FROM myv1;

更新(1)

 UPDATE myv1 SET m=9000 WHERE department_id=10;

	②常量视图
	CREATE OR REPLACE VIEW myv2
	AS
	
	SELECT 'john' NAME;
	
	SELECT * FROM myv2;

更新(2)

UPDATE myv2 SET NAME=‘lucy’;

		③Select中包含子查询
		
		CREATE OR REPLACE VIEW myv3
		AS
		
		SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
		FROM departments;

更新(4)

		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;

更新(5)

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

	⑤from一个不能更新的视图
	CREATE OR REPLACE VIEW myv5
	AS
	
	SELECT * FROM myv3;

更新(6)

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


			⑥where子句的子查询引用了from子句中的表
			
			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
			);

更新(7)

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

视图练习

一、创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱

	CREATE OR REPLACE VIEW emp_v1
	AS
	SELECT last_name,salary,email
	FROM employees
	WHERE phone_number LIKE '011%';

二、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息

				CREATE OR REPLACE VIEW emp_v2
				AS
				SELECT MAX(salary) mx_dep,department_id
				FROM employees
				GROUP BY department_id
				HAVING MAX(salary)>12000;
				
				
				SELECT d.*,m.mx_dep
				FROM departments d
				JOIN emp_v2 m
				ON m.department_id = d.`department_id`;

前面内容链接

项目链接
MySQL数据库(一)https://blog.csdn.net/yoonbongchi/article/details/106741893.
MySQL数据库(二)https://blog.csdn.net/yoonbongchi/article/details/106769869.
MySQL数据库(三)https://blog.csdn.net/yoonbongchi/article/details/106806476.
MySQL数据库(四)https://blog.csdn.net/yoonbongchi/article/details/106808752.

总结

还需努力,奥里给。加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值