看完就懂的连表查询

简介: 看完就懂的连表查询

文章目录


一、表与表之间的关系

1.1一对一

1.2一对多

一个班级可以有多个学生,像这样就叫一对多的关系

1.3多对多

一个老师可以带多个学生,一个学生可以被多个老师教,所以两张表的关系是多对多。


二、 连表查询

2.1概念

如果要查询的数据字段在两张表里,需要连表查询

2.2笛卡尔积

select * from 表名1 inner join 表名2;

如果学生表如下:

教师表如下:

如果像上面的写法不加条件就是用学生表的每一条数据去匹配老师表的数据,就是8*5=40,就会生成一个庞大的查询结果,叫笛卡尔积。

但是上面很多数据是无效的,所以为了避免出现笛卡尔积,我们要加上条件。

2.3内连接

select * from 表名1 inner join 表名2 on 条件;

查询结果如下:

我们也可以给表起别名,语法真实表名 as 别名

2.4外连接

2.4.1左外连接
select 字段 from 左表名 left outer join 右表名 on 条件;

左外连接是以左表为基准,左表的所有数据都会显示,对于右表匹配到的就显示匹配的数据,没有匹配的就显示null.

也可以把outer省略

2.4.2右外连接
select 字段 from 左表名 right outer join 右表名 on 条件;

右外连接是以右表为基准,右表的所有数据都会显示,对于左表匹配到的就显示匹配的数据,没有匹配的就显示null.

2.4.3全连接

我们可以这样实现全部查询所有数据显示结果

左外连接语句 UNION 右外连接语句;

select sname,age,tname from student left join teacher on student.tid=teacher.tid UNION select sname,age,tname from student right join teacher on student.tid=teacher.tid;

2.4.4navicat导入导成sql语句

我们把别人给的sql语句导入如下操作:

注意导入成功以后右键刷新一下表才会显示出来。

如果我们想把自己写的表导成sql文件,可以如下操作:

2.4.5练习

假设dept表如下:

假设员工表如下:

(1) 查询sales(销售部)的员工的具体信息(姓名 工资 奖金 部门)

(2)查询姓名最后一位是R的员工的姓名 工作 奖金和所在的部门


三、 子查询

3.1概念

一个查询语句的结果当成另一个查询的语句的范围或条件了。

3.2练习

3.2.1查询工资最高的员工所有信息

第一步:先查出最高工资

select max(sal) from emp;结果是5000

第二步:查询工资=5000的人的所有信息

select * from emp where sal=5000;

第三步:替换成子查询

select * from emp where sal=(select max(sal) from emp);
3.2.2查询工资比7654工资高和7788做相同工作的人的详细信息?

第一步:定出主框架

select * from emp where 工资>? and job=?

第二步:先实现条件1

select sal from emp where empno=7654 结果是1250

第三步:实现条件2

select job from emp where empno=7788;结果是ANALYST

第四步:替换成子查询

select * from emp where sal>( select sal from emp where empno=7654) and job=( select job from emp where empno=7788);

最终结果如下:


五、练习

5.1查询工资比JONES员工高的信息

第一步:先查询JONES的工资

select sal from emp where ename='JONES'; 结果是2975

第二步:替换成子查询

select * from emp where sal>( select sal from emp where ename='JONES');

5.2计算每个部门的平均工资比30部门最高工资还高的平均工资

第一步:先写主框架

select  deptno, avg(sal)  from emp group by deptno having avg(sal)>?

第二步:求30号部门的最高工资

select max(sal) from emp where deptno=30; 结果是2850

第三步:替换成子查询

select  deptno, avg(sal)  from emp group by deptno having avg(sal)>(select max(sal) from emp where deptno=30);

5.3查询工资排名靠前的第6位到第10位

select sal from emp order by sal desc limit 5,5;

5.4查询和SCOTT从事相同工作的信息

第一步:先查询SCOTT从事的工作

select job from emp where ename='SCOTT';结果是化验员

第二步:替换成子查询

select * from emp where job=( select job from emp where ename='SCOTT');

5.5查询有奖金的员工信息

select * from emp where comm is not null;

5.6查询部门编号是20并且工资在2000和3000之间的员工信息

select * from emp where deptno=20 and sal between 2000 and 3000;

5.7查询出工作为MANAGER或者CLERK的员工的信息。

select * from emp where job=’MANAGER’ or job=’CLERK’;

或者

select * from emp where job in (‘MANAGER’,’CLERK’);

5.8查询出名字正数第二位为R的员工信息。

select * from emp where ename like ‘_R%’;


六、补充

mysql有两个存储引擎,一个是innoDB 和MYISAM,但是如果想设置外键必须存储引擎是innodb.

其实创建数据表完整格式:

create table xx(
  字段名 类型 字段修饰符,
  …..
)engine=innodb default charset utf8;



相关文章
|
机器学习/深度学习 并行计算 Shell
docker 获取Nvidia 镜像 | cuda |cudnn
本文分享如何使用docker获取Nvidia 镜像,包括cuda10、cuda11等不同版本,cudnn7、cudnn8等,快速搭建深度学习环境。
7787 0
|
前端开发 JavaScript
前端知识(十)———JavaScript 使用URL跳转传递数组对象数据类型的方法
前端知识(十)———JavaScript 使用URL跳转传递数组对象数据类型的方法
552 0
|
域名解析 网络协议
网络协议与攻击模拟-02-wireshark使用-显示过滤器
网络协议与攻击模拟-02-wireshark使用-显示过滤器
470 0
|
存储 监控 安全
ONVIF协议介绍
ONVIF协议介绍
7255 0
|
监控 安全 前端开发
Onvif开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
Onvif开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
Onvif开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
|
6月前
|
Java 开发者
使用BigDecimal类进行精确的加、减、乘、除操作,并比较BigDecimal数组元素大小
总结起来,BigDecimal类是Java中一个强大的工具,用于精确控制浮点数运算,避免了传统浮点类型因精度问题可能造成的错误。在需要精确计算的场景中,如金融系统、科学计算等,BigDecimal是首选。通过以上介绍的方法,可以对BigDecimal进行高效稳定的算数操作及大小比较。
735 12
|
12月前
|
人工智能 测试技术 定位技术
Tarsier2:字节跳动开源专注于图像和视频内容理解的视觉语言大模型
Tarsier2 是字节跳动推出的大规模视觉语言模型,支持高质量视频描述、问答与定位,在多个视频理解任务中表现优异。
910 16
|
10月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
1269 0
|
JavaScript 前端开发 Go
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
2732 2
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
3270 5