文管二级Acce数据库SQL语句详解由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“access数据库sql语言”。
第一讲
上面是Acce数据库中所涉及的两个表
下面我们介绍Acce数据库中用于查询数据的语句:
1、SELECT 语句
SELECT语句是数据库中使用频率最高的语句,就是我们通常说的查询语句。
其格式如下:
SELECT+需要查询的对象+FROM+表名+WHERE+条件。
例
1、查询上表中所有男性职工的“工号”“姓名”“部门”和“应发工资”。SELECT 工号,姓名,部门,应发工资 FROM rsda where 性别=”男”
注意事项:
1):写查询语句时英文部分不区分字母大小写。
2):除汉字外,所有字符标点和数字都必须使用半角英文状态下输入。
3):SELECT查询语句中如果没有条件限制,“WHERE+条件”部分可以省略。
4):需要查询的项目在表中必须存在。
5):如果要输出表中所有项目可以用“*”代替。
例如:查询上表中所有人员的姓名,出生年月及部门
SELECT 姓名,出生年月,部门 FROM rsda;
显示表中的所有信息
Select * from rsda;显示表中所有女性职工的信息 Select * from rsda where 性别=”女”;
要求:查询表中所有“未婚”男性职工的信息。
Select * from rsda where(性别=”男”)and(婚否=no);有两个知识点需要掌握:
1):运算符:
A、算术运算符:加(+)、减(-)、乘(*)、除(/)、和取模(%)。算术运算符可以完成对两个表达式的数学运算。
B:赋值运算符:等号(=)
C:比较运算符:等于(=)、大于(>)、大于或等于(>=)、小于(或!=)、不小于(!).D:逻辑运算符:与(and)、或(or)和非(not)。对于AND运算,只有当运算符两端的表达式的值都为真时,结果才返回真,只要有一股表达式的值为假,结果就是假;对于or运算,只要运算符两端的表达式的值有一个位真,结果就返回真,只有两个表达式的值都是假,结果才为假;NOT运算是对表达式的值取反。
2):数据类型:文本、备注、数字、日期/时间、货币、自动编号、是/否、超链接等。本例中“婚否”选项,使用的是“是/否”类型,即我们常说的布尔型,判断的时候“是”用yes表示,“否”用no表示。
Select语句中各个参数:
1)、top 如:查询前3条记录的工号,姓名,性别 Select top 3 工号,姓名,性别 from rsda;显示的结果是前3条记录。
查询数据表中前50%人员的信息
Select top 50 percent * from rsda;显示的结果是表中前50%人员的信息 2):DISTINCT
如:查询所有记录的“性别”字段,并去掉重复值 Select distinct 性别 from rsda;3):别名
如:查询所有记录的工号(别名为number)、姓名(别名为name)、出生年月(别名为birthday)字段
Select number=工号,姓名 as name ,出生年月 birthday from rsda;需要注意的是,在ACCESS中使用 “列名 AS 列别名”形式。4):年龄
如:查询表中每个人的年龄。
Select 姓名,(year(now())-year(出生年月))as 年龄 from rsda;now()函数返回当前日期,year()获取年份。其他函数有abs(绝对值)、left(从左侧截取字符串)、right(从右侧截取字符串)、len(获取字符串的长度)、ltrim和rtrim(去掉字符串前面或后面的空格)、day(返回日期)、month(返回月份)、year(返回年份)、weekday(返回星期)、hour(返回小时)、date(返回系统日期)、sum(求和)、avg(求平均值)、count(统计个数)、max(求最大值)、min(求最小值)等等。
如:显示表中应发工资的最大值
Select max(应发工资)as 工资 from rsda; 如:查询表中各人员工号的前两位
Select left(工号,2)as 工号前两位 from rsda; 如:统计所有男性职工的人数
Select count(*)from rsda where 性别=”男”
如:显示表中应发工资最高的人员信息
select * from rsda where 应发工资>=(select max(应发工资)from rsda);上面是个嵌套查询语句
2、into语句
如:创建一个新表rrr来显示上表中前五名人员的信息。
Select top 5 * into rrr from rsda;
第二讲
一、from语句
from子句用于指定要查询的表。
例如:查询表rsda表和kcm表中的数据。
SELECT rsda.编号,rsda.工号,姓名,性别,出生年月,kcm.课程名 from rsda,kcm where rsda.工号=kcm.工号
注意:本例子是关于表间查询的。表中有共同列的项目必须标注表名,格式为“表名”+“.”+“列号”。当两个或多个数据表中有共同名称的字段时必须使用上面的格式,否则由于系统不清楚应该使用哪个数据表中的同名字段,将无法执行此查询,会提示错误。上面例子也可以使用联合查询形式完成,程序如下:
SELECT rsda.编号,rsda.工号,姓名,性别,出生年月,kcm.课程名 from rsda inner join kcm on rsda.工号=kcm.工号
练习:显示担任“计算机文化基础”教学人员的工号,姓名,性别,婚否,基本工资及部门。
二、where语句
where子句是条件子句,用来限定查询的内容。在where语句中是允许使用比较运算符如下:
等于、大于、大于等于、小于、小于等于、不等于、不大于、不小于、不等于。例如:查询rsda表中应发工资小于1500的人员信息。
SELECT * from rsda where 应发工资
逻辑反、逻辑与、逻辑或。
例如:查询年龄小于39岁未婚男士的部门信息
SELECT 姓名,部门 from rsda where(year(now())-year(出生年月)
三、between关键字
例如:查询表rsda中应发工资在1000到1500之间的人员信息 SELECT * from rsda where 应发工资 between 1000 and 1500 练习:显示表中基本工资在800到1200之间人员的姓名,部门及基本工资。
四、in 关键字
使用in关键字可以确定给定的值是否与子查询或列表中的值相匹配。例如:显示教务处、学生处和总务处已婚男士人员的补贴信息
SELECT 姓名,补贴 from rsda where(性别=“男”)and(婚否=-1)and(部门 in(“教务处”,“学生处”,“总务处”))练习:查询表中总务处和基础部未婚女性职工的人数。
五、like关键字
使用like关键字可以确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。通过模式的匹配,达到模糊查询的效果。
例如:查询表中张姓人员的工号,姓名,性别,部门及出生年月
SELECT 工号,姓名,性别,部门,出生年月 from rsda where 姓名 like “张*”
练习:查询工号以11开头的所有人员信息。
六、group by语句
在group by语句中在选择列表内定义的列的别名不能用于指定分组列,此外,select后面的每一列数据除了出现在统计函数中的列外,都必须在group by子句中应用。例如:在表rsda表中按性别进行分组,查询相应的人数。
SELECT 性别,count(性别)as 人数 from rsda group by 性别 练习:统计已婚和未婚的人数,并按婚否进行分组。
七、having语句
having语句为分组或集合指定搜索条件,通常与group by语句一起使用,说明:当having 与group by all一起使用时,having 语句替代了all。在having语句中不能使用text,image,ntext数据类型。
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中出现的任意项。例如:在表中查询部门中有两个以上人员的部门信息
SELECT 部门,count(部门)as 部门人数 from rsda group by 部门 having count(部门)>=2 练习:显示表中有两个以上补贴相同的人员信息。
八、order by语句
order by语句用于指定对查询结果排序。如果在select中同时指定了top,则order by语句无效。在排序过程中ASC表示按递增顺序排列,即从最低值到最高值对指定列中的值进行排序。是系统默认的排列方式,书写语句时可省略。DESC表示按递减顺序排列,即从最高值到最低值对指定列中的值进行排序。需要注意的是,空值被视为最低值。例如:显示表中基本工资为1000的人员信息,并按工号降序排列。SELECT * from rsda where 基本工资=1000 order by 工号 desc;练习:查询补贴为500的工号,姓名,部门,并按工号升序排列。
九、联合查询。
联合查询是指将两个或两个以上的select语句通过union运算符连接起来的查询,联合查询可以将两个或者更多查询的结果组合为单个结果集,该结果集包含联合查询中所有查询的全部行。
使用union组合两个查询的结果集的两个基本规则是:
1、所有查询中的列数和列是顺序必须相同。
2、数据类型必须兼容。
十、嵌套查询
嵌套查询主要用于复杂的查询。在SQL语言中,一个select---from---where语句称为一个查询块,将一个查询块嵌套在另外一个查询块的where子句或having短语的条件中的查询称为嵌套查询。
嵌套查询中上层查询块称为外层查询或父查询,下层查询块称为内查询或子查询。SQL语言允许多层查询嵌套,但是在子查询中不允许出现order by语句,order by语句只能用在最外层的查询块中。
嵌套查询一般按照由里向外的方法处理,即先处理最内层的子查询,然后处理一层一层的向上处理,直到最外层查询块。
在某些嵌套查询中where之后还可以使用any和all两个关键字。Any表示子查询结果中的某个值,而all表示子查询结果中的所有值。这两个关键字可以和算术运算符在一
起构成各种查询条件,如>all表示大于子查询中的所有值。
例如:查询所授两门以上科目的人员基本信息。
SELECT * from rsda where 工号=any(select 工号 from kcm group by 工号 having count(工号)>=2)练习:显示表中应发工资最高的人员信息
十一、插入函数
Insert语句用于向数据库表或者视图中加入一行数据。
例如:向表rsda中插入一行数据,只包含工号,姓名,婚否。insert into rsda(工号,姓名,婚否)values(“12039”,“王五”,“-1”)例如:向rsda表中插入一行数据,所有字段都要给出相应的值。
insert into rsda
values(“13”,“12049”,“赵六”,“男”,“1999-12-12”,“-1”,“学生处”,“2000”,“850”,“60”,“2790”,“”)
例如:向表rsda中插入一批数据,数据来源于另外一个已有的数据表rsda1.Insert into rsda(工号,姓名,性别,出生年月)select工号,姓名,性别,出生年月from rsda1;如果所追加的表不存在请用下面的格式:
Select+所要添加的项目+into+新表名+from+需要查询的表名+where+条件
例如:要求将所有男性职工的记录追加到名为“追加表”的表中,只需要其中的4个字段:姓名、性别、工资、补贴。
SELECT 工号,姓名,性别,部门 into 追加表 from rsda where 性别=“男”
十二、更新数据
Update语句用于修改数据库表中特定记录或者字段的数据。
例如:修改刘龙强的工号为11027,出生年月为1978年1月3日。update rsda set 工号=“11027”,出生年月=“1978-1-3” where 姓名=“刘龙强” 练习:更新工号为12009的员工教师课程为“数据库” 例如:更新表rsda中所有人员为已婚。update rsda set 婚否=-1;
十三、delete语句
Delete语句用于删除数据库表中的数据。
例如:删除表中张三的所有信息。delete from rsda where 姓名=“张三” 当不指定条件时,将删除表中的所有行数据。要清除表中的所有数据,只留下数据表的定义还可以使用truncate语句。与delete语句相比,通常truncate执行速度快,因为它是不记录日志的删除表中全部数据的操作。
如:delete from rsda
Truncate table rsda Truncate table 表名 速度快,而且效率高,因为:
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
DROP TABLE table_name 表示删除表的全部信息。
表所有者可以除去任何数据库内的表。除去表时,表上的规则或默认值将解除绑定,任何与表关联的约束或触发器将自动除去。如果重新创建表,必须重新绑定适当的规则和默认值,重新创建任何触发器并添加必要的约束。如果删除表内的所有行(DELETE tablename)或使用 TRUNCATE TABLE 语句,则表将一直存在到被除去。
课后练习:
1.要求:列出rsda数据表中部门为“教务处”的女性职工的工号,姓名,性别和部门。Select 工号,姓名,性别,部门 from rsda where(部门=”教务处”)and(性别=”女”)2.显示基本工资的最小值和最大值,并将结果分别赋给变量minjbgz、maxjbgz。Select min(基本工资)as minjbgz,max(基本工资)as maxjbgz from rsda 显示“基础部”每位老师所讲授的所有课程名。Select 姓名,课程名 from rsda,kcm where(rsda.工号=kcm.工号)and(部门=”基础部”)显示所有姓张的人员信息。Select * from rsda where 姓名 like “张*” 物理删除rsda数据表中部门为“基础部”的所有男性职工的记录。Delete from rsda where(部门=”基础部”)and(性别=”男”)统计每位教师讲授的课程数目。SELECT 姓名,count(课程名)as 课程数目 from rsda,kcm where rsda.工号=kcm.工号 group by 姓名
列出rsda数据表中部门为“总务处”和“学生处”的所有男性职工的信息。Select * from rsda where(部门 in(“总务处”,”学生处”))and(性别=”男”)按照“出生年月”升序形式显示所有人员的信息。Select * from rsda order by 出生年月
计算补贴的平均值、公积金的平均值,并将结果分别赋给变量rjbt、rjgjj。Select avg(补贴)as rjbt,avg(公积金)as rjgjj from rsda
10.11.显示讲课教师中年龄最大的教师的姓名和性别。Select 姓名,性别 from rsda,kcm where 出生年月=any(select max(出生年月)from rsda)列出rsda数据表中部门为“基础部”的男性职工的工号,姓名,性别和部门。Select 工号,姓名,性别,部门 from rsda where(部门=”基础部”)and(性别=”男”)按照“基本工资”降序形式显示所有人员的信息。Select * from rsda order by 基本工资 desc 13.14.统计男教工中基本工资超过1000元的人数,并将结果赋给变量num。select count(基本工资)as num from where(基本工资>1000)and(性别=”男”)统计讲授“计算机文化基础实验”课程的教师中“补贴”一项的最高值,并将结果赋给变量A57(或者新字段A57)。Select max(补贴)as A57 from 3.4.5.6.7.8.9.12.rsda,kcm where(rsda.工号=kcm.工号)and(课程名=”计算机文化基础实验”).15.要求:显示所有本年度已经过完生日(不含当日)的人员信息。Select * from rsda where(month(date())>month(出生年月))or((month(date())=month(出生年月))and(day(date())>day(出生年月)))要求:为部门是“总务处”的职工每人增加15%的补贴(补贴=补贴*1.15)。update rsda set 补贴=补贴*1.15 where 部门=”总务处” 计算部门为“基础部”、补贴不足300元的人员的基本工资的平均值。Select avg(基本工资)from rsda where(部门=”基础部”)and(补贴
统计30岁(不含30岁)以上的老师各自讲授的课程数目。SELECT 姓名,COUNT(课程名)as 课程数目 FROM kcm INNER JOIN rsda ON Kcm.工号 = Rsda.工号 WHERE(year(date())-year(出生年月))>= 30 GROUP BY 姓名
或者SELECT 姓名,COUNT(课程名)as 课程数目 FROM rsda, kcm
where((year(date())-year(出生年月))>= 30)and(Kcm.工号 = Rsda.工号)GROUP BY 姓名
16.17.18.第三讲 SQL语句的格式总结
一、Select语句
SELECT+需要查询的对象+FROM+表名+WHERE+条件。
Select语句中的参数:
1.Top 显示结果的前几条记录
select+Top+数字+from+表名+WHERE+条件。
显示结果的前百分之几的记录
select+Top+数字+percent+from+表名+WHERE+条件。
2.Distinct 在显示的结果中去掉重复值
3.As 给相应的列名赋予一个新的名字,或者给相应的字段创建一个新名字。
select+原列名+as+新列名+from+表名+WHERE+条件。
函数计算的结果+as+新名称(如:max(基本工资)as 最大工资)
4.函数的使用
1)Now()返回当前的系统时间,包含年、月、日、时、分、秒 2)Date()返回当前系统日期,包含年、月、日 3)Abs(参数)取数值的绝对值
4)Left(列名+,+数字)从左侧截取相应长度的字符串(如:left
(工号,2)=11(工号 like “11*”)
显示工号的前两位字符)
5)right(列名+,+数字)从右侧截取相应长度的字符串(如:right(工号,2)
显示工号的后两位字符)
6)len(列名)返回满足条件的列中字符串的长度(如:len(工号))显示工号有几个字符组成7)day(日期)返回日期中的天(如:day(date())显示当前系统的日)
8)month(日期)返回日期中的月(如:month(date())显示当前系统的月)
9)year(日期)返回日期中的年(如:year(出身年月)显示出生的年份)
10)sum(列名)对列中满足条件的记录进行求和(如:sum(基本工资)统计满足条件的基本工资的总和)
11)avg(列名)对列中满足条件的记录求平均值(如:avg(应发工资)统计满足条件的应发工资的平均值)
12)count(列名)统计个数(如count(课程名)统计满足条件的课程数目)有时候要和group by 及having 一起使用。
13)Max(参数)求满足条件的最大值(如:max(应发工资)显示应发工资的最大值)
14)Min(参数)求满足条件的最小值(如:min(应发工资)显示应发工资的最大值)
5.Into 把数据追加到一个表中,如果没有相应的表,系统会自动创建一个满足条件的表。
在多表之间查询的时候一定要在表中有共同列名的前面加上”表名+.”。格式为“表名”+“.”+“列名”。如果表中独有的列,前面可以不加表名。隐含的条件是必须共同列中的数据相同(如:rsda.工号=kcm.工号)。
在条件中不能直接使用函数。(如:where 基本工资>=max(基本工资))
在条件语句中需要判断多个条件时必须使用逻辑表达式(如:()and())
6.Between关键字
满足条件的某区间的内容
Between+数值1+and+数值2 7.In关键字
使用in关键字可以确定给定的值是否与子查询或列表中的值相匹配。
列名+in+(参数1,参数2…..)
8.Like关键字
使用like关键字可以确定给定的字符串是否与指定的模式匹配。
列名+like+”参数”
如:工号 like “12*”
9.Group by
对查询的列表中对相应主键(列)进行分组。在group by语句中在选择列表内定义的列的别名不能用于指定分组列,此外,select后面的每一列数据除了出现在统计函数中的列外,都必须在group by子句中应用。Group +by+列名
SELECT 姓名,count(课程名)as 人数 from rsda,kcm where rsda.工号=kcm.工号
group by 姓名
10.Having having语句为分组或集合指定搜索条件,通常与group by语句一起使用
SELECT 部门,count(部门)as 部门人数 from rsda group by 部门 having count(部门)>=2
11.Order by order by语句用于指定对查询最终结果进行排序。DESC表示按递减顺序排列,ASC表示按递增顺序排列。
SELECT * from rsda where 基本工资=1000 order by 工号 desc;
二、Insert
Insert语句用于向数据库已有表中追加一行或者多行。Insert+into+表名+(列名1,列名2,列名3…„)+values+(“数据1”,”数据2”,”数据3”…„)Insert+into+表名+values+(所有字段的相应值)Insert+into+表名+(列名1,列名2,列名3…„)+select+列名1,列名2,列名3…..+from+表名+where+条件
如果所追加的表不存在,请用下面的格式:
Select+所要添加的项目+into+新表名+from+需要查询的表名+where+条件
三、Update Update语句用于修改数据库表中特定记录或者字段的数据.Update+表名+set+(列名=”数据”, 列名=”数据”……)+where+条件
四、Delete
Delete+from+表名+where+条件
五、Drop 删除表 Drop+ table+表名
课后习题:
1.要求:显示公积金的最小值和最大值,并将结果分别赋给变量mingjj、maxgjj。Select min(公积金)as mingjj,max(公积金)as maxgjj from rsda 2.要求:显示女教师讲授的所有课程名。Select 姓名,课程名 from rsda,kcm where(rsda.工号=kcm.工号)and(性别=”女”)3.要求:彻底删除kcm数据表中工号为12006的人员。Delect from kcm where 工号=”12006”
4.要求:统计讲授“程序设计”课程的老师的基本工资的平均值,并将结果赋给变量A54(或者新字段A54)。Select avg(基本工资)as A54 from rsda,kcm where(rsda.工号=kcm.工号)and(课程名=”程序设计”)5.要求:计算教务处人员的基本工资的平均值和最大值。Select avg(基本工资)as 平均值,max(基本工资)as 最大值 where 部门=”教务处”
6.要求:显示30岁(含30岁)以下的人员的所有信息。Select * from rsda where(year(date())-year(出生年月))
10.要求:物理删除rsda数据表中部门为“教务处”的所有女性职工的记录。Delete from rsda
where(部门=”教务处”)and(性别=”女”)11.要求:按照“应发工资”升序形式显示所有人员的信息。Select * from rsda order by 应发工资 asc 12.要求:列出rsda数据表中应发工资大于1500元的男性职工的工号、姓名、性别、部门和应发工资。Select 工号,姓名,性别,部门,应发工资 from rsda(应发工资>1500)and(性别=”男”)13.要求:按照rsda数据表中“部门”升序生成一个名为“人事表1”的新表,其中包含4个字段:工号、姓名、性别和部门。Select 工号,姓名,性别,部门 into 人事表1 from rsda order by 部门 asc 14.要求:显示讲课教师中年龄最小的教师的姓名和性别。select 姓名,性别 from rsda where(Year([出生年月]))=any(SELECT Max(Year(出生年月))FROM rsda, kcm where rsda.工号 = kcm.工号)and((month([出生年月]))=any(SELECT max(month(出生年月))FROM rsda, kcm where rsda.工号 = kcm.工号))and((day([出生年月]))=any(SELECT max(day(出生年月))FROM rsda , kcm where rsda.工号 = kcm.工号))15.要求:物理删除rsda数据表中1985年以前(不含1985年)出生的部门为“教务处”的职工记录。Delete from rsda where(year(出生年月)
21.要求:显示讲授“英语阅读”课程的每位老师的姓名、年龄。Select 姓名,(year(date())-year(出生年月))as 年龄 from rsda,kcm where(rsda.工号=kcm.工号)and(课程名=”英语阅读”)22.要求:统计rsda数据表中部门为“基础部”的女性职工的基本工资的平均值,并将结果赋给变量A53(或者新字段A53)。Select avg(基本工资)as A53 from rsda where(部门=”基础部”)and(性别=”女”)23.要求:统计男性职工中基本工资超过1500元的人数,并将结果赋给变量A55(或者新字段A55)。Select 基本工资,count(*)as A55 from rsda where(性别=”男”)and(基本工资>1500)24.要求:列出rsda数据表中工号前2位等于“10”的男性职工的信息。Select * from rsda where 工号 like “10*”;或者是Select * from rsda where left(工号,2)=10;25.要求:为rsda数据表中部门是“教务处”的人员每人增加25%的补贴(补贴=补贴*1.35)。update rsda set 补贴=补贴*1.35 where 部门=”教务处”