黑马程序员MySQL-视图SQL笔记

2023-11-10

对应课程地址

-- 视图
-- 准备数据
create database if not exists mydb6_view;
use mydb6_view;
create table dept(
	deptno int primary key,
  dname varchar(20),
	loc varchar(20)
);
insert into dept values(10, '教研部','北京'),
(20, '学工部','上海'),
(30, '销售部','广州'),
(40, '财务部','武汉');

create table emp(
	empno int primary key,
	ename varchar(20),
	job varchar(20),
	mgr int,
	hiredate date,
	sal numeric(8,2),
	comm numeric(8, 2),
	deptno int,
-- 	FOREIGN KEY (mgr) REFERENCES emp(empno),
	FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE
);
insert into emp values
(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20),
(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30),
(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30),
(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20),
(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30),
(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30),
(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10),
(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20),
(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10),
(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30),
(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20),
(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30),
(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20),
(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10);

create table salgrade(
	grade int primary key,
	losal int,
	hisal int
);
insert into salgrade values
(1, 7000, 12000),
(2, 12010, 14000),
(3, 14010, 20000),
(4, 20010, 30000),
(5, 30010, 99990);


-- 创建视图
CREATE 
	OR REPLACE VIEW view1_emp AS SELECT
	ename,
	job 
FROM
	emp;
	
-- 查看表和视图
show tables;
show full tables;

-- 查看视图结构
DESCRIBE view1_emp;

-- 查询视图
SELECT
	* 
FROM
	view1_emp;
	
-- 修改视图结构
ALTER VIEW view1_emp AS SELECT
a.deptno,
a.dname,
a.loc,
b.ename,
b.sal 
FROM
	dept a,
	emp b 
WHERE
	a.deptno = b.deptno;
	
	
	
-- 更新视图:修改原表数据
-- 先创建一个视图
CREATE 
	OR REPLACE VIEW view1_emp AS SELECT
	ename,
	job 
FROM
	emp;
	
-- 查询一下视图
SELECT
	* 
FROM
	view1_emp;


-- 更新视图
UPDATE view1_emp 
SET ename = '鲁肃' 
WHERE
	ename = '谢逊';
	
-- 1、插入数据时,视图只是引用表格中的某些字段,
-- 而另外一些字段又没有指定默认值时会插入失败	
INSERT INTO view1_emp
VALUES
	( '周瑜', '文员' );
	
-- 2、视图包含聚合函数不可更新
CREATE 
	OR REPLACE VIEW view2_emp AS SELECT
	count(*) cnt
FROM
	emp;
	
SELECT
	* 
FROM
	view2_emp;
INSERT INTO view2_emp
VALUES
	( 100 );
	
UPDATE view2_emp 
SET cnt = 100;

-- 3、视图包含distinct不可更新
CREATE 
	OR REPLACE VIEW view3_emp AS SELECT DISTINCT
	job 
FROM
	emp;

SELECT
	* 
FROM
	view3_emp;
	
INSERT INTO view3_emp
VALUES
	( '财务' );


-- 4、视图包含group by、having不可更新
CREATE 
	OR REPLACE VIEW view4_emp AS SELECT
	deptno 
FROM
	emp 
GROUP BY
	deptno 
HAVING
	deptno > 10;

SELECT
	* 
FROM
	view4_emp;

insert into view4_emp values(40);


-- 5、视图包含union、union all不可更新
-- union all不去重,union会去重
CREATE 
	OR REPLACE VIEW view5_emp AS SELECT
	empno,
	ename 
FROM
	emp 
WHERE
	empno <= 5 UNION SELECT empno, ename FROM emp WHERE empno > 8;

SELECT
	* 
FROM
	view5_emp;

INSERT INTO view5_emp
VALUES
	( 1015, '宋江' );
	
-- 6、视图包含子查询不可更新
CREATE 
	OR REPLACE VIEW view6_emp AS SELECT
	empno,
	ename,
	sal 
FROM
	emp 
WHERE
	sal = (
	SELECT
		max( sal ) 
	FROM
	emp);

SELECT
	* 
FROM
	view6_emp;

INSERT INTO view6_emp
VALUES
	( 1015, '血刀老祖', 30000.0 );

-- 7、视图包含join不可更新
CREATE VIEW view7_emp AS SELECT
dname,
ename,
sal 
FROM
	emp a
	JOIN dept b ON a.deptno = b.deptno;

INSERT INTO view7_emp
VALUES
	( '行政部', '韦小宝', 6500.00 );
	
-- 8、视图包含常量文字值不可更新
CREATE 
	OR REPLACE VIEW view8_emp AS SELECT
	'行政部' dname,
	'杨过' ename;
	
INSERT INTO view8_emp
VALUES
	( '行政部', '韦小宝' );


CREATE 
	OR REPLACE VIEW view9_emp AS SELECT
	* 
FROM
	emp;
-- 重命名视图
RENAME TABLE view9_emp TO view9_1_emp;
-- 删除视图
DROP VIEW
IF
	EXISTS view9_1_emp;

-- 视图练习
-- 1:查询部门平均薪水最高的部门名称
-- 最原始做法:不使用开窗函数,不使用视图
SELECT
	dname 
FROM
	dept 
WHERE
	deptno = (
	SELECT
		b.deptno 
	FROM
		(
		SELECT
			a.deptno,
			max( a.avg_sal ) 
		FROM
			( SELECT deptno, avg( sal ) avg_sal FROM emp GROUP BY deptno ) a 
		) b 
	);

-- 1:增加一点难度查询部门平均薪水处于最高两位的部门名称
-- 使用开窗函数,不使用视图
-- 1.1 先查出每个部门编号对应的平均薪水
-- 1.2 用开窗函数进行排序
-- 1.3 找到rank小于等于2的deptno
-- 1.4 再跟dept表联合查找出dname
SELECT
	dname 
FROM
	dept d,
	(
	SELECT
		deptno 
	FROM
		(
		SELECT
			*,
			rank() over ( ORDER BY avg_sal DESC ) rn 
		FROM
			( SELECT deptno, avg( sal ) avg_sal FROM emp GROUP BY deptno ) a 
		) b 
	WHERE
		rn = 1 
	) c 
WHERE
	d.deptno = c.deptno;
	
-- 1:增加一点难度查询部门平均薪水处于最高两位的部门名称
-- 使用开窗函数,并且使用视图
-- 1.1 先查出每个部门编号对应的平均薪水,创建一个视图
CREATE 
	OR REPLACE VIEW view_dept_avg_sal AS SELECT
	deptno,
	avg( sal ) avg_sal 
FROM
	emp 
GROUP BY
	deptno;
-- 1.2 用开窗函数进行排序,创建一个视图
CREATE 
	OR REPLACE VIEW view_dept_avg_sal_rank AS SELECT
	*,
	rank() over ( ORDER BY avg_sal DESC ) rn 
FROM
	view_dept_avg_sal;
-- 1.3 找到rank小于等于2的deptno,创建一个视图
CREATE 
	OR REPLACE VIEW view_dept_avg_sal_top2 AS SELECT
	* 
FROM
	view_dept_avg_sal_rank 
WHERE
	rn <= 2;
-- 1.4 再跟dept表联合查找出dname
CREATE 
	OR REPLACE VIEW view_dept_avg_sal_top2_dname AS SELECT
	dname 
FROM
	dept a,
	view_dept_avg_sal_top2 b 
WHERE
	a.deptno = b.deptno;


-- 2:查询员工比所属领导薪资高的部门名、员工名、员工领导编号
-- 最原始做法:不使用视图
SELECT
	dname,
	ename,
	mgr 
FROM
	dept b,
	(
	SELECT
		e1.deptno,
		e1.ename,
		e1.sal,
		e1.mgr,
		e2.sal mgr_sal 
	FROM
		emp e1,
		emp e2 
	WHERE
		e1.mgr = e2.empno 
		AND e1.sal > e2.sal 
	) a 
WHERE
	b.deptno = a.deptno;
	
-- 2:查询员工比所属领导薪资高的部门名、员工名、员工领导编号
-- 使用视图
-- 2.1查询员工比所属领导薪资高的部门号,然后创建一个视图
CREATE 
	OR REPLACE VIEW view_deptno_ename_mgr AS SELECT
	e1.deptno,
	e1.ename,
	e1.mgr 
FROM
	emp e1,
	emp e2 
WHERE
	e1.mgr = e2.empno and e1.sal > e2.sal;
-- 2.2将上一步查询出来的部门号和部门表进行连表查询
CREATE 
	OR REPLACE VIEW view_dname_ename_mgr AS SELECT
	dname,
	ename,
	mgr 
FROM
	dept a,
	view_deptno_ename_mgr b 
WHERE
	a.deptno = b.deptno;
	
-- 3:查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资,
-- 并查询出薪资在前2名的员工信息
-- 最原始做法,不使用视图
SELECT
	empno,
	ename,
	sal 
FROM
	(
	SELECT
		empno,
		ename,
		sal,
		rank() over ( ORDER BY sal DESC ) rn 
	FROM
		emp e,
		dept d,
		salgrade s 
	WHERE
		e.deptno = d.deptno 
		AND YEAR ( hiredate ) >= '2000' 
		AND loc = '上海' 
		AND grade = 4 
		AND sal BETWEEN losal 
		AND hisal 
	) a 
WHERE
	rn <= 2;
	
-- 3:查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资,
-- 并查询出薪资在前2名的员工信息
-- 使用视图
-- 3.1 查询工资等级为4级,2000年以后入职的工作地点为上海的员工编号、姓名和工资,创建一个视图
CREATE 
	OR REPLACE VIEW view_ename_sal_after2000_grade4 AS SELECT
	empno, ename, sal 
FROM
	emp e,
	dept d,
	salgrade s 
WHERE
	e.deptno = d.deptno 
	AND grade = 4 
	AND sal BETWEEN losal 
	AND hisal 
	AND loc = '上海' 
	AND YEAR ( hiredate ) > '2000'
-- 此处三张表联查还可以用join,逻辑会更清晰
SELECT
	empno,
	ename,
	sal 
FROM
	emp e
	JOIN dept d ON e.deptno = d.deptno AND loc = '上海' AND YEAR ( hiredate ) > '2000';
	JOIN salgrade s ON grade = 4 AND ( sal BETWEEN losal AND hisal )
	


-- 3.2 查询出薪资在前2名的员工信息
SELECT
	empno,
	ename,
	sal 
FROM
	( SELECT *, rank() over ( ORDER BY sal DESC ) rn FROM view_ename_sal_after2000_grade4 ) a
WHERE
	rn <= 2;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马程序员MySQL-视图SQL笔记 的相关文章

  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • 使用 PHP 查询更改表,列名未显示在 phpMyAdmin 中

    这是我的第一篇文章 这里有一篇类似的文章 phpMyAdmin 不显示添加的列 代码日志 https stackoverflow com questions 12960302 phpmyadmin doesnt show added col
  • 游标与更新

    一家公司使用 SQL Server 数据库来存储有关其客户及其业务交易的信息 您所在的城市引入了新的区号 对于前缀小于 500 的电话号码 区号 111 保持不变 前缀为 500 及以上的号码将分配区号 222 客户表中电话列中的所有电话号
  • 如何使用Python高效地将CSV文件数据插入MYSQL?

    我有一个带有 aprox 的 CSV 输入文件 400 万条记录 插入已运行超过 2 小时 但仍未完成 数据库仍然是空的 关于如何实际插入值的任何建议 使用insert into 并且更快 比如将插入物分成块 我对 python 还很陌生
  • 哪种 SQL 模式能够更快地避免插入重复行?

    我知道有两种不重复插入的方法 第一个是使用WHERE NOT EXISTS clause INSERT INTO table name col1 col2 col3 SELECT s s s WHERE NOT EXISTS SELECT
  • SQL分组和总结

    我的表如下所示 income date productid invoiceid customerid 300 2015 01 01 A 1234551 1 300 2016 01 02 A 1234552 1 300 2016 01 03
  • 在 SQL Server 中选择条件的值[重复]

    这个问题在这里已经有答案了 在查询选择中 我想显示字段是否满足条件的结果 想象一下我有一张名为stock 该表有一列告诉我库存中每种商品的数量 我想做的是这样的 SELECT stock name IF stock quantity lt
  • 选择早于的时间戳

    我如何从数据库中选择超过 12 小时的项目 我使用时间戳列来存储时间 但我认为我不需要年 月 日 只需要小时 我有类似的东西 但它不起作用 没有错误 只是从表中返回所有数据 sql SELECT FROM Y WHERE X and tim
  • 如何将 T-SQL 中的结果连接到列中?

    我正在处理一个查询 它应该给我这样的结果 Name Surname Language Date James Hetfield en gb fr 2011 01 01 Lars Ulrich gb fr ca 2011 01 01 但我的选择
  • Oracle Many OR 与 IN () 的 SQL 性能调优 [重复]

    这个问题在这里已经有答案了 我手头没有 解释计划 您能帮忙判断以下哪一个更有效吗 选项1 select from VIEW ABC where STRING COL AA OR STRING COL BB OR STRING COL BB
  • 如何通过逗号分隔将 2 行合并为一行?

    我需要将这些单独的行合并到一列 我现在如何通过逗号分隔合并列 CID Flag Value 1 F 10 1 N 20 2 F 12 2 N 23 2 F 14 3 N 21 3 N
  • WordPress 访问

    我正在与朋友一起开发一个网站 使用Wordpress我们正在尝试从我的计算机和他的计算机访问同一个 WordPress 帐户 以便我们可以一起在网站上工作 我们尝试将彼此添加为管理员 但只能从创建管理员的计算机上访问新帐户 有谁知道如何做到
  • SQL DML:日期值不正确 (MySQL)

    我在数据库中创建了一个表 CREATE TABLE official receipt student no INT UNSIGNED academic year CHAR 8 trimester ENUM 1 2 3 or no MEDIU
  • MySQL 如何使用返回多行的 SELECT 子查询插入表?

    MySQL 如何使用返回多行的 SELECT 子查询插入表 INSERT INTO Results People names VALUES SELECT d id FROM Names f JOIN People d ON d id f i
  • 更新或插入 MySQL Python

    如果记录已存在 我需要更新一行 如果不存在 我需要创建一个新记录 我理解 ON DUPLICATE KEY 将使用 MYSQLdb 完成此操作 但是我无法使其正常工作 我的代码如下 cursor database cursor cursor
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色
  • 数据库“key/ID”设计思想、代理键、主键等

    因此 我最近看到多次提到代理键 但我不太确定它是什么以及它与主键有何不同 我总是假设 ID 是表中的主键 如下所示 Users ID Guid FirstName Text LastName Text SSN Int 然而 维基百科将代理键

随机推荐

  • linux下安装mysql5.7.17及简单配置&&HIVE安装和使用

    1 mysql5 7 17安装在 usr local mysql目录里面 也可以安装在其他地方 安装包最好与Linux系统一样 eg 32位的就是 mysql 5 7 17 linux glibc2 5 i686 tar gz 官网可下载
  • 基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(一)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python环境 TensorFlow环境 Keras环境 Android环境 1 安装AndroidStudio 2 导入TensorFlow的jar包和so库 3 导入Open
  • 【cfeng work】什么是SaaS? SaaS详细介绍

    WorkProj 内容管理 SaaS SaaS的优势 SaaS的注意项 SaaS产品核心组件 cfeng结合work理解SaaS 本文introduce SaaS的相关内容 昨天cfeng已经介绍过云原生了 其实就是应用在设计上就要围绕Cl
  • 来可电子CAN转232/485设备在使用时可能遇到的问题和解决方案

    使用场景 上位机软件通过232串口发送数据经过CAN转232设备转换成CAN数据发送到仪表中 仪表接收到指定的数据后 返回特定的CAN数据 串口调试工具数据收发测试 CAN转232设备在使用中的接线 使用过程中可能遇到的问题 1 串口按照规
  • JDBC概述

    JDBC JDBC Java Database Connectivity java数据库连接 java语言中用于连接各种数据库的应用程序编程接口 为了解决 使java 编写的程序不再依赖于具体的数据库 JDBC操作不同数据库仅仅只是连接方式
  • 逆天啦!国产自研多环境开发软件 CEC-IDE 问世,“卡脖子”问题完美解决?

    来自 JavaGuide 震撼到了 厉害 继国产自研浏览器 国产自研操作系统 国产自研手机系统后的全新力作 国产自研 IDE 它就是 CEC IDE 一款由数字广东公司与麒麟软件联合打造的 是国内首个适配国产操作系统 自主创新的一款安全 专
  • 李沐论文精读系列一: ResNet、Transformer、GAN、BERT

    文章目录 一 ResNet 1 0 摘要 论文导读 1 1 导论 1 1 1 为什么提出残差结构 1 1 2 实验验证 1 2 相关工作 1 3 实验部分 1 3 1 不同配置的ResNet结构 1 3 2 残差结构效果对比 1 3 3 残
  • Discuz论坛 创始人/超级管理员密码忘记解决办法!

    1 首先要明白一个基础知识 网站的管理员 admin 和创始人 UCenterAdministrator 不是一回事 一般人都误把admin当成UCenterAdministrator 而那些懂的人在给人们讲如何找回密码 比方使用tools
  • 浅谈对梯度下降法的理解

    浅谈梯度下降法 如果读者对方向导数和梯度的定义不太了解 请先阅读上篇文章 方向导数与梯度 前些时间接触了机器学习 发现梯度下降法是机器学习里比较基础又比较重要的一个求最小值的算法 梯度下降算法过程如下 1 随机初始值 2 迭代 直至收敛 表
  • VMware 安装 OpenWrt 旁路由并配置 PassWall

    1 准备 OpenWrt 镜像包 我已经转好了 vmdk 格式的 更多的可以去恩山论坛下载 OpenWrtvmdk格式 虚拟化文档类资源 CSDN下载 也可以在这个平台在线定制 OpenWrt固件下载与在线定制编译 2 网络选择 NAT 模
  • Tensorflow中的GPU分配方法

    Tensorflow中的GPU分配方法 默认情况下 TensorFlow 会使用其所能够使用的所有 GPU 这样 会出现浪费的情况 列出当前设备上的GPU和CPU 首先 通过 tf config experimental list phys
  • Python scrapy爬虫 生成 启动 crawlspider命令 爬取示例网站的数据案例

    创建一个scrapy项目 scrapy startproject myscrapy 生成一个爬虫 scrapy genspider example example com 启动爬虫 scrapy crawl example 生成crawls
  • vim终极配置:spf13-vim

    spf13 vim介绍 1 没有超户的linux操作系统如何安装vim最新版 spf13 vim常用插件介绍 1 NERDTree 2 neocomplcache 3 EasyMotion 4 ctags 5 tagbar 1 spf13
  • Python下pefile的使用

    其实在pefile主页的Wiki上已经详细介绍了 https code google com p pefile wiki UsageExamples这里给出了使用例子 同时参照着看雪http bbs pediy com showthread
  • Count Color 【POJ - 2777】【线段树】

    题目链接 这道题一开始觉得处理颜色很繁琐 但是后来发现了个东西 T lt 30 对于这个数据 似乎可以开成比特位 二进制 然后进行处理 会发现 这就是区间更新的线段树了 有几个坑 我跳进去过了 一个是初始化要为1 颜色1 其次A和B的大小是
  • 手把手教你构建一个web前端项目,全网最详细教程!

    1 选择现成的项目模板还是自己搭建项目骨架 搭建一个前端项目的方式有两种 选择现成的项目模板 自己搭建项目骨架 选择一个现成项目模板是搭建一个项目最快的方式 模板已经把基本的骨架都搭建好了 你只需要向里面填充具体的业务代码 就可以通过内置的
  • asp.net core linux生成word方案 aspose

    代码 using System using System Diagnostics using Microsoft AspNetCore Mvc using Microsoft Extensions Logging using AsposeD
  • 智能优化算法:战争策略算法-附代码

    智能优化算法 战争策略算法 摘要 WSO 是 Ayyarao 等人于 2022 年提出一种基于古代战争策略的新型元启发式优化算法 该算法灵感来自于古代战争中的攻击策略和防御策略 并通过士兵在战场上的位置更新来达到求解优化问题的目的 具有寻优
  • LittlevGL在PC端运行

    上面是我的微信和QQ群 欢迎新朋友的加入 参考官网指导 https github com littlevgl pc simulator sdl visual studio 获取到vs的工程 打开解决方案 编译运行 在源码目录下 打开main
  • 黑马程序员MySQL-视图SQL笔记

    对应课程地址 视图 准备数据 create database if not exists mydb6 view use mydb6 view create table dept deptno int primary key dname va