Sqlserver多表查询

作者: gw

------------------------数据查询----------------------------

--(select sno ,avg(grade) as avg_grade from sc group by sno) as st2

--select student.sno from student left outer join sc on(student.sno=sc.cno);

--select student.sno,sname,ssex,sage,sdept,sc.cno,sc.grade from student left outer join sc on(student.sno=sc.sno);

--select student.sno,sname,ssex,sage,sdept,sc.cno,sc.grade from student , sc where student.sno=sc.sno;

--select student.sno ,sname,cno,grade from student ,sc where student.sno=sc.sno and sc.cno=‘2‘ and sc.grade>80

--查询每个学生的学号,姓名,选修的课程名及成绩
--select student.sno, sname ,course.cname, sc.grade from sc,student,course where student.sno=sc.sno and sc.cno=course.cno

--select sno,sname,sdept from student where sdept in( select sdept from student where sname=‘何大勇‘);

--查询每个学生大于它的平均成绩的的课程的课程名 1
--select distinct sno ,cno from sc x where grade >= (select avg(grade) from sc y where y.sno=x.sno )

-- 用查询的结果作为一个新的集合
--查询每个学生大于它的平均成绩的的课程的课程名 2
--select st1.sno,st1.cno from
-- sc st1,(select sno ,avg(grade) as avg_grade from sc group by sno) as st2
-- where st1.sno=st2.sno and st1.grade>=st2.avg_grade;

--查询每个学生的平均成绩
--select sno,avg(grade) as avg_grade from sc x group by sno;

--查询平均成绩大于80的学生的学号
--select sno,avg(grade) as avg_grade from sc x group by sno having avg(grade)>80;

--select distinct sno ,cno from sc x where x.grade>=(select avg(y.grade) from sc y where y.cno = x.cno);

--select cno,avg(grade )as m_grade from sc group by cno ;

-- 查询大于该课程平均成绩的学生的学号,成绩,课程号
--select distinct sno,grade,cno from sc x where x.grade>=(select avg(y.grade) from sc y where x.cno=y.cno );

--select sname , sage,sdept from student where sage<any (select sage from student where sdept=‘cs‘) and sdept!=‘cs‘;

--select sname , sage,sdept from student where sage>any (select sage from student where sdept=‘cs‘) and sdept!=‘cs‘;

--利用top只返回前三行
--select top 3 * from student;

--select b.sname ,a.cno , a.sno from
-- student b, (select cno,sno from sc) as a
-- where b.sno=a.sno;

--创建系部数据库
--create table dept(dno int ,dname varchar(20),dmoster varchar(10),primary key(dno));

--drop table dept;

--insert into table dept (dno,dmoster) values(10299,‘113‘);

--select * from student;

--sname,cno from student,sc
--where not exists (select * from sc where sno=student.sno and cno=‘1‘)and sc.sno=student.sno

--臃肿的查询语句
--select distinct sname from student,sc
--where exists (select * from sc b where sno=student.sno and b.cno=‘1‘)and sc.sno=student.sno

--select sname from student
--where exists (select * from sc b where sno=student.sno and b.cno=‘1‘)

--下面这句话是直接做一个笛卡尔积
--select sname,cno from student,sc

--查询和高渐离在一个系的其他学生 1
--select sno,sname,sdept from student s1 where exists
--(select * from student s2 where s2.sdept=s1.sdept and s2.sname=‘高渐离‘) and s1.sname!=‘高渐离‘

--select* from student ;

-- 查询和高渐离在一个系的其他学生 2
--select sno,sname,sdept from student where sdept in(select sdept from student s2 where s2.sname=‘高渐离‘) and sname !=‘高渐离‘

-- 查询和高渐离在一个系的其他学生 3
--select sno,sname,sdept from student where sdept=(select sdept from student s2 where s2.sname=‘高渐离‘) and sname !=‘高渐离‘

--select sname from student
-- where not exists (select * from course
-- where not exists (select * from sc
-- where sno=student.sno and cno=course.cno))

--
--
--
--

-- 一直不理解exists这个语句 下面是从百度知道上搜索出来的
--EXISTS或者NOT EXISTS是把主查询的字段传到后边的查询中作为条件,返回值是TRUE或者FALSE。
--EXISTS TRUE,那么就是查询条件成立,结果会显示出来。
--NOT EXISTS TRUE,则为FALSE,查询连接条件不成立。
--select * from course where not exists(select * from grade where grade.课程代号=course.课程代号)
--这个语句,是查询course表中课程代号在grade中没有出现的数据。
--看看grade表,课程编号有01到06,而COURSE表,有01到07,那么07在GRADE表是不存在的,那么,是符合条件的。
--同样select * from course where exists(select * from grade where grade.课程代号=course.课程代号)
--则是查询COURSE的记录条件为编号在GRADE中存在。那么很明显,结果是K01到K06的数据。
--另外,EXISTS和NOT EXISTS的作用可以用IN或NOT IN实现,但是exists效率要高。
-- 因为EXISTS和NOT EXISTS返回的结果是TRUE或者FALSE,那么则在子查询中,遇到第一个符合条件的结果,
--就会退出查询,而不会进行全表的检索。
--而NOT IN或者IN,要把子查询中的SELECT字句全部查询出来才行。

--子查询中,遇到第一个符合条件的结果,就会退出查询,而不会进行全表的检索。

--select * from sc where sno in(‘2014003‘);

--select sno from sc s1 where cno =all (select * from sc where sno in(‘2014003‘));

/*
例1:查询所有选修了1号课程的学生的姓名。
解法1:利用exists
首先取Student表中的一个元组,然后在SC表中依次找SC.Sno=该元组的Sno,并且对应的Cno=‘1‘,
如果存在,则外层查询的where子句返回为真,则Student表中的该元组可以输出。然后依次遍历
Student表中的其他元组。
举个例子:对于在学生表中学号等于2002151121这个元组,在SC表中第一条记录即符合条件,
然后where 子句返回 true,所以该条元组可以输出。然后依次遍历。
select Sname
from Student
where exists
(
select *
from SC
where Sno = Student.Sno AND Cno=‘1‘
);
解法2:利用连接查询
select Sname
from Student,SC
where Student.Sno=SC.Sno AND SC.Cno=‘1‘;

例2:查询没有选修1号课程的学生的姓名。
解:
select Sname
from Student
where not exists
(
select *
from SC
where Sno=Student.Sno AND Cno=‘1‘
);

例3:查询选修了全部课程的学生姓名。
select Sname
from Student
where not exists
(
select *
from Course
where not exists
(
select *
from SC
where Sno=Student.Sno AND
Cno=Course.Cno
) );

--!!!在exists(not exists) 子句中 如果有多条记录 依次对每条记录进行判断
--!!!某条记录满足条件就返回 true 剩下的就不用查询了 在结合外层的exists(not exists)
--!!!如果外层为exists 该条记录被选中 如果外层为not exists ,not true该条记录被舍弃

查找语义:查询这样的学生,没有一门课程是他不选修的。
查找过程:
首先,选取Student表中的一个元组,然后在依次判断Course表中的每个元组是否可以输出,只要有
一个课程可以输出,则最外层查询的where子句返回为false;而在判断某个课程是否可以输出时,
则要利用第三层查询,利用当前的学号和当前的课程号,在SC表中查询,如果存在,则第二层查询
where子句返回false。至此,每一门课程都不可以输出时,这个学号对应的元组才可以输出。表示
这个学生选修了全部的课程。

例4:至少选修了学生2014006选修的全部课程的学生号码。
--
select distinct Sno
from SC SCX
where not exists
( select *
from SC SCY
where SCY.Sno=‘2014006‘ AND
not exists
( select *
from SC SCZ
where SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
*/

/*
select distinct sno from sc s1
where not exists
(select * from sc s2 where s2.sno=‘2014006‘and not exists
(select * from sc s3 where s1.sno=s3.sno and s2.cno=s3.cno)
)

*/

/*
查询语义:不存在这样的课程y,学生2014006选修了y,而学生x没选。
查询过程:先在SCX表中选一条记录,比方说第一条,然后再看SCY表中,只有SCY表中全部不能
输出,第一层查询的where子句才返回true,第一条记录就可以输出;所以就要一次查看SCY表
中的每一个元组,前三个,因为学号首先不满足=200215122所以必然不能输出,第四个的话,
就要看其AND后面的not exists返回什么值,而这又取决于第三层查询中是否存在满足学号
等于SCX.Sno且课程号=SCY.Cno的元组,经查看,有 ,则返回false,所以第四个也不能输
出,第五个类似,所以,第一层查询的not exists返回true。所以第一条记录可以输出。
*/

/*
--如何判断两个集合 是否 A包含B
--依次判断B的每一个元素是否在A中存在
--B中没有一个元素 不在A中存在
select * from K where not exists
(select * from B where not exists
(select * from A where A.filed=b.filed and K...) )

*/

--集合的并操作可以用or来代替
--select distinct sno from sc where cno=‘4‘ or cno=‘5‘

--select sno from sc where cno=‘4‘ union select sno from sc where cno=‘5‘

--集合的交操作可以用and来代替
--select * from student where sage>=22 and sdept=‘cs‘

--集合的差操作可以用not in来代替 not in 后面是要除去的集合
--select * from student where sage>=22 and sdept not in
-- (select sdept from student s1 where sdept=‘cs‘)

--查询计算机系 所有学生中除去年龄大于21岁的
--select * from student s1 where sdept=‘cs‘ and sage not in
-- (select sage from student s2
-- where s2.sage>=22 and s1.sno=s2.sno )

时间: 11-28

Sqlserver多表查询的相关文章

SQLServer学习笔记&lt;&gt;.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   同时往数据库表插入一些数据,用户后续对数据库的sql的练习.在这里有需要的可以下载相应的脚本进行数据库的初始化.我放到百度云上面,请戳 我:http://yun.baidu.com/share/link?shareid=3635107613&uk=2971209779,提供了<Sqlserver

sqlserver锁表、解锁、查看锁表

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 面演示一个实例,它使用sys.dm_tran_locks动态视图监视数据库中锁的活动. 打开一个查询窗口,执行如下语句: USE AdventureWorks BEGIN TRAN SELECT ProductID, ModifiedDate FROM Production.ProductDocument WITH (TABLOCKX) 打开另一个查询窗口

对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗

在sql server 中,如果一张表存在聚集索引的时候,大多数情况下,如果进行select * from TableName查询,默认的返回顺序是按照聚集所在列的顺序返回的 但是,在一张表存在聚集索引的时候,并不一定所有的情况都是按照聚集索引列的顺序排列的, 下面开始测试 create table TestDefaultOrder ( Id int identity(1,1) primary key,--主键上默认会建立聚集索引 Col2 char(5), COL3 char(5) ) --写

sql多表查询之一:Where 和 On的秘密

原文 sql多表查询之一:Where 和 On的秘密 对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术.什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某几个字段进行互联管理的时候,这就不得不说说sql多表查询中Where 和 On的秘密. 在了解sql多表查询中Where 和 On的秘密之前,让我们先来温习一下连接基础吧 按列a把两表连接,请问各种连接方式的结果的结果? 语法呢? 左    select * from @a Aa left join

转Oracle、MySql、SQLServer 数据分页查询

最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:其实的索引 * pageSize:每页显示的记录数 */ select o.* from (sql) o limit firstIndex,pageSize

Mabitis 多表查询(一)resultType=“java.util.hashMap”

1.进行单表查询的时候,xml标签的写法如下 进行多表查询,且无确定返回类型时 xml标签写法如下: <select id="Volume" parameterType="java.util.Map" resultType="java.util.HashMap"> 因为没有对应的类型,所以返回HashMap 类型的结果.此时需要在dao中添加 java.util.HashMap 的引用.否则报错. 2.此次bug处理.另外习得从异常信

Oracle、MySql、SQLServer 数据分页查询

Oracle.MySql.SQLServer 数据分页查询 摘自:http://www.cnblogs.com/wangyong/p/3396333.html 近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:

SQLServer访问Oracle查询性能问题解决

原文:SQLServer访问Oracle查询性能问题解决 1. 问题 系统有个模块,需要查询Oracle数据库中的数据.目前是通过建立链接服务器实现的. SQLServer访问Oracle实现 可参考这篇文章http://www.cnblogs.com/gnielee/archive/2010/09/07/access-oracle-from-sqlserver.html 目前的查询语句就是一个简单的带where条件的查询语句,类似如下: SELECT * FROM LINKED_NAME..A

mysql如何避免回表查询

<迅猛定位低效SQL?>留了一个尾巴: select id,name where name='shenjian' select id,name,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什么是回表查询? 什么是索引覆盖? 如何实现索引覆盖? 哪些场景,可以利用索引覆盖来优化SQL? 这些,这是今天要分享的内容. 画外音:本文试验基于MySQL5.6-InnoDB. 一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类