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

这篇具有很好参考价值的文章主要介绍了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;





文章来源地址https://www.toymoban.com/news/detail-524033.html

到了这里,关于MySQL基础篇(day 07,复习自用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库——MYSQL复习

    单表查询 1.查询指定列 select id,name from t_student 2.查询全部列 select * from t_student 3.查询经过计算的值 select id, age-18 from t_student 4.消除取值重复的行 select name distinct from t_student 5.查询满足条件的元祖(比较、确定范围(between 18 and 20)、确定集合(in (‘李四’,‘王五’))、字符

    2024年02月08日
    浏览(38)
  • mysql 数据库 期末复习题库

    一、选择题 第 1 章 数据库系统概述 1 . DBS 是(   A )的简写。 A. 数据库系统   B. 数据库管理系统    C. 数据库    D. 操作系统 2.DBMS 是 (  B   ) 的简写 A. 数据库系统   B. 数据库管理系统    C. 数据库    D. 数据 3.DB 、 DBMS 和 DBS 之间的关系是   (  C  ) A. DB 包含 DBMS 和

    2024年02月08日
    浏览(46)
  • MySQL 数据库的备份与还原案例分享 2023.07.12

        1、使用mysqldump命令备份数据库中的所有表     2、备份booksDB数据库中的books表     3、使用mysqldump备份booksDB和test数据库     4、使用mysqldump备份服务器中的所有数据库     5、使用mysql命令还原第二题导出的book表     6、进入数据库使用source命令还原第二题导出的bo

    2024年02月16日
    浏览(42)
  • 【100天精通python】Day44:python网络爬虫开发_爬虫基础(爬虫数据存储:基本文件存储,MySQL,NoSQL:MongDB,Redis 数据库存储+实战代码)

    目录 1 数据存储 1.1 爬虫存储:基本文件存储 1.2 爬虫存储:使用MySQL 数据库 1.3 爬虫 NoSQL 数据库使用 1.3.1 MongoDB 简介

    2024年02月11日
    浏览(67)
  • MySQL数据库期末复习--这一篇就够了

    目录 一、前言 二、一些基本概念 1、时态数据库 2、分布式数据库 3、面向对象数据库 4、移动数据库 三、数据库的创建 1、工具 2、基本需求 3、根据上述需求画出E-R图 4、将E-R图转换成关系模式 5、建立数据表 6、每张数据表的结构 四、视图 1、创建视图 2、查看视图  3、更

    2024年02月09日
    浏览(61)
  • 【REST2SQL】07 GO 操作 Mysql 数据库

    【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle旗

    2024年01月22日
    浏览(89)
  • Day04 03-MySQL数据库的DCL(用户|权限|视图)

    第十二章 DCL 12.1 DCL的作用 DCL语句主要用来做用户的创建、管理,权限的授予、撤销等操作的。 12.2 管理用户 创建、删除用户的操作,必须要使用root用户才可以完成! 12.3 权限管理 如果在授权远程登录的时候,出现如下问题: Unable to load authentication plugin ‘caching_sha2_password’

    2024年02月07日
    浏览(56)
  • MySQL数据库基础之MySQL查询基础

    从今天开始,本系列内容就带各位小伙伴学习数据库技术 。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约【 1212】 字,不说废话,只讲可以让你学到技术、

    2024年02月06日
    浏览(52)
  • 【MySQL】 MySQL数据库基础

    🎄本节目标: 🚩数据库的操作:创建数据库、删除数据库 🚩常用数据类型 🚩表的操作:创建表、删除表 SHOW DATABASES; 使用如下: 🎈语法: 🎈语法说明 大写的表示 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 🎈示例: 🛫

    2024年02月08日
    浏览(50)
  • MySQL - 第1节 - MySQL数据库基础

    目录 1.数据库的概念 2.主流数据库 3.基本使用 3.1.连接服务器 3.2.服务器管理 3.3.数据库服务器,数据库,表关系 3.4.使用案例 3.4.1.数据存储路径 3.4.2.创建/删除数据库 3.4.3.使用数据库 3.4.4.创建数据库表 3.4.5.表中插入数据 3.4.6.查询表中的数据 3.5.数据逻辑存储 4.MySQL架构 5.SQ

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包