MySQL数据库笔记五:多表查询
1.表与表之间的关系
一对一:用户表和身份信息表,用户表是主表
例如:男人表 、女人表
create table man(
mid int primary key auto_increment,
mname varchar(32),
wid int unique
);
create table woman(
wid int primary key auto_increment,
wname varchar(32)
);
一对多:最常见的表关系,用户表和订单表
例如:员工表、部门表
create table emp(
empno int primary key auto_increment,
ename varchar(32),
deptno int
);
create table dept(
deptno int primary key auto_increment,
dname varchar(32)
);
多对多:例如学生表和课程表,通常情况都是将多对多的关系拆分为一对多或者多对一的关系。
至少需要三张表
create table student(
sid int primary key auto_increment,
sname varchar(32)
);
insert into student (sname) values ('大拿');
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
create table course(
cid int primary key auto_increment,
cname varchar(32)
);
insert into course (cname) values ('语文');
insert into course (cname) values ('数学');
insert into course (cname) values ('英语');
insert into course (cname) values ('化学');
create table s_c(
cid int,
sid int
);
insert into s_c (sid,cid) values (1,1);
insert into s_c (sid,cid) values (1,2);
insert into s_c (sid,cid) values (1,3);
insert into s_c (sid,cid) values (1,4);
insert into s_c (sid,cid) values (2,2);
insert into s_c (sid,cid) values (2,4);
insert into s_c (sid,cid) values (3,1);
insert into s_c (sid,cid) values (3,3);
2.为什么要使用多张表
避免出现大量的数据的冗余。
并不是表拆的越多就越好,根据实际情况进行拆分。
3.概念
同时查询多张表
4.分类
<1>合并查询
union ,union all
合并结果集,就是把两个select语句的查询结果合并到一起。(相当于并集)
合并的两个结果,列数和列的顺序,类需要一致
create table emp(
empno int primary key auto_increment,
ename varchar(32)
);
create table dept(
deptno int primary key auto_increment,
dname varchar(32)
);
select * from emp union select * from dept;
select * from emp union all select * from dept;
<2>连接查询
员工表
create table emp(
empno int primary key auto_increment, # 员工编号
ename varchar(32), #员工姓名
job varchar(32), #员工职位
mgr int, #上级编号
hiredate date, #入职时间
sal double, #薪水
comm double, #奖金
deptno int #所属部门
);
部门表
create table dept(
deptno int primary key auto_increment, #部门编号
dname varchar(32), #部门名称
loc varchar(32) #部门地址
);
内连接: inner join....on 、 join 、 ,
inner join 是比较运算符,只返回符合条件的行
例如:
select * from emp inner join dept on emp.deptno=dept.deptno;
select * from emp e ,dept d where e.deptno = d.deptno;
select * from emp e join dept d where e.deptno = d.deptno;
外连接:
左外连接:LEFT OUTER JOIN | left join ... on
代表查询,左边行的全部,右边没有则null
select * from emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
右外连接: right join ... on 或者 right outer join .... on
右连接包含right join 右表所有的行,如果左表中某行在右表没有匹配,则结果中对应的左表的部门全部为空(null)
select * from emp e right OUTER JOIN dept d ON e.deptno = d.deptno;
自连接:
自连接就是说,在同一个数据表中,看作是两个表,表示查找每个人的领导,如果没有领导,则显示无领导
把一张表看作成两张表,一张员工表,一张领导表,都是emp表
select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;
自然连接:natural join (join)| natural left join(同 left join) | natural right join (同 right join)
自然连接会自动判断,以两个表中相同的字段为连接条件,返回查询结果。
select * from emp natural join dept;
select * from emp NATURAL left join dept;
select * from emp NATURAL right join dept;
注意:内连接不写连接条件会出现笛卡尔积的结果,应该避免这种情况,而外连接不写连接条件会报错。
<3>子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)
子查询解决的问题:
谁的薪资比丛浩高???
select * from emp where sal >(select sal from emp where ename='从浩');
定义:子查询允许把一个查询嵌套在另一个查询当中
子查询又叫做内部查询,相当于内部查询。包含内部查询的就称为外部查询。子查询的结果被主查询所使用。
注意的问题:
1.括号
2.可以在主查询的where select having from 后面,都可以使用子查询
3.不可以再group by 后面使用子查询
4.主查询和子查询可以不是同一张表;只有子查询返回的值,主查询可以使用。
需求:查询部门名称是人力的员工信息
第一种方式:利用子查询
select * from emp where deptno=(select deptno from dept where dname='人力部');
第二种方式:利用关联查询
select * from emp e,dept d where e.deptno = d.deptno and d.dname='人力部';
SQL优化:尽量使用多表查询
绝大部分的子查询再最终执行的时候他都是转换成一个多表查询来执行的。 通过SQL执行计划可以看出来。
通过SQL执行计划会发现两种方式执行的是一样的。
5.from后面的子查询
需求:
查询员工号 姓名 月薪
select empno,ename,sal from emp;
6.一般不在子查询中排序
7.一般先执行子查询,再去执行主查询
ANY关键字
假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么
select .... from .. where a > any(...);
->
select ..... from ... where a > result1 or a >result2 or a >result3;
需求:
查询工资比1号部门中任意一个员工高的信息
select * from emp where sal > any(select sal from emp where deptno = 1);
ALL关键字
ALL关键字与any关键字类似,只不过上面的or改成and :
select .... from .. where a > all(...);
->
select ..... from ... where a > result1 and a >result2 and a >result3;
需求:
查询工资比1号部门中所有员工号的员工信息
select * from emp where sal > all(select sal from emp where deptno = 1);
SOME关键字
some 关键字和any关键字是一样的功能。所以:
select .... from .. where a > any(...);
->
select ..... from ... where a > result1 or a >result2 or a >result3;
IN关键字
IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:
where column in (v1,v2,v3,.....);
where column not in (v1,v2,v3,.....);
当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。
案例:
查询部门名称是人力和研发的员工
select * from emp where deptno in (select deptno from dept where dname='人力部' or dname='研发部')
MySQL数据库笔记五:多表查询的更多相关文章
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...
- Mysql数据库(五)表记录的检索
一.基本查询语句 二.单表查询 1.查询所有字段 mysql> SELECT * FROM tb_bookinfo; +----------+-----------+--------+----- ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- mysql数据库中的多表查询(内连接,外连接,子查询)
用两个表(a_table.b_table),关联字段a_table.a_id和b_table.b_id来演示一下MySQL的内连接.外连接( 左(外)连接.右(外)连接.全(外)连接). MySQL版 ...
- MySQL数据库篇之多表查询
主要内容: 一.多表连接查询 二.复合条件连接查询 三.子查询 1️⃣ 多表连接查询 一.准备表 #建表 create table department( id int, name varchar( ...
- mysql数据库笔记0
mysql数据库笔记0 一次性添加多行数据 例如: INSERT INTO students (class_id, name, gender, score) VALUES (1, '大宝', 'M', ...
- Hibernate连接mysql数据库并自动创建表
天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...
- MySQL数据库(五)--用户管理、pymysql模块
一.用户管理(权限管理) 在MySQL中自带的mysql数据库中有4个表用于用户管理的 # 优先级从高到低 user > db > tables_priv > columns_pri ...
- mysql数据库为什么要分表和分区?
一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片 ...
随机推荐
- elk报错解决
.elasticsearch启动失败如下: [root@bogon home]# /home/elasticsearch-/bin/elasticsearch [--11T07::,][WARN ][ ...
- Git(1):思想及概念
Git与其他版本控制软件的差异及思想 直接记录快照,而非差异比较 Git不保存这些前后变化的差异数据.实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中.每次提交更新时,它会纵览一 ...
- 【Zookeeper】利用zookeeper搭建Hdoop HA高可用
HA概述 所谓HA(high available),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA. ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬编码
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...
- C++学习笔记-继承中的构造与析构
C++存在构造函数与析构函数,继承中也存在构造和析构函数.继承中的构造和析构函数与普通的构造析构有细微差别. 赋值兼容性原则 #include "iostream" using n ...
- sql次级语句
select upper(n_id) from nrc_news;select left(n_content,1) from nrc_news;select len(n_content) from n ...
- PYTHON 100days学习笔记008-1:数据结构补充
目录 Day008_01:数据结构补充 1.列表list 1.1 将列表当作堆栈使用 1.2 将列表当作队列使用 1.3 列表推导式 1.4 嵌套列表解析 1.5 del语句 2.元组和序列 3.集合 ...
- poj2152 Fire(树形DP)
题目链接:https://vjudge.net/problem/POJ-2152 题意:给定一颗大小为n的树,在每个结点建消防站花费为w[i],如果某结点没有消防站,只要在它距离<=d[i]的结 ...
- Linux-echo:打印彩色输出
脚本可以使用转义序列在终端中生成彩色文本 文本颜色是由对应的色彩码来描述的.其中包括: 重置=0,黑色=30,红色=31,绿色=32, 黄色=33,蓝色=34,洋红=35,青色=36,白色=37. 要 ...
- Servlet 过滤器和异常处理
Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息.可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servl ...