约束
内容
#第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;
文章来源地址https://www.toymoban.com/news/detail-524033.html
文章来源:https://www.toymoban.com/news/detail-524033.html
到了这里,关于MySQL基础篇(day 07,复习自用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!