重新学习数据库(2)

单元概述

通过本章的学习能够了解MySQL数据库中多表查询的含义,掌握多表查询的基本写法,掌握特殊的多表查询的写法,掌握内连接和外连接的区别

测试数据脚本

drop TABLE emp;
drop TABLE dept;
drop TABLE salgrade;
create table dept
(
deptno integer(4) not null,
dname varchar(14),
loc varchar(13)
);
alter table dept add constraint pk_dept primary key (deptno);
create table emp
(
empno integer(4) not null,
ename varchar(10),
job varchar(9),
mgr integer(4),
hiredate date,
sal decimal(7,2),
comm decimal(7,2),
deptno integer(2)
);
alter table emp add constraint pk_emp primary key (empno);
alter table emp add constraint fk_deptno foreign key (deptno) references dept (deptno);
create table salgrade
(
grade integer(1),
losal decimal(7,2),
hisal decimal(7,2)
);
insert into DEPT (DEPTNO, DNAME, LOC) values (10, ‘ACCOUNTING’, ‘NEW YORK’);
insert into DEPT (DEPTNO, DNAME, LOC) values (20, ‘RESEARCH’, ‘DALLAS’);
insert into DEPT (DEPTNO, DNAME, LOC) values (30, ‘SALES’, ‘CHICAGO’);
insert into DEPT (DEPTNO, DNAME, LOC) values (40, ‘OPERATIONS’, ‘BOSTON’);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL) values (5, 3001, 9999);
— 下面要特别注意,%d-%m-%Y 里的 d 和 m 一定要小写
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, ‘SMITH’, ‘CLERK’, 7902, STR_TO_DATE(’17-12-1980′, ‘%d-%m-%Y’), 800.00, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, ‘ALLEN’, ‘SALESMAN’, 7698, STR_TO_DATE(’20-02-1981′, ‘%d-%m-%Y’), 1600.00, 300.00, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, ‘WARD’, ‘SALESMAN’, 7698, STR_TO_DATE(’22-02-1981′, ‘%d-%m-%Y’), 1250.00, 500.00, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, ‘JONES’, ‘MANAGER’, 7839, STR_TO_DATE(’02-04-1981′, ‘%d-%m-%Y’), 2975.00, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, ‘MARTIN’, ‘SALESMAN’, 7698, STR_TO_DATE(’28-09-1981′, ‘%d-%m-%Y’), 1250.00, 1400.00, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, ‘BLAKE’, ‘MANAGER’, 7839, STR_TO_DATE(’01-05-1981′, ‘%d-%m-%Y’), 2850.00, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, ‘CLARK’, ‘MANAGER’, 7839, STR_TO_DATE(’09-06-1981′, ‘%d-%m-%Y’), 2450.00, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, ‘SCOTT’, ‘ANALYST’, 7566, STR_TO_DATE(’19-04-1987′, ‘%d-%m-%Y’), 3000.00, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, ‘KING’, ‘PRESIDENT’, null, STR_TO_DATE(’17-11-1981′, ‘%d-%m-%Y’), 5000.00, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, ‘TURNER’, ‘SALESMAN’, 7698, STR_TO_DATE(’08-09-1981′, ‘%d-%m-%Y’), 1500.00, 0.00, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, ‘ADAMS’, ‘CLERK’, 7788, STR_TO_DATE(’23-05-1987′, ‘%d-%m-%Y’), 1100.00, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, ‘JAMES’, ‘CLERK’, 7698, STR_TO_DATE(’03-12-1981′, ‘%d-%m-%Y’), 950.00, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, ‘FORD’, ‘ANALYST’, 7566, STR_TO_DATE(’03-12-1981′, ‘%d-%m-%Y’), 3000.00, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, ‘MILLER’, ‘CLERK’, 7782, STR_TO_DATE(’23-01-1982′, ‘%d-%m-%Y’), 1300.00, null, 10);

单元练习

  1. 写一个查询,显示所有员工姓名,部门编号,部门名称。
    SELECT e.ename,e.deptno,d.dname
    FROM emp e, dept d
    WHERE e.deptno = d.deptno;
  2. 写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
    SELECT e.ename,d.loc,e.comm
    FROM emp e,dept d
    WHERE e.deptno = d.deptno
    AND e.comm is not NULL
    AND d.loc = ‘CHICAGO’;
  3. 写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
    SELECT e.ename,d.loc
    FROM emp e, dept d
    WHERE e.deptno =d.deptno
    AND ename LIKE ‘%A%’;

1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序
SELECT e.empno,e.ename,e.sal,s.grade,d.loc
FROM emp e,dept d,salgrade s
WHERE e.deptno = d.deptno
AND (e.sal BETWEEN s.losal AND s.hisal)
ORDER BY grade ASC;

1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号
SELECT worker.ename ‘ENAME’,worker.empno ‘ENO’,manager.ename ‘MNAME’,manager.empno ‘MNO’
FROM emp worker,emp manager,dept d
WHERE worker.mgr = manager.empno
AND worker.deptno = d.deptno
AND d.loc IN (‘NEW YORK’,’CHICAGO’);

  1. 创建一个员工表和部门表的交叉连接。
    select * from emp cross join dept;
  2. 使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
    SELECT e.ename,e.deptno,e.hiredate
    FROM emp e NATURAL JOIN dept d
    WHERE hiredate >’1980-05-01′;
  3. 使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
    SELECT worker.ename ‘WNAME’,manager.ename ‘MNAME’
    FROM emp worker
    LEFT OUTER JOIN emp manager
    ON (worker.mgr = manager.empno);
  4. 使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来
    SELECT worker.ename ‘WNAME’,manager.ename ‘MNAME’
    FROM emp manager
    RIGHT OUTER JOIN emp worker
    ON (worker.mgr = manager.empno);

课后练习

  1. 显示员工SMITH的姓名,部门名称,直接上级名称
    SELECT worker.ename ‘WNAME’,d.dname ‘DNAME’,manager.ename ‘MNAME’
    FROM emp worker,dept d,emp manager
    WHERE worker.mgr = manager.empno
    AND worker.deptno = d.deptno
    AND worker.ename = ‘SMITH’;
  2. 显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
    SELECT e.ename,d.dname,e.sal,s.grade
    FROM emp e, dept d,salgrade s
    WHERE e.deptno = d.deptno
    AND(e.sal BETWEEN s.losal AND s.hisal)
    AND s.grade > 4;
  3. 显示员工KING和FORD管理的员工姓名及其经理姓名。
    SELECT e.ename “员工姓名”,m.ename “经理姓名”
    FROM emp e,emp m
    WHERE e.mgr=m.empno
    AND m.ename =’KING’ or e.mgr=m.empno and m.ename =’FORD’;
  4. 显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早
    SELECT e.ename “员工姓名”, e.hiredate “参加工作时间” ,m.ename “经理姓名”, m.hiredate “经理参加工作时间”
    FROM emp e,emp m
    WHERE e.mgr=m.empno

对等值连接、不等值连接、自身连接、外连接有了更深刻的理解,查询语句写得更加熟练了

Original: https://www.cnblogs.com/Aegeansea666/p/16484409.html
Author: Aegeansea666
Title: 重新学习数据库(2)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622767/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • zabbix监控配置流程

    1.0 zabbix监控配置流程详细 管理角度: 开发 由开发人员提供监控指标来监控 运营 让其找开发要监控指标 运维 直接加 配置角度: 创建主机 创建主机组并加入主机 添加监控…

    数据库 2023年6月14日
    0148
  • Redis 文件事件

    事件驱动 Redis 服务器是事件驱动程序,分为 文件事件和 时&am…

    数据库 2023年6月6日
    0152
  • InnoDB数据存储结构

    MySQL服务器上 存储引擎负责对表中数据的读取和写入工作,不同存储引擎中 &#x5…

    数据库 2023年5月24日
    0122
  • 操作线程的方法

    操作线程的方法操作线程有很多方法,这些方法可以使线程从某一种状态过渡到另一种状态。 线程的休眠能控制线程行为的方法之一是调用sleep()方法,sleep()方法可以指定线程休眠的…

    数据库 2023年6月16日
    0124
  • Java关键字总结(一)

    static总结: 1、修饰静态变量,通过类名.变量名,不需要实例化对象,属于静态资源,所有类实例共享 2、修饰静态方法,通过类名.方法,不需要实例化对象,属于静态资源,所有类实例…

    数据库 2023年6月6日
    0173
  • Variable used in lambda expression should be final or effectively final

    java的lambda表达式里不能出现变量,必须是final修饰的,但是可以让变量在定义时候计算【新函数】出结果,这样就不算变量了。可以使用lambda表达式,不再报错。例如 bo…

    数据库 2023年6月9日
    0166
  • 数据库_多表查询_内连接&外连接

    首先明确一下定义: 内连接:在多表查询的时候,只检索出表之间相互匹配的行(满足匹配条件的行),结果中不包括两个表之间不匹配的行。 一个不太准确但易懂的例子:比如有两个表,表1存储了…

    数据库 2023年6月16日
    0205
  • 解决数据库报错Error 1390: Prepared statement contains too many placeholders的问题

    今天,当您开发一个项目时,您试图一次插入大量数据,但出现了以下错误: [En] Today, when you were developing a project, you tri…

    数据库 2023年5月24日
    0167
  • Javaweb07-三层架构(BaseDao)

    1、BaseDao 持久层业务接口实现类的公共父类,定义了jdbc操作数据库的所有公共方法,方便子类继承; import java.io.InputStream; import j…

    数据库 2023年6月16日
    0173
  • MongoDB,入门看这一篇足矣!

    一、介绍 在介绍 MongoDB 之前,我先介绍一下业务开发的时候遇到的痛点,以便大家对它有一个更加清晰的认识! 最近在用数据库存储数据的时候发现这么一个坑,例如从消息队列中监听消…

    数据库 2023年6月14日
    0133
  • 高可用 | Xenon 实现 MySQL 高可用架构 常用操作篇

    原创:知数堂 上一篇文章,我们详细介绍了 Xenon 实现 MySQL 高可用架构的部署过程。接下来本篇将介绍 Xenon 的常用操作,帮助大家在完成环境搭建之后,能把 Xenon…

    数据库 2023年5月24日
    0156
  • Linux常用命令总结(二)

    1.Netstat 命令 用于显示各种网络相关信息,如网络连接,路由表,接口状态等待。 例如 统计IP110.120.119.XXX的连接数: netstat | grep 110…

    数据库 2023年6月16日
    0121
  • B树-查找

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 查找 假设有一棵3阶B树,如下图所示。 下面说明在该B树中查找 52的过程 首先,从根结点出发…

    数据库 2023年6月14日
    0193
  • MySQL函数学习(五)—–流程控制函数

    md函数笔记五 注:笔记旨在记录 五、MySQL 流程控制函数 0. 表 0.1 num表: 1. IF() — 条件判断 1.1. 函数: 1.2. sql示例: 2…

    数据库 2023年6月16日
    0151
  • 智慧 ~ 引子 ~ 三则故事

    年轻人的故事 从前,有位乡下青年,读了点书,嫌乡村的生活单调,决定要去城里闯世界。临走时,他向村中的村长请教,村长给了他三个字的忠告:”不要怕”。并讲好等他…

    数据库 2023年6月9日
    0129
  • Geoserver对发布的数据源进行金字塔切片

    一、建立切片数据源1.1建立工作区 1.2添加数据我这里是老师给的高清卫星地图数据,格式为tif工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层这里建立的…

    数据库 2023年6月6日
    0146
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球