查缺补漏二:多表联查
多表联查场景
一对一
用户与用户信息表:当用户的信息数据过多时,我们可以将其分成两个表分别对应用户基本信息和用户的详情信息。
create table user(`id` int auto_increment primary key comment'用户id',`name` varchar(10),`age` varchar(10),`gender` char,`tel` varchar(30),`school` varchar(20),`addr` varchar(20),`degree` varchar(10),`university` varchar(10)
);
当用户信息过多时,就可以使用外键进行关联。在任意一方加入外键,关联另一方主键,并且设置外键为唯一的UNIQUE如下实现:
create table user(`id` int auto_increment primary key,`name` varchar(10),`age` varchar(10),`gender` char
);
create table user_info(`id` int auto_increment primary key ,`tel` varchar(30),`school` varchar(20),`addr` varchar(20),`degree` varchar(10),`university` varchar(10),`user_id` int unique,constraint fk_user_info foreign key (user_id) references user(id)
);
多对一
部门与员工:一个员工对应一个部门,一个部门对应多个员工
员工指向多的一方,部门指向一的一方。此时应该在员工表中创建外键,指向部门表中的主键
# 员工表
create table emp
(`emp_id` int auto_increment primary key,`emp_name` varchar(20) not null,`emp_gender` char,`emp_tel` varchar(30),`emp_dept_id` int,constraint fk_emp_dept foreign key (emp_dept_id) references dept (dept_id)
);
# 部门表
create table dept
(`dept_id` int auto_increment primary key,`dept_name` varchar(20) not null
);
查询方法:
-- 正常单表查
select * from emp;
-- 全查 笛卡尔积
select * from emp,dept;
-- 联查 消除无效的笛卡尔积
select * from emp,dept where emp_dept_id = dept.dept_id;
多对多
学生与课程:一个学生可以选修多门课程,一门课程可以被多个学生选择
此时我们应该在学生表与课程表之间建立中间表。中间表包含两个外键,分别对应学生表和课程表的主键
首先我们准备好数据,学生表+课程表+中间信息表
# 学生表
CREATE TABLE student(id INT auto_increment PRIMARY KEY COMMENT '主键ID',name VARCHAR(10) COMMENT '姓名',no VARCHAR(10) COMMENT '学号'
)COMMENT '学生表';
INSERT INTO student VALUES(NULL,'小瘪三','2001'),(NULL,'小瘪四','2002'),(NULL,'小瘪五','2003'),(NULL,'小瘪六','2004');# 课程表
CREATE TABLE course(id INT auto_increment PRIMARY KEY COMMENT'主键ID',name VARCHAR(10) COMMENT '课程名称'
)COMMENT '课程表';
INSERT INTO course VALUES(NULL,'java'),(NULL,'PHP'),(NULL,'MySQL'),(NULL,'Hadoop');# 学生课程关系表(中间表)
CREATE TABLE student_course(id INT auto_increment COMMENT '主键' PRIMARY KEY,student_id INT NOT NULL COMMENT '学生ID',course_id INT NOT NULL COMMENT '课程ID',CONSTRAINT fk_course_id FOREIGN KEY (course_id) REFERENCES course (id),CONSTRAINT fk_student_id FOREIGN KEY (student_id) REFERENCES student (id)
)COMMENT '学生——课程关系中间表';
INSERT INTO student_course VALUES(null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);
我们切换IDEA打开可以清晰的看到三个表之间的关系,中间信息表中的两个外键:student_id与course_id将学生表和课程表关联了起来
内连接查询
查询A集合与B集合的交集
-- 方式一
select [字段列表] from 表1,表2 where 条件...;
-- 方式二
select [字段列表] from 表1 inner join 表2 on 条件...;
示例:查询所有员工与其所属部门
-- 方式一
select emp_name,dept_name from emp inner join dept d on emp.emp_dept_id = d.dept_id;
-- 方式二
select emp_name,dept_name from emp,dept where emp.emp_dept_id = dept.dept_id;
外连接
右外连接:查询右表所有数据以及两表交集部分数据
select 字段列表 from 表1 right outer join 表2 on 条件...;
左外连接:查询左表所有数据以及两表交集部分数据
select 字段列表 from 表1 left outer join 表2 on 条件...;
示例:
-- 2. 查询员工全部信息及其对应的部门信息 左外连接
select e.*,dept_name from emp e left join dept d on d.dept_id = e.emp_dept_id;
-- 3. 查询全部部门和其对应的所有员工信息 右外连接
select d.*,e.emp_name from emp e right join dept d on e.emp_dept_id = d.dept_id;
自连接
当前表与自身的连接查询,自连接必须使用别名
格式:
select 字段列表 from 表A 别名 join 表A 别名 on 条件...;
在员工表中,所有的普通员工、管理者都是员工。查询每个员工归属哪个管理者管理就需要用到自连接
select a.name,b.name from emp a join emp b on a.emp_id = b.manager_id;
联合查询
关键字 union [all] 将两条sql语句查询的结果拼接起来
-- 查询年龄大于50的员工 和薪资小于10000的员工
select * from emp where emp.emp_age > 50
union all
select * from emp where emp.emp_salary < 10000;
加上all表示不会去重,不加all表示去重复(即同时满足两条sql语句的只出现一次即可)
多张表的列数必须保持一致,字段类型也需要一致
子查询
子查询是指在SQL语句中嵌套select语句进行嵌套查询
select * from t1 where column1 =(select column1 from t2);
子查询的外部语句可以是insert、uodate、delete、select的任何一个
标量子查询示例:查询‘ 开发部 ’的全部员工信息
首先你可以利用正常的两条sql去查询:
-- 查询“开发部”的所有员工
-- 1. 两条语句查询
select dept_id from dept where dept_name = '开发部';
select emp_name from emp where emp_dept_id = 1;
或者你可以使用内连接方式进行联查:
-- 内连接
select e.emp_name,d.dept_name from emp e inner join dept d on e.emp_dept_id = d.dept_id where dept_name = '开发部';
或者使用子查询:
-- 使用子查询
select * from emp where emp_dept_id = (select dept_id from dept where dept_name = '开发部');
查缺补漏二:多表联查相关推荐
- EFCore查缺补漏(二):查询
相关文章: EFCore查缺补漏 第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single q ...
- JAVA核心,200例,查缺补漏
适用于想要查缺补漏的人:本已经掌握的技术,但是不知道如何表达的人:不断完善技自己,顺带梳理下答案. 主要包括以下模块:Java基础.容器.多线程.反射.对象拷贝.Java Web模块,异常.网络.设计 ...
- 「查缺补漏」高频考点浏览器面试题
前言 想要成为一名合格的前端工程师,掌握相关浏览器的工作原理是必备的,这样子才会有一个完整知识体系,要是「能参透浏览器的工作原理,你就能解决80%的前端难题」. 这篇梳理的话,更多的是对浏览器工作原理 ...
- 2020年最新最全的Java面试经历整理(一次性查缺补漏个够)
前言 现在已经是2020年了,相信很多人都在准备面试,,如何拿到心仪的 Offer,进入梦寐以求的大厂,实现自己的职业理想,达到程序员的小康水平. 这篇文章主要介绍了刘哥一月份的几次面经,(一次性查缺 ...
- Java 基础开发技术查缺补漏笔记
暑假期间,个人对一些未来研究生阶段可能会常用的编程技术进行重新一轮的系统复习和学习,及希望能够查缺补漏,有所提升.本文也是作为复习和学习过程中的笔记,用于长久的记录.不排除其中可能含有部分疏漏和错误, ...
- C++查缺补漏之异常(续)
此文是文章<C++查缺补漏之异常>:http://blog.csdn.net/ii1245712564/article/details/44617881的后续 1.异常的重新抛出 可能单个 ...
- MySQL查缺补漏 从无到有
MySQL查缺补漏 从无到有 有这一篇就够了 数据库概述 SQL概述 什么是数据库 MySQL概述 SQL的分类 DOS命令窗口使用MySQL的基本命令 查看MySQL的版本 进入MySQL 导入数据 ...
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- 查缺补漏系统学习 EF Core 6 - 原始 SQL 查询
推荐关注「码侠江湖」加星标,时刻不忘江湖事 这是 EF Core 系列的第五篇文章,上一篇文章盘点了 EF Core 中的几种数据查询方式. 但是有有时候,我们可能无法用标准的 LINQ 方法完成查询 ...
最新文章
- iOS 15.2计划上线“数字遗产”!网友:管的真远,身后事都替我操心?
- vnctf——cm1
- Angular2.0 基础: User Input
- MySQL数据库密码重置
- Python模块(7)-SciPy 简易使用教程
- 有了这个告警系统,DBA提前预警不是难题
- Java-java.io.BufferedInputStream
- 【视频】R语言中的分布滞后非线性模型(DLNM)与发病率,死亡率和空气污染示例
- 20170826滴滴算法工程师笔试
- android im 文件发送,极光IM- 基础功能 - 极光文档
- 计算机cf是什么比赛,端游cf什么是信用星级
- 配置Linux服务器防火墙端口规则
- pacman 查询_pacman常用命令
- IDV和IDV的发展简史
- 计算机人工智能应用,计算机在人工智能中的应用研究
- OpenJudge NOI 1.13 18:Tomorrow never knows?
- 计算机专业常见面试题目汇总
- C++中 char* 、string、 char、char[]在各种情况下的输入与输出
- 海为PLC远程监控与数据采集方案
- 欧盟委员会敲定新SCC,以恢复正常的欧盟-美国数据传输协议
热门文章
- 12万字数字政府县级智慧政务云平台建设方案WORD
- 华为内部的Web安全原则笔记
- 软件测试 | 测试开发 | Zadig 完成 100% 开源:开启软件交付 3.0 时代
- 又因明星婚恋,微博瘫痪了
- NSSCTF Round#8 web专项赛
- STM32F401RCT6基于Arduino框架点灯程序
- Fast Normalized Cross-Correlation
- [ZJOI 2016] bzoj 4455 小星星 - 容斥
- unity塔防游戏怪物转向_家园保卫战红包版下载,家园保卫战赚钱游戏红包版 v1.0.5...
- jieba分词自定义词库无效果