您的位置:首页 > 数据库

sql server学习笔记-day4

2017-10-18 15:58 357 查看
--今天讲”多表查询“
select * from dept
select * from emp

--显示sales部门所有员工的情况
select * from emp,dept where dept.depName='sales' and dept.depno=emp.depno

--显示雇员名,雇员工资,及所在部门的名字,并按部门编号排序
--如果两张表都有相同名字的字段,则需要带表名
select ename,sal,depName,emp.depno from emp,dept where dept.depno=emp.depno order by dept.depno
--使用表名的别名
select ename,sal,depName,e.depno
from emp e,dept d   --给表起了别名e和d
where d.depno=e.depno
order by d.depno

--显示部门号为10的部门名、员工名和工资
select depName,ename,sal from emp,dept where emp.depno=dept.depno and emp.depno=10

--自连接:指的是同一张表的连接查询
--显示员工‘FORD’的上级领导的姓名
select ename from emp where empno=(select mgr from emp where ename='FORD')

--思考题:显示每个员工的姓名和他上级的姓名
--分析,把emp表看成两张表,分别是worker和boss(内连接)
--那么什么是外连接(左外连接,右外连接)呢?
select worker.ename 雇员,boss.ename 老板 from emp worker,emp boss where worker.mgr=boss.empno

--子查询:指的是嵌入在其他sql语句中的select语句,也叫嵌套查询
--①单行子查询:只返回一行数据的子查询语句
--如何显示与Smith同一个部门的所有员工
select * from emp where depno=(select depno from emp where ename='smith')
--②多行子查询:返回多行数据的子查询
--请思考:如何查询和部门10的工作相同的雇员的名字、岗位、工资和部门号
--(多行查询应该用关键字in,=只适用于单行查询)
select ename,job,sal,depno from emp where job in(select distinct job from emp where depno=10)
--如何排除10号部门本身
select ename,job,sal,depno from emp where job in(select distinct job from emp where depno=10) and depno!=10

--在from字句中使用子查询
--思考:如何显示高于部门平均工资的员工的名字、薪资,和他们部门的平均工资
--分析:
--1.首先要知道每个部门的平均工资
select depno,avg(sal) 平均工资 from emp group by depno
--2.把上面的查询结果,当做一个临时表 对待
select emp.ename,emp.sal,tem.平均工资 from emp,
(select depno,avg(sal) 平均工资 from emp group by depno) tem
where emp.sal>tem.平均工资 and emp.depno=tem.depno
--总结:当在from语句中使用子查询时,该子查询结果会被作为一个临时表来对待,使用该临时表时,必须指定一个别名

--全部显示
select * from emp

--分页查询?当数据量很大时,效率也很好!

--请显示第5-10个入职的雇员(按照时间的先后顺序)
--分析:
--1. 显示第1-4个入职的雇员(top xxx)
select top 4 * from emp order by hiredate
--2. 第5-10个即去除前四个入职之后的前六个人
select top 6 * from emp where empno not in
(select top 4 empno from emp order by hiredate)
order by hiredate

--显示第5-9个人的信息(按照薪水的高低)
select top 5 * from emp where empno not in
(select top 4 empno from emp order by sal)
order by sal
--显示emp表中的第5-9个人的信息,并按照这五个人的薪资进行排序
select * from
(select top 5 * from emp where empno not in
(select top 4 empno from emp)) r
order by sal

--identity(1,1),表示testId字段自增长,从1,每次加1
create table test2
(testId int primary key identity(1,1),
testName nvarchar(30),
testPass nvarchar(30))

--当数据量很大时,分页查询的执行语句速度也非常快!
--例如我们创建一个有100多万行的表,然后利用分页查询,按照Id排序查询第100-105行的数据:
select * from test2
insert into test2 (testName,testPass) values('xy','xyy')
insert into test2 (testName,testPass) select testName,testPass from test2
select count(*) from test2
select top 6 * from test2 where testId not in
(select top 99 testId from test2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql server