SQL数据库学习,常用语句查询大全

数据库学习


sql server数据库基本概念


使用文件保存数据存在几个缺点:

1、文件的安全性问题;

2、文件不利于查询和对数据的管理;

3、文件不利于存放海量数据

4、文件在程序中控制不方便。

 

数据库的定义(1)

严格地说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。在经济管理的日常工作中,常常需要把某些相关的数据放进这样的“仓库”,并根据管理的需要进行相应的处理。例如,企业或事业单位的人事部门常常要把单位职工的基本情况(职工号、姓名、年龄、性别、籍贯、工资、简历等)存放在表中,这张表就可以看成一个数据库。有了这个“数据仓库”我们就可以根据需要随时查询某职工的基本情况,也可以查询工资在某个范围内的职工人数等等。这些工作如果都能在计算机上自动进行,那我们的人事管理就可以达到极高的水平。此外,在财务管理、仓库管理、生产管理中也需要建立众多的这种“数据库”,使其可以利用计算机实现财务、仓库、生产的自动化管理。

 

数据库的定义(2)

J.Martin组数据库下了一个比较完整的定义:数据库是存储在一起的相关数据的集合,这些数据是结构化的,无有害的或不必要的冗余,并为多种应用服务;数据的存储独立于使用它的程序;对数据库插入新数据,修改和检索原有的数据均能按一种公用的和可控制的方式进行。当某个系统中存在结构上完全分开的若干个数据库时,则该系统包含一个“数据库集合”。

 

数据库的基本结构

数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。

1、物理数据层

    它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据的原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。

2、概念数据层

    它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。

3、逻辑数据层

    它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。

数据库不同层次之间的联系是通过映射进行转换的。

 

数据库的基本特点

1、实现数据共享

    数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。

2、减少数据的冗余度

    同文件系统比,数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性

3、数据实现集中控制

    文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。

4、数据一致性和可维护性,以确保数据的安全性和可靠性。

5、故障恢复

 

目前主流数据库

微软:              Sql Server和Access

瑞典MySQL:         AB公司MySql

IBM公司:           DB2

美国Sybase公司:   Sybase

IBM公司:           Informix

美国Oracle公司:   Oracle

 

数据库选择:

1、成本;2、功能;3、并发性要求;4、安全性;

 

为什么学习SqlServer?

简单易学

一般来讲,学习数据库很多人都是从微软的sql server数据库开始的,我们知道微软的产品以简单易用见长,事实也是如此,从sqlserver开始学习数据库是正确的选择,后面我们还要带领大学学习oracle数据库,如果一上手就学习oracle这种大型数据库,会很吃力。

 

sql server介绍(1)

SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle、Sybase、Microsoft SQL Server、Access等都采用了SQL语言标准。

 

sql server介绍(2)

SQL Server是一个关系数据库管理系统。它最初是由Microsoft Sybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。在Windows NT推出后,Microsoft与Sybase在SQLServer的开发上就分道扬镳了,Microsoft将SQLServer移植到Windows NT系统上,专注于开发推广SQLServer的Windows NT版本。Sybase则较专注于SQL Server在UNIX操作系统上的应用。

SQL Server2000是Microsoft公司推出的SQLServer数据库管理系统,该版本继承了SQL

Server7.0版本的优点,同时又比它增加了许多更先进的功能。

 

sql server开发工具

sql server2000为我们提供了两种开发工具

1、企业管理器

企业管理器是微软提供的图形界面方式操作sql server2000的工具

2、查询分析器

查询分析器是微软提供的用命令行(sql语句)操作sqlserver2000的工具

 

企业管理器的使用(1)

数据库用户和管理员的概念

1、管理员sa的介绍

2、如何修改sa的密码

 

企业管理器的使用(2)

为了让大家能迅速掌握企业管理器的使用,我们使用管理器。

以一个梁山好汉管理为例

1、建库

2、建表

英雄表 hero

[这里涉及到对表的几个重要概念:a、字段;b、字段类型(简单介绍);c、表行;d、表列;e、记录]

3、对表进行增加、删除、修改、查询的操作

这里可以针对真实班级的学生来做,并增加一定的互动,比如用点名机来抽学生操作,或是用点名机看看那个学生被删除或是添加、修改...这样可能学生更有兴趣。

 

查询分析器的使用(1)

    企业管理器给用户提供了一个很方便的图形界面管理工具,大家用起来感觉直观方便,可是它也有缺点,当一个表的记录非常大的时候,对表的各种操作,都显得不方便了,比如:

1、要求从1000行记录中查询是否存在名为“孙小明”的人

2、要求把1000行记录中工资低于100的人,工资增加10%

3、要求把年龄大于30的人从数据表中删除

这时,你会发现使用企业管理器是很不方便的

所以微软为我们提供另外一个操作数据库的工具,查询分析器。查询分析器可以非常方便的完成上述任务。

 

查询分析器的使用(2)--sql语句

使用查询分析器,我们就必需要了解sql语句。

 

什么是sql语句呢?

人与人交流是使用语言进行交流。我们与sql数据库交流就要使用对应的计算机语言进行交流,所以访问sql数据库要使用sql语句进行指令的发送。

查询分析器的使用(3)--sql语句

SQL全称是“结构化查询语言(Structured Query Language)”

SQL(Structured QueryLanguage)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。

 

查询分析器的使用(4)--sql语句

SQL语言包含4个部分:

数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。

数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。

数据查询语言(DQL),例如:SELECT语句。

数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。

 

查询分析器的使用(5)

使用查询分析器再次完成梁山好汉管理数据库

1、建库

2、建表

英雄表 hero

[这里涉及到对表的几个重要概念:a、字段;b、字段类型(简单介绍);c、表行;d、表列;e、记录]

1、 对表进行增加、删除、修改、查询的操作

 

查询分析器中创建数据库

--创建数据库

create database LiangshanHero2

 

--创建表

use LiangshanHero2--使用指定数据库

go--执行

create table hero--表名

(heroId  int ,--英雄排名

heroName  varchar(50),--名字

heroNickName  varchar(50),--绰号

sex char(2),--性别

sal int

)

 

--删除一张表(把表的结构和表的数据删除)

drop table hero

--使用sql语句来添加数据

insert into hero  values(1,'宋江','及时雨','男',20000)

insert into hero   values(2,'卢俊义','玉麒麟','男',15000)

insert into hero  values(3,'吴用','智多星','男',30)

insert into hero  values(4,'公孙胜','入云龙','男',80)

 

--使用sql语句查询数据,最基础的查询语句

select * from hero

 

--1、查询工资低于100的同志

select * from hero  where sal<100

 

--2、把工资低于100的人工资提高10%(update)

--语法结构:update表名 set 字段名1=?,字段名2=?...where 条件语句

update hero setsal=sal*1.1 where sal<100

 

--3、请删除工资性别为女的

delete from hero  where sex='男'

 

表的管理--表名和列的命名规则

1、必需以字母,_开头

2、长度不能超过128个字符

3、不要使用sql server的保留字

4、只能使用如下字符A-Z,a-z,0-9,$,#,_等

 

表的管理--支持的数据类型

字符型

char 定长 最大8000字符(非unicode编码)

char(10)'小韩'前四个字符放'小韩',后添6个空格补全

varchar变长 最大8000字符(非unicode编码)

varchar(10)'小寒'sql server分配四个字符,这样可以节省空间

ntext可变长度Unicode数据的最大长度为2的30次方-1(1,073,741,823)个字符

text可变长度非Unicode数据的最大长度为2的31次方-1(2,147,483,647)个字符

区别:

1、text是字节格式存储英文的,也可以存中文但有时候会显示成乱码

2、ntext是多字节格式存储unicode的,也就是存储各种文字用的。

在什么时候使用char型而不使用varchar,在知道字段定长固定时就使用char

 

字符型

nchar 定长 最大4000字符(unicode编码)

nchar(10)'小韩'前四个字符放'小韩',后添6个空格补全

nvarchar 变长 最大4000字符(unicode编码)

nvarchar(10)'小寒'sql server分配四个字符,这样可以节省空间

特别说明:

1、一般带有汉字的字段用nvarchar,全英文或符号的用varchar,因为nvarchar为unicode字符集,该类型的字段无论是单个字母还是单个汉字都占两个字节,而varchar,字母占一个字节,汉字占两个,nvarchar处理汉字或其它unicode字符集的速度要比varchar字段快。

2、如果有一些特殊字符在nvarchar中没有的,如日文的某些名片,那当然只能选合适的代码页用varchar了,而且这些特有语言特有的字符转换到nvarchar会消失

 

表的管理--支持的数据类型

数字型

1、bit范围 0到1

2、int范围 负的2的31次方到正的 2的31次方-1

3、bigint范围 负的2的63次方到正的 2的63次方-1

4、float存放小数,不推荐使用

5、numeric小数

强烈建议 如果要去存放小数最好使用numeric

 

日期类型

datetime(表示日期)

timestamp(时间戳)

一般情况下 用datetime表示日期

--sqlserver为我们提供一个专门的时间函数

getdate()

create table spname--建表

(bir datetime)--字段

insert into spnamevalues(getdate())--添加时间

 

图片

image保存图片,但是用的很少,一般用路径保存图片,在软件公司往往使用图片服务器和图床技术

 

视频

binary字段可以存放,但是我们往主,将视频文件保存在文件服务器上,sql server中只保留文件路径,存取效率高。

 

表的管理--怎样创建表

建表(公司管理系统)

--职员表

sql server建议表的设计者,最好给表定义一个主键,用来标示唯一的一条记录。

1、主键(primary key),不能够重复出现;

2、主键必需给值,换言之主键不能为null

3、主键可以修改,但不能修改为同名的,同时要明确字段不有重复,否则报错。

 

表的管理--查询

查询表是对表操作的最重要的操作,这个后面详细讲解

 

表的管理--添加数据

所有字段都插入

insert into emp  values(7521,'ward','salesman',7698,'1981-2-22',1250.00,500.00,30)

 

插入部分字段(语法)

insertinto 表名 (字段名1,字段名2,...) values (对应字段数据1,对应字段数据2,...)

 

表的管理--修改数据

改一个字段(语法)

update 表名 set字段名='新值' where 字段='值'

例:update  student set sex='女' where xh='A001'

    update clerk set age=38 where cleName='贾政'

 

修改多个字段(语法)

update 表名 set字段名1='新值',字段名2='新值'... where 字段='值'

例:update student   set sex='男',birthday='1980-04-01' where xh='A001'

    update clerk set cleName='薛蟠',age=40 where cleId=2

 

修改含有null值的数据(语法)

update 表名 set字段名='新值' where 字段 isnull

例:update clerkset cleName='薛宝钗' where age is null

 

表的管理--删除数据

删除全部数据

deletefrom 表名

 

删除指定数据

deletefrom 表名 where字段名='值'

 

删除多个指定数据(and是条件满足,or是前提条件不满足时使用)

deletefrom 表名 where字段名1='值' and 字段名2='值' and或or ...

 

表的基本查询--介绍(重点)

select语句在软件编程中非常的有用,要好好掌握。

 

介绍主键和外键

主键,一张表中只能有一个主键

1、主键(primary key),不能够重复出现;

2、主键必需给值,换言之主键不能为null

3、主键可以修改,但不能修改为同名的,同时要明确字段不有重复,否则报错。

 

外键

1、外键只能指向主键

2、外键和主键的数据类型要一致

 

数据库例解主键、外键、多功能查询,见下例:

--建库

create database test

 

--创建dept

create table dept--部门表

(deptno int primary key,--部门编号

dname nvarchar(30),--部门名称

loc nvarchar(30)--所在地

)

 

--建表emp

create table emp--表名

(empno int primarykey,--编号

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)--部门编号(做成外键)

)

 

--针对外键,请注意:

--1、外键只能指向主键

--2、外键和主键的数据类型要一致

 

--向dept表中添加数据

insert into deptvalues (10,'accounting','new york')

insert into deptvalues (20,'research','dallas')

insert into deptvalues (30,'sales','chicago')

insert into deptvalues (40,'operations','boston')

 

--向emp表中添加数据

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7369,'smith','clerk',7902,'1980-12-17',800.00,20)

insert into empvalues(7499,'allen','salesman',7698,'1981-2-20',1600.00,300.00,30)

insert into empvalues(7521,'ward','salesman',7698,'1981-2-22',1250.00,500.00,30)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7566,'jones','manager',7839,'1981-4-2',2975.00,20)

insert into empvalues(7654,'martin','salesman',7698,'1981-9-28',1250.00,1400.00,30)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7698,'blake','manager',7839,'1981-5-1',2850.00,30)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7782,'clark','manager',7839,'1981-6-9',2450.00,10)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7788,'scott','analyst',7566,'1987-4-19',3000.00,20)

insert into emp(empno,ename,job,hiredate,sal,deptno) values (7839,'king','president','1981-11-17',5000.00,10)

insert into empvalues (7844,'turner','salesman',7698,'1981-9-8',1500.00,0.00,30)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7876,'adams','clerk',7788,'1987-5-23',1100.00,20)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7900,'james','clerk',7698,'1981-12-3',950.00,30)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7902,'ford','analyst',7566,'1981-12-3',3000.00,20)

insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7934,'miller','clerk',7782,'1982-1-23',1300.00,10)

 

--查看dept表内容

select * from dept

--查看emp表内容

select * from emp

 

--查询所有列

--语法:select * from表名 where 条件

select * from emp

 

--查询指定列(sql sever不区分大小写,oracle区分大小写)

--语法:select字段1,字段2 from 表名 where 条件

 

--查询smith的薪水,工作,所在部门

selectsal,job,deptno from emp where ename='smith'

 

--取消重复行(distinct只能消除完全一样的行,保留一行)

--语法:select distinct字段 from 表名 where 条件

 

--统计共有多少个部门编号

select distinct  deptno from emp

 

--使用算数表达式

--显示每个雇员的年工资+奖金

select ename"姓名",sal*13+isnull(comm,0)*13"年收入" from emp

 

--使用where子句

--如何显示工资高于3000的员工

select ename"员工姓名",sal"工资高于3000" from emp where sal>3000

 

--如何查找1982-1-1后入职的员工

select ename"员工姓名",hiredate"1982-1-1后入职日期" from emp where hiredate>'1982-1-1'

 

--如何显示工资在2000到2500的员工情况

select * from empwhere sal>=2000 and sal<=2500

select * from empwhere sal between 2000 and 2500

 

--如何使用like操作符(模糊查询)

--%:表示0到多个字符 _:表示单个字符

--如何显示首字符为S的员工姓名和工资

select ename,salfrom emp where ename like 's%'

 

--如何显示第三个字符为o的所有员工的姓名和工资

select ename,salfrom emp where ename like '__O%'

 

--在where条件中使用in

--如何显示empno为123,345,800...的雇员情况

select * from empwhere empno in(123,345,800)

 

--使用is null的操作符

--如何显示没有上级的雇员的情况

select * from empwhere mgr is null

 

--使用逻辑操作符号

--查询工资高于500或是岗位为manager的雇员,同时还要满足他们的姓名首写字母为大写的J

select * from empwhere (sal>500 or job='manager') and ename like 'J%'

 

--使用order by字句(asc默认是升序排列,desc为降序排列)

--如何按照工资的从低到高的顺序显示雇员的信息

select sal from emporder by sal asc

--按照部门号升序而雇员的工资降序排列

--order by可以根据不同的字段排序

select deptno,salfrom emp order by deptno,sal desc

 

--使用列的别名排序(别名需要使用""号圈中)

select  ename,sal*12"年薪"from emp order by "年薪"

 

表的复杂查询

说明:

    在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给

大家介绍较为复杂的select语句

数据分组-max(最大),min(最小),avg(平均),sum(和),count(统计)

 

见下例:

--如何显示所有员工中最高工资和最低工资

select  min(sal)"最低工资",max(sal)"最高工资" from emp

--显示最低工资并显示出雇员名字

select  ename"姓名",sal"工资" from emp where sal=(select min(sal) from emp)

 

--显示所有员工的平均工资和工资总和

select avg(sal)"平均工资",sum(sal)"工资总和" from emp

--把高于平均工资的雇员的名字和他的工资显示出来

select ename,salfrom emp where sal>(select avg(sal) from emp) order by sal

 

--计算共有多少员工

select   count(*)"雇员数"from emp

 

--扩展要求

--请显示工资最高的员工的名字、工作岗位

select ename,job  from emp where sal=(select max(sal) from emp)

 

--请显示工资高于平均工资的员工信息,并显示平均工资(效率不高)

select ename"姓名",job"岗位",sal"工资",(select avg(sal)from emp)"平均工资" from emp where sal>(selectavg(sal) from emp) order by sal

 

表的复杂查询

group by和having子句

group by用于对查询的结果分组统计

having子句用于限制分组显示结果

 

例:

--group by和having子句使用(having与group by结合使用,可以对分组后的查询结果进行筛选)

--如何显示每个部门的平均工资和最高工资

select deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资" from emp group by deptno

--如何显示每个部门的平均工资和最高工资并显示部门名称(多表查询)

select  emp.deptno"部门号",avg(sal)"平均工资",max(sal)"最高工资",min(sal)"最低工资",dept.dname"部门名称" from  emp,dept where emp.deptno=dept.deptno group by emp.deptno,dept.dname

 

--显示每个部门的每种岗位的平均工资和最低工资

select deptno"部门号",job"岗位",avg(sal)"平均工资",min(sal)"最低工资" from emp group by deptno,job order by deptno

 

--显示平均工资低于2000的部门号和它的平均工资

select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)<2000

 

--显示平均工资大于2000的部门号和它的平均工资并按升序排列

select deptno"部门号",avg(sal)"平均工资" from emp group by deptno having avg(sal)>2000 order by"平均工资"

 

表的复杂查询

对数据分组的总结

1、分组函数只能出现在选择列表,having、order by子句中

2、如果在select语句中同时包含有group by,having,ovrderby那么他们的顺序是group by,having,order by

3、在选择列中如果有列、表达式、和分组函数,那么这些列和表达式必需有一个出现在group by子句中,否则就会出错

如:selectdeptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000

这里deptno就一定要出现在group by中

 

表的复杂查询--多表查询

说明:

    多表查询是指基于两个或两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)

 

--多表查询

--如果多张表都有相同名字的字段,则需要带表名(别名)

--显示sales部门位置和其员工的姓名

select  emp.ename"员工姓名",dept.dname"部门名称",dept.loc"部门所在地" from  emp,dept where dept.dname='sales' and emp.deptno=dept.deptno

 

--显示雇员名,雇员工资及所在部门的名字

select  emp.ename"雇员名",emp.sal"雇员工资",dept.dname"部门名称" from  emp,dept where emp.deptno=dept.deptno

 

--如何显示部门号为10的部门名、员工名和工资

select  emp.deptno"部门号",dept.dname"部门名称",emp.ename"员工名称",emp.sal"工资" from emp,dept where emp.deptno=dept.deptno and emp.deptno=10

 

--显示雇员名、雇员工资及所在部门的名字并按部门排序

select e.ename"雇员名字",e.sal"工资",d.dname"部门名称" from empe,dept d where e.deptno=d.deptno order by d.dname

 

表的复杂查询--多表查询

自连接

自连接是指在同一张表的连接查询

例:

--自连接

--显示某个员工的上级领导的姓名,比如显示"ford"的上级

select (select enamefrom emp where ename='ford')"员工姓名",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 deptno"部门号",ename"员工名字" 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子句中使用子查询

--如何显示高于部门平均工资的员工名字、薪水、部门的平均工资

--分析:1、首先要知道各个部门的平均工资

select  avg(sal)"部门平均工资",deptno  from emp group by deptno

--2、把上面的查询结果当作一个临时表对待

select e.ename"员工名字",e.sal"薪水",temp.myavg"部门平均工资",e.deptnofrom emp e,(select avg(sal) myavg,deptno from emp group by deptno) temp wheree.deptno=temp.deptno and e.sal>temp.myavg

 

在from子句中使用子查询

这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个临时表来对待,当在from子句中使用子查询时,必需给子查询指定别名

 

分面查询

按雇员的id号升序取出

--请显示第5个到第10个入职的雇员信息(按照入职的时间先后顺序查找)

--分析:1、显示第1个到第4个入职的雇员

select  top 4 * from  emp order by hiredate

--top后的数表示要取出几条记录

select top 6 * from  emp where empno not in(select top 4 empno from emp order by hiredate) order byhiredate

 

--请显示第11个到13个入职的雇员信息

select top 3 * from  emp where empno not in(select top 10 empno from emp order by hiredate) order byhiredate

 

--请显示第5个到9个入职的雇员信息(按薪水高低排序)

select top 5 * from  emp where empno not in(select top 4 empno from emp order by sal desc) order bysal desc

 

用查询结果创建新表

这个命令是一种快捷的建表方法

select *(这里可以选择字段) into另一个表名 from 表

 

--如何删除掉一张表重复记录

create table cat(

catId int,

catName varchar(40)

)

 

insert into catvalues(1,'aa')

 

select * from cat

 

--1、把cat表的记录distinct后的结果,放到临时表中

select  distinct * into #temp from cat

--2、把cat表的记录清空

delete  from cat

--3、把临时表中的数据信息加入到cat表中

insert  into cat select * from #temp

--4、删除临时表

drop table#temp

 

 

--左外连接和右外连接

--思考题:显示公司每个员工和他的上级领导的名字

--内连接的处理方式(内连接只显示匹配的信息)

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

 

维护数据的完整性--约束

约束用于确保数据库数据满足特定的商业规则。在sql server和oracle中,约束包括:not null、unique,primary key,foreign key和check五种

 

维护数据的完整性--使用

not null(非空)

如果在列上定义了not null,那么当插入数据时,必需为列提供数据。

--约束机制--not null(非空)

--创建一张表

create table test1

(test1Id int primarykey identity(1,1),

testname varchar(30)not null,--not null不能为空

testpass varchar(30)not null,

testage int --不写代表可以为空

)

 

create table test1

(test1Id int primarykey identity(1,1),--identity(1,1)自增长1条记录

testnamevarchar(30),

testpassvarchar(30),

testage int --不写代表可以为空

)

--删除表

drop table test1

--向表插入数据

insert into test1(testage) values (3)

insert into test1 (testname,testpass,testage)values ('','',5)--''空与null空是不一样的

--查询表内容

select * from test1

 

unique(唯一)(一张表中可以有多个)

当定义了唯一约束后,该列值是不能重复的,但是可以为null,并只能有一个空值

--约束机制--unique(唯一)

--建表

create table test2

(test1Id int primarykey identity(1,1),--identity(1,1)自增长1条记录

testname varchar(30)unique, --unique唯一的,数据不允许重复,但可以为空

testpassvarchar(30),

testage int --不写代表可以为空

)

 

insert into test2(testname,testpass,testage) values ('aa','123',45)

insert into test2(testpass,testage) values ('123',45)

 

select * from test2

 

primarykey(主键)(一张表中只可以有一个主键)

用于唯一的标示表行的数据,当定义主键约束后,该列不但不能重复而且不能为null

需要说明的是:一张表最多只能有一个主键,但是可以有多个unqiue约束。

表可以有复合主键,有多个列构成一个主键

--复合主键

create table test3

(testId int,

testnamevarchar(30),

testpassvarchar(30),

testage int,

primary key(testId,testname)--复合主键,需单独声明

)

 

--行级定义和表级定义

create table test4

(testId int,--在字段中定义主键为行级定义.例:testId int primary key

testnamevarchar(30),

testpassvarchar(30),

testage int,

primarykey (testId,testname)--复合主键,需单独声明为表级定义

)

 

foreignkey(外键)(外键在从表上,要配合主表,但主表要有主键或unique约束)

用于定义主表和从表之间的关系。外键约束要定义在从表上,主表则必需具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必需在主表的主键列存在或是null

 

check(强制条件)

用于强制行数据必需满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000-2000之间如果不再1000-2000之间就会提示出错。

--check(强制条件)

create table test5

(testId int,

testnamevarchar(30),

testpass varchar(30),

sal intcheck(sal>=1000 and sal<=2000),--规定sal的值在1000-2000之间

)

 

insert into test5values (4,'aa','aa',1200)--可以加入sal值在范围之内

insert into test5values (5,'bb','bb',2200)--不可加入sal值在范围之外

 

select * from test5

 

default使用(默认值)

--default使用

create table mes

(mesId int primarykey identity(1,1),

mesccn varchar(2000)not null,

mesDate datetimedefault getdate()--在不指定值是default可以直接取默认值,也可以由用户指定值

)

 

insert into  mes(mesccn) values('abc')

insert into  mes(mesccn,mesDate) values('cba','1976-1-6')

 

select * from mes

 

商店售货系统表设计案例

    现有一个商店的数据库,记录客户及其购物情况,由下面三个表组成:

商品goods(商品号goodsId,商品名goodsName,单价unitprice,商品类别category,供应商provider);

客户customer(客户号customerId,姓名name,住址address,电邮email,性别sex,身份证cardId);

购买purchase(客户号customerId,商品号goodsId,购买数量nums);

请使用sql语言完成下列功能:

1、建表,在定义中要求声明:

1、每个表的主外键;

2、客户的姓名不能为空值;

3、单价必需大于0,购买数量大于0;

4、电邮不能够重复;

5、客户的性别必需是男或者女,默认为男

6、商品类别是'食物','日用品'

--商店售货系统表设计案例

create table goods--商品表

(goodsIdnvarchar(50) primary key,--商品Id为主键

goodsNamenvarchar(80) not null,--商品名不为空

unitpricenumeric(10,2) check (unitprice>0),--商品单价限制大于0

category nvarchar(3)check(category in('食物','日用品')),--商品类别需在指定的范围内

provide nvarchar(50)--供应商

)

 

create tablecustomer--客户表

(custcmerIdnvarchar(50) primary key,--客户Id为主键

cusname nvarchar(50)not null,--客户名不能为空

address nvarchar(100),--地址

email nvarchar(100)unique,--邮件不为重复

sex nchar(1)check(sex in('男','女')) default '男',--性别只能为男或女,默认为男

cardId nvarchar(18)--身份证

)

 

create tablepurchase--购买表

(custcmerIdnvarchar(50) foreign key references customer(custcmerId),--客户Id为外键,并指向customer表的custcmerId主键

goodsId nvarchar(50)foreign key references goods(goodsId),--商品Id为外键,并指向goods表的goodsId主键

nums intcheck(nums>0)--购买数量限定大于0

)

 

表的管理--修改表

添加一个字段

ALTERTABLE distributors ADD COLUMN address varchar(30);

 

修改字段的类型/或是名字(不能有数据)

ALTERTABLE distributors

    ALTER COLUMN address TYPE varchar(80),

    ALTER COLUMN name TYPE varchar(100);

ALTERTABLE distributors RENAME COLUMN address TO city;

 

删除一个字段

ALTERTABLE distributors DROP COLUMN address RESTRICT;

 

修改表的名字

ALTERTABLE distributors RENAME TO suppliers;

 

删除表

drop table表名;

 

数据库的备份和恢复

使用企业管理器完成备份和恢复

使用企业管理器有两种方式完成备份和恢复

1、分离/附加

    分离完后,请到sql server安装的目录下去找两个文件数据库名.mdf和数据库名.ldf,这两个文件就是分离后的文件,数据库分离后,该数据库就不能再使用了。

    附加是指,当用户需要重新使用某个分离的数据库时进行的操作,就是让sql server数据库重新关联该数据库。

 

2、备份/恢复

    备份数据库是指,把某个数据库文件从sql server中备份出来,这样用户可以根据需要再使用(用于恢复、复用..),备份数据库不会影响到源数据库的使用

    恢复数据库是指,当源数据库因为某种原因(比如源数据库毁坏、数据丢失、系统崩溃)需要恢复时进行的操作

 

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

    用企业管理器完成对数据库的备份和恢复简单直观,同样我们也可以在查询分析器中完成类似的任务。

--使用查询分析器对数据库进行备份和恢复

--数据库备份

--语法:backup database数据库名 to disk='存储路径'

backup  database LiangshanHero2 to disk='f:/liangshan.bak'

 

--数据库恢复

--语法:restore database数据库名 from disk='读取路径'

restore  database LiangshanHero2 from disk='f:/liangshan.bak'

 

--新建数据库

--语法:create datebase数据库名

create  database LiangshanHero2

 

--删除数据库

--语法:drop database数据库名

drop  database LiangshanHero2

 

*******************************************************************************

 

posted on 2016-02-13 21:09  岚之山  阅读(5424)  评论(0编辑  收藏  举报

导航