查询结果为什么会不一样

时间:2021-12-06 20:14:32
数据表:课程(课程编号,课程名称,老师),学生(学生编号,学生名称,性别),选课(课程编号,学生编号,成绩)
                c         cno            cname       teacher    s         sno           sname       sex         sc       cno             sname      grade
sql语句:
select c.cno,c.cname,s.sname from c,s where exists(select * from s,sc,c where not exists(select * from sc where sno=s.sno and cno=c.cno))
select c.cno,c.cname,s.sname from c,s where exists(select * from s where not exists(select * from sc where sno=s.sno and cno=c.cno))

请问这两个查询结果为什么会不一样?请教!

7 个解决方案

#1


sc 的数据:
1 1 80
2 1 70
3 1 60
1 2 90
2 2 100
3 2 100
1 3 80
2 3 90
4 1 100
s的数据:
1 小王  男
2 小李  女
3 小张  女
4 小赵  男
c的数据:
1 计算机程序设计 张老师
2 数据结构                李老师
3 JAVA语言        谢老师

#2


 两个语句的结果不一样,说明不等价;你这是要查询什么 ?

#3


这两个查询,前一个查询除了学生选择了哪些课程,后一个查询了非全部学生选择的课程,可是你看连个sql语句,基本上没有区别,这是为什么?我想不透原因。

#4


cno=c.cno 中的c 不是一个c 啊, 所以相关子查询的查询过程也不一样,结果也不一样

#5


我描述的可能不太正确,你一代入数据就知道是什么问题了 查询结果为什么会不一样

#6


只能说2个语句不等价,

elect * from s,sc,c where not exists(select * from sc where sno=s.sno and cno=c.cno)

select * from s where not exists(select * from sc where sno=s.sno and cno=c.cno)

这2个查询结果集都不一样,查询出来的结果会一样吗?

#7


首先你给的数据好像少了点东西(主键是唯一的)
我建立了一个数据库,代码如下
USE [master]
GO

/****** Object:  Database [NewDB]    Script Date: 04/25/2016 09:36:48 ******/
CREATE DATABASE [NewDB] ON  PRIMARY 
( NAME = N'NewDB', FILENAME = N'D:\SQL_实例\MSSQL10.MSSQLSERVER\MSSQL\DATA\NewDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'NewDB_log', FILENAME = N'D:\SQL_实例\MSSQL10.MSSQLSERVER\MSSQL\DATA\NewDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [NewDB] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [NewDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [NewDB] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [NewDB] SET ARITHABORT OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [NewDB] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [NewDB] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [NewDB] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [NewDB] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [NewDB] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [NewDB] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [NewDB] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [NewDB] SET  DISABLE_BROKER 
GO

ALTER DATABASE [NewDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [NewDB] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [NewDB] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [NewDB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [NewDB] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [NewDB] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [NewDB] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [NewDB] SET  READ_WRITE 
GO

ALTER DATABASE [NewDB] SET RECOVERY FULL 
GO

ALTER DATABASE [NewDB] SET  MULTI_USER 
GO

ALTER DATABASE [NewDB] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [NewDB] SET DB_CHAINING OFF 
GO



执行结果查询:
select * from s;
select * from c;
select * from sc;

sno sname sex
1 小王         男         
2 小李         女         
3 小张         女         
4 小赵         男         

cno cname teacher
1 计算机程序设计    张老师       
2 数据结构       李老师       
3 JAV语言      谢老师       

id cno sname grade
1 1 1 80
2 2 1 70
3 3 1 60
4 1 2 90
5 2 2 100
6 3 2 100
7 1 3 80
8 2 3 90
9 4 1 100

执行这句语句:select * from  sc where sno=s.sno and cno=c.cno
这个语句是错误的!
错误情况:
消息 207,级别 16,状态 1,第 1 行
列名 'sno' 无效。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "s.sno"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "c.cno"。

我以我的理解修正了代码,不知道是不是你想要的!
select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno

不多说了,直说全部改正后的结果语句吧:
select c.cno,c.cname,s.sname from c,s where exists(select * from s,sc,c where not exists(select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno))
select c.cno,c.cname,s.sname from c,s where exists(select * from s,sc,c where not exists(select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno))

但是执行结果是一样的啊!而且都为空!
按照我的理解的话,结果应该是这样的!



#1


sc 的数据:
1 1 80
2 1 70
3 1 60
1 2 90
2 2 100
3 2 100
1 3 80
2 3 90
4 1 100
s的数据:
1 小王  男
2 小李  女
3 小张  女
4 小赵  男
c的数据:
1 计算机程序设计 张老师
2 数据结构                李老师
3 JAVA语言        谢老师

#2


 两个语句的结果不一样,说明不等价;你这是要查询什么 ?

#3


这两个查询,前一个查询除了学生选择了哪些课程,后一个查询了非全部学生选择的课程,可是你看连个sql语句,基本上没有区别,这是为什么?我想不透原因。

#4


cno=c.cno 中的c 不是一个c 啊, 所以相关子查询的查询过程也不一样,结果也不一样

#5


我描述的可能不太正确,你一代入数据就知道是什么问题了 查询结果为什么会不一样

#6


只能说2个语句不等价,

elect * from s,sc,c where not exists(select * from sc where sno=s.sno and cno=c.cno)

select * from s where not exists(select * from sc where sno=s.sno and cno=c.cno)

这2个查询结果集都不一样,查询出来的结果会一样吗?

#7


首先你给的数据好像少了点东西(主键是唯一的)
我建立了一个数据库,代码如下
USE [master]
GO

/****** Object:  Database [NewDB]    Script Date: 04/25/2016 09:36:48 ******/
CREATE DATABASE [NewDB] ON  PRIMARY 
( NAME = N'NewDB', FILENAME = N'D:\SQL_实例\MSSQL10.MSSQLSERVER\MSSQL\DATA\NewDB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'NewDB_log', FILENAME = N'D:\SQL_实例\MSSQL10.MSSQLSERVER\MSSQL\DATA\NewDB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [NewDB] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [NewDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [NewDB] SET ANSI_NULL_DEFAULT OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_NULLS OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_PADDING OFF 
GO

ALTER DATABASE [NewDB] SET ANSI_WARNINGS OFF 
GO

ALTER DATABASE [NewDB] SET ARITHABORT OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_CLOSE OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_CREATE_STATISTICS ON 
GO

ALTER DATABASE [NewDB] SET AUTO_SHRINK OFF 
GO

ALTER DATABASE [NewDB] SET AUTO_UPDATE_STATISTICS ON 
GO

ALTER DATABASE [NewDB] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO

ALTER DATABASE [NewDB] SET CURSOR_DEFAULT  GLOBAL 
GO

ALTER DATABASE [NewDB] SET CONCAT_NULL_YIELDS_NULL OFF 
GO

ALTER DATABASE [NewDB] SET NUMERIC_ROUNDABORT OFF 
GO

ALTER DATABASE [NewDB] SET QUOTED_IDENTIFIER OFF 
GO

ALTER DATABASE [NewDB] SET RECURSIVE_TRIGGERS OFF 
GO

ALTER DATABASE [NewDB] SET  DISABLE_BROKER 
GO

ALTER DATABASE [NewDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO

ALTER DATABASE [NewDB] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO

ALTER DATABASE [NewDB] SET TRUSTWORTHY OFF 
GO

ALTER DATABASE [NewDB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO

ALTER DATABASE [NewDB] SET PARAMETERIZATION SIMPLE 
GO

ALTER DATABASE [NewDB] SET READ_COMMITTED_SNAPSHOT OFF 
GO

ALTER DATABASE [NewDB] SET HONOR_BROKER_PRIORITY OFF 
GO

ALTER DATABASE [NewDB] SET  READ_WRITE 
GO

ALTER DATABASE [NewDB] SET RECOVERY FULL 
GO

ALTER DATABASE [NewDB] SET  MULTI_USER 
GO

ALTER DATABASE [NewDB] SET PAGE_VERIFY CHECKSUM  
GO

ALTER DATABASE [NewDB] SET DB_CHAINING OFF 
GO



执行结果查询:
select * from s;
select * from c;
select * from sc;

sno sname sex
1 小王         男         
2 小李         女         
3 小张         女         
4 小赵         男         

cno cname teacher
1 计算机程序设计    张老师       
2 数据结构       李老师       
3 JAV语言      谢老师       

id cno sname grade
1 1 1 80
2 2 1 70
3 3 1 60
4 1 2 90
5 2 2 100
6 3 2 100
7 1 3 80
8 2 3 90
9 4 1 100

执行这句语句:select * from  sc where sno=s.sno and cno=c.cno
这个语句是错误的!
错误情况:
消息 207,级别 16,状态 1,第 1 行
列名 'sno' 无效。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "s.sno"。
消息 4104,级别 16,状态 1,第 1 行
无法绑定由多个部分组成的标识符 "c.cno"。

我以我的理解修正了代码,不知道是不是你想要的!
select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno

不多说了,直说全部改正后的结果语句吧:
select c.cno,c.cname,s.sname from c,s where exists(select * from s,sc,c where not exists(select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno))
select c.cno,c.cname,s.sname from c,s where exists(select * from s,sc,c where not exists(select * from sc,s,c where sc.sname=s.sno and sc.cno=c.cno))

但是执行结果是一样的啊!而且都为空!
按照我的理解的话,结果应该是这样的!