重新学习数据库(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/644578/

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

(0)

大家都在看

  • 不同网段之间实现GDB远程调试功能

    在开发过程中,使用gdb远程调试时,会碰到 Linux 服务器的网段和板载设备的网段不是一样的,不能正常使用 gbd 远程调试功能。 板载设备和电脑连接路由器,属于同一个网段,如1…

    技术杂谈 2023年7月25日
    079
  • gnomeshell扩展命令行开启和关闭

    #关闭gnome-shell-extension-tool -d 扩展名 #开启gnome-shell-extension-tool -e 扩展名 例如:gnome-shell-e…

    技术杂谈 2023年7月24日
    080
  • 《软技能-代码之外的生存指南》读书笔记

    《软技能-代码之外的生存指南》读书笔记 写在前面 最近项目相对松了一些,想静下心来看一些书,买了些DDD的书,记得这本书也是程序员必读的书之一,就凑单也买了纸质的来看看~ 抄录一些…

    技术杂谈 2023年7月24日
    064
  • SpringBoot异步调用

    在程序执行时候还有一个瓶颈,串行执行,可以通过使用不同线程类快速提升应用的速度。 要启用Spring的异步功能,必须要使用 @EnableAsync注解。这样将会透明地使用 jav…

    技术杂谈 2023年7月24日
    070
  • 特定声音识别检测模块详解

    一 需求分析 对于养宠物的人来说,识别宠物的叫声并根据它的叫声来判断是否出现了异常。宠物叫声一般都比较单一,难度相对较低,准确性有保障。 病人健康检测:通过声音识别,可以检测出人夜…

    技术杂谈 2023年5月31日
    0115
  • HugeGraph入门

    前言 下载链接 链接:https://pan.baidu.com/s/1P7eIelXHI0l5pSEBFCCF7Q提取码:vax4 一、HugeGraph简介 最近在搞好友推荐方…

    技术杂谈 2023年6月1日
    0107
  • 条件分支

    条件分支 if-else-fi [root@node1 test]# vim if.sh #!/bin/bash amswer=30 if [ $1 -gt $answer ];t…

    技术杂谈 2023年7月11日
    078
  • Django Model 如何返回空的 QuerySet

    >>> from django.contrib.auth.models import User >>> User.objects.none() …

    技术杂谈 2023年6月21日
    0111
  • 一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG

    这一周线上碰到一个诡异的BUG。 线上有个定时任务,这个任务需要查询一个表几天范围内的一些数据做一些处理,每隔十分钟执行一次,直至成功。 通过日志发现,从凌晨5:26分开始到5:5…

    技术杂谈 2023年7月25日
    0120
  • Redis+Lua实现简易的秒杀抢购

    1 商品抢购 主要逻辑是:减库存,记录抢购成功的用户 @RestController public class DemoController { @Resource private…

    技术杂谈 2023年7月24日
    074
  • Python 周期任务神器,太实用了

    前言 如果你想在Linux服务器上周期性地执行某个 Python 脚本,最出名的选择应该是 Crontab 脚本,但是 Crontab 具有以下缺点: 1.不方便执行秒级的任务。 …

    技术杂谈 2023年6月21日
    0108
  • Aerospike AQL

    Aerospike AQL posted on2022-02-09 17:44 duanxz 阅读(48 ) 评论() 编辑 Original: https://www.cnblo…

    技术杂谈 2023年5月30日
    081
  • TestLink在线Excel用例转换xml

    项目功能 TestLink在线Excel用例转换xml将符合用例模板的Excel测试用例,转换成xml,用于导入TestLink进行用例管理。 使用方法 1、编写测试用例 2、打开…

    技术杂谈 2023年7月11日
    056
  • Node节点禁止调度(平滑维护)方式- cordon,drain,delete

    cordon、drain和delete三个命令都会使node停止被调度,后期创建的pod不会继续被调度到该节点上,但操作的暴力程度却不一样。 一、cordon 停止调度(不可调度,…

    技术杂谈 2023年5月30日
    076
  • 体验【应用交付扫雷大作战】,得程序员专属帆布袋

    【体验技能Get】✅一个平台,搞定应用全生命周期管理✅白屏化部署,轻松上手K8s✅发布可观测可干预,发布信心十足【体验奖品Get,100%拿】云效新老用户均可参与,1000份云效定…

    技术杂谈 2023年7月11日
    069
  • 区间dp

    顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。 核心思路 既然让我求解在一个区间上的最优解…

    技术杂谈 2023年7月11日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球