`

sql server2000的一部分操作的笔记(里面有些和oracle数据库的比较)

阅读更多
--这样的情况下用char
--存放学号都是六位,查询起来很快。。。如果是varchar则要一个一个的比
--如果一个字段的长度是确定的则使用char


create table hgname
(
test float(3)
)

insert into hgname values(2)

select * from hgname

--如果比bigint还要大,
drop table hgname

数据类型
  float :
    float(5) 表示保留小数点后5位

  numeric:
    numeric(20,2)--表示一共可以是20位,保留小数点后两位

  --   如果超出会自动截去,推荐使用numeric
 

--日期类型:
  datetime :
create table hgname
(
     data datetime
)
---sql server  为我们专门提供了一个时间函数
--getdate()//得到当前的系统时间

insert into hgname values(getdate())
select * from hgname

--timestamp (时间戳)

--可以存放图片 image类型 ,但是用的很少,一般用路径保存图片,在软件公司往往使用图片服务器和图床技术
--  在图片有安全要求时可以考虑放入数据库 而且图片不要太大

--存放视频 binary类型 但是我们往往 ,将视频文件保存在文件服务器上,数据库只保存路径

--在命令行中敲ping www.taobao.com.cn得到淘宝网的IP地址
--ping -t www.taobao.com.cn


--建表(公司管理系统)
--  职员表
-- 主键(primary key)不能重复且不能为空
create table clerk
(
cleId int primary key,
cleName nvarchar(50),
age int
)

insert into clerk values(1,'贾宝玉',18)
insert into clerk values(2,'贾政',20)


--插入部分字段
insert into clerk (cleId ,cleName) values(3,'林黛玉')

select * from clerk

--改一个字段
update clerk set age = 38 where cleName = '贾政'


--把2豪人物的名字改为薛 蟠 age 改为40
update clerk set cleName ='薛蟠' ,age = 40 where cleId =2


--主键能修改吗? 2改为4

update clerk set cleId = 4 where cleName ='薛蟠'

--可以改,但是不能改为重复的主键


--修改含有NUll的字段
--把年龄为null的人的名字改为‘薛宝钗’

update clerk set cleName= '薛宝钗' where age = null--不行

select * from clerk
--应该为
update clerk set cleName= '薛宝钗' where age is not

--删除全部数据
delete from 表名
--删除指定数据
delete from 表名 where 字段名= '值'  and 字段名 ='值'

insert into clerk values(5,'贾母',70)

--删除年龄>=40的人 并且<=70,或者age是null
delete from clerk where (age >=40 and age<=70 ) or age is null



--查询

--建两张表emp表和dept表
--因为oracle有,就不键了
create table dept
(
deptno int primary key,
dname  nvarchar(30),
loc nvarchar(30)
)

create table emp
(
empno int primary key,
ename nvarchar(30),
job nvarchar(30),
mgr int,
hiredate datetime,
sal numeric(10,2)
comm numeric(10,2)
deptno int  foreign key references dept(deptno) --因为的deptno根据需要要做成外键
)

--外键,请注意:
--!。外键只能指向主键
--2.外键和被指向的主键的类型要一致

select * from emp;

select * from dept;

select sal ,job,deptno from emp where ename ='SMITH';
--sql server是不区分大小写的

--取消重复行   distinct
select distinct sal from emp where ename = 'SMITH';
--统计有多少个部门编号
select distinct deptno from emp;

--使用算数表达式
--显示每个雇员的年工资
select ename ,sal*12+nvl(comm ,0) 年工资 from emp;vv
--sql server 2000中判断null的用 isnull(comm,0)
--显示工资高于3000的员工
select * from emp where sal >3000;
select * from emp where hiredate >'1982-1-1';

---模糊查询

select ename,sal from emp where ename like 'S%';
--% 代表0到多个字符
select ename,sal from emp where ename like '__A';
---_代表一个字符

---where 中使用in  批量查询
select * from emp where empno in(123,345,800);

-- is null操作符
--显示没有上级的人
select * from emp where mgr is null;


select * from emp where (sal>500 or job ='MANAGER') and ename like 'J%';

--安工资从低到高显示
select * from emp order by sal asc ;
--order by 默认是升序
--order by desc 表示降序

--按照入职的先后顺序排
select * from emp order by hiredate asc;

--按照部门号的升序排列,而雇员的工资降序排列
select * from emp order by deptno , sal desc;
--先考率第一个字段,然后第二个。。。

--统计每个人的年薪,并案中案从到高的顺序排序
select ename ,(sal*12 + nvl(comm,0) ) 年薪 from emp order by (sal*12 + nvl(comm,0) ) desc;

--分页查询
--先学子查询
--数据分组: max min avg sum count
select ename ,sal from emp where sal =(select  min(sal) from emp);

---显示所有雇员的平均工资
select avg(sal) 平均工资,sum(sal) 总工资 from emp;

--把高于平均工资的雇员的名字和他的工资显示出来
select ename,(select avg(sal) from emp) from emp where sal>(select avg(sal) avg_sal from emp);
--统计共多少雇员
select count(*) from emp;

--group by 和 having
--group by 用于对于查询的结果分组统计
--having 子句用于限制分组显示结果

--如和显示每个部门的平均工资和最高工资
--并显示部门名称 select * from dept;(多表查询)
select deptno,avg(sal),max(sal) from emp  group by deptno;

--显示每个部门的每个岗位的平均工资和最低工资
select avg(sal),min(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;

--1 分组函数只能出现在选择列表,having order by 子句中
--2 如果在select 语句中同时包含有group by ,having ,order by那么他们的顺序是
--group by ,having,order by

--3。在选择列中如果有列、表达式、分组函数,那么这些列和表达式必须有一个
--出现在group by 子句中,否则就会出错
--如select  deptno ,avg(sal) ,max(sal) from emp group by deptno having avg(sal) <2000;
--deptno这里就一定要出现在group by 中

--现有一个商店的数据库,记录顾客及其购物情况,请设计有多少张表,每张表的字段是什么?
create table customer
(
  cName nvarchar2(30),
  sex number(2),
  address nvarchar2(50),
  goodsNum number(100),
 
)

create table goods
(
 
)

--多表查询
--显示雇员名,雇员工资,及所在部门的名字
select e.ename ,e.sal ,d.dname from emp e ,dept d where e.deptno = d.deptno;
--显示部门号为10的部门名,员工名和工资
select d.dname ,e.ename, e.sal from emp e ,dept d where e.deptno =10 and d.deptno=10;
--显示雇员名,雇员工资及所在部门的名字,并按照部门排序
select e.ename ,e.sal ,d.dname from emp e ,dept d where e.deptno = d.deptno order by d.deptno;

--显示某个员工的上级领导的姓名,比如显示FORD的上级
select ename from emp where empno = (select mgr from emp where ename ='FORD');
select e1.ename , e2.ename from emp e1,emp e2 where e1.mgr = e2.empno and e1.ename ='FORD';
--显示每个员工和他的上级的名字
select e1.ename , e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
--外连接(左外连接,右外连接)
--显示没有上级的人的名字
select ename from emp where ename  not in(select e1.ename from emp e1,emp e2 where e1.mgr = e2.empno);

--子查询
--是嵌套在其他sql语句中的select 语句,也叫嵌套查询
--单行子查询
--是指只返回一行数据的子查询语句
--请思考如何显示与SMITH同一部门的所有员工
select e2.* from emp e1,emp e2 where e1.deptno = e2.deptno and e1.ename ='SMITH';
select * from emp where deptno=(select deptno from emp where ename ='SMITH');
--多行子查询
--指返回多行数据的子查询
--请思考:如何查询和部门10的工作相同的雇员的名字,岗位,工资,部门号
select * from emp where job in(select distinct job  from emp where deptno = 10);

---在from 子句中使用子查询
--请思考:如何显示高于部门平均工资的员工的信息
select avg(sal) from emp group by deptno ;
select * from emp e,(select avg(sal) avg_sal , deptno from emp group by deptno) t where e.deptno = t.deptno and e.sal >avg_sal;
--也可以创建一个视图


--分页查询
--显示第一个到第4个入职额雇员
select top 4 * from emp order by hiredate;--sql server200中可以,但oracle不可以
--oracle中应该用rownum
select t1.* ,rownum rn from (select * from emp order by hiredate) t1 where rownum <=4;
--请显示第5个到第10个入职的雇员(按时间的先后顺序)
select * from (select t1.* ,rownum rn from (select * from emp order by hiredate) t1  where rownum<=10) where rn>=5;

--sql server 200  中的写法---先排除前4个人,再重新的里面选出前6个
select top 6 * from emp where empno not in (select top 4 empno from emp order by hiredate) order by hiredate;


--sql server中实现
--identity(1,1),表示该testId 字段自增,从1开始,每次加1
create table test(
testId int primary key identity(1,1),
testName varchar2(30),
testPass varchar2(30)
)

insert into test (testName,testPass) values('hugui','zhuxi');

insert into test (testName,testPass) select testName,testPass from test;

select count(*) from test;


select * from emp ;


--用查询结果创建表
select * (字段) into 另一个表名 from 表

--如何删除一张表中的重复记录
create cat
(
catId int,
catName varchar2(40)
)

insert into cat values(2,'b');
select * from cat;
--把cat表的记录distinct的结果,放到#temp
select distinct * into #temp from cat;
--把cat表清空
delete table cat;
--把#temp表的数据(没有重复的记录)插入到cat表
insert into cat select * from #temp;
--删除#temp
drop table #temp;

--左外连接和右外连接

--内连接
select e1.ename , e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
--显示每个员工和他的上级的名字,要求没有上级的人的名字也要显示

--左外连接:指左边的表的记录全部都要显示,如果没有匹配的记录就用null填
select e1.ename ,e2.ename from emp e1 left join emp e2 on e1.mgr =e2.empno;

--右外连接:指右边的表的记录全部都要显示,如果没有匹配的记录就用null填
select e1.ename ,e2.ename from emp e1 right join emp e2 on e1.mgr =e2.empno;


-----维护数据的完整性--约束
--约束包括:not null ,unique ,primary key ,foreign key ,和check 五种

--not null
  --插入时必须为字段指定数据,不能为空
--unique
   --该值不能重复,是唯一的,单丝可以为null,但是最多只能有一个null
--primary key
   --用于唯一的标示表行的数据主键唯一,且不能为空 ,一张表最多只有一个主键约束,但是可以有个unique
   --表可以有复合主键
--foreign key
  --用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必须具有主键约束或是unique约束,
  --当定义外键后,要求外键列数据必须在主表的主键列存在或是为null
--check
  --用于强制数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值
  --在1000-2000之间,如果不在1000-2000之间就会提示出错
create table test
(
Id number(10)unique,--行级定义
name varchar2(30),
pass  varchar2(30),
age number(3)default 18,--default  的使用
sal int check (sal>=1000 and sal<=2000),
primary key (Id ,name)--表级定义
)



--商店售货系统表设计案例
--现有一个商店的数据库,记录客户及其购物情况,有下面三个表组成:
--商店goods (商品号goodsId ,商品名goodsName,单价unitprice ,商品类别category,供应商provider);
--客户customer(客户号 customerId ,姓名 name,地址address ,电子邮件email ,性别sex,身份证cardId);
--购买purchase (客户号customerId ,商品号goodsId,购买数量nums);
--请用sql语言完成下列功能
--建表,在定义中要求声明:
--1,每个表的住外键
--2。客户的姓名不能为null
--3。单价必须>0,购买数量必须子啊1到30之间
--4,电子邮件不能重复
--5。客户的性别必须是男或者女,默认为男
--6。商品的类别必须是食物或者是日用品

create table goods
(
goodsId nvarchar(50) primary key,
goodsName  nvarchar(80) not null,
unitprice  numeric(10,2) check (unitprice>0),
category  nvarchar(6) ckeck(category in('食物','日用品')),
provider  nvarchr(50)
)

create table customer
(
customerId  nvarchar(50) primary key,
cusname  nvarchar(50) not null,
address nvarchar(100),
email nvarchar(100) unique,
sex nchar(1) ckeck (sex in('男','女')) default '男',
cardId nvarchar(18)
)

create table purchase
(
customerId  nvarchar(50) foreign key references customer(customerId),
goodsId nvarchar(50) foreign key references goods(goodsId),
nums int ckeck (nums >0 and nums <30)
)


--修改表

--1。掌握sql server的数据库的备份和恢复
--2。掌握java对表的crud操作
--3、掌握Statement和PreparedStatement
--4。能完成一般的java数据库编程任务

--使用企业管理器备份和恢复数据库
--1.分离、附加
--分离完后,请到sql server 安装的目录下去找两个文件 数据库名。mdf 和数据库名。ldf
--这两个文件就是分离后的文件,数据库分离后,该数据看就不能再使用了
--附加是指,当用户需要重使用某个分离的数据库式进行的操作,就是让sql server数据库重新关联该数据库

--用文件

--使用查询分析器完成备份和恢复

--如何备份数据库

语法是
backup database 数据库名 to disk ='d:/hg.back'

backup database test to disk ='d:/hg.back'


--删除数据库
drop database test

--恢复数据库
restore database 数据库名 from disk ='d:/hg.back'

--有时可能不需要备份整个数据库,表的备份。。和数据库一样


--找出早于12年前受雇的员工
-- sql server 2000
select * from emp where datediff(year,hiredate,getdate())>22;
--oracle中
select * from emp where sysdate >= add_months(hiredate ,12*12);

--找出各月倒数第3天的受雇的所有员工
--oracle
select * from emp where hiredate = last_day(hiredate)-2;

--以首字母大写的方式显示名字
--sql server 2000
select upper(substring(ename,1,1))+lower(substring(ename ,2,len(ename))) from emp;
--oracle
select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) from emp;

--显示姓名正好是5个字母的
select * from emp where ename like '_____';
select * from emp where len(ename) =5;
--oracle 中: select * from emp where length(ename)=5;


--显示所有员工的前三个字符
--oracle
select substr(ename,1,3) from emp;
--sql server 2000
select substring(ename,1,3) from emp;

--显示所有员工的姓名,用a替换所有的A
--oracle
select replace(ename,'A','a') from emp;

--显示满10年服务年限的员工的姓名和受雇日期
--oracle
select ename ,hiredate from emp where sysdate >= add_months(hiredate,12*10);
--sql server 2000
select ename,hiredate form emp where datediff(year,hiredate,getdate())>10;

--显示所哟员工的姓名、工作和薪金,按工作的升序排列,若工作相同,则按薪金排序
select ename,job,sal from emp order by job desc ,sal;
--order by 先按desc排序,再按sal排序

select avg(sal),deptno from emp group by deptno;


--显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,
--若月份相同则将做早年份的员工排在最前面
--oracle
select ename, to_char(hiredate,'YYYY-MM') from emp  order by to_char(hiredate,'mm'),to_char(hiredate,'YYYY') ;
--sql server 2000
select ename,detepart(year,hiredate),datepart(month,hiredate) m from emp by m,y;

--列出至少有一个员工的所有部门
--sql server 2000  and oracle
select count(*), deptno from emp  group by deptno having count(*) >1;

--列出薪金比SMITH多的所有员工
select * from emp where sal>(select sal from emp where ename ='SMITH') and ename <>'SMITH';

--列出多有员工的姓名,及其直接上级的姓名
select w.ename 员工 , b.ename 上级 from emp w ,emp b where w.mgr = b.empno;


--列出受雇日期晚于其直接上级的所有员工
select w.ename 员工 , w.hiredate, b.ename 上级, b.hiredate  from emp w ,emp b where w.mgr = b.empno and w.hiredate >b.hiredate;


--列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
select d.dname , e.* from dept d left join emp e on e.deptno = d.deptno;


--列出所有CLERK 的姓名及其部门名称
select e.ename ,d.dname from emp e,dept d where e.job='CLERK' and e.deptno = d.deptno;

--列出最低薪金大于1500的各种工作
select min(sal),job from emp group by job having min(sal) >1500;


--列出在部门’SALES‘工作的员工的名字,假定不知道销售部的部门编号
select ename from emp where deptno =(select deptno from dept where dname = 'SALES');

--列出薪金高于公司平均薪金的所有员工
select ename ,sal from emp where sal>(select avg(sal) from emp);

--列出与SCOTT从事相同工作的所有员工
select * from emp where job = (select job from emp where ename ='SCOTT');

--列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金
select * from emp where sal in(select sal from emp where deptno =30);


--列出薪金大于部门30中员工的薪金的所有员工的姓名和薪金
select * from emp where sal >(select max(sal) from emp where deptno =30);


--列出在每个部门工作的员工数量、平均工资和平均服务期限
--sql server 2000
select count(*),avg(sal),avg(datediff(year,hiredate,getdate())),deptno from emp group by deptno;
--oracle
select count(*) ,avg(sal) ,avg(sysdate - hiredate) ,deptno from emp group by deptno;

--列出所有员工的姓名、部门名称和工资
select e.ename,d.dname ,e.sal from emp e,dept d where e.deptno=d.deptno;



--列出从事同一工作但是属于不同部门的员工的一种组合
select e1.ename ,e2.ename from emp e1,emp e2 where e1.job = e2.job and e1.deptno <> e2.deptno;

--列出所有部门的详细信息和部门人数
--select d2.dname,d2.loc ,d.c from dept d2 ,(select count(*) c,deptno de from emp group by deptno) d
--where d2.deptno = d.de;
select d2.dname,d2.loc ,nvl(d.c,0) from dept d2 left join (select count(*) c,deptno de from emp group by deptno) d
on d2.deptno = d.de;

--列出各种工作的最低工资
select min(sal),job from emp group by job;


--列出MANAGER的最低薪金
--sql server 2000不区分大小写 而oracle区分
select min(sal) from emp where job ='MANAGER';


--列出所有员工的年工资,按年薪从低到高排序 oracle :nvl(comm,0)  sql server:isnull(comm,0)
select sal*12+nvl(comm,0),ename from emp order by (sal*12+nvl(comm,0));



分享到:
评论

相关推荐

    java+SSH+oracle+sqlserver学习笔记

    在Java应用中,通常使用JDBC(Java Database Connectivity)来连接和操作Oracle数据库。 5. SQLServer数据库:Microsoft的SQLServer是另一种流行的数据库系统,尤其在Windows环境和.NET生态系统中广泛应用。SQL...

    Oracle数据库培训笔记

    ### Oracle数据库培训笔记知识点概述 #### 一、数据库基础 - **版本简介**:Oracle数据库经历了从Oracle 7.3.4、8.0.6到8i、9i、10g、11g等多个版本的发展。其中,8i版本开始采用Java作为核心编程语言,实现了平台...

    自己总结的server教程和Oracle笔记

    而"oracle自学笔记.txt"则可能是一个纯文本格式的笔记文件,涵盖了Oracle数据库的体系结构、安装配置、SQL语法、PL/SQL编程、数据库管理等方面的知识。 综合以上信息,这个压缩包提供了两部分学习资源:一是针对SQL...

    Oracle数据库体系结构-学习笔记.docx

    Oracle数据库体系结构包括数据库和实例两大部分。数据库包含了数据文件、控制文件和重做日志文件等物理组件;而实例则是数据库在内存中的表示,包括SGA和PGA以及后台进程。SGA作为共享内存区域,包含了共享池、数据...

    各种主流数据库学习笔记

    其次,SQL Server是微软公司开发的一款商业数据库系统,它提供了强大的数据管理和分析功能。在《传智播客-sql入门.ppt》中,除了基础的SQL语法外,你可能还会接触到SQL Server特有的功能,如T-SQL扩展、备份恢复策略...

    史上最全的oracle笔记

    Oracle数据库是一种广泛应用于企业级应用的数据管理解决方案,其历史悠久,功能强大。这篇史上最全的Oracle笔记将为你提供全面的学习指导。 一、数据库基础 数据库(DataBase)是存储数据的系统,Oracle数据库允许...

    SQL 数据库语言学习笔记

    本篇“SQL数据库语言学习笔记”将深入探讨SQL的基本概念、语法和常用操作,帮助你掌握这个强大的工具。 一、SQL简介 SQL起源于1970年代,由IBM的研究员开发,其设计目标是为了解决日益复杂的数据查询和管理问题。...

    数据库(Oracle+SQL) 学习笔记

    根据给定的“数据库(Oracle+SQL) 学习笔记”的标题、描述及部分内容,我们可以归纳出以下几个重要的知识点: ### 一、SQL基础语法 #### 1. SELECT语句 SELECT 语句用于从数据库表中选取数据。基本格式如下: ``` ...

    SSH应用sqlserver和Oracle和Ajax和java基础

    在本压缩包中,你将找到关于SSH框架在实际应用中与SQL Server、Oracle数据库以及Ajax和Java基础知识的详细笔记。 1. SSH框架: - Struts:作为MVC框架的一部分,负责处理HTTP请求,并将控制权交给相应的业务逻辑...

    数据库复习笔记及mooc上的题库

    常见的数据库管理系统(DBMS)如MySQL、Oracle、SQL Server和MongoDB等,它们支持SQL(结构化查询语言),用于与数据库交互。 在笔记中,你可能会看到关于关系型数据库的内容,这是最常见的一种数据库模型。关系型...

    最全面的sql数据库基础知识笔记

    SQL(Structured Query Language)是用于管理和操作关系型数据库的标准语言,它被广泛应用于各种数据库系统,如MySQL、Oracle、SQL Server、PostgreSQL等。本笔记将深入探讨SQL数据库的基础知识,帮助初学者全面理解...

    一些sql语法基础笔记

    - **Access**: 微软Office套件的一部分,是一种小型桌面数据库系统。 #### 三、数据库表结构 - **表(Table)**:是数据库中的主要数据存储单元,对应于现实世界中的实体或概念。 - **行(Row)**:表示一条记录,每个...

    视频教程魔乐科技(mldn)Oracle完全同步笔记

    本视频教程由魔乐科技(mldn)提供,专为Oracle初学者设计,旨在帮助学习者掌握Oracle数据库的基本操作和高级特性,通过详细的同步笔记,使学习过程更加高效。 首先,Oracle数据库的基础知识是学习的起点。这包括...

    oracle笔记(韩顺平oracle视频教学整理)

    5. Java操作Oracle:讲述了如何使用Java语言连接和操作Oracle数据库。 6. Oracle中事务处理:讲解了事务的概念、特性(ACID属性),以及如何在Oracle中进行事务控制,包括提交(commit)和回滚(rollback)。 7. ...

    《oracle9i数据库管理员手册》读书笔记

    SQL是访问和管理Oracle数据库的核心语言,用于数据查询、更新和管理。PL/SQL是一种过程化SQL,提供了更复杂的编程能力,如流程控制、异常处理等,用于构建复杂的应用逻辑和数据库触发器。 #### 3. **安全性管理** ...

    MLDN李兴华数据库笔记

    - **性能调优**:Oracle数据库的性能调优涉及多个方面,包括SQL查询优化、索引策略、内存管理和磁盘I/O优化等。 ### MySQL数据库 虽然给定文件的部分内容主要集中在Oracle上,但根据描述,也应包含有MySQL的相关...

    达内Oracle学习笔记

    在达内科技培训的笔记中,Oracle学习部分提供了对Oracle数据库系统深入的理解和操作技巧,对于初学者及希望深化Oracle技能的专业人士都极具价值。以下是从标题、描述、标签以及部分内容中提炼出的关键知识点。 ####...

Global site tag (gtag.js) - Google Analytics