在VFP里玩SQL查询

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VFP里玩SQL查询相关的知识,希望对你有一定的参考价值。

文章目录

一、SQL概述

  • SQL:Structured Query Language,结构化查询语言。包含DDL(数据定义语言)、DML(数据操纵语言)、DCL(数据控制语言,VFP不支持)。利用SQL可以创建表、修改表结构、以及对表记录进行各种操作(增、删、改、查)。

二、利用SQL创建表

(一)任务:创建职工表

create table 职工表(职工号 C(4), 姓名 C(8), 性别 C(2), 出生年月 D, 职称 C(6), 基本工资 N(6,1))

(二)任务:创建student表,设置学号为主键


  • SQL Server支持SQL建表时设置联合主键
  • VFP支持SQL建表时设置联合主键,但是写法有点不同
  • 实战练习:操作题真考题库第20套题基本操作题

三、利用SQL修改表结构

(一)添加字段

1、命令格式

alter table <表文件名>;
      add <字段名> 类型(宽度)

2、案例演示

  • 任务:给职工表添加字段【津贴】,数值型,三位

(二)修改字段

1、命令格式

alter table <表文件名>;
      alter column <字段名> 类型(宽度)

2、案例演示

  • 任务:将职工表的津贴字段修改成数值型四位。

(三)删除字段

1、命令格式

alter table <表文件名>;
      drop column <字段名>

2、案例演示

  • 任务:将职工表的津贴字段删除掉。

(四)设置字段有效性规则

1、命令格式

alter table <表文件名>;
      alter column <字段名> set check <有效性规则> error <出错信息>

2、案例演示

  • 任务:给学生表的性别字段设置有效性规则:性别$“男女”,出错信息为“性别只能为男或女”。
alter table 学生表;
   alter column 性别 set check 性别$"男女" error "性别只能为男或女"

(五)设置字段默认值

1、命令格式

alter table <表文件名>;
      alter column <字段名> set default <默认值>

2、案例演示

  • 任务:给学生表的性别字段设置默认值:男。
alter table 学生表;
   alter column 性别 set default "男"

(六)给字段建立索引

1、命令格式

alter table <表文件名>;
      add <primary key|candidate|unique> <索引表达式> tag <索引名>

2、案例演示

  • 任务:给学生表的学号建立主索引,索引名为“学号”。
alter table 学生表;
      add primary key 学号 tag 学号

  • 任务:给学生表的学号建立候选索引,索引名为“学号”。
alter table 学生表;
      add unique 学号 tag 学号

  • 说明:unique替换成candidate也是一样的效果。

四、利用SQL修改表记录

(一)添加记录

1、命令格式

格式1insert into <表文件名> (字段列表) values (值列表)
格式2insert into <表文件名> from array <二维数组名>

2、案例演示

  • 任务:给职工表添加三条记录。
insert into 职工表 (职工号,姓名,性别,出生年月,职称,基本工资);
     values ("0001","张晓光","男",^1985/12/12,"工程师",4000)
insert into 职工表 values ("0002","李欣悦","女",^1986/2/16,"技师",3500)
insert into 职工表 values ("0003","郑智化","男",^1989/11/06,"高工",5500)

  • 任务:给职工表添加记录——004 吴红丽 女

  • 注意:字段列表与值列表要一一对应,并且类型要匹配。数值型常量无需定界符,而字符型、日期型与逻辑型常量都需要定界符。

  • 演示:如果将二维数组的数据插入到数据表里。

(二)更新记录

1、命令格式

update <表文件名> set 字段名1 = 表达式1, 字段名2 = 表达式2,……, 字段名n = 表达式n [条件子句]
  • 说明:如果没有条件子句,那么就对全部记录进行更新操作。

2、案例演示

  • 任务:将职工表第四条记录的出生年月改为^1975/2/14,职称改成高工,基本工资改为5500。
  • 课堂练习:将职工表男职工的基本工资上涨20%,女职工的基本工资上涨10%。

(三)删除记录

1、命令格式

delete from <表文件名> [条件子句]
  • 说明:如果没有条件子句,那么是删除全部记录

3、案例演示

  • 任务:删除职工表里的女职工。
  • 只是逻辑删除,打了删除标记,真要物理删除,还得发布pack命令

五、利用SQL查询表记录(包含排序、汇总)

(一)SQL查询命令格式

select [distinct|top n]<字段或表达式列表|*>;         && 字段子句——投影运算(对应VFP的fields子句)
     from <单张表或多张表>;                          && 查询的数据源(对应VFP的use命令)
     where <逻辑表达式>;                             && 条件子句——选择运算(对应VFP的for子句)
     order by <字段列表>;                            && 排序子句(asc:升序;desc:降序)(对应VFP的index命令)
     group by <字段>;                                && 分组子句
     having <逻辑表达式>;                            && 组内条件
     into table <表文件名>                           && 目标子句

(二)简要说明

  1. 关键字distinct用于去掉重复记录
  2. top n 或 top n percent 一定要配合order by子句
  3. 数据源可以是数据表,也可以是视图(虚拟表)
  4. 关联可以通过where子句实现,也可以通过关键字join来实现
  5. order by子句可以接多个排序字段
  6. 目标子句有四种情况
  • into table <表文件名>
  • into cursor <临时表文件名>
  • into array <二维数组名>
  • to file <文本文件名>

  • 我们主要是针对学生表、选课表与课程表进行操作。

(三)案例演示

1、单表查询

  • 任务:查询学生表全部记录,包含所有字段信息。

  • 任务:查询女生记录,包含姓名、性别与入校总分字段。

  • 在where子句的逻辑表达式里,除了以前我们学过的关系运算符(=、>、<、>=、<=、!=),但还有几个特有的关系运算符,比如between…and…、in、like。

  • 任务:查询入校总分在500与570之间的记录。

  • 任务:查询入校总分为550、565、570的记录。

  • 任务:查询姓张的学生记录。

  • 说明:单等号实现的是模糊查询,使用双等号就可以实现精确查询

  • 任务:查询姓张的单名学生记录。

  • 如果要查询姓张的双名学生记录:姓名 like “张__”(要有两个下划线)。

  • 任务:查询全部学生记录,按入校总分降序排列。

  • 任务:先按性别升序排列,性别相同的再按入校总分降序排列。

  • 任务:按年龄降序排列。

select *, year(date())-year(出生年月) as 年龄;
  from 学生表;
  order by 年龄 desc
select *, year(date())-year(出生年月) as 年龄;
  from 学生表;
  order by 9 desc
  • 为什么是9呢?因为*表示前面有八个字段,年龄字段是第9个字段。

  • 任务:显示入校总分前三名的学生记录。

  • 任务:显示选了课的学生的学号。

  • 如果要对记录进行汇总,我们会用到五个聚合函数:count(*)、sum(数值型字段)、avg(数值型字段)、max(数值型字段)、min(数值型字段)。

  • 任务:统计学生人数、入校总分的总和、平均值、最高分、最低分。

  • 说明:查询结果的标题可以根据需要设置的。

  • 任务:统计男生的人数、入校总分的总和、平均值、最高分、最低分。

  • 任务:按性别分组统计人数、入校总分的总和、平均值、最高分与最低分。

  • 任务:显示每个学生选课门数以及平均分。

  • 任务:显示选课门数两门以上且平均分在80分以上的学号、选课门数、平均分。

2、嵌套查询

  • 嵌套查询:查询的结果作为另一个查询的条件的一部分,前一个查询叫做后一个查询的子查询

  • 任务:查询入校总分超过入校总分平均分的记录。

  • 任务:查询实发工资在800元以上的职工记录,显示姓名、性别与职称字段。

  • 思考题:查询同时选修了c120和c140课程的学号、课程号、成绩。

  • 任务:查询学生记录,要求入校总分大于或等于1983年以后出生的所有学生的入校总分。

  • 任务:查询学生记录,要求入校总分大于或等于1983年以后出生的任何一个学生的入校总分。

  • 任务:查询选修的每门课程成绩在85以上的学生信息,包含学号、姓名、性别字段。

  • 问题:有同学问,为什么不能写成如下形式?

  • 上述语句查询的是有一门课程成绩大于或等于85的学生记录。

  • 大家可以看到,用这种方式查询,凡是有一门课程成绩在85以上的学生都被查询出来了,显然不符合题目要求。

3、关联查询

(1)利用where子句实现关联查询

  • 任务:查询职工的信息,包含职工号、姓名、性别、职称、实发工资。
  • 分析:职工号、姓名与性别来自职工表,而实发工资来自工资表,两张表要进行公共字段等值连接。
  • 任务:查询男职工的信息,包含职工号、姓名、性别、职称、实发工资。
  • 任务:显示学生成绩情况,包含学号、姓名、课程名与成绩。


  • 我们希望把选课表里的学号替换成姓名,课程号替换成课程名。
  • 任务:查询郭晨光的选课情况,包含学号、姓名、课程名与成绩。
  • 任务:显示全部学生选修课程的平均分。
  • 任务:查询平均分在80分以上的学生记录,包含学号、姓名、平均分。

(2)利用join关键字实现关联查询

  • join有四种连接:inner join、left outer join、right outer join、full join

  • 任务:查询职工的信息,包含职工号、姓名、性别、职称、实发工资。

  • 任务:查询男职工的信息,包含职工号、姓名、性别、职称、实发工资。

  • 任务:显示学生成绩情况,包含学号、姓名、课程名与成绩。


六、SQL查询选择题实战

1、为“歌手”表增加一个字段“最后得分”的SQL语句是()。
A、ALTER TABLE 歌手 ADD 最后得分 F(6,2)
B、ALTER DBF 歌手 ADD 最后得分 F 6,2
C、CHANGE TABLE 歌手 ADD 最后得分 F(6,2)
D、CHANGE TABLE 歌手 INSERT 最后得分 F 6,2)

2、在数据库中创建表的CREATE TABLE命令中定义主索引,实现实体完整性规则的是()。
A、FOREIGN KEY
B、DEFAULT
C、PRIMARY KEY
D、CHECK

3、在SQL SELECT语句中为了将查询结果存储到临时表应该使用短语(  )。
A、TO CURSOR
B、INTO CURSOR
C、INTO DBF
D、TO DBF

4、设有学生选课表SC(学号,课程号,成绩),用SQL命令检索同时选修了课程号为"C1"和"C5"课程的学生的学号的正确命令是(  )。
A、SELECT 学号 FROM SC WHERE 课程号= ‘C1’ AND 课程号= ‘C5’
B、SELECT 学号 FROM SC WHERE 课程号=’C1’ AND 课程号=(SELECT课程号 FROM SC WHERE课程号= ‘C5’)
C、SELECT 学号 FROM SC WHERE 课程号=’C1’ AND 学号=(SELECT 学号 FROM SC WHERE课程号= ‘C5’)
D、SELECT 学号 FROM SC WHERE 课程号=’C1’ AND 学号 IN (SELECT 学号 FROM SC WHERE课程号= ‘C5’)

5、设有学生表S(学号,姓名,性别,年龄)、课程表C(课程号,课程名,学分)和学生选课表SC(学号,课程号,成绩),检索学号、姓名和学生所选课程的课程名和成绩,正确的SQL命令是(  )。
A、SELECT 学号,姓名,课程名,成绩 FROM S,SC,C WHERE S.学号 = SC.学号AND SC.学号= C.学号
B、SELECT 学号,姓名,课程名,成绩 FROM (S JOIN SC ON S.学号= SC.学号)JOIN C ON SC.课程号 = C.课程号
C、SELECT S.学号,姓名,课程名,成绩 FROM S JOIN SC JOIN C ON S.学号= SC.学号ON SC.课程号 = C.课程号
D、SELECT S.学号,姓名,课程名,成绩 FROM S JOIN SC JOIN C ON SC.课程号 = C.课程号 ON S.学号= SC.学号

6、以下有关SELECT短语的叙述中错误的是(  )。
A、SELECT短语中可以使用别名
B、SELECT短语中只能包含表中的列及其构成的表达式
C、SELECT短语规定了结果集中列的顺序
D、如果FROM短语引用的两个表有同名的列,则SELECT短语引用它们时必须使用表名前缀加以限定

7、与"SELECT * FROM 学生 INTO DBF A"等价的语句是(  )。
A、SELECT * FROM 学生 INTO A
B、SELECT * FROM 学生 INTO TABLE A
C、SELECT * FROM 学生 TO TABLE A
D、SELECT * FROM 学生 TO DBF A

8、为"评分"表的"分数"字段添加有效性规则:“分数必须大于等于0并且小于等于10”,正确的SQL语句是(  )。
A、CHANGE TABLE 评分ALTER 分数 SET CHECK 分数>=0 AND 分数<=10
B、ALTER TABLE 评分 ALTER 分数 SET CHECK 分数>=0 AND 分数<=10
C、ALTER TABLE 评分 ALTER 分数 CHECK 分数>=0 AND 分数<=10
D、CHANGE TABLE 评分 ALTER 分数 SET CHECK 分数>=0 OR 分数<=10

9、设有关系歌手(歌手号,姓名),根据"歌手"关系建立视图myview,视图中含有包括了"歌手号"左边第一位是"1"的所有记录,正确的SQL语句是(  )。
A、CREATE VIEW myview AS SELECT * FROM 歌手 WHERE LEFT(歌手号,1)="1"
B、CREATE VIEW myview AS SELECT * FROM 歌手 WHERE LIKE(“1”,歌手号)
C、CREATE VIEW myview SELECT * FROM 歌手 WHERE LEFT(歌手号,1)="1"
D、CREATE VIEW myview SELECT * FROM 歌手 WHERE LIKE(“1”,歌手号)

10、在SQL SELECT查询中,为了使查询结果排序必须使用短语(  )。
A、ASC
B、DESC
C、GROUP BY
D、ORDER BY

11、查询单价在600元以上的主机板和硬盘的正确SQL命令是(  )。
A、SELECT * FROM 产品 WHERE 单价>600 AND (名称=′主机板′ AND 名称=′硬盘′)
B、SELECT * FROM 产品 WHERE 单价>600 AND (名称=′主机板′ OR 名称=′硬盘′)
C、SELECT * FROM 产品 FOR 单价>600 AND (名称=′主机板′ AND 名称=′硬盘′)
D、SELECT * FROM 产品 FOR 单价>600 AND (名称=′主机板′ OR 名称=′硬盘′)

12、在SQL的ALTER TABLE语句中,为了增加一个新的字段应该使用短语(  )。
A、CREATE B、APPEND C、COLUMN D、ADD

13、插入一条记录到表结构为(职工号,姓名,工资)的表Employee中,正确的SQL命令是()。
A、INSERT TO Employee VALUES(“19620426”, “李平”,8000)
B、INSERT INTO Employee VALUES(“19620426”, “李平”,8000)
C、INSERT INTO Employee RECORD(“19620426”, “李平”,8000)
D、INSERT TO Employee RECORD(“19620426”, “李平”,8000)

14、将表结构为(职工号,姓名,工资)的表Employee中所有职工的工资增加20%,正确的SQL命令是()。
A、CHANGE Employee SET 工资=工资1.2
B、CHANGE Employee SET 工资 WITH 工资
1.2
C、UPDATE Employee SET 工资=工资1.2
D、UPDATE Employee SET 工资 WITH 工资
1.2

15、为Employee表增加一个字段"出生日期", 正确的SQL语句是()。
A、CHANGE TABLE Employee ADD 出生日期 D
B、ALTER DBF Employee ADD 出生日期 D
C、ALTER TABLE Employee ADD 出生日期 D
D、CHANGE TABLE Employee INSERT 出生日期 D

16、删除Employee表中职工号为"19620426"的记录,正确的SQL语句是()。
A、DELETE FROM Employee WHILE 职工号=“19620426”
B、DELETE FOR Employee WHERE 职工号=“19620426”
C、DELETE FOR Employee WHILE 职工号=“19620426”
D、DELETE FROM Employee WHERE 职工号=“19620426”

17、在表结构为(职工号,姓名,工资)的表Employee中查询职工号的左4位为"1962"的职工的最高工资值,正确的SQL命令是
A、SELECT MAX(工资) FROM Employee WHERE RIGHT(职工号,4)=“1962”
B、SELECT MIN(工资) FROM Employee WHERE LEFT(职工号,4)=“1962”
C、SELECT MAX(工资) FROM Employee WHERE LEFT(职工号,4)=“1962”
D、SELECT MAX(工资) FROM Employee WHILE LEFT(职工号,4)=“1962”

18、Employee的表结构为:职工号、单位号、工资,Department 的表结构为:单位号、单位名称、人数,查询工资多于12000的职工号和他们所在单位的单位名称,正确的SQL命令是()。
A、SELECT 职工号,单位名称 FROM Employee,Department;
WHERE 工资>12000 AND Employee.单位号=Department.单位号
B、SELECT 职工号,单位名称 FROM Employee,Department;
WHERE 工资>12000 OR Employee.单位号=Department.单位号
C、SELECT 职工号,单位名称 FROM Employee,Department;
WHERE 工资>12000 AND Employee.单位号=Department.职工号
D、SELECT 职工号,单位名称 FROM Employee,Department;
WHERE 工资>12000 OR Employee.单位号=Department.职工号

19、Employee的表结构为:职工号、单位号、工资,Department 的表结构为:单位号、单位名称、人数,查询至少有3名职工的每个单位的职工人数和平均工资。正确的SQL命令是()。
A、SELECT 单位号,COUNT(),AVG(工资) FROM Employee GROUP BY 单位号 WHERE COUNT()>=3
B、SELECT 单位号,COUNT(),AVG(工资) FROM Employee GROUP BY 单位号 HAVING COUNT()>=3
C、SELECT 单位号,AVG(工资) FROM Employee GROUP BY 单位号 HAVING COUNT()>=3
D、SELECT 单位号,COUNT(
),AVG(工资) FROM Employee ORDER BY 单位号 HAVING COUNT(*)>=3

20、Employee的表结构为:职工号、单位号、工资,Department 的表结构为:单位号、单位名称、人数,查询信息管理学院和计算机学院教师的工资总和,正确的SQL命令是()。
A、SELECT SUM(工资) FROM Employee WHERE 单位号 IN (SELECT 单位号 FROM Department WHERE 单位名称=“计算机学院” AND 单位名称=“信息管理学院”)
B、SELECT ALL(工资) FROM Employee WHERE 单位号 IN (SELECT 单位号 FROM Department WHERE 单位名称=“计算机学院” OR 单位名称=“信息管理学院”)
C、SELECT SUM(工资) FROM Employee WHERE 单位号 IN (SELECT 单位号 FROM Department WHERE 单位名称=“计算机学院” OR 单位名称=“信息管理学院”)
D、SELECT SUM(工资) FROM Employee WHERE 单位号 NOT IN (SELECT 单位号FROM Department WHERE 单位名称=“计算机学院” OR 单位名称=“信息管理学院”)

21、Employee的表结构为:职工号、单位号、工资,与SELECT * FROM Employee WHERE 工资 BETWEEN 10000 AND 12000等价的SQL命令是()。
A、SELECT * FROM Employee WHERE 工资>=10000 AND 工资<=12000
B、SELECT * FROM Employee WHERE 工资>=10000 AND <=12000
C、SELECT * FROM Employee WHERE 工资>=10000 OR 工资<=12000
D、SELECT * FROM Employee WHERE 工资>=10000 OR <=12000

22、负责数据库中查询操作的数据库语言是(  )。
A、数据定义语言 B、数据管理语言
C、数据操纵语言 D、数据控制语言

23、SQL语言的查询语句是(  )。
A、INSERT
B、UPDATE
C、DELETE
D、SELECT

24、学生表中有"学号"、"姓名"和"年龄"三个字段,SQL语句"SELECT 学号 FROM 学生"完成的关系操作称为(  )。
A、选择
B、投影
C、连接
D、并

25、若SQL语句中的ORDER BY短语中指定了多个字段,则(  )。
A、依次按自右至左的字段顺序排序
B、只按第一个字段排序
C、依次按自左至右的字段顺序排序
D、无法排序

26、假设客户表中有客户号(关键字)C1~C10共10条客户记录,订购单表有订单号(关键字)OR1~OR8共8条订购单记录,并且订购单表参照客户表。如下命令可以正确执行的是(  )。
A、INSERT INTO 订购单 VALUES(′OR5′, ′C5′,^2008/10/10)
B、INSERT INTO 订购单 VALUES(′OR5′, ′C11′,^2008/10/10)
C、INSERT INTO 订购单 VALUES(′OR9′, ′C11′,^2008/10/10)
D、INSERT INTO 订购单 VALUES(′OR9′, ′C5′,^2008/10/10)

27、假设成绩字段的默认值是空值,检索还未确定成绩的学生选课信息,正确的SQL命令是(  )。
A、SELECT 学生.学号,姓名,选课.课程号 FROM 学生 JOIN 选课 WHERE 学生.学号=选课.学号 AND 选课.成绩 IS NULL
B、SELECT 学生.学号,姓名,选课.课程号 FROM 学生 JOIN 选课 WHERE 学生.学号=选课.学号 AND 选课.成绩=NULL
C、SELECT 学生.学号,姓名,选课.课程号 FROM 学生 JOIN 选课 ON 学生.学号=选课.学号 WHERE 选课.成绩 IS NULL
D、SELECT 学生.学号,姓名,选课.课程号 FROM 学生 JOIN 选课 ON 学生.学号=选课.学号 WHERE 选课.成绩=NULL

28、假设所有的选课成绩都已确定。显示"101"号课程成绩中最高的10%记录信息,正确的SQL命令是(  )。
A、SELECT * TOP 10 FROM 选课 ORDER BY 成绩 WHERE 课程号="101"
B、SELECT * PERCENT 10 FROM 选课 ORDER BY 成绩 DESC WHERE 课程号="101"
C、SELECT * TOP 10 PERCENT FROM 选课 ORDER BY 成绩 WHERE 课程号="101"
D、SELECT * TOP 10 PERCENT FROM 选课 ORDER BY 成绩 DESC WHERE 课程号="101"

29、SQL的数据操作语句不包括(  )。
A、INSERT
B、UPDATE
C、DELETE
D、CHANGE

30、与"SELECT DISTINCT 产品号 FROM 产品 WHERE 单价>=ALL(SELECT 单价 FROM 产品 WHERE SUBSTR(产品号,1,1)="2")“等价的SQL命令是(  )。
A、SELECT DISTINCT 产品号 FROM 产品WHERE 单价>=(SELECT MAX(单价) FROM 产品 WHERE SUBSTR(产品号,1,1)="2”)
B、SELECT DISTINCT 产品号 FROM 产品 WHERE 单价>=(SELECT MIN(单价) FROM 产品 WHERE SUBSTR(产品号,1,1)="2")
C、SELECT DISTINCT 产品号 FROM 产品 WHERE 单价>= ANY(SELECT 单价 FROM 产品 WHERE SUBSTR(产品号,1,1)="2")
D、SELECT DISTINCT 产品号 FROM 产品 WHERE 单价>= SOME (SELECT 单价 FROM 产品 WHERE SUBSTR(产品号,1,1)="2")

31、在SQL SELECT语句中与INTO TABLE等价的短语是(  )。
A、INTO DBF
B、TO TABLE
C、INTO FORM
D、INTO FILE

32、在VFP中,以下关于查询的描述正确的是()。
A、不能用自由表建立查询
B、只能用自由表建立查询
C、不能用数据库表建立查询
D、可以用数据库表和自由表建立查询

33、在视图设计器中有,而在查询设计器中没有的选项卡是()。
A、排序依据
B、更新条件
C、分组依据
D、杂项

34、在查询设计器环境中,"查询"菜单下的"查询去向"不包括(  )。
A、临时表
B、表
C、文本文件
D、屏幕

35、打开查询设计器建立查询的命令是()。
A、CREATE QUERY
B、OPEN QUERY
C、DO QUERY
D、EXEC QUERY

36、下面对视图的描述中错误的是()。
A、通过视图可以查询表
B、通过视图可以修改表的结构
C、通过视图可以更新表中的数据
D、通过自由表不能建立视图

37、删除视图myview的命令是(  )。
A、DELETE myview
B、DELETE VIEW myview
C、DROP VIEW myview
D、REMOVE VIEW myview

38、假设查询文件(myquery.qpr)已经创建,要显示查询结果,可使用命令()。
A、DO myquery.qpr
B、USE myquery.qpr
C、BROWSE myquery.qpr
D、LIST mquery.qpr

以上是关于在VFP里玩SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

VFP中SQL语言的几个问题

SQL急求!!!!

VFP里使用SQL的SELECT语句将查询结果存储在一个临时表中,应使用啥子句?

数据库有以下一张表:职工表:职工编号、姓名、性别、出生日期和职位,工资五个字段用SQL语句完成以下查询

将姓名为张三职工记录删除用SQL语句

基于SQL数据库查询城镇职工医保定点医疗机构药占比的审计方法