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语言 谢老师
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个查询结果集都不一样,查询出来的结果会一样吗?
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
首先你给的数据好像少了点东西(主键是唯一的)
我建立了一个数据库,代码如下
执行结果查询:
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"。
我以我的理解修正了代码,不知道是不是你想要的!
不多说了,直说全部改正后的结果语句吧:
但是执行结果是一样的啊!而且都为空!
按照我的理解的话,结果应该是这样的!
我建立了一个数据库,代码如下
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语言 谢老师
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个查询结果集都不一样,查询出来的结果会一样吗?
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
首先你给的数据好像少了点东西(主键是唯一的)
我建立了一个数据库,代码如下
执行结果查询:
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"。
我以我的理解修正了代码,不知道是不是你想要的!
不多说了,直说全部改正后的结果语句吧:
但是执行结果是一样的啊!而且都为空!
按照我的理解的话,结果应该是这样的!
我建立了一个数据库,代码如下
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))
但是执行结果是一样的啊!而且都为空!
按照我的理解的话,结果应该是这样的!