MySQL基础篇(day 07,复习自用)

约束

内容

#第13章_约束

/*
1.基础知识
1.1 为什么需要约束?
为了保证数据的完整性

1.2什么叫约束?对表中字段的限制。

1.3 约束的分类:

角度1:约束的字段的个数
单列约束 vs 多列约束

角度2:约束的作用范围

列级约束:将此约束声明在对应字段的后面
表级约束:在表中所有字段都声明完以后,在所有字段的后面声明的约束

角度3:约束的作用(或功能)

① NOT NULL (非空约束)
② UNIQUE (唯一性约束)
③ PRIMARY KEY(主键约束)
④ FOREIGN KEY(外键约束)
⑤ CHECK(检查约束)
⑥ DEFAULT(默认值约束)

1.4 如何添加约束?

CREATE TABLE 时添加约束

ALTER TABLE 时增加约束、删除约束

*/

#2.如何查看表中的约束
#information_schema数据库名(系统库)
#table_constraints表名称(专门存储各个表的约束)
SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'employees';

CREATE DATABASE dbtest13;
USE dbtest13;

#3.NOT NULL(非空约束)
#3.1在CREATE TABLE时添加约束

CREATE TABLE test1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
salary DECIMAL(10,2)
);

DESC test1;

INSERT INTO test1(id,last_name,email,salary)
VALUES (1,'Tom','tom@126.com',3400);

#Column 'last_name' cannot be null
INSERT INTO test1(id,last_name,email,salary)
VALUES (2,NULL,'tom1@126.com',3400);

#Column 'id' cannot be null
INSERT INTO test1(id,last_name,email,salary)
VALUES (NULL,'Jerry','jerry@126.com',3400);

#Field 'last_name' doesn't have a default value
INSERT INTO test1(id,email)
VALUES(2,'abc@126.com');

UPDATE test1
SET last_name = NULL
WHERE id = 1;

SELECT * FROM test1;

#3.2 在ALTER TABLE时添加约束
DESC test1;

ALTER TABLE test1
MODIFY email VARCHAR(25) NOT NULL;

#3.3在ALTER TABLE时删除约束
ALTER TABLE test1
MODIFY email VARCHAR(25) NULL;

#4.unique
#4.1 在CREATE TABLE时添加约束
CREATE TABLE test2(
id INT UNIQUE, #列级约束
last_name VARCHAR(15),
email VARCHAR(25) ,
salary DECIMAL(10,2),

#表级约束
CONSTRAINT uk_test2_email UNIQUE (email)
#也可以直接 UNIQUE(email)
); 


DESC test2;

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'test2';

#在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'Tom','tom@126.com',4500);

#错误:Duplicate entry '1' for key 'test2.id'
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'Tom1','tom1@126.com',4600);

#错误:Duplicate entry 'tom@126.com' for key 'test2.uk_test2_email'
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'Tom1','tom@126.com',4600);

#可以向声明为UNIQUE的字段上添加NULL值。而且可以多次添加NULL值
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'Tom1',NULL,4600);

INSERT INTO test2(id,last_name,email,salary)
VALUES(3,'Tom2',NULL,4600);

SELECT * FROM test2;

#4.2在ALTER TABLE时添加约束

DESC test2;
 
UPDATE test2
SET salary = 5000
WHERE id = 3; 

#建表后指定唯一键约束
#只有表级约束才能添加约束名,使用MODIFY修改的是字段,为列级约束,所以不能使用CONSTRAINT
#方式1:
ALTER TABLE test2
ADD CONSTRAINT uk_test2_sal UNIQUE(salary);

#方式2:
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE; 

#4.3复合的唯一性约束
CREATE TABLE USER(
id INT,
`name` VARCHAR(15),
`password` VARCHAR(25),#勿忘逗号

#表级约束 
CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`)

);

INSERT INTO USER
VALUES(1,'Tom','abc');
#可以添加成功的,也就是只是不能添加name和password完全相同。 
INSERT INTO USER
VALUES(1,'Tom1','abc');

SELECT * FROM USER;

#案例:符合的唯一性约束的案例

#学生表
CREATE TABLE student(
sid INT, #学号
sname VARCHAR(20), #姓名
tel CHAR(11) UNIQUE KEY, #电话
cardid CHAR(18) UNIQUE KEY #身份证号
);
#课程表
CREATE TABLE course(
cid INT, #课程编号
cname VARCHAR(20) #课程名称
);
#选课表
CREATE TABLE student_course(
id INT,
sid INT,
cid INT,
score INT,
UNIQUE KEY(sid,cid) #复合唯一
);

INSERT INTO student VALUES(1,'张三','13710011002','101223199012015623');#成功
INSERT INTO student VALUES(2,'李四','13710011003','101223199012015624');#成功
INSERT INTO course VALUES(1001,'Java'),(1002,'MySQL');#成功

SELECT * FROM student;

SELECT * FROM course;

INSERT INTO student_course VALUES
(1, 1, 1001, 89),
(2, 1, 1002, 90),
(3, 2, 1001, 88),
(4, 2, 1002, 56);#成功

SELECT * FROM student_course;

#Duplicate entry '2-1002' for key 'student_course.sid'
INSERT INTO student_course 
VALUES (5,2,1002,67);
 
#4.4删除唯一性约束 
-- 添加唯一性约束的列上也会自动创建唯一索引。
-- 删除唯一约束只能通过删除唯一索引的方式删除。
-- 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
-- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()
-- 中排在第一个的列名相同。也可以自定义唯一性约束名。
 
SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'student_course';
 
SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'test2';

DESC test2;

#如何删除唯一性索引
ALTER TABLE test2
DROP INDEX last_name;
 
ALTER TABLE test2
DROP INDEX uk_test2_sal;


#5.PRIMARY KEY(主键约束)
#5.1 在CREATE TABLE时添加约束

#一个表中最多只能有一个主键约束。

#错误:Multiple primary key defined
CREATE TABLE test3(
id INT PRIMARY KEY,#列级约束
last_name VARCHAR(15) PRIMARY KEY,
salary DECIMAL(10,2),
email VARCHAR(25)
);

#主键约束特征:非空且唯一,用于唯一的标识表中的一条记录。
CREATE TABLE test4(
id INT PRIMARY KEY,#列级约束
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);

#MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
CREATE TABLE test5(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25),

#表级约束
CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字。
);

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'test5';
 
INSERT INTO test4(id,last_name,salary,email)
VALUES (1,'Tom',4500,'tom@126.com');

#错误:Duplicate entry '1' for key 'test4.PRIMARY'
INSERT INTO test4(id,last_name,salary,email)
VALUES (1,'Tom',4500,'tom@126.com');

#错误:Column 'id' cannot be null
INSERT INTO test4(id,last_name,salary,email)
VALUES (NULL,'Tom',4500,'tom@126.com');

SELECT *
FROM test4;

CREATE TABLE user1(
id INT,
NAME VARCHAR(15),
PASSWORD VARCHAR(25),

PRIMARY KEY(NAME,PASSWORD)
);

INSERT INTO user1
VALUES (1,'Tom','abc');

INSERT INTO user1
VALUES (1,'Tom1','abc');

#Column 'name' cannot be null
#如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
INSERT INTO user1
VALUES (1,NULL,'abc');

SELECT * FROM user1;

#5.2 在ALTER TABLE时添加约束
CREATE TABLE test6(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);

DESC test6;

ALTER TABLE test6
ADD PRIMARY KEY (id);

#5.3 如何删除主键约束(在实际开发中,不会去删除主键约束)
ALTER TABLE test6
DROP PRIMARY KEY;

#6.自增长类:AUTO_INCREMENT
#6.1在CREATE TABLE时添加
CREATE TABLE test7(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15)
);

#开发中,一旦主键作用的字段上声明有AUTO_INCREMENT,则我们在添加数据时,就不要给主键对应的字段去赋值了。
INSERT INTO test7(last_name)
VALUES ('Tom');

SELECT * FROM test7;

#当我们向主键(含AUTO_INCREMENT)的字段上添加0或NULL时,实际上会自动地往上添加指定的字段的数值
INSERT INTO test7(id,last_name)
VALUES (0,'Tom');

INSERT INTO test7(id,last_name)
VALUES (NULL,'Tom');

INSERT INTO test7(id,last_name)
VALUES (-10,'Tom');

INSERT INTO test7(id,last_name)
VALUES (10,'Tom');

#6.2在ALTER TABLE 时添加
CREATE TABLE test8(
id INT PRIMARY KEY ,
last_name VARCHAR(15)
);

DESC test8;

ALTER TABLE test8
MODIFY id INT AUTO_INCREMENT;

#6.3在ALTER TABLE时删除
ALTER TABLE test8
MODIFY id INT;

#6.4 MySQL 8.0新特性—自增变量的持久化
CREATE TABLE test9(
id INT PRIMARY KEY AUTO_INCREMENT
);
 
INSERT INTO test9
VALUES (0),(0),(0),(0);

SELECT * FROM test9; 
 
DELETE FROM test9
WHERE id = 4;

INSERT INTO test9
VALUES (0);

DELETE FROM test9
WHERE id = 5;

#重启服务器

SELECT * FROM test9;

INSERT INTO test9
VALUES (0);

#7.foreign key(外键约束)
#7.1 在CREATE TABLE 时添加

#主表和从表:父表和子表
#先创建主表

#①先创建主表
CREATE TABLE dept1(
dept_id INT,
dept_name VARCHAR(15)
);

#②再创建从表
CREATE TABLE emp1(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT,

#表级约束
CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCE dept1(dept_id)

);

#上述操作报错,因为主表中的dept_id上没有主键约束或唯一性约束。
#③添加
ALTER TABLE dept1
ADD PRIMARY KEY(dept_id);

DESC dept1;

#④再创建从表
CREATE TABLE emp1(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT,

#表级约束
CONSTRAINT fk_emp1_dept_id FOREIGN KEY (department_id) REFERENCES dept1(dept_id)

);

DESC emp1;

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'emp1';

#7.2演示外键的效果
#添加失败
INSERT INTO emp1
VALUES (1001,'Tom',10);

#
INSERT INTO dept1
VALUES (10,'IT');

#
INSERT INTO emp1
VALUES (1001,'Tom',10);

#删除失败
DELETE FROM dept1
WHERE dept_id = 10;

#更新失败
UPDATE dept1
SET dept_id = 20
WHERE dept_id = 10;

#7.3在ALTER TABLE时添加外键约束
CREATE TABLE dept2(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);

CREATE TABLE emp2(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT
);

ALTER TABLE emp2
ADD CONSTRAINT fk_emp2_dept_id FOREIGN KEY (department_id) REFERENCES dept2(dept_id);

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'emp2';

#7.4 约束等级
-- Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
-- Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子
-- 表的外键列不能为not null
-- No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
-- Restrict方式 :同no action, 都是立即检查外键约束
-- Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置
-- 成一个默认的值,但Innodb不能识别

#对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式

#7.5 删除外键约束

#一个表中可以声明有多个外键约束
USE atguigudb;

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'employees';

USE dbtest13;

SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = 'emp1';

#删除外键约束
ALTER TABLE emp1
DROP FOREIGN KEY fk_emp1_dept_id;

#再手动的删除外键约束对应的普通索引
SHOW INDEX FROM emp1;

ALTER TABLE emp1
DROP INDEX fk_emp1_dept_id;

#8.check 约束
#MySQL5.7不支持CHECK约束,MySQL8.0支持CHECK约束。
CREATE TABLE test10(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) CHECK (salary > 2000)
);

INSERT INTO test10
VALUES (1,'Tom',2500);

#添加失败
#Check constraint 'test10_chk_1' is violated.
INSERT INTO test10
VALUES (2,'Tom1',1500);

#9.DEFAULT约束
#9.1在CREATE TABLE添加约束
CREATE TABLE test11(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000 
);

DESC test11;
 
INSERT INTO test11(id,last_name,salary)
VALUES (1,'Tom',3000);

INSERT INTO test11(id,last_name)
VALUES (2,'Tom1')

SELECT * FROM test11;

#9.2 在ALTER TABLE添加约束
CREATE TABLE test12(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) 
);

DESC test12;

ALTER TABLE test12
MODIFY salary DECIMAL(8,2) DEFAULT 2500;

#9.3 在ALTER TABLE删除约束
ALTER TABLE test12
MODIFY salary DECIMAL(8,2);

SHOW CREATE TABLE test12;



练习

#第13章 练习
CREATE DATABASE test04_emp;

USE test04_emp;

CREATE TABLE emp2(
id INT,
emp_name VARCHAR(15)
);
CREATE TABLE dept2(
id INT,
dept_name VARCHAR(15)
);

#练习1:
#1.向表emp2的id列中添加PRIMARY KEY约束
ALTER TABLE emp2
MODIFY id INT PRIMARY KEY;#也可以用ADD
#ADD PRIMARY KEY(id)

#2. 向表dept2的id列中添加PRIMARY KEY约束
ALTER TABLE dept2
#MODIFY id  INT PRIMARY KEY;
ADD PRIMARY KEY(id);

#3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,
#与之相关联的列是dept2表中的id列。
#不会
ALTER TABLE emp2
ADD dept_id INT ;

DESC emp2;

ALTER TABLE emp2
ADD CONSTRAINT fk_emp2_deptid FOREIGN KEY (dept_id) REFERENCES dept2(id);

#练习2:
# 1、创建数据库test01_library
USE test01_library;

# 2、创建表 books,表结构如下:
DESC books; 
CREATE TABLE books(
id INT,
`name` VARCHAR(50),
`authors` VARCHAR(100),
price FLOAT,
pubdate YEAR,
note, VARCHAR(100),
num INT
);



# 3、使用ALTER语句给books按如下要求增加相应的约束
#给id增加主键约束
#方式1:
ALTER TABLE books
ADD PRIMARY KEY(id);

#给id字段增加自增约束
ALTER TABLE books
MODIFY id INT  AUTO_INCREMENT;

#也可以将上面2个要求合并
#方式2: 
ALTER TABLE books
MODIFY id INT PRIMARY KEY AUTO_INCREMENT;

#给name等字段增加非空约束
ALTER TABLE books MODIFY `name` VARCHAR(50) NOT NULL;
ALTER TABLE books MODIFY `authors` VARCHAR(100) NOT NULL;
ALTER TABLE books MODIFY price FLOAT NOT NULL;
ALTER TABLE books MODIFY pubdate YEAR NOT NULL;
ALTER TABLE books MODIFY num INT(11) NOT NULL;

DESC books;



#练习3:
#1. 创建数据库test04_company
CREATE DATABASE test04_company;
USE test04_company;

#2. 按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employees
CREATE TABLE offices(
officeCode INT(10) PRIMARY KEY,
city VARCHAR(50) NOT NULL,
address VARCHAR(50),
country VARCHAR(50) NOT NULL,
#postCode varchar(15) unique也可以
postalCode VARCHAR(15),
CONSTRAINT uk_off_postcode UNIQUE(postalCode)

);

DESC offices;

CREATE TABLE employees(
employeeNumber INT(11) PRIMARY KEY AUTO_INCREMENT,
lastName VARCHAR(50) NOT NULL,
firstName VARCHAR(50) NOT NULL,
mobile VARCHAR(25) UNIQUE,
officeCode INT(10)  NOT NULL,
jobTitle VARCHAR(50) NOT NULL,
birth DATETIME NOT NULL,
note VARCHAR(255),
sex VARCHAR(5),

#FOREIGN KEY后面的officeCode要加括号
CONSTRAINT fk_emp_offCode FOREIGN KEY (officeCode) REFERENCES offices(officeCode)
);

DESC employees;

#3. 将表employees的mobile字段修改到officeCode字段后面
ALTER TABLE employees
MODIFY mobile VARCHAR(25) AFTER officeCode;

#4. 将表employees的birth字段改名为employee_birth
#用CHANGE而不是RENAME
ALTER TABLE employees
CHANGE birth employee_birth DATETIME;

#5. 修改sex字段,数据类型为CHAR(1),非空约束
ALTER TABLE employees
MODIFY sex CHAR(1) NOT NULL;

#6. 删除字段note
ALTER TABLE employees
DROP COLUMN note;

#错误写法
DROP COLUMN note
FROM TABLE employees;

#7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)
ALTER TABLE employees
ADD favoriate_activity VARCHAR(100);

#8. 将表employees名称修改为employees_info
RENAME TABLE employees
TO employees_info;

DESC employees_info;

视图

内容

#第14章_视图(view)

/*
1.视图的理解
①视图,可以看做是一个虚拟表,本身是不存储数据的。
视图的本质,就可以看做是存储起来的SELECT语句。

②视图中SELECT语句中涉及到的表,称为基表。

③针对视图做DML操作,会影响到对应的基表中的数据。反之亦然。

④视图本身的删除,不会导致基表中数据的删除。

⑤视图的应用场景:针对于小型项目,不推荐使用视图。

⑥视图的优点:简化查询;控制数据的访问


*/

#2.如何创建视图
#准备工作
CREATE DATABASE dbtest14;

USE dbtest14;

CREATE TABLE emps
AS
SELECT *
FROM atguigudb.employees;

CREATE TABLE depts
AS
SELECT *
FROM atguigudb.departments;

SELECT * FROM emps;

SELECT * FROM depts;

DESC emps;

DESC atguigudb.employees;

#2.1针对于单表
#情况1:视图中的字段与基表的字段有对应关系。
CREATE VIEW vu_emp1
AS
SELECT employee_id,last_name,salary
FROM emps;

SELECT * FROM vu_emp1;
#确定视图中字段名的方式1:
CREATE VIEW vu_emp2
AS
SELECT employee_id emp_id,last_name lname,salary #查询语句中字段的别名会作为视图中字段的名称出现
FROM emps
WHERE salary > 8000;

SELECT * FROM vu_emp2;

#确定视图中字段名的方式2:
CREATE VIEW vu_emp3(emp_id,NAME,monthly_sal) #小括号内字段个数与SELECT中字段个数相同
AS
SELECT employee_id,last_name ,salary 
FROM emps
WHERE salary > 8000;

SELECT * FROM vu_emp3;

#情况2:视图中的字段在基表可能没有对应的字段。
CREATE VIEW vu_emp_sal
AS
SELECT department_id,AVG(salary) avg_sal
FROM emps
WHERE department_id IS NOT NULL
GROUP BY department_id;

SELECT * FROM vu_emp_sal;

#2.2 针对于多表
CREATE VIEW vu_emp_dept
AS
SELECT e.employee_id,e.department_id,d.department_name
FROM emps e JOIN depts d
ON e.department_id = d.department_id

SELECT * FROM vu_emp_dept;

#利用视图对数据进行格式化
CREATE VIEW vu_emp_dept1
AS
SELECT CONCAT(e.last_name,'(',d.department_name,')') emp_info
FROM emps e JOIN depts d
ON e.department_id = d.department_id

SELECT * FROM vu_emp_dept1;

#2.3基于视图创建视图

CREATE VIEW ev_emp4
AS
SELECT employee_id,last_name
FROM vu_emp1;

SELECT * FROM ev_emp4;

#3.查看视图
#语法1:查看数据库的表对象、视图对象
SHOW TABLES;

#语法2:查看视图的结构
DESC vu_emp1;

#语法3:查看视图的属性信息
SHOW TABLE STATUS LIKE 'vu_emp1';

#语法4:查看视图的详细定义信息
SHOW CREATE VIEW vu_emp1;

#4."更新"视图中的数据
#4.1 一般情况,可以更新视图的数据
SELECT * FROM vu_emp1;

SELECT employee_id,last_name,salary
FROM emps;
#更新视图的数据,会导致基表中数据的修改
UPDATE vu_emp1
SET salary = 20000
WHERE employee_id = 101;

#同理,更新表中的数据,也会导致视图中的数据的修改
UPDATE emps
SET salary = 10000
WHERE employee_id = 101;

#删除视图中的数据,也会导致视图中的数据的删除
DELETE FROM vu_emp1
WHERE employee_id = 101;

#4.2不能更新视图的数据
SELECT * FROM vu_emp_sal;

#更新失败
#The target table vu_emp_sal of the UPDATE is not updatable
UPDATE vu_emp_sal
SET avg_sal = 5000
WHERE department_id = 30;

#更新失败
DELETE FROM vu_emp_sal
WHERE department_id = 30;

#5.修改视图
DESC vu_emp1;

#方式1:
CREATE OR REPLACE VIEW vu_emp1
AS
SELECT employee_id,last_name,salary,email
FROM emps
WHERE salary > 7000;

#方式2:
ALTER VIEW vu_emp1
AS
SELECT employee_id,last_name,salary,email,hire_date
FROM emps;

#6.删除视图
SHOW TABLES;

DROP VIEW ev_emp4;

DROP VIEW IF EXISTS vu_emp2,vu_emp3;



练习

#第14章 练习
USE dbtest14;
#练习1:
#1. 使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME),
#员工号(EMPLOYEE_ID),部门号(DEPARTMENT_ID)
CREATE OR REPLACE VIEW employee_vu(lname,emp_id,dept_id)
AS
SELECT last_name,employee_id,department_id
FROM emps;

#2. 显示视图的结构
DESC employee_vu;

#3. 查询视图中的全部内容
SELECT * FROM employee_vu;

#4. 将视图中的数据限定在部门号是80的范围内
#不会
ALTER VIEW employee_vu(lname,emp_id,dept_id)
AS 
SELECT last_name,employee_id,department_id
FROM emps
WHERE department_id = 80;

#或者:
CREATE OR REPLACE VIEW employee_vu
AS
SELECT last_name,employee_id,department_id
FROM emps
WHERE department_id = 80;

SELECT * FROM emps;
#练习2:
#1. 创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,salary,email
FROM emps
WHERE phone_number LIKE '011%';

#2. 要求将视图 emp_v1 修改为查询电话号码以‘011’开头的并且
#邮箱中包含 e 字符的员工姓名和邮箱、电话号码
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,email,phone_number,salary
FROM emps
WHERE phone_number LIKE '011%'
AND email LIKE '%e%';

SELECT * FROM emp_v1;

#3. 向 emp_v1 插入一条记录,是否可以?
DESC emps;
#实测:失败了
INSERT INTO emp_v1
VALUES ('Tom','tom@126.com','01012345')


SELECT * FROM emp_v1;
#4. 修改emp_v1中员工的工资,每人涨薪1000
UPDATE emp_v1
SET salary = salary + 1000;

#5. 删除emp_v1中姓名为Olsen的员工
DELETE FROM emp_v1
WHERE last_name = 'Olsen';


#6. 创建视图emp_v2,要求查询部门的最高工资高于 12000 的部门id和其最高工资
CREATE OR REPLACE VIEW emp_v2(dept_id,max_sal)
AS
SELECT department_id,MAX(salary)
FROM emps
GROUP BY department_id
HAVING MAX(salary) > 12000;

SELECT * FROM emp_v2;
#7. 向 emp_v2 中插入一条记录,是否可以?
#不可以
#The target table emp_v2 of the INSERT is not insertable-into
INSERT INTO emp_v2(dept_id,max_sal)
VALUES (4000,20000)


#8. 删除刚才的emp_v2 和 emp_v1
DROP VIEW IF EXISTS emp_v2,emp_v1;

SHOW TABLES;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值