MySQL从基础到高级篇三

MySQL从基础到高级篇三

  1. DML(Data Modern language) 语言
    数据操作语言:
    ① 插入操作
    ② 修改操作
    ③ 删除操作
一、插入语句
方式一(经典插入):
	语法:
		insert into 表名(列名1, 列名2, ......)
		values(值1, 值2,........)
	#案例1:插入的值类型要与列的类型一致或兼容
	——insert into student(last_name, sex, tech_id, score) values('周瑜', '男', 3, 99);
	#案例2:不可以为null 的列必须填入值,可以为null的列如何插入值
	——insert into student(last_name, sex, tech_id, score) values('周瑜', null, null,null);
	——insert into student(last_name) values('周瑜');
	#案例3:列的顺序可以调换
	——insert into student(last_name, score, sex, tech_id) values('周瑜', 99, '男‘’, 3);
	#案例4:列数和值的个数必须一致
	——insert into student(last_name, sex) values('周瑜', '男');
	#案例5:可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
	——insert into student values('周瑜', '男', 3, 99);

方式二:
	语法:
		insert into 表名
		set 列名=值, 列名=值, 列名=值,.......
	#案例1:向student 表插入一条数据
	——insert into student
			set ast_name='周瑜', sex='男', tech_id=3, score=99;

两种insert 方式的比较:
	①方式一支持多行插入,方式二不支持
	——insert into student(last_name, sex, tech_id, score) 
			values('周瑜', '男', 3, 99), ('黄盖', '男', 2, 89), ('陆逊', '男', 4, 94);
	②方式一支持插入子查询,方式二不支持
	——insert into student(last_name, sex, tech_id, score)
			select '鲁肃', sex, tech_id, score from student where score=97;

二、修改语句
	1、修改单表的记录
	语法:
			update 表名
			set 列名=值, 列名=值, 列名=值,...........
			where 筛选条件;

	#案例1:修改单表的记录
	——update student set tech_id=3, score=89 where id=34;
	#案例2:修改student 表中id 为45 的tech_id=3,score=92
	——update student set tech_id=3, score=92 where id=45
	
	2、修改多表的记录【补充】
	语法:
		sql92语法:
				update 表1 别名, 表2 别名
				set 列=值, 列=值,...........
				where 连接条件
				and 筛选条件;
				
		sql99语法:
				update 表1 别名
				inner | left | right join 表2 别名
				on 连接条件
				set 列=值, 列=值, ........
				where 筛选条件;
	
	#案例1: 修改指导老师为‘王五’的学生信息的score=89
	#案例2:修改没有student 表中学生没有指导老师的的学生的tech_id=5
	
三、删除语句
方式一:delete
	语法:
	1、单表删除
	delete from 表名 where 筛选条件
	#案例1:删除手机号以9结尾的女神信息
	——delete from beauty where phone='%9';

	2、多表删除
		sql92 语法:
				delete 表1的别名, 表2的别名
				from 表1 别名, 表2 别名
				where 连接条件
				and 筛选条件;
		
		sql99 语法:
				delete 表1的别名, 表2的别名
				from 表1 别名
				inner | left | right join 表2 别名
				on 连接条件
				where 筛选条件;
				
	#案例1:删除张无忌女朋友的信息
	——delete b
			from beauty as b
			inner join boys as bo
			on b.boyfriend_id=bo.id
			where bo.boyName='张无忌';
	#案例2:删除黄晓明的信息以及他女朋友的信息
	——delete b, bo
			from beauty as b
			inner join boys as bo
			on b.boyfriend_id=bo.id
			where bo.boyName='黄晓明';
	
方式二:truncate
语法:truncate table 表名;
特点:
		①delete 可以加where 条件,truncate 不能加
		②truncate 删除,效率高一点点
		③加入要删除的表中有自增长列
				用delete 删除后,再插入数据,自增长列的值从断点处开始
				用truncate 删除后,再插入数据,是从1 开始
		④truncate 删除没有返回值,delete 删除有返回值
		⑤truncate 删除不能回滚,delete 删除可以回滚
		
	#案例:将魅力值>100 的男神信息删除
	——truncate table boys(没有筛选条件)
  1. DDL 语言
    定义:数据定义语言
    作用:对数据库和数据表结构的管理

一、数据库的管理
创建(create)、修改(alter)、删除(drop)

一、数据库的管理
1、数据库的创建
	语法:
		create database 数据库名称;

	#案例1:创建数据库Books
	——create database if not existts Books;

2、数据库的修改
	#案例1:修改数据库的字符集
	——alter database Books character set gbk;
	#案例2:修改数据库的名字
	——alter database Books rename to books;

3、数据库的删除
	——drop database if exists Books;

二、数据表的管理
1、创建数据表
	语法:
			create table 表名(
					列名 列的类型 【(长度) 约束】,
					列名 列的类型 【(长度) 约束】,
					列名 列的类型 【(长度) 约束】,
					.....................................,
					列名 列的类型 【(长度) 约束】
			);
	
	#案例1:创建book 数据表
	——create table book(
					id int,	#编号
					book_name varchar(20),	#书名
					price double,	#价格
					author_id int,	#作者编号
					publish_date datetime		#出版日期
			);
	#案例2:创建author 数据表
	——create table author(
					id	int,	#编号
					author_name varchar(20),		#作者名字
					nation varchar(10)		#国籍
			);

2、修改数据表
语法:
	——alter table 表名 add| drop| modify| change| column 列名 【列类型 约束】 【first/ after 字段名】(添加的位置);
操作:
		①修改列名(alter table 表名 change column 旧列名 新列名 类型;)
		——alter table book change column publish_date pub_date datetime;
		②修改列的类型或约束(alter table 表名 modify column 列名 新类型【新约束】)
		——alter table book modify column pub_date timestamp		##把原来的datetime 约束改为 timestamp
		③添加新列(alter table add column 列名 类型 【first| after 字段名】)
		——alter table author add column annual double;
		④删除列(alter table 表名 drop column 列名)
		——alter table author drop column annual;
		⑤修改表名(alter table 表名 rename 【to】新表名)
		——alter table author rename to book_author;

3、表的删除
drop table if exists book_author;

4、表的复制
	#案例1:仅仅复制数据表的结构
	——create table c_author1 like book_author;
	#案例2:复制数据表的结构+数据
	——create table c_author2
			select * from book_author;
	#案例3:复制数据表的结构+部分(行)数据
	——create table c_author3
			select * from book_author where id>2;
	#案例4:复制数据表的结构+部分(列)数据
	——create table c_author4
			select id, author_name from book_author;
	#案例5:只复制数据表的某些字段结构
	——create table c_author5
			select id, author_name from book_author where 1=2;


练习题
	#案例1:创建数据表  dept1
	——create table dept1(
					id int(10),
					name varchar(20)
			);
	#案例2:将表departments 中的数据插入新表dept2 中
	——create table dept2
			select department_id, department_name
			from departments;
	#案例3:创建表 emp5
	——create table emp5(
					id int(10),
					first_name varchar(25),
					last_name varchar(25),
					dept_id int(10)
			);
	#案例4:将列Last_name 的长度增加到 50
	——alter table emp5 modify column last_name varchar(50);
	#案例5:根据表employee 创建employee2
	——create table employee2 like employee;
	#案例6:删除表emp5
	——drop table if exists emp5;
	#案例7:将表 employee2 重命名为 emp5
	——alter table employee2 rename to emp5;
	#案例8:在表dept 和emp5 中添加新列test_column, 并检查所作的操作
	——alter table dept add column test_column int;
	——alter table emp5 add column test_column int;
	#案例9:直接删除表 emp5 中的列 dept_id
	——alter table emp5 drop column test_column;
  1. 常见的数据类型
1、数值型:
			整型
			浮点型:
					定点数
					浮点数
2、字符型
			短文本:char、varchar
			长文本:text、blob(较长的二进制数据)
3、日期型:

一、整型
分类:
		名称			tinyint、smallint、mediumint、int/integer、bigint
		字节数			1			2					3					4				8
特点:
	①如果不设置无符号位还是有符号位,默认是有符号位,如果想设置无符号为,需要添加unsigned 关键字
	②如果插入的数值超出了整型的范围,会报out of range 异常,并且往该字段插入临界值
	③如果不设置长度,会有默认长度,长度代表了显示的最大宽度,如果不够会用0 在左边填充,但必须搭配zerofill 使用

	#案例1:设置无符号为的整型字段
	——create table if exists tab_int(
					t1 int,
					t2 int unsigned		##用unsigned 关键字修饰的字段表示无符号位
			);
	#案例2:设置往ti 字段插入数值5000000000
	——insert into tab_int
			set t1=5000000000;	##会报out of range 异常,把t1 字段的值默认设置为4294967295
	#案例3:修改t1 字段的长度,在数值长度不足时使用0 填充
	——alter table tab_int modify column t1 int(7) zerofill;
	——insert into tab_int
			set t1=1234;

二、小数
1、浮点型:
		float(M,D)
		double(M,D)
2、定点型
		dec(M,D)
		decimal(M,D)

特点:
	①M:整数部位数 + 小数点后部位数,D:小数点后部位数,如果插入的数值超过范围,会自动插入临界值
	②M 和 D 可以省略,如果是decimal,则M 默认为10,D 默认为0,如果是float 或 double,则会根据插入的数值的精度来决定精度。
	③定点型的精确度较高,如果要求插入数值的精度较高(如:货币运算等,则考虑使用定点型)

原则:所选的类型越简单越好,能保存数值的类型越小越好(节省内存空间)

	#案例1:创建tab_float表,并设置f1、f2、f3 三个字段和范围
	——create table tab_float(
					f1 float(5, 2),
					f2 float(5, 2),
					f3 float(5, 2),
			);
	#案例2:向f1、f2、f3 三个字段分别插入数值132.456、123.2、1234.56
	——insert into tab_float(f1, f2, f3) values(132.456, 123.2, 1234.56);
	#案例3:修改tab_float 表中f1、f2、f3 的数据类型,并且省略MD,并分别插入数值456.12、123456.131456、123.54652137
	——alter table tab_float modify column f1 float;
	——alter table tab_float modify column f2 float;
	——alter table tab_float modify column f3 float;
	——insert into tab_float(f1, f2, f3) values(456.12, 123456.131454, 123.54652137);
	#案例4:修改tab_float 表中f1 字段为float,f2 字段为double,f3 字段为decimal,均省略M、D,且均插入相应数值
	——alter table tab_float modify column f1 float;
	——alter table tab_float modify column f2 double;
	——alter table tab_float modify column f3 decimal;
	——insert into tab_float(f1, f2, f3) 
			values(23456.123456, 23456.123456, 23456.123456), (456.56, 456.56, 456.56), (12.3, 12.3, 12.3);

3、字符型
	短文本
			①char(M)
			②varchar(M)
			③其他:
					binary和varbinary 用于保存较短的二进制
					enum 用于保存枚举
					set 用于保存集合
	
	特点:
							写法					M的意思				可变性					内存					效率
			char			char(M)			最大字符数			固定长度				消耗大				高
			varcahr	varcahr(M)		最大字符数			可变长度				消耗小				低
			
	长文本
			①text
			②blob		##保存二进制流(图像、音频)

四、日期类型
——create table tab_date(
				t1 datetime,
				t2 datestamp
		);

分类:
		date 只保存日期
		time 只保存数据
		year 只保存年份
		datetime 保存日期+时间
		datestamp 保存+时间

特点:
								字节							范围								时区影响
		datetime			8							1000-9999						不受
		datestamp		4							1970-2038						受

	#案例1:插入当前时区的时间戳
	——insert into tab_date(t1, t2) values(now(), now());
	#案例2:修改当前时区,并插入该时区的时间戳
	——show variables like 'time_zone'		##查看当前的时区
	——set time_zone='+9:00'		##设置当前时区为第9 时区
	——insert into tab_date(t1, t2) values(now(), now());
  1. 常见的约束
    含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
    分类:六大约束
    not null:非空,用于包装该字段的值不能为空(比如:姓名、学号等)
    default:默认,用于保证该字段有默认值(如:性别)
    primary key:主键,用于保证该字段的值具有唯一性,并且非空(比如:学号、员工编号)
    unique:唯一,用于保证该字段的值具有唯一性,可以为空(如:座位号)
    check:检查约束【mysql 中不支持】(如:年龄、性别)
    foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某列的值(如:学生的专业编号)

添加约束的时机:
1、创建表时
2、修改表时

约束的添加分类:
1、列级约束:
六大约束语法上都支持,但外键约束没有效果
2、表级约束:
除了非空、默认,其他的都支持

主键和唯一的比较:

保证唯一性 是否允许为空 一个表中的个数 是否允许组合
主键 × only √,不推荐
唯一 some √,不推荐

外键:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,字段名无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,先插入主表,再插入从表。删除数据时,先删除从表,再删除主表

一、创建表时添加约束
1、添加列级约束
语法:
		create table 表名(
				字段名 类型 约束(一个字段可以添加多个约束,用空格分隔),
				.....................,
				字段名 类型 约束
		);		


	#案例1:创建一个stu_test 表,有字段id(主键),stu_name(非空),gender(检查),seat(唯一),age(默认),major_id(外键)
	——create table stu_test (
					id int primary key, 	##主键
					stu_name varchar(20) not null, 		##非空
					gender char(1) check(gender='男' or gender='女'),		##检查
					seat int union, 		##唯一
					age int default 18,		##默认约束
					major_id int references major(id)		##外键
			);
	#案例2:创建一个major 表,有字段 id(主键),major_name(非空)
	——create table major(
					id int primary key,
					major_name varchar(20) not null
			);
	#案例3:查询stu_test 表中的所有索引,包括主键、外键、唯一
	——show index from stu_test ;

2、添加表级约束
语法:在各个字段的最下面
			【constraint 约束别名】约束类型(字段名)


	#案例1:删除刚才上面创建的stu_test 表
	——drop table stu_test;		##删除stu_test 表
	#按例2:创建stu_test 表
	——CREATE TABLE IF NOT EXISTS stu_test(
				id INT,
				stu_name VARCHAR(20),
				gender CHAR(1),
				seat INT,
				age INT,
				major_id INT,
				
				CONSTRAINT pk PRIMARY KEY(id),	##设置(id)主键
				CONSTRAINT uq UNIQUE(seat),	##设置(seat)唯一键
				CONSTRAINT ck CHECK(gender='男' OR gender='女'),	##检查
				CONSTRAINT fk_stu_test_major FOREIGN KEY(major_id) REFERENCES major(id)	#外键
			); 

3、一种通用的写法
	#按例2:创建stu_test 表
	——CREATE TABLE IF NOT EXISTS stu_test(
				id int primary key, 	##主键
				stu_name varchar(20) not null, 		##非空
				gender char(1) check(gender='男' or gender='女'),		##检查
				seat int union, 		##唯一
				age int default 18,		##默认约束
				major_id INT,
				
				CONSTRAINT fk_stu_test_major FOREIGN KEY(major_id) REFERENCES major(id)	#外键
			); 

二、修改表时添加约束
语法:
	①、添加列级约束
	——alter table 表名 modify column 字段名 数据类型 新约束;
	②、添加表级约束
	——alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】;

	#案例1:删除刚才上面创建的stu_test 表
	——drop table stu_test;		##删除stu_test 表
	#按例2:创建stu_test 表
	——CREATE TABLE IF NOT EXISTS stu_test(
				id INT,
				stu_name VARCHAR(20),
				gender CHAR(1),
				seat INT,
				age INT,
				major_id INT
			); 
	#案例3:给stu_name 字段添加非空(not null)约束
	——alter table stu_test modify column stu_name varchar(20) not null;
	#案例4:给age 字段添加默认(default)约束
	——alter table stu_test modify column age int default;
	#案例5:给id 字段添加主键(primary key)约束
	——alter table stu_test modify column id int primary key;
	#案例6:给seat 字段添加唯一(unique)约束
	——alter table stu_test modify column seat int unique;
	——alter table stu_test add unique(seat);
	#案例7:给major_id 字段添加外键(foreign key)约束
	——alter table stu_test add foreign key(major_id) references major(id); 

三、修改表时删除约束
1、删除非空约束
#案例1:删除stu_name 字段的非空(not null)约束
——alter table stu_test modify column stu_name varchar(20) null;
#案例2:删除age 字段的默认(default)约束
——alter table stu_test modify column age int;
#案例3:删除seat 字段的唯一(unique)约束
——alter table stu_test modify column seat int;
——alter table stu_test drop index seat;
#案例4:删除id 字段的主键(primary key)约束
——alter table stu_test drop primary key
#案例5:删除major_id 字段的外键(foreign key)约束
——alter table stu_test drop foreign key major_id;

四、删除主表的记录
	#方式一:级联删除(把指定字段在主表、从表均删除)
	——alter table stu_test add constraint fk_stu_major foreign key(major_id) references major(id) on delete cascade;
	#方式二:级联置空(把指定字段在主表中的外键置空、从表删除该记录)
	——alter table stu_test add constraint fk_stu_major foreign key(major_id) references major(id) on delete set null;

总结:
							位置						支持的约束类型							是否可以起约束名
	列级约束:		列的后面				语法都支持,但外键没有效果			不可以
	表级约束:		所有列的下面		默认和非空不支持,其他支持			可以(主键没有效果)


五、标识列(自增长列)
含义:可以不用手动的插入值,系统提供默认的序列值
特点:
	① 标识列不一定要和主键搭配,但要求是一个key
	② 一个表有且仅有一个标识列
	③ 标识列的类型只能是数值型
	④ 标识列可以通过set auto_increment_increment=3;设置步长

语法:
	——create table 表名(
					字段名 类型 约束(key:primary key、unique) auto_increment,
					.................,
					字段名 类型 约束
			);
	
	#案例1:删除刚才上面创建的stu_test 表,并且把id 字段设置为主键和自增模式
	——drop table stu_test;		##删除stu_test 表
	#按例2:创建stu_test 表
	——CREATE TABLE IF NOT EXISTS stu_test(
					id int primary key auto_increment,		##设置为自增模式,此字段的约束必须为key
					stu_name VARCHAR(20),
					gender CHAR(1),
					seat INT,
					age INT,
					major_id INT
				);

六、修改表时设置标识列
	#案例1:去掉stu_test 表中的主键约束
	——alter table stu_test drop primary key;
	#案例2:给stu_test 表中的id 字段添加主键约束和设置自增模式
	——ALTER TABLE stu_test MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

七、修改表时删除标识列
ALTER TABLE stu_test MODIFY COLUMN id INT PRIMARY KEY;
  1. TCL(Transaction Controller language)事务控制语言
    事务:一个或一组sql 语句组件一个执行单元,这个执行单元要么全部执行,要么全部不执行。事务是由单独单元的一个或多个SQL 语句组成,在这个单元中,每个MySQL 语句是互相依赖的,而整个单独单元作为一个不可分割的整体,如果单元中的某条SQL 语句一旦执行失败或产生错误,整个单元将会进行回滚操作,所有收到影响的数据将会返回到事务开启前的一个状态;如果单元中的所有SQL 语句均执行成功,则事务被顺利执行。
一、
	#案例1:转账
		张三丰		1000
		郭襄			1000
		update 表名	set 张三丰的余额=1000-500 where name='张三丰';
		意外/异常/报错
		update 表名 set 郭襄的余额=1000+500 where name='郭襄';

1、多个事务并发问题
——对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
	① 脏读:对于两个事务A、B,A读取了已经被B更新但还没有被提交的字段之后,若B进行了回滚,那么A读取到的数据就是临时且无效的(读取到了无效的数据)。
	② 不可重复读:对于两个事务A、B,A读取了一个字段,然后B提交更新了该字段之后,A再次读取同一个字段,拿到的值就不同了(前后两次读取到不同地数据——相对于更新)。
	③ 幻读:对于两个事务A、B,A从一个表中读取了一个字段,然后B往该表插入了多行新的数据之后,A再次读取该表时就会比之前多出几行(前后两次读取到不同地数据——相对于插入)。

2、事务的ACID 属性
	① 原子性(atomicity)——原子性是指事务是一个不可分割的处理单位,事务中的操作要么都发生,要么都不发生。
	② 一致性(consistency)——事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
	③ 隔离性(isolation)——事务的隔离性是指一个事务的执行表態被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行各个事务之间互相干扰。
	④ 持久性(durability)——持久性是指一个事物一旦被提交,它对数据库中数据的改变就是永久性的,就接下来的其他操作和数据库故障不应该对其有任何影响。

3、事务的创建
	① 隐式事务:事务没有明显的开启和结束的标记(比如:insert、update、delete 语句)
	② 显示事务:事务具有明显的开启和结束的标记(如:autocommit=0/1)
	步骤1:开启事务
		set autocommit=0;
		start transaction;		##可选的
	步骤2:编写事务中的SQL语句(select、insert、update、delete)
		语句1;
		语句2;
		........,
	步骤3:结束事务
		commit;		##提交事务(数据持久化到磁盘文件中)
		rollback;		##回滚事务(数据只是存储到了内存中,还没有持久化到磁盘文件中)
		savepoint a;		##设置回滚点(搭配rollback使用,rollback to a——当某事务需要的时候设置回滚的节点)

4、操作事务命令行
	① 查看当前事务隔离级别
	——select @@tx_isolation;
	② 设置当前MySQL 连接的事务隔离级别
	——set transaction isolation level (read uncommitted、read commit、repeatable read、serializable);
	③ 设置数据库系统的全局的事务隔离级别
	——set global transaction isolation level  (read uncommitted、read commit、repeatable read、serializable);

5、delete 和 truncate 在事务处理中的区别
	① delete:当事务执行了delete 后在执行rollback,被delete 的数据可以恢复
	② truncate:当事务执行了truncate 后在执行rollback,被delete 的数据不可以恢复

数据库对事务的四种隔离级别:

隔离级别 描述
read uncommitted(读未提交数据) 允许事务读取为被其他事务提交的变更、脏读、不可重复读和幻读的问题都会出现
read commit(读已提交数据) 只允许事务读取已经被其他事务提交了的变更、可以避免脏读,但是不可重复读和幻读问题仍然存在
repeatable read(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读,但幻读的问题仍然存在。
serializable(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该进行更新、插入和删除操作。所有并发问题都可以避免,但性能底下
脏读 不可重复读 幻读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

各种数据库产品对事务隔离级别的支持程度

oracle mysql
READ UNCOMMITTED ×
READ COMMITTED √(默认)
REPEATABLE READ × √(默认)
SERIALIZABLE
  1. 视图
    含义:虚拟表,和普通表一样使用。一种虚拟存在的表,行和列的数据来自定义视图的查询中事务的表,并且是在使用视图时动态生成的,只保存‘sql 逻辑’,不报错查询结果
    应用场景:
    1)、多个地方用到同样的查询结果
    2)、该查询结果使用的sql 语句比较复杂
1、teacher 表
	CREATE TABLE `teacher` (
		  `Id` int(11) NOT NULL AUTO_INCREMENT,
		  `last_name` varchar(255) DEFAULT NULL COMMENT '名字字段',
		  `age` varchar(255) DEFAULT NULL COMMENT '年龄字段',
		  PRIMARY KEY (`Id`)
		) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='老师数据表';

2、student 表
	CREATE TABLE `student` (
		  `Id` int(11) NOT NULL AUTO_INCREMENT,
		  `last_name` varchar(255) DEFAULT NULL COMMENT '学生名字',
		  `sex` varchar(255) DEFAULT NULL COMMENT '学生性别',
		  `tech_id` int(11) DEFAULT NULL,
		  PRIMARY KEY (`Id`)
		) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='一个学生表';

3、给teacher 表和student 表建立联合临时表(视图)
语法:
	create view 视图名
	as 查询语句;

优点:
	① 重用 SQL 语句(视图创建好了以后可持续用)
	② 简化复杂的SQL 操作,不必知道它的查询细节(简化了之前使用的嵌套方式查询)
	③ 保护数据,提高安全性(可以在不知道字段的情况下创建视图使用)

实例:
	——create view v1 
			as select s.last_name as stu_name, t.last_name as tech_name
			from student as s
			inner join teacher as t
			on s.tech_id=t.id;
	
	#案例1:查询临时表的内容
	——SELECT * FROM v1;
	#案例2:查询临时表中tech_name='李四' 字段的内容
	——SELECT stu_name FROM v1 WHERE tech_name='李四';
	#案例3:查询姓张的学生、分数和指导组老师的信息
		①创建视图
		——create view v
				as select s.last_name as stu_name, score, t.*
				from student as s
				inner join teacher as t
				on s.tech_id=t.id;
		②查询内容
		——select * from v where stu_name like '%张%';
	#案例4:查询各部门的平均工资级别
		①创建视图
		——create view v
				as select avg(salary) as ag, department_id
				from employees
				group by department_id;
		②查询内容
		——select v.ag, v.department_id, grade_level
				from v
				inner join job_grade as g
				on v.ag between g.lowest_sal and hignest_sal;
	#案例5:查询平均工资最低的部门信息
		①查询内容
		——select min(ag) as 最低平均工资, d.*
				from v
				inner join departments as d
				on v.department_id=d.department_id;
	#案例6:查询平均工资最低的部门名和工资
		①查询内容
		——select min(ag) as 最低平均工资, d.department_name
				from v
				inner join departments as d
				on v.department_id=d.department_id;

4、修改视图
	方式一:
	——create or replace view 视图名
			as 查询语句;
	实例:
	——CREATE OR REPLACE VIEW v1 
			AS SELECT s.last_name AS stu_name, t.*
			FROM student AS s
			INNER JOIN teacher AS t
			ON s.tech_id=t.id;

	方式二:
	——alter view 视图名
			as 查询语句;
	实例:
	——ALTER VIEW v1 
			AS SELECT s.last_name AS stu_name, score AS 分数, t.*
			FROM student AS s
			INNER JOIN teacher AS t
			ON s.tech_id=t.id;

5、删除视图
	语法:drop view 视图名, 视图名, ....;
	实例:drop view v1;

练习:
	#案例1:创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
		①创建视图
		——create or replace view emp_v1
				as select e.last_name as emp_name, salary, email
				from employees
				where phone_number like='011%';
		②查询内容
		——select * from emp_v1;
	#案例2:创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息
		①创建视图
		——create or replace view emp_v2
				as select max(salary) as max_sal, d.*
				from employees
				group by department_id
				having max_sal>12000;
		②查询内容
		——select * from emp_v2;

6、视图数据更新
	注意:视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
		①包含以下关键字的SQL语句:分组函数、distinct、group by、having、union/union all
		——create or replace stu_tech
				as select last_name, score
				from student
				group by tech_id;
		②常量视图
		——create or replace stu_tech
				as select name='张飞'
		③select 中包含子查询
		——create or replace stu_tech
				as select(select * from teacher);
		④join
		——create or replace stu_tech
				as select s.last_name, t.*
				from student as s
				inner join teacher as t
				on s.tech_id=t.id;
		⑤from 一个不能更新的视图
		——create or replace stu_tech2
				as select * from stu_tech;
		⑥where 子句的子查询引用了from 子句中的表
		——create or replace stu_tech3
				as select last_name, score
				from student
				where tech_id in(
						select id from teacher course='体育'
				);
		
	#案例1:创建一个student 和 teacher 的视图stu_tech
	——create or replace view stu_tech
			as select s.last_name, score
			from student
	#案例2:往stu_tech 视图插入数据
	——INSERT INTO stu_tech(last_name, score) VALUES('丰田', 89);
	#案例3:往stu_tech 视图修改数据
	——update stu_tech set score=90 where last_name='丰田'
	#案例4:往stu_tech 视图删除数据
	——delete from stu_tech where last_name='丰田';
创建语法的关键字 是否实际占用物理空间 使用
视图 create view 只是保存了SQL 逻辑 增删查改,一般不能增删改
create table 保存了数据 增删查改
练习题:
	#案例1:创建Book 表,字段如下:
					b_id 整型,要求主键
					b_name 字符型,要求设置唯一键,并非空
					price 浮点型,要求有默认值10
					b_type_id 类型编号,要求引用bookType表的 id 字段
			已知bookType 表字段有(id、name)
	——create table Book(
				b_id int primary key,
				b_name varchar(20) unique not null,
				price float default 20,
				b_type_id int,
				foreign key(b_type_id) references bookType(id)
			);
	#案例2:开启事务,向表中插入一行数据,并结束
	——set autocommit=0;
	——start transaction;
	——insert into Book(b_name, price, b_type_id) values('JavaWeb', 25, 3);
	——commit;
	#案例3:创建视图,视图查询价格大于100的书名和类型名
	——create view b_v
			as select b_name, tb.name as b_type_name
			from Book as b
			inner join bookType as bt
			on b.b_type_id=bt.id
			where b.price>100;
	#案例4:修改视图,实现查询价格90~120之间的书名和价格
	——create or replace view b_v2
			as select b_name, price
			from Book
			where price between 90 and 120;
	#案例5:删除刚才创建的视图
	——drop view b_v2;

你可能感兴趣的:(MySQL)