--注意语句的读写顺序是从右往左的
create database D1
drop table dept
drop table empcreate table dept (
deptno int primary key,
dname nvarchar(30),
loc nvarchar(30))insert into dept (deptno, dname, loc) values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc) values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc) values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc) values (40, 'OPERATIONS', 'BOSTON')create table emp (
empno int primary key,
ename nvarchar(30),
job nvarchar(30),
mgr int,
hiredate datetime,
sal numeric(9,2),
comm numeric(9,2),
deptno int foreign key references dept(deptno))
--因为deptno根据需要得做成外键insert into emp (empno,ename,job,mgr,hiredate,sal,deptno) values (7369,'SMITH','CLERK',7902,'1980-12-17',800.00,20);
insert into emp values (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);
insert into emp values (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500.00,30);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7566,'JONES','MANAGER',7839,'1981-4-2',2975,null,20);
insert into emp values (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values ( 7788, 'SCOTT', 'ANALYST', 7566, '1987-4-19', 3000, NULL, 20);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values ( 7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values ( 7844, 'TURNER', 'SALESMAN', 7698, '1981-9-8', 1500, 0, 30);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7876, 'ADAMS', 'CLERK', 7788, '1987-5-23', 1100, NULL, 20);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7900, 'JAMES', 'CLERK', 7698, '1981-12-3', 950, NULL, 30);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values ( 7902, 'FORD', 'ANALYST', 7566, '1981-12-3', 3000, NULL, 20);
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (7934, 'MILLER', 'CLERK', 7782, '1982-1-23', 1300, NULL, 10);--*全部查询
select * from emp
select * from deptselect sal,job,deptno from emp where ename ='smith'
-----distinct消除相同的
select distinct deptno,ename from emp order by deptno
--显示年工资
select ename, sal13+isnull(comm,0)13 年工资 from emp
--显示1982-1-1之后入职
select ename from emp where hiredate>'1982-1-1'
--显示首字母为s的工资,姓名
select ename,sal from emp where ename like 's%'--%表示多个字符 --_a表示单个字符
-----in
select ename,sal from emp where empno in(123,800,325)
--显示没有上级的
select ename,sal from emp where mgr is null
--查询工资高于500或者岗位是manage 同时满足首个姓名字母是j
select ename,sal from emp where (sal>500 or job='MANAGER')and ename like 'j%'
--工资从低到高,order by(低到高/先到后asc),高到低/后到先desc
select * from emp order by sal desc
--按照部门号升序而雇员工资降序
select from emp order by deptno,sal desc
--年薪从低到高
select ename,(sal13+isnull(comm,0)13) 年薪 from emp order by (sal13+isnull(comm,0)*13)
--min(),max,avg 平均,sum,count函数
--显示最低工资--显示最低工资和他的名字
--select ename, min(sal) from emp 错误的
--select ename,(select min(sal) from emp) from emp 错误的,我的,显示出来不对应
select ename,sal from emp where sal=(select min(sal) from emp)--子列表
--平均工资 总工资
select avg(sal) 平均工资 ,sum(sal) 总工资 from emp
--高于平均工资的雇员工资和名字显示--select ename,sal from emp where sal=(select sal>avg(sal) from emp) 错误的,因为sal>avg(sal)自己和自己的平均比较错误。
select ename,sal from emp where sal>(select avg(sal) from emp)--这里是括号外和里面比较所以不一样
--分组group by分组 having限制结果
--显示部门的平均和最高工资(并显示部门名称涉及到另一张表,多表查询)
select avg(sal) 平均工资 ,max(sal) 最高工资,deptno from emp group by deptno
--没个部门每种岗位的平均和最高工资
select avg(sal) 平均工资 ,max(sal) 最高工资,deptno,job from emp group by deptno,job --order by deptno
--平均工资低于2000的部门和他的平均工资
--having和group by 结合,可以对分组之后的结果进行筛选抛弃
select avg(sal) 平均工资 ,deptno from emp group by deptno having avg(sal)<2000-----------------多表查询
select from emp,dept--显示笛卡尔集144,所以匹配
--显示雇员名雇员工资及所在部门及部门号(emp.deptno)
--emp.deptno=dept.deptno这个是关键的KEY把他们关联起来
select ename,sal,loc,emp.deptno from emp,dept where dept.dname='sales'and emp.deptno=dept.deptno
--显示部门10,部门名,员工名和工资
select ename,sal,dname,emp.deptno from emp,dept where emp.deptno=dept.deptno and emp.deptno=10
-------------------自连接(内连接)
--显示某个员工的上级1.知道福德上级编号
select mgr from emp where ename='ford'
select ename from emp where empno=(select mgr from emp where ename='ford')
--显示每个员工的姓名和他上级的名字,把emp表看做两张表利用别名worker,boss,让自己与自己关联
----------select ename, mgr from emp where (select mgr from emp )
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno
------------------左外连接,右外连接
-----------把没有老板的也显示出来?--外连接(左,右)
--左外连接:把左边表的记录全部显示,如果没有匹配的记录就用null
select worker.ename,boss.ename 老板 from emp worker left join emp boss on worker.mgr=boss.empno
--右外连接:把右边表的记录全部显示,如果没有匹配的记录就用null
select worker.ename,boss.ename 老板 from emp worker right join emp boss on worker.mgr=boss.empno
--总结:1.自连接,除上述也可以 from 表1 inner join 表2 on(表1自己加入到表2,上述where 该为on)
--------2.左连接,from 表1 left join 表2 on(表1自己左加入到表2),把左边表的记录全部显示,如果没有匹配的记录就用null
--------3.右连接,from 表1 right join 表2 on(表1自己右加入到表2),把右边表的记录全部显示,如果没有匹配的记录就用null
--------子查询,嵌入在其他sql语句的select语句
--单行子查询,显示与SMITH同一部门的所有员工
select * from emp where deptno=(select deptno from emp where ename='smith')
---------多行子查询,返回多行子数据的查询
--查询部门10的工作相同的雇员名字,岗位,工资,部门号多行返回需要用到in,单行可以用=
select * from emp where job in(
select distinct job from emp where deptno=10 )
--排除10部门本身
select * from emp where job in(
select distinct job from emp where deptno=10 ) and(deptno !=10)
--------from 中使用子查询
--显示高于部门平均工资的员工的信息
--1.各个部门平均工资
select avg(sal),deptno from emp group by deptno
--2.把上面的当做临时表 select * from emp两张表关联
select emp.ename ,sal,tem.myavg from emp,(select avg(sal) myavg,deptno from emp group by deptno) tem
where emp.deptno=tem.deptno and emp.sal>tem.myavg--------分叶查询
--第5个到第10入职的(按照时间顺序)
--1.显示第一个到第四个入职的雇员
select top 4*from emp order by hiredate
--top :取出几条
--排除前4个在取6个即就是5-10
select 6 *from from emp where emptno not in
(select top 4 emptno from emp order by hiredate)
order by hiredate
-----------------------identity(1,1)从1,每次+1自增长
create table test(
testID int primary key identity(1,1),
testName varchar(30),testPass varchar(30))insert into test (testName,testPass )values('shunping','shunping')
insert into test (testName,testPass )select testName,testPass from test
-------------------删除一张重复的记录
create table cat(
catId int,catName varchar(40))insert into cat values(1,'aa')
insert into cat values(2,'bb')select *from cat
--1.把cat的记录distinct后的结果放在临时表里面去,也就是没有重复的记录
select distinct * into #temp from cat
--清空cat表
delete *from cat
--把temp的数据(没有重复的记录),在插入到cat表去,最后删除临时表
insert into cat select *from #temp
drop table #temp
-----------------------#temp临时表--约束unique,primary key 都是唯一但是unique开业为null,但只能唯一一个,primary key有复合主键primary key(test1Id,testname)
--一张表只能一个主键但是能多个外键
create table test1(
test1Id int primary key identity(1,1),
testname varchar(30) not null,test varchar(30) not null,
testage int)
--check(testage>100) 约束范围只能选大于100,default默认约束
--备份数据库
backup database D1 to disk='f:/sp.bak'
--删除数据库
drop database D1
--恢复数据库
restore database D1 from disk='f:/sp.bak'
--备份表----修改---把工资低于100提高10% update 表名 set 字段名1=,字段名2= where 条件
----删除---delete from 表名 where 条件
---nchar unicode 一字符 一汉字 一英文
---char 非unicode 二字符 一汉字 二英文
----定义DDL 操作DML 查询DQL 控制DCL
---DATEDIFF(YEAR,STARTDATE,ENDDATE),LEN(),UPPER(),LOWER(),SUBSTRING(ENAME,1,1)
--------练习
--1.列出至少一个员工的所有部门
--得到每个部门多少员工
select count(),deptno from emp group by deptno
select count(),deptno from emp group by deptno having count(*)>1
--2.列出薪金比smith多的所有员工
--先找出他薪水
select *from emp where sal>(select sal from emp where ename='smith')and ename<>'smith'
--3.列出所有员工的姓名及其上级的姓名
select w.ename b.ename from emp w,emp b where w.mgr=b.empno
--4.受雇日期晚于其直接上级的所有员工
--找出上级的时间,和下级的时间
select w.ename from emp w,emp b where w.mgr=b.empno and b.hiredate--5.部门名称和这些部门的员工信息,同时那些没有员工的部门
select d.dname, e.ename, e.job from emp e right join dept d on e.deptno=d.deptno
--6."CLERK"的姓名及部门名称--7.最低薪金大于1500的各种工作
--每个工作是最低工资
select min(sal),job from emp group by job having min(sal)>1500
--8.列出在sale部的工作的员工的姓名
select ename,'sales' from emp where deptno=(select deptno from dept where dname='sales')
--9.薪金高于公司的平均工资的员工
select from emp where sal>(select avg(sal)from emp)
--10.列出于“scott”从事相同工作的员工
select ename from emp where job=(select job from emp where ename='scott')
--11.列出薪金等于部门30中的员工的薪金的所有员工的姓名和薪金
select ename,sal from emp where sal in(select sal from emp where deptno=30)
--12薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金
select ename,sal from emp where sal >(select max(sal) from emp where deptno=30)
--13.每个部门工作的员工数量,平均工资,平均服务期限
select count(),avg(sal),avg(datediff(year,hiredate,getdate())),deptno from emp group by deptno
--14 给出不同部门相同职业的一种组合
select distinct job,deptno from emp where job='clerk'
--所有部门的详细信息和人数
select d2.dname,d2.loc,isnull(d.c,0) from dept d2 left join
(select count(*) c,deptno de from emp group by deptno) d
on d2.deptno=d.de