MySql -数据库进阶

一、约束

1.外键约束
  • 外键约束概念

    • 让表和表之间产生关系,从而保证数据的准确性!
  • 建表时添加外键约束

    • 为什么要有外键约束
    -- 创建db2数据库
    CREATE DATABASE db2;
    -- 使用db2数据库
    USE db2;-- 创建user用户表
    CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,    -- idNAME VARCHAR(20) NOT NULL             -- 姓名
    );
    -- 添加用户数据
    INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四'),(NULL,'王五');-- 创建orderlist订单表
    CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,    -- idnumber VARCHAR(20) NOT NULL,          -- 订单编号uid INT                               -- 订单所属用户
    );
    -- 添加订单数据
    INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),
    (NULL,'hm003',2),(NULL,'hm004',2),
    (NULL,'hm005',3),(NULL,'hm006',3);-- 添加一个订单,但是没有所属用户。这合理吗?
    INSERT INTO orderlist VALUES (NULL,'hm007',8);
    -- 删除王五这个用户,但是订单表中王五还有很多个订单呢。这合理吗?
    DELETE FROM USER WHERE NAME='王五';-- 所以我们需要添加外键约束,让两张表产生关系
    
    • 外键约束格式
    CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
    
    • 创建表添加外键约束
    -- 创建user用户表
    CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,    -- idNAME VARCHAR(20) NOT NULL             -- 姓名
    );
    -- 添加用户数据
    INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四'),(NULL,'王五');-- 创建orderlist订单表
    CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,    -- idnumber VARCHAR(20) NOT NULL,          -- 订单编号uid INT,                              -- 订单所属用户CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)   -- 添加外键约束
    );
    -- 添加订单数据
    INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),
    (NULL,'hm003',2),(NULL,'hm004',2),
    (NULL,'hm005',3),(NULL,'hm006',3);-- 添加一个订单,但是没有所属用户。无法添加
    INSERT INTO orderlist VALUES (NULL,'hm007',8);
    -- 删除王五这个用户,但是订单表中王五还有很多个订单呢。无法删除
    DELETE FROM USER WHERE NAME='王五';
    
  • 删除外键约束

-- 标准语法
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;-- 删除外键
ALTER TABLE orderlist DROP FOREIGN KEY ou_fk1;
  • 建表后添加外键约束
-- 标准语法
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名);-- 添加外键约束
ALTER TABLE orderlist ADD CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id);
2.外键的级联更新和级联删除(了解)
  • 什么是级联更新和级联删除
    • 当我想把user用户表中的某个用户删掉,我希望该用户所有的订单也随之被删除
    • 当我想把user用户表中的某个用户id修改,我希望订单表中该用户所属的订单用户编号也随之修改
  • 添加级联更新和级联删除
-- 添加外键约束,同时添加级联更新  标准语法
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE;-- 添加外键约束,同时添加级联删除  标准语法
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON DELETE CASCADE;-- 添加外键约束,同时添加级联更新和级联删除  标准语法
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE ON DELETE CASCADE;-- 删除外键约束
ALTER TABLE orderlist DROP FOREIGN KEY ou_fk1;-- 添加外键约束,同时添加级联更新和级联删除
ALTER TABLE orderlist ADD CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id) ON UPDATE CASCADE ON DELETE CASCADE;-- 将王五用户的id修改为5    订单表中的uid也随之被修改
UPDATE USER SET id=5 WHERE id=3;-- 将王五用户删除     订单表中该用户所有订单也随之删除
DELETE FROM USER WHERE id=5;

二、多表设计

1.一对一(了解)
  • 分析
    • 人和身份证。一个人只有一个身份证,一个身份证只能对应一个人!
  • 实现原则
    • 在任意一个表建立外键,去关联另外一个表的主键
  • SQL演示
-- 创建db5数据库
CREATE DATABASE db5;
-- 使用db5数据库
USE db5;-- 创建person表
CREATE TABLE person(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加数据
INSERT INTO person VALUES (NULL,'张三'),(NULL,'李四');-- 创建card表
CREATE TABLE card(id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR(50),pid INT UNIQUE,CONSTRAINT cp_fk1 FOREIGN KEY (pid) REFERENCES person(id) -- 添加外键
);
-- 添加数据
INSERT INTO card VALUES (NULL,'12345',1),(NULL,'56789',2);
  • 图解

在这里插入图片描述

2.一对多
  • 分析
    • 用户和订单。一个用户可以有多个订单!
    • 商品分类和商品。一个分类下可以有多个商品!
  • 实现原则
    • 在多的一方,建立外键约束,来关联一的一方主键
  • SQL演示
/*用户和订单
*/
-- 创建user表
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加数据
INSERT INTO USER VALUES (NULL,'张三'),(NULL,'李四');-- 创建orderlist表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,number VARCHAR(20),uid INT,CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)  -- 添加外键约束
);
-- 添加数据
INSERT INTO orderlist VALUES (NULL,'hm001',1),(NULL,'hm002',1),(NULL,'hm003',2),(NULL,'hm004',2);/*商品分类和商品
*/
-- 创建category表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);
-- 添加数据
INSERT INTO category VALUES (NULL,'手机数码'),(NULL,'电脑办公');-- 创建product表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(30),cid INT,CONSTRAINT pc_fk1 FOREIGN KEY (cid) REFERENCES category(id)  -- 添加外键约束
);
-- 添加数据
INSERT INTO product VALUES (NULL,'华为P30',1),(NULL,'小米note3',1),
(NULL,'联想电脑',2),(NULL,'苹果电脑',2);
  • 图解

在这里插入图片描述

3.多对多
  • 分析
    • 学生和课程。一个学生可以选择多个课程,一个课程也可以被多个学生选择!
  • 实现原则
    • 需要借助第三张表中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键
  • SQL演示
-- 创建student表
CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20)
);
-- 添加数据
INSERT INTO student VALUES (NULL,'张三'),(NULL,'李四');-- 创建course表
CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);
-- 添加数据
INSERT INTO course VALUES (NULL,'语文'),(NULL,'数学');-- 创建中间表
CREATE TABLE stu_course(id INT PRIMARY KEY AUTO_INCREMENT,sid INT, -- 用于和student表的id进行外键关联cid INT, -- 用于和course表的id进行外键关联CONSTRAINT sc_fk1 FOREIGN KEY (sid) REFERENCES student(id), -- 添加外键约束CONSTRAINT sc_fk2 FOREIGN KEY (cid) REFERENCES course(id)   -- 添加外键约束
);
-- 添加数据
INSERT INTO stu_course VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);
  • 图解

在这里插入图片描述

三、多表查询

1.多表查询-数据准备
  • SQL语句
-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;-- 创建user表
CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,	-- 用户idNAME VARCHAR(20),			        -- 用户姓名age INT                             -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);-- 订单表
CREATE TABLE orderlist(id INT PRIMARY KEY AUTO_INCREMENT,	-- 订单idnumber VARCHAR(30),					-- 订单编号uid INT,    -- 外键字段CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);-- 商品分类表
CREATE TABLE category(id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类idNAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');-- 商品表
CREATE TABLE product(id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品idNAME VARCHAR(30),                    -- 商品名称cid INT, -- 外键字段CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);-- 中间表
CREATE TABLE us_pro(upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表iduid INT, -- 外键字段。需要和用户表的主键产生关联pid INT, -- 外键字段。需要和商品表的主键产生关联CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);
  • 架构器图解

在这里插入图片描述

2.多表查询-笛卡尔积查询(了解)
  • 有两张表,获取这两个表的所有组合情况
  • 要完成多表查询,需要消除这些没有用的数据
  • 多表查询格式
SELECT列名列表
FROM表名列表
WHERE条件...
  • 笛卡尔积查询
-- 标准语法
SELECT 列名 FROM 表名1,表名2,...;-- 查询user表和orderlist表
SELECT * FROM USER,orderlist;
3.多表查询-内连接查询
  • 查询原理
    • 内连接查询的是两张表有交集的部分数据(有主外键关联的数据)
  • 显式内连接
-- 标准语法
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;-- 查询用户信息和对应的订单信息
SELECT * FROM USER INNER JOIN orderlist ON user.id=orderlist.uid;
SELECT * FROM USER JOIN orderlist ON user.id=orderlist.uid;-- 查询用户信息和对应的订单信息,起别名
SELECT * FROM USER u JOIN orderlist o ON u.id=o.uid;-- 查询用户姓名,年龄。和订单编号
SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
FROMUSER u          -- 用户表
JOINorderlist o     -- 订单表
ON u.`id` = o.`uid`;
  • 隐式内连接
-- 标准语法
SELECT 列名 FROM 表名1,表名2 WHERE 条件;-- 查询用户姓名,年龄。和订单编号
SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
FROMUSER u,		-- 用户表orderlist o     -- 订单表
WHEREu.`id`=o.`uid`;
4.多表查询-外连接查询
  • 左外连接

    • 查询原理
      • 查询左表的全部数据,和左右两张表有交集部分的数据
    • 基本演示
    -- 标准语法
    SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;-- 查询所有用户信息,以及用户对应的订单信息
    SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
    FROMUSER u          -- 用户表
    LEFT OUTER JOINorderlist o     -- 订单表
    ONu.`id`=o.`uid`;
    
  • 右外连接

    • 查询原理
      • 查询右表的全部数据,和左右两张表有交集部分的数据
    • 基本演示
    -- 基本语法
    SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;-- 查询所有订单信息,以及订单所属的用户信息
    SELECTu.`name`,	-- 姓名u.`age`,	-- 年龄o.`number`	-- 订单编号
    FROMUSER u          -- 用户表
    RIGHT OUTER JOINorderlist o     -- 订单表
    ONu.`id`=o.`uid`;
    
5.多表查询-子查询
  • 子查询介绍

    • 查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!
  • 子查询-结果是单行单列的

    • 可以作为条件,使用运算符进行判断!
    • 基本演示
    -- 标准语法
    SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);-- 查询年龄最高的用户姓名
    SELECT MAX(age) FROM USER;              -- 查询出最高年龄
    SELECT NAME,age FROM USER WHERE age=26; -- 根据查询出来的最高年龄,查询姓名和年龄
    SELECT NAME,age FROM USER WHERE age = (SELECT MAX(age) FROM USER);
    
  • 子查询-结果是多行单列的

    • 可以作为条件,使用运算符in或not in进行判断!
    • 基本演示
    -- 标准语法
    SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]); -- 查询张三和李四的订单信息
    SELECT id FROM USER WHERE NAME='张三' OR NAME='李四';   -- 查询张三和李四用户的id
    SELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根据id查询订单
    SELECT number,uid FROM orderlist WHERE uid IN (SELECT id FROM USER WHERE NAME='张三' OR NAME='李四');
    
  • 子查询-结果是多行多列的

    • 可以作为一张虚拟表参与查询!
    • 基本演示
    -- 标准语法
    SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];-- 查询订单表中id大于4的订单信息和所属用户信息
    SELECT * FROM USER u,(SELECT * FROM orderlist WHERE id>4) o WHERE u.id=o.uid;
    
6.多表查询练习
  • 查询用户的编号、姓名、年龄。订单编号
/*
分析:用户的编号、姓名、年龄  user表     订单编号 orderlist表条件:user.id = orderlist.uid
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
FROMUSER t1,       -- 用户表orderlist t2   -- 订单表
WHEREt1.`id` = t2.`uid`;
  • 查询所有的用户。用户的编号、姓名、年龄。订单编号
/*
分析:用户的编号、姓名、年龄 user表     订单编号 orderlist表条件:user.id = orderlist.uid查询所有用户,使用左外连接
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
FROMUSER t1        -- 用户表
LEFT OUTER JOINorderlist t2   -- 订单表
ONt1.`id` = t2.`uid`;
  • 查询所有的订单。用户的编号、姓名、年龄。订单编号
/*
分析:用户的编号、姓名、年龄 user表     订单编号 orderlist表条件:user.id = orderlist.uid查询所有订单,使用右外连接
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
FROMUSER t1         -- 用户表
RIGHT OUTER JOINorderlist t2    -- 订单表
ONt1.`id` = t2.`uid`;
  • 查询用户年龄大于23岁的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析:用户的编号、姓名、年龄 user表     订单编号 orderlist表条件:user.age > 23 AND user.id = orderlist.uid
*/
/*
selectt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
fromuser t1,     -- 用户表orderlist t2 -- 订单表
wheret1.`age` > 23andt1.`id` = t2.`uid`;
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
FROMUSER t1       -- 用户表
LEFT OUTER JOINorderlist t2  -- 订单表
ONt1.`id` = t2.`uid`
WHEREt1.`age` > 23;
  • 查询张三和李四用户的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析:用户的编号、姓名、年龄 user表     订单编号 orderlist表条件:user.id = orderlist.uid AND user.name IN ('张三','李四');
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户姓名t1.`age`,	-- 用户年龄t2.`number`	-- 订单编号
FROMUSER t1,        -- 用户表orderlist t2    -- 订单表
WHEREt1.`id` = t2.`uid`AND-- (t1.`name` = '张三' OR t1.`name` = '李四');t1.`name` IN ('张三','李四');
  • 查询商品分类的编号、分类名称。分类下的商品名称
/*
分析:商品分类的编号、分类名称 category表     分类下的商品名称 product表条件:category.id = product.cid
*/
SELECTt1.`id`,	-- 分类编号t1.`name`,	-- 分类名称t2.`name`	-- 商品名称
FROMcategory t1,	-- 商品分类表product t2	    -- 商品表
WHEREt1.`id` = t2.`cid`;
  • 查询所有的商品分类。商品分类的编号、分类名称。分类下的商品名称
/*
分析:商品分类的编号、分类名称 category表     分类下的商品名称 product表条件:category.id = product.cid查询所有的商品分类,使用左外连接
*/
SELECTt1.`id`,	-- 分类编号t1.`name`,	-- 分类名称t2.`name`	-- 商品名称
FROMcategory t1	-- 商品分类表
LEFT OUTER JOINproduct t2	-- 商品表
ONt1.`id` = t2.`cid`;
  • 查询所有的商品信息。商品分类的编号、分类名称。分类下的商品名称
/*
分析:商品分类的编号、分类名称 category表     分类下的商品名称 product表条件:category.id = product.cid查询所有的商品信息,使用右外连接
*/
SELECTt1.`id`,	-- 分类编号t1.`name`,	-- 分类名称t2.`name`	-- 商品名称
FROMcategory t1	-- 商品分类表
RIGHT OUTER JOINproduct t2	-- 商品表
ONt1.`id` = t2.`cid`;
  • 查询所有的用户和所有的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析:用户的编号、姓名、年龄 user表   商品名称 product表   中间表 us_pro条件:us_pro.uid = user.id AND us_pro.pid = product.id
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户名称t1.`age`,	-- 用户年龄t2.`name`	-- 商品名称
FROMUSER t1,	-- 用户表product t2,	-- 商品表us_pro t3	-- 中间表
WHEREt3.`uid` = t1.`id`ANDt3.`pid` = t2.`id`;
  • 查询张三和李四这两个用户可以看到的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析:用户的编号、姓名、年龄 user表   商品名称 product表   中间表 us_pro条件:us_pro.uid = user.id AND us_pro.pid = product.id AND user.name IN ('张三','李四')
*/
SELECTt1.`id`,	-- 用户编号t1.`name`,	-- 用户名称t1.`age`,	-- 用户年龄t2.`name`	-- 商品名称
FROMUSER t1,	-- 用户表product t2,	-- 商品表us_pro t3	-- 中间表
WHERE(t3.`uid` = t1.`id` AND t3.`pid` = t2.`id`)AND-- (t1.`name` = '张三' or t1.`name` = '李四');t1.`name` IN ('张三','李四');
7.多表查询-自关联查询
  • 自关联查询介绍
    • 同一张表中有数据关联。可以多次查询这同一个表!
  • 自关联查询演示
-- 创建员工表
CREATE TABLE employee(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),mgr INT,salary DOUBLE
);
-- 添加数据
INSERT INTO employee VALUES (1001,'孙悟空',1005,9000.00),
(1002,'猪八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龙',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林冲',1009,8100.00),
(1009,'宋江',NULL,16000.00);-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
/*
分析:员工姓名 employee表        直接上级姓名 employee表条件:employee.mgr = employee.id查询左表的全部数据,和左右两张表交集部分数据,使用左外连接
*/
SELECTt1.name,	-- 员工姓名t1.mgr,		-- 上级编号t2.id,		-- 员工编号t2.name     -- 员工姓名
FROMemployee t1  -- 员工表
LEFT OUTER JOINemployee t2  -- 员工表
ONt1.mgr = t2.id;

四、视图

1.视图的概念
  • 视图是一种虚拟存在的数据表
  • 这个虚拟的表并不在数据库中实际存在
  • 作用是将一些比较复杂的查询语句的结果,封装到一个虚拟表中。后期再有相同复杂查询时,直接查询这张虚拟表即可
  • 说白了,视图就是将一条SELECT查询语句的结果封装到了一个虚拟表中,所以我们在创建视图的时候,工作重心就要放在这条SELECT查询语句上
2.视图的好处
  • 简单
    • 对于使用视图的用户不需要关心表的结构、关联条件和筛选条件。因为这张虚拟表中保存的就是已经过滤好条件的结果集
  • 安全
    • 视图可以设置权限 , 致使访问视图的用户只能访问他们被允许查询的结果集
  • 数据独立
    • 一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
3.视图数据准备
-- 创建db7数据库
CREATE DATABASE db7;-- 使用db7数据库
USE db7;-- 创建country表
CREATE TABLE country(id INT PRIMARY KEY AUTO_INCREMENT,country_name VARCHAR(30)
);
-- 添加数据
INSERT INTO country VALUES (NULL,'中国'),(NULL,'美国'),(NULL,'俄罗斯');-- 创建city表
CREATE TABLE city(id INT PRIMARY KEY AUTO_INCREMENT,city_name VARCHAR(30),cid INT, -- 外键列。关联country表的主键列idCONSTRAINT cc_fk1 FOREIGN KEY (cid) REFERENCES country(id)
);
-- 添加数据
INSERT INTO city VALUES (NULL,'北京',1),(NULL,'上海',1),(NULL,'纽约',2),(NULL,'莫斯科',3);
4.视图的创建
  • 创建视图语法
-- 标准语法
CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
  • 普通多表查询,查询城市和所属国家
-- 普通多表查询,查询城市和所属国家
SELECTt1.*,t2.country_name
FROMcity t1,country t2
WHEREt1.cid = t2.id;-- 经常需要查询这样的数据,就可以创建一个视图
  • 创建视图基本演示
-- 创建一个视图。将查询出来的结果保存到这张虚拟表中
CREATE
VIEWcity_country
ASSELECT t1.*,t2.country_name FROM city t1,country t2 WHERE t1.cid=t2.id;
  • 创建视图并指定列名基本演示
-- 创建一个视图,指定列名。将查询出来的结果保存到这张虚拟表中
CREATE
VIEWcity_country2 (city_id,city_name,cid,country_name) 
ASSELECT t1.*,t2.country_name FROM city t1,country t2 WHERE t1.cid=t2.id;
5.视图的查询
  • 查询视图语法
-- 标准语法
SELECT * FROM 视图名称;
  • 查询视图基本演示
-- 查询视图。查询这张虚拟表,就等效于查询城市和所属国家
SELECT * FROM city_country;-- 查询指定列名的视图
SELECT * FROM city_country2;-- 查询所有数据表,视图也会查询出来
SHOW TABLES;
  • 查询视图创建语法
-- 标准语法
SHOW CREATE VIEW 视图名称;
  • 查询视图创建语句基本演示
SHOW CREATE VIEW city_country;
6.视图的修改
  • 修改视图表中的数据
-- 标准语法
UPDATE 视图名称 SET 列名=值 WHERE 条件;-- 修改视图表中的城市名称北京为北京市
UPDATE city_country SET city_name='北京市' WHERE city_name='北京';-- 查询视图
SELECT * FROM city_country;-- 查询city表,北京也修改为了北京市
SELECT * FROM city;-- 注意:视图表数据修改,会自动修改源表中的数据
  • 修改视图表结构
-- 标准语法
ALTER VIEW 视图名称 [(列名列表)] AS 查询语句;-- 查询视图2
SELECT * FROM city_country2;-- 修改视图2的列名city_id为id
ALTER
VIEWcity_country2 (id,city_name,cid,country_name)
ASSELECT t1.*,t2.country_name FROM city t1,country t2 WHERE t1.cid=t2.id;
7.视图的删除
  • 删除视图
-- 标准语法
DROP VIEW [IF EXISTS] 视图名称;-- 删除视图
DROP VIEW city_country;-- 删除视图2,如果存在则删除
DROP VIEW IF EXISTS city_country2;
8.视图的总结
  • 视图是一种虚拟存在的数据表
  • 这个虚拟的表并不在数据库中实际存在
  • 说白了,视图就是将一条SELECT查询语句的结果封装到了一个虚拟表中,所以我们在创建视图的时候,工作重心就要放在这条SELECT查询语句上
  • 视图的好处
    • 简单
    • 安全
    • 数据独立

五、备份与还原

1.命令行方式
  • 备份

    • 使用SecureCRT工具连接到Linux系统,输入:mysqldump -u root -p 数据库名称 > 文件保存路径
      在这里插入图片描述

    • 进入文件保存路径,查看文件是否存在
      在这里插入图片描述

    在这里插入图片描述

  • 恢复

    • 登录mysql数据库
      在这里插入图片描述

    • 删除已经备份的数据库
      在这里插入图片描述

    • 重新创建名称相同的数据库
      在这里插入图片描述

    • 使用该数据库
      在这里插入图片描述

    • 导入文件执行:source 备份文件路径;

    在这里插入图片描述

2.图形化界面方式
  • 备份

在这里插入图片描述

在这里插入图片描述

  • 恢复

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/611828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-01-09 Android.mk 根据c文件名插入特定的宏定义,我这里用于定义log LOG_TAG 标签

一、在Android的构建系统中,使用Android.mk构建脚本可以根据特定需求来定义宏。如果你想根据C文件的名称来插入特定的宏定义,可以使用条件语句检查文件名,并相应地设置宏。 在Android的构建系统中,使用Android.mk构建脚本可以根据…

【MySQL】表设计与范式设计

文章目录 一、数据库表设计一对一一对多多对多 二、范式设计第一范式第二范式第三范式BC范式第四范式 一、数据库表设计 一对一 举个例子,比如这里有两张表,用户User表 和 身份信息Info表。 因为一个用户只能有一个身份信息,所以User表和In…

jmeter+ant+Jenkins集成

一、 环境准备 1、Jenkins下载:https://jenkins.io/zh/download/ 2、 Jenkins安装:解压下载的压缩包,直接点击msi文件安装即可 4、 Jenkins登录用户设置:装: 浏览器地址栏中输入:http://localhost:8080/…

益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康

撰文 | 宋文法 肠道菌群,是人体不可分割的组成部分,生活在我们肠道内的数万亿细菌对健康起着重要作用,它们影响着人的新陈代谢、消化能力、抵御感染、控制人体对药物的反应,甚至还能预防某些癌症。 非酒精性脂肪肝病,是…

【实用技巧】Windows 电脑向iPhone或iPad传输视频方法1:无线传输

一、内容简介 本文介绍如何使用 Windows 电脑向 iPhone 或 iPad 传输视频,以 iPhone 为例,iPad的操作方法类似,本文不作赘述。 二、所需原材料 Windows 电脑(桌面或其它文件夹中存有要导入的视频)、iPhone 14。 待…

Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域并放大,Kotlin(3)

Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域并放大,Kotlin(3) 在文章2 Android Canvas图层saveLayer剪切clipPath原图addCircle绘制对应圆形区域,Kotlin(2)-CSDN博客 的基础上&…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中,我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

二叉树及其实现

二叉树 一.树的概念及结构1.1树的概念1.2相关概念 2.二叉树的概念及结构2.1 概念2.2 特殊的二叉树 3.二叉树的遍历3.1 前序、中序以及后序遍历3.2 层序遍历3.3 判断二叉树是否是完全二叉树3.4 二叉树的高度3.5 二叉树的叶子节点个数3.6 二叉树的第k层的节点个数3.7 二叉树销毁3…

苹果可充电键盘背光系统专利曝光:延长MacBook Air / Pro续航

根据美国商标和专利局(USPTO)近日公示的清单,苹果公司近日获得了一项关于电子设备键盘的相关专利。 苹果公司在专利中表示,为了在低光环境下,能够提高用户敲击键盘的输入体验,通常键盘会提供背光。 传统键…

深度学习笔记(二)——Tensorflow环境的安装

本篇文章只做基本的流程概述,不阐述具体每个软件的详细安装流程,具体的流程网上教程已经非常丰富。主要是给出完整的安装流程,以供参考 环境很重要 一个好的算法环境往往能够帮助开发者事半功倍,入门学习的时候往往搭建好环境就已…

关于Vue前端接口对接的思考

关于Vue前端接口对接的思考 目录概述需求: 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式, 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…

基于uniapp封装的table组件

数据格式 tableData: [{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},{elcInfo: [{tableData:[1,293021.1,293021.1,293021.1,293021.1,]}]},/* {title: "2",elcInfo: [{…

知识图谱gds使用记录

安装 从下载站下载对应的包到plugin目录下,修改配置文件/etc/neo4j/neo4j.conf,末尾加入gds.*,重新启动 在浏览器输入CALL gds.list()命令进行测试 建立图映射 为了使用图算法,需要先将图数据库的内容映射为一个新图 如果是全…

freesurfer-reconall后批量提取TIV(颅内总体积)

#提取TIV #singleline=$(grep Estimated Total Intracranial Volume /usr/local/freesurfer/subjects/bect-3d+bold-wangjingchen-4.9y-2/stats/aseg.sta

学习笔记——C++运算符之算术运算符

C中运算符包含诸多种类,其中有:算术运算符,赋值运算符,比较运算符和逻辑运算符 每一种运算符及其作用如下表所示: 一,算术运算符1,加减乘除 其中,“”,“-”运算符既可…

基于ssm智慧社区停车管理系统设计与实现【附源码】

基于ssm智慧社区停车管理系统设计与实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX&am…

电脑找不到d3dcompiler43.dll怎么修复,教你5个可靠的方法

d3dcompiler43.dll是Windows操作系统中的一个重要动态链接库文件,主要负责Direct3D编译器的相关功能。如果“d3dcompiler43.dll丢失”通常会导致游戏无法正常运行或者程序崩溃。为了解决这个问题,我整理了以下五个解决方法,希望能帮助到遇到相…

Java CPU或内存使用率过高问题定位教程

简介 Spring cloud微服务广泛应用后,服务的监控和运维压力也与日俱增,经常有服务出现CPU或者内存使用率过高的告警,那么遇到这样的问题我们该如何排查呢?我们可以借助哪些工具来定位问题呢?本文将介绍一下遇到此类问题…

【前端素材】bootstrap4实现在线蛋糕甜品店网页Tehzeeb

一、需求分析 在线蛋糕甜品店的网站通常包含以下几个方面的内容和功能: 主页:网站的主页是用户进入网站的第一个页面,通常会展示一些精选蛋糕和甜品的图片和介绍,以吸引用户的注意力。主页还可能包含一些特别促销或最新的产品信息…

Mysql是怎样运行的--下

文章目录 Mysql是怎样运行的--下查询优化explainoptimizer_trace InnoDB的Buffer Pool(缓冲池)Buffer Pool的存储结构空闲页存储--free链表脏页(修改后的数据)存储--flush链表 使用Buffer PoolLRU链表的管理 事务ACID事务的状态事…