一、插入语句
方式一(经典插入):
语法:
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(没有筛选条件)
一、数据库的管理
创建(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、数值型:
整型
浮点型:
定点数
浮点数
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、创建表时
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:转账
张三丰 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、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;