sql server 数据增删改查


一、数据插入

1、语法

INSERT INTO 表名 [<属性列>]

VALUES(参数列表)

注解:

①没有说明属性列,即要给出所有的列的值

②不确定的列,可以设置为null。(在允许为空的情况下)

2、实例

①在“人事管理系统”中,新增一个员工信息(员工编号‘100508’、员工姓名‘小龙女’、所在部门编号‘10001’、籍贯‘河南’)

insert into员工信息(员工编号,员工姓名,所在部门编号,籍贯)

values('100508','小龙女','10001','河南')

②将“人事管理系统”数据库的“员工信息”表中籍贯为“河南”并且所在部门编号为”10001”数据插入到“新员工信息”表中。

insert into新员工信息(员工编号,员工姓名,所在部门编号)

select 员工编号,员工姓名,所在部门编号from员工信息

where 籍贯='河南'and所在部门编号='10001'

 

二、数据更新

1、语法

UPDATE表名 SET 列名=表达式

[WHERE<条件>]

2、实例

①在“人事管理系统”数据库“部门信息”表中,将部门的员工人数设置为10

update 部门信息 set 员工人数=10

②在“人事管理系统”数据库“员工信息”表中,将文化程度为“大专”,并且在“2005-05-01”到“2007-05-01”之间入职的所有员工调动到编号为“10006”的部门去

update 员工信息set所在部门编号='10006'

where 入职时间 between '2005-05-01' and '2007-05-01' and文化程度='大专'

③在“人事管理系统”数据库中对部门进行了重组和调整,原来编号为10006的部门名称变为“市场开发部”,人数也调整为20人

update 部门信息set 部门名称='市场开发部',员工人数=20

where 部门编号=10006

 

三、数据删除

1、语法

(1)删除表的记录,保留表的结构,写日志可以恢复

DELETEFROM 表名

[WHERE<条件>]

(2)删除表的所有记录,保留表的结构,不写日志,无法恢复,速度快

TRUNCATETABLE 表名

2、实例

①在“人事管理系统”数据库中,编号为“100503”的新员工升级为正式员工,需要在“新员工信息”表中删除他的记录。

delete from 新员工信息 where 员工编号='100503'

②在“人事管理系统”数据库中,需要删除%的员工信息

delete top (5)percentfrom 员工信息

③在“人事管理系统”数据库中,删除“新员工信息”表中的所有记录

truncate table新员工信息

delete from 新员工信息

④将学生“陈霞”所在班级的其他学生并且成绩不合格的学生成绩删除

delete 成绩表

where  成绩<60and学号 in(

select 学号from学生信息

where 班级编号=(select班级编号from 学生信息 where 姓名='陈霞'))

 

四、数据查询

1、语法

SELECT[ALL|DISTINCT] <目标列表达式>

FROM<表名|视图名>

WHERE<条件表达式>

GROUPBY <列名>

HAVING<条件表达式>

ORDERBY <列名> [ASC|DESC]

2、注解

(1)SELECT [ALL|DISTINCT] <目标列表达式>

①不仅可以是表中的属性列,也可以是表达式,还可以是字符串常量、函数。

②用户可以通过指定别名来改变查询结果的列标题。

③ALL|DISTINCT

l  DISTINCT:去掉结果表中重复行。

l  ALL:保留结果表中取值重复的行。如果没有指定DISTINCT关键字,则缺省为ALL。

④查询全部列:可以使用“*”

(2)WHERE <条件表达式>

①比较(=等于 >大于 <小于 >=大等于 <=小等于!=或<>不等于!>不大于!<不小于)

②确定范围(BETWEEN AND,NOT BETWEEN AND)

③确定集合(IN,NOT IN)

④字符匹配(LIKE,NOT LIKE)

l  %:代表任意长度(长度可以为0)的字符串

l  _:代表任意单个字符。

⑤空值(IS NULL,IS NOT NULL)

⑥多重条件(AND,OR,NOT)

(3)ORDER BY <列名> [ASC|DESC]

l  DESC:降序

l  ASC:升序,缺省为ASC

(4)聚集函数

COUNT([ALL|DISTINCT]*)

统计元组个数

COUNT([ALL|DISTINCT]<列名>)

统计一列中值得个数

SUM([ALL|DISTINCT]<列名>)

计算一列值得总和

AVG([ALL|DISTINCT]<列名>)

计算一列值得平均值

MAX([ALL|DISTINCT]<列名>)

求一列值中的最大值

MIN([ALL|DISTINCT]<列名>

求一列值中的最小值

(5)GROUP BY <列名> HAVING <条件表达式>

①将查询结果按某一列或多列的值分组,值相等的为一组。

②除了聚集函数,其他都要分组。

③如果分组后,还要求一定的条件对这些组进行筛选,最终只输出满足条件的组,可以使用 HAVING<条件表达式>。

④WHERE子句的作用于基本表或试图,从中选择满足条件的元组。HAVING作用于组,从中选择满足条件的组。

3、关于查询

(1)单表查询:针对一个表

(2)连接查询:针对2个表以上

①等值连接|非等值连接

②自然连接:在等值连接中把目标列中重复的属性去掉。

③自身连接:一个表与自己进行连接。

④外连接(左外连接、右外连接)

⑤复合条件连接

(3)嵌套查询

①定义:将一个查询块嵌套在另一个查询块的查询

②类型:带有IN的子查询、带有比较运算符的子查询、带有ANY或ALL的子查询、带有EXISTS子查询

(4)集合查询

①并操作UNION

②交操作INTERSECT

③差操作EXCEPT

4、实例

(1)单表查询

①查询学生表的所有记录

select * from 学生表

②查询学号为‘1005’的学生信息

select *from学生信息

where 学号='1005'

③在“人事管理系统”数据库“员工信息”表中,查询工龄大于4年的员工信息

select *from员工信息

where year(getdate())-year(入职时间)>4

④查询学生的籍贯字段不为空的记录

select *from学生信息

where 籍贯 is not null

⑤查询姓名第一个字符是‘张’且姓名共两个字符的学生信息

select *from学生信息

where 姓名 like '_'

⑥查询学生姓名中带有“丽”字或“娜”字的学生信息

select *from学生信息

where 姓名like'%%'or姓名 like '%%'

⑦查询教师表的职称字段有哪几种取值

select distinct职称from 教师信息

(2)分页查询

①查询学生信息中前5条记录

select top 5 * from 学生信息

②查询学生信息中前20%条记录

select top 20 percent * from学生信息

(3)聚集函数

①统计学生表中所有男生的信息,并将查询结果字段命名为“男生总人数”

select COUNT(*) as男生总人数from 学生信息

where 性别=''

②根据籍贯查询各省学生人数,并显示省份和人数信息

select 籍贯as省份,count(*)as学生人数 from 学生信息

group by 籍贯

③按课程号计算选课表中各门课程的平均分,总分

select 课程编号,AVG(成绩)as平均分,SUM(成绩)as总分 from 成绩表

group by 课程编号

④查询员工表中2000年以后入职的姓名,政治面貌字段,并按政治面貌分组显示查询结果

select 员工姓名,政治面貌from员工信息

where 入职时间>'2000'and

政治面貌 in(

select 政治面貌from员工信息

group by政治面貌)

(4)连接(多表)查询

①查询参加考试的学生姓名,课程名,成绩信息

方法一:

select 姓名,课程名称,成绩

from  学生信息,课程信息,成绩表

where 学生信息.学号=成绩表.学号and

课程信息.课程编号=成绩表.课程编号

方法二:

select 姓名,课程名称,成绩

from  学生信息t1,课程信息t2,成绩表t3

where t1.学号=t3.学号and

t2.课程编号=t3.课程编号

②查询出所有考试及格的学生的成绩信息,包括学生的学号、姓名、性别、年级、班级编号及考试成绩,并且按照成绩进行降序排列

select  学生信息.学号,姓名,性别,年级,班级编号,成绩

from  学生信息,成绩表

where 学生信息.学号=成绩表.学号and

成绩>=60

order by 成绩 desc

③询所有学生的考试成绩信息,包括学生学号、姓名、课程编号和成绩信息。

方法一:左外连接

select  a.学号,a.姓名,b.课程编号,b.成绩

from 学生信息aleft  outer join 成绩表b on a.学号=b.学号

方法二:右外连接

select  a.学号,a.姓名,b.课程编号,b.成绩

from 学生信息aright  outer join 成绩表b ona.学号=b.学号

方法三:全外连接

select  a.学号,a.姓名,b.课程编号,b.成绩

from 学生信息 a full outerjoin成绩表b  ona.学号=b.学号

(5)嵌套查询

①查询成绩低于分的学生姓名

select 姓名from学生信息

where 学号in(

select 学号from成绩表

where 成绩>85)

或连接(多表)查询

select 姓名from学生信息,成绩表

where 学生信息.学号=成绩表.学号and

成绩>85

②查询平均成绩大于的课程信息。

select *from课程信息

where 课程编号in(

select 课程编号from成绩表

group by课程编号

having avg(成绩)>70)

③查询出最高成绩(比任意学生成绩都高)的学生的学号信息

select *from学生信息

where 学号in(

select 学号from成绩表

where 成绩>=all(select成绩from 成绩表))

④查询出不是最低成绩的学生的学号信息

select *from学生信息

where 学号in(

select 学号from成绩表

where 成绩>=any(select成绩from 成绩表))

(6)集合查询

①“人事管理系统”数据库的“员工信息”表中,查询“所任职位”为“经理”的员工编号和员工姓名信息,并为其增加新列“所在位置”,列的内容为“员工信息表”;从“部门信息”表中查询所有的部门编号和部门名称信息,并定义新增列的内容为“部门信息表”;最后将两个查询结果联合在一起。

select 员工编号,员工姓名,'员工信息表' as所在位置 from 员工信息

where 所任职位='经理'

union

select 部门编号,部门名称,'部门信息表'

from 部门信息

(7)关于查询的其他操作

①创建一个学生补考表,表中数据来自成绩表,条件为成绩小于60分,要求补考表中仅显示学生的学号和补考课程的编号。

select 学号,课程编号

into 补考表

from 成绩表

where 成绩<60

②创建新表:及格成绩表(学号,课程号,成绩),并将选课表中所有及格成绩的记录插入到新表中

select 学生信息.学号,课程编号,成绩

into 及格表

from 学生信息,成绩表

where 学生信息.学号=成绩表.学号and

成绩>=60

 

posted @ 2013-04-28 20:00  javawebsoa  Views(484)  Comments(0Edit  收藏  举报