一、数据插入
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 ) percent from 员工信息
③在“人事管理系统”数据库中,删除“新员工信息”表中的所有记录
truncate table 新员工信息
或 delete from 新员工信息
④将学生“陈霞”所在班级的其他学生并且成绩不合格的学生成绩删除
delete 成绩表
where 成绩 < 60 and 学号 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 学生信息 a left outer join 成绩表 b on a . 学号 = b . 学号
方法二:右外连接
select a . 学号 , a . 姓名 , b . 课程编号 , b . 成绩
from 学生信息 a right outer join 成绩表 b on a . 学号 = b . 学号
方法三:全外连接
select a . 学号 , a . 姓名 , b . 课程编号 , b . 成绩
from 学生信息 a full outer join 成绩表 b on a . 学号 = 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