sql查询一个面试题的7步解法及语法区别分析讲解

本篇讲述的是对一个sql面试题的细致语法讲解。关于执行流程(on where),内连接,外连接(左右)上实用。关于这些基本的语法知识请参考我前面的sql基本语法。

这张表的名字SC,SNO学号,CNO课程号,SCGRADE成绩。要求:列出“1”号课程成绩比“2”号课程成绩高的所有学生学号及其“1”号课程和“2”号课程的成绩

要求:列出“1”号课程成绩比“2”号课程成绩高的所有学生学号及其“1”号课程和“2”号课程的成绩

1,分别查出1 2号课程的所有列表(包括学号,课程,成绩)。

2,条件1课程表的成绩>2课程表的成绩。两表连接查询。

3,隐士的条件,这两个表中的学号相等。两表连接查询。

4,select 表1或表2的序号,表1.成绩,表2.成绩。

5,分别起别名。

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT *FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT * FROM SC WHERE CNO=2)as b
WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A RIGHT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

所有方法

第一种:

SELECT A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT *FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT * FROM SC WHERE CNO=2)as b
WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

第二种:

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A CROSS JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
WHERE A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

  

第三种

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

 

第四种:

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A INNER JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;

  

第五种:

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

  

第六种:

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A LEFT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE WHERE A.SNO=b.SNO;

 

第七种:

SELECT  A.SNO as ‘学号‘,A.SCGRADE AS ‘1号课程‘,b.SCGRADE as ‘2号课程‘ FROM
(SELECT SNO,SCGRADE FROM SC WHERE CNO=1)AS A RIGHT JOIN (SELECT SNO,SCGRADE FROM SC WHERE CNO=2)as b
ON A.SCGRADE>b.SCGRADE AND A.SNO=b.SNO;

  

方法1和2之间区别是两个连接表的查询字段的多余与否。

方法3演示了inner jion和on的连接使用,并和cross jion的区别。

方法4和3演示了内连接流程顺序,先from内(包含on)走完,再where。内连接和on where的功能相同,但顺序不同。

方法5演示纯的左连接和on多条件使用。

方法6和5演示了左链接流程顺序,先from内(包含on)走完,再where。内连接和on where的功能相同,但顺序不同。

方法7右连接的on多条件使用。

这些区别已经区分非常清楚。具体语法请看我前几篇关于数据库的基本语法文章。

当然,这些不是什么前沿技术,但很细致,对不对?

  

时间: 2024-11-02 18:36:47

sql查询一个面试题的7步解法及语法区别分析讲解的相关文章

SQL查询一个表中类别字段中Max()最大值对应的记录

问题是: 数据库有一个表 code,里面有个点击量字段click_num和一个类别字段kind以及其它信息字段, 现在要搜出每个类别中点击量最大的那条记录,如果是10个类别,那么结果应该是10条记录, 如果最大点击量有两个相同的只要一条. 经过N次搜索,N次检测网上的解决SQL语句,终于找到个优雅的而且结果正确的SQL,这个是一个博客作者在Mysql的官方文档里面发现的. 禁不住收藏了,以备后用. select id,kind,click_num from code as a where  cl

SQL查询一个表的总记录数的方法

一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>SELECT ename, sa

一个sql查询一个员工所管理的所有人员

如何设计一张表来存储一个公司的所有员工信息,员工信息时有上下级关系的,如何可以快速查到一个员工所管理的所有人员? Tree CEO                                                1 |--Manage1                                       11 |-------Leader1                             111 |         |-------employee1        

SQL查询一个月第一天/最后一天及日期格式化

1.一个月第一天的Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3.一年的第一天Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 4.季度的第一天Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 5.当天的半夜Select DATEADD(dd,

一条SQL查询一个属性,多个属性值的情况

原先sql获取角色对应的权限信息: select a.*, group_concat(b.auth_name) as auth_name from sh_role a left join sh_auth b on  find_in_set( b.auth_id, a.role_id_list) group by a.role_id; 原文地址:https://www.cnblogs.com/zonehoo/p/8318302.html

sql查询一个字段不同值并返回

sql SELECT COUNT(字段),分组字段,SUM(字段),SUM(字段) FROM 表 GROUP BY 分组字段 java EntityWrapper<ProjectEntity> pp= new EntityWrapper<ProjectEntity>(); pp.eq("depcode", community); int proc = projectService.selectCount(pp); pp.setSqlSelect("CO

SQL查询一个表中另外一个表不存在的数据-转

#方法一:使用 not in ,容易理解,效率低  ~执行时间为:1.395秒~SELECT COUNT(1) FROM ecs_goods WHERE ecs_goods.goods_id NOT IN (SELECT ecs_member_price.goods_id FROM ecs_member_price);#方法二:使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录  ~执行时间:0.739秒~SELE

一个有趣的 SQL 查询(查询7天连续登陆)

一个有趣的 SQL 查询 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: *************************** 1. row *************************** Field: uid Type: int(10) unsigned Null: NO Key: MUL Default: NULL Extra: *************************** 2.

记一个简单的sql查询

在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句如下: 1 CREATE TABLE [dbo].[UserInfo]( 2 [UserID] [int] IDENTITY(1,1) NOT NULL, 3 [UserName] [varchar](50) NOT NULL, 4 [URegTime] [datetime] NOT NULL, 5