SQL 的JOIN ON连表查询注意事项(查偏科学生的例子)

2023-10-24 19:10

本文主要是介绍SQL 的JOIN ON连表查询注意事项(查偏科学生的例子),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、关联查询时,别名随便起,极限情况下甚至中文也可以(但不提倡),注意在多个子查询内,对同一个表的同一个字段可以起不同的别名,在外面join on和where时也是互不影响的.

2.当left join或from后面跟的是子查询,即当查询内容是子查询(a和b)时,,如果给子查询中的字段取了别名(pid),那么在外层联表这两个子查询on和where时用a.就必须要使用别名来.出来了,必须要和各自子查询里面取的别名对的上 如果还是使用原字段名去on会导致查询时找不到字段,会报错:

[Err] 1054 - Unknown column '原字段名' in 'on clause'

3、表与表在使用ON连表必须严格用字段名,即使给字段取了别名,也不能用起的别名,否则会找不到详细的字段,报错:

Oracle 报错:ORA-00904 “p”."别名" : 标识符无效

MySQL报错:[Err] 1054 - Unknown column 'p.别名' in 'on clause'

​编辑

​编辑

4.关联表时注意先后关系,注意要先声明用到哪个表后,再使用其.点出里面的字段;比如到22行的时候s表还没有声明,就先使用的话,就会报异常

5.在连表查询时,若与关联的表有重复的字段,就不要用select*来直接获取所有字段的值了,需要一个一个写完整,并起别名,否则报错:

[Err] 1060 - Duplicate column name '重复的字段'​编辑

6、如果查询内容是子查询关联的结果,那么最外层一般直接select*,因为是连几张表或自己查,会指定好字段,外层不需要额外指定

7、select的时候可以from一个子查询()a,不是非要from一个表,同样left join也不是非要连上一个表,也可以连上一个子查询()b


三种写法速记

-- 两个子查询左连接  分别是语文成绩和数学成绩  条件是pid相等  条件偏科
-- 查询人员表 再左连接成绩表s1(语文)和成绩表s2(数学) 条件是偏科
-- from后面跟所有表,where后面些条件 把表关系用and连起来

现有:三张表 人员表、课程表、分数表;其中人员表和课程表是独表,成绩表为联表;

需求:查询语文分数大于数学分数(即偏科)的学生信息 

分析:显然,查每一个偏科的人,都需要从成绩表查此人的两条数据(语/数)出来进行分数比较,所以这里如果用到左连接,那么一定需要关联两次成绩表,on到同一个人的标识,即学号;再在最后定下偏科的where规则,即此人的语文成绩大于数学成绩完成查询;

然后,如果不使用左连接,在from时,也要在后面跟上两次成绩表,并取别名(s1/s2)详见博客最尾部展示了其他的几种查询方法

人员表(Person)id,name      课程表(Class)  id,name      成绩表(Score)  id,pid,cid,fen

1、关联查询时,别名随便起,极限情况下甚至中文也可以(但不提倡),注意在多个子查询内,对同一个表的同一个字段可以起不同的别名,在外面join的onwhere时也是互不影响的.

2.left joinfrom后面跟的是子查询中的字段若取了别名,那么在外层on联表或where写条件时,就必须要使用别名来点出各自的字段了,:

left joinfrom后面跟的是子查询,即当查询内容是子查询(a和b)时,如果给子查询中的字段取了别名(pid),那么在外层on联表或where写条件时,用子查询的字段就必须要使用别名来.出来,并且必须要和各自子查询里面取的别名对的上,因为会出现自己连接自己的情况,字段会重,如果还是使用原表字段名去on会导致查询时不能确定是哪个子查询里面的字段,会报错:

[Err] 1054 - Unknown column '原字段名' in 'on clause'

联表left join子查询on错误示例;

查询fromwhere条件错误示例; 

3、在使用ON连表必须严格用字段名,即使给字段取了别名,也不能用起的别名,否则会找不到详细的字段,报错:

Oracle 报错:ORA-00904p."别名" : 标识符无效

MySQL报错:[Err] 1054 - Unknown column 'p.别名' in 'on clause'

oracle数据库:

mysql数据库: 

4.关联表时注意先后关系,注意要先声明用到哪个表后,再使用其.点出里面的字段;比如到22行的时候s表还没有声明,就先使用的话,就会报异常

[Err] 1054 - Unknown column 's.cid' in 'on clause'

5.在连表查询时,若与关联的表有重复的字段,就不要用select*来直接获取所有字段的值了,需要一个一个写完整,并起别名,否则报错:

[Err] 1060 - Duplicate column name '重复的字段'

6、如果查询内容是子查询关联的结果,那么最外层一般直接select*,因为是连几张表或自己查,会指定好字段,外层不需要额外指定

7、select的时候可以from一个子查询()a,不是非要from一个表,同样left join也不是非要连上一个表,也可以连上一个子查询()b

select * from

(根据pid过滤出语文成绩) a

left ioin (根据pid过滤出语文成绩) b  on a.pid=b.pid

where a.fen>b.fen

附:

分析:查每一个偏科的人,都需要从成绩表查此人的两条数据(语/数)出来进行分数比较,所以这里如果用到左连接,那么一定需要关联两次成绩表,on到同一个人的标识,即学号;最后再来制定where规则:即此人的语文成绩大于数学成绩完成查询;

如果不使用左连接,在from时,也要在后面跟上两次成绩表,并取别名(s1/s2)后面第二种示例

一.这是几种方法中使用了左连接并最简洁的SQL:

SELECT * FROM person p 
LEFT JOIN    score s1 on s1.pid=p.id and s1.cid='101'
LEFT JOIN    score s2 on s2.pid=p.id and s2.cid='102'
where   s1.fen>s2.fen

如果觉得查询结果乱,可以将select* 改为别名

SELECT  p.id 学号,p.namee 名称,s1.fen 语文成绩,s2.fen 数学成绩 FROM person p 
LEFT JOIN    score s1 on s1.pid=p.id and s1.cid='101'
LEFT JOIN    score s2 on s2.pid=p.id and s2.cid='102'
where   s1.fen>s2.fen
            查询结果如下:

二。如果不使用左连接查询,在from时,也要在后面跟上两次成绩表,并取别名(s1/s2)

SELECT * FROM person p,score s1, score s2
WHERE p.id=s1.pid
AND p.id=s2.pid
AND s1.cid=(SELECT id FROM class WHERE namee='语文')
AND s2.cid='102'     ←←←(这里102可以如上一行一样,用内连接根据课程名查课程id)
AND s1.fen>s2.fen

 如果觉得查询结果乱,可以将select* 改为别名

SELECT p.id 学号,p.namee 名称,s1.fen 语文成绩,s2.fen 数学成绩 FROM person p,score s1, score s2
WHERE p.id=s1.pid
AND p.id=s2.pid
AND s1.cid=(SELECT id FROM class WHERE namee='语文')
AND s2.cid='102'     ←←←(这里102可以如上一行一样,用内连接根据课程名查课程id)
AND s1.fen>s2.fen

还发现了CSDN编辑页面CV到SQL查询页面的一个小bug:

---2022/11/8

这篇关于SQL 的JOIN ON连表查询注意事项(查偏科学生的例子)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277183

相关文章

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误