MySQL练习-employees数据库(二)
| department | 部门表 |
| dept_emp | 部门员工任职期表(按部门&时期) |
| dept_manager | 部门经理任职期表(按时期) |
| employees | 员工详情表 |
| salaries | 员工薪资表(按时期) |
| title | 员工职称表(按时期) |
选择员工id为110022,因为他还当过经理,所有五张表都会有
SELECT *
FROM dept_emp
WHERE emp_no = 110022; SELECT *
FROM dept_manager
WHERE emp_no = 110022; SELECT *
FROM employees
WHERE emp_no = 110022; SELECT *
FROM titles
WHERE emp_no = 110022; SELECT *
FROM salaries
WHERE emp_no = 110022;
dept_emp

dept_manager

employees

title

salaries

分组统计&排序
统计历史上各个部门所拥有的员工数量,并降序排序
SELECT dept_no, COUNT(*) AS emp_sum
FROM dept_emp
GROUP BY dept_no
ORDER BY emp_sum DESC

创建视图
把上面的查询创建成视图(执行完语句后记得点刷新,不然看不到)
CREATE VIEW test AS
SELECT dept_no, COUNT(*) AS emp_sum
FROM dept_emp
GROUP BY dept_no
ORDER BY emp_sum DESC:

联结
使用联结,将创建的视图test补上部门名称,使用WHERE联结两个表的dept_on变量,这是一种等值联结/自然联结,因为dept_on在两张表都是唯一并且一一对应的。
注意一点,联结后我们仍希望筛选联结的变量时,需要指定是哪张表的dept_on,不然系统分不清。

以上为联结的入门,可以说最常用最简单的联结方式,接下来我们将联结方式进行尝试,再根据使用场景进行总结。
INNER JOIN
上面的自然联结(使用WHERE)其实就内部联结,如下两句SQL语句效果是一样。
当需要联结的两个联结键都是“唯一的”(内部没有重复值的意思),便需要使用内部联结,因为这种情况下是用WHERE和INNER JOIN语句是一样的,为了方便使用WHERE吧,如果语句赋值还是使用INNER JOIN
SELECT *
FROM dept_manager, dept_emp
WHERE dept_manager.emp_no = dept_emp.emp_no; SELECT *
FROM dept_manager INNER JOIN dept_emp
ON dept_manager.emp_no = dept_emp.emp_no;
OUTER JOIN
如果两个表进行联结的两个联结键其中一个是有重复值的,一个是没有的,而且“有重复的”要比“唯一的”范围“大”,然后我们用"唯一的"的内容去填补“有重复的”表!
使用LEFT JOIN将departments表中信息将dept_manager补上部门名称
SELECT dept_manager.*, dept_name
FROM dept_manager LEFT JOIN departments
ON dept_manager.dept_no = departments.dept_no

使用OUTER JOIN必须加上LEFT或者RIGHT,所以实际并不存在OUTER JOIN,而是存在
LEFT JOIN
RIGHT JOIN
(OUTER可以省略不写)
总结使用场景其实简单
内部联结:两个表的两个联结键都是“唯一的”
外部链接:两个联结键一个是“有重复的”,一个是“唯一的”,而且前一个的范围最好比后一个“大”,我们就可以用“唯一的”信息去填补“有重复的”,没有对应就留空。
联结探究
我们来研究下不符合上面使用场景的情况是怎样的。我们以dept_emp和salaries表中员工号为10010的数据为例,因为刚好emp_no有“重复的”,接下来我们就用emp_no作为联结键。
SELECT *
FROM dept_emp
WHERE emp_no = 10010; SELECT *
FROM salaries
WHERE emp_no = 10010;
dept_emp

salaries

使用内部联结,INNER JOIN和WHERE一起上,结构一致,使用“有重复的”的联结键,产生的结果是笛卡尔积:2*6=12
SELECT *
FROM salaries INNER JOIN dept_emp
ON salaries.emp_no = dept_emp.emp_no
WHERE salaries.emp_no = 10010; SELECT *
FROM salaries, dept_emp
WHERE salaries.emp_no = dept_emp.emp_no AND salaries.emp_no = 10010;

使用外部链接,LEFT和RIGHT都上,结果也和内部联结相似,只是排序些许不同(不影响)。
SELECT *
FROM salaries LEFT JOIN dept_emp
ON salaries.emp_no = dept_emp.emp_no
WHERE salaries.emp_no = 10010; SELECT *
FROM salaries RIGHT JOIN dept_emp
ON salaries.emp_no = dept_emp.emp_no
WHERE salaries.emp_no = 10010;
联结多个表
SELECT dept_manager.*, departments.dept_name, employees.first_name
FROM dept_manager, departments, employees
WHERE dept_manager.dept_no = departments.dept_no
AND dept_manager.emp_no = employees.emp_no
MySQL练习-employees数据库(二)的更多相关文章
- MySQL练习-employees数据库(一)
安装一个数据库示例--employees 使用工具为Navicat--(ctrl + q: 打开新查询窗口 ctrl + r: 运行当前窗口内的所有语句) 参考http://www.cnblogs.c ...
- mysql样例数据库employees
Oracle和sqlserver都有基于员工信息的样例数据库,同样mysql上也是有的. 给出一个连接地址https://github.com/datacharmer/test_db. 下载后直接调用 ...
- 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作
此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...
- 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)
一.初识MySQL数据库 ###<1>数据库概述 1. 数据库 长期存储在计算机内的,由组织的可共享的数据集合 存储数据的仓库 文件 ...
- MySQL使用笔记(二)数据库基本操作
By francis_hao Dec 11,2016 数据库是什么 数据库是什么呢?对于MySQL来说,数据库是存储数据库对象的容器,参考[1]中的简单解释是:数据库是一个拥有特定排放顺序的文件 ...
- Vertica的这些事(二)——SQL-Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O ...
- 实验十--- MySQL过程式数据库对象
实验十 MySQL过程式数据库对象 一. 实验内容: 1. 存储过程的创建和调用 2. 存储函数的创建和调用 3. 触发器的创建和触发 4. 事件的创建和修改 一. 实验项目:员工管理数据库 用于 ...
- MySQL+Amoeba实现数据库主从复制和读写分离
MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...
- mysql 远程连接数据库的二种方法
http://blog.csdn.net/freecodetor/article/details/5799550 一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5 ...
随机推荐
- Sql Server 2016 新功能——内置的 Temporal Tables
放假之前老大跟我提起了一下2016有个有趣的功能叫 Temporal Table ,今天去看了一下资料整理一下. 这个功能看上去像是临时表,但是其实是系统维护的一个历史记录表.(在某个程度上面比起我们 ...
- monkey之monkey命令详解
四大类-- 常用选项.事件选项.约束选项.调试选项 1.常用选项 --help:打印帮助信息 -v:指定打印信息的详细级别,一个-v增加一个级别 ,默认级别为 0 .用于指定反馈信息级别(信息级别就是 ...
- [转]Asp.Net 用户验证(自定义IPrincipal和IIdentity)
本文转自:http://www.cnblogs.com/amylis_chen/archive/2012/08/02/2620129.html Default.aspx 页面预览 默认情况下SignI ...
- [转].net core 通过ViewComponent封装控件 左侧菜单
本文转自:http://www.cnblogs.com/BenDan2002/p/6224816.html 我们在.net core中还使用了ViewComponent方式生成控件.ViewCompo ...
- 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
一.序言 陆陆续续的如果累计起来,我估计至少有二十来位左右的朋友加我QQ,向我咨询有关抠图方面的算法,可惜的是,我对这方面之前一直是没有研究过的.除了利用和Photoshop中的魔棒一样的技术或者 ...
- Spring Mock
今天看别人的测试代码,发现有 MockMvc.MockHttpServletRequest.MockHttpServletResponse ,不知道是干啥的,百度下下才知道 Mock这个东东. 下 ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Javascript的this用法及jQuery中$this和$(this)的区别
this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...
- mysql函数大全
对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...
- SQLSERVER 获取datetime日期的查询语句
SELECT varchar(10:57AM SELECT varchar(CONVERT(100), GETDATE(), 2): 11.05.16 SELECT varchar(CONVERT(1 ...