是一种说明性的编程语言;对于C之类的过程语言,你编写程序时需要指明得出结果所需的每个步骤,使用SQL这种说明性语言,只需描述想要的内容中,无需了解存取路径,只需提出what to do,而无需指明how to do;是一种面向集合的操作方式,只用于9个动词。因此,标准的SQL没有传统的流程控制结构,如if-then-else、for等语句;
它是交互式式或嵌入式语言。在交互式SQL环境中,用户输入的SQL命令直接发送到数据库管理系统,得到结果后立即显示。DBMS的服务器同时拥有图形和命令行工具,用一接受用户输入的SQL语句或包含SQL程序(脚本)的文本文件。
在开发数据库应用程序时,可以将SQL语句“嵌入”到编写程序所用的宿主语言(host language)中。宿主语言通常是一种通用语言(如C++、Java)或脚本语言(如PHP或Python).如一个PHP CGI脚本可以用SQL语句来查询MySQL数据库,MySQL交查询的结果返回给PHP变量,以便进一步分析或显示在网页上。
但在DBMS、宿主语言或操作环境中,语法上略有差异。
SQL表示“结构化查询语言”是一种变通的误解。它不是结构化的,不只用于查询,不是一种过程语言;
查询只是SOL语言的重要组成部分,但不是全部,除了查询功能处,还包括数据定义(对表、表结构的操作),create,drop alter;数据操作:对表记录的操作,insert,delete,update;数据控制:grant,revoke(Vf不提供SQL的数据控制功能)。数据查询:select;目前所有的关系型数据库管理系统如oracle,SQL Server,DB2,VFP都支持SQL;
其实就是对表、对表中列、行的操作;
1 创建、更改和删除表;
2 插入、更新和删除行;
3 查询(从n表中)选择列,筛选列;
数据定义语句:对表或表结构的操作 | Create | |
Alter | ||
Drop | ||
数据操作语句:对表记录的操作 | Insert | |
Update | ||
Delete | ||
数据查询语句 | Select | |
数据控制语句 | Grant |
SQl中是不区分字母大小写的,对一地SQL关键字一般用大写,对于子句也一般另起一行;。
SQL的三级模式:
外模式:视图
模式:基本表
内模式:存储文件
DDL | create | talbe | tablename | ||
alter | table | tablename | add | fieldname | |
alter | fieldname | ||||
set check | |||||
set default | |||||
drop check | |||||
drop default | |||||
rename | column | ||||
drop | column | ||||
drop | table | tablename | |||
DML | insert | into | target[(field1[,field2[,…]])] | ||
values(values1[,values2[,…]]) | |||||
update | tablename | ||||
set | cloumn_name=eExpression1[,column_name=eExpression2…] | ||||
where filtercondition | |||||
delete | from | tablename[where condition] | |||
select | item | ||||
from | tablename | ||||
where condition | |||||
create table score( | |||||
课程代码 c(3) primary key, | |||||
课程名称 c(20), | |||||
学分 n(1,0)) | |||||
性别 c(2) check(性别="男",or 性别="女") | |||||
简历 G null |
update tablename set column_name=eExpresion1 [,column_name2=eExpression2…]
where filterCondiotn [,filterconditon…]
replace [<scope>]<recordname1> with <expression1>[addictive] [,<recordname2> with <expression2>[addictive]
[for<condition>][while<condition>]
Select的选择项可以是表文件中的一个字段,也可以是一个常量,也可以是一个表达式,对于字段和表达式还可以使用下列函数:avg\sum\count\min\max;
SELECT [all | Distinct][top Expr [percent]] | |
[alias.] Columns [as column_name] | 指定查询中包含的字段(列)、常数、表达式; |
From [databasename!] tables [[as]local_alias] | 指定查询所用的表的名称,可以是多个; |
[[inner] | Left [outer] | Right [outer] ! Full [outer] Join databaseName!] | 指定两个表的内在关系; |
[on joincondition…] | 指定表的连接条件 |
[WHERE joincondition [and joinCondition… | 指定查询条件 |
[and ! Or filterCondition [and ! Or filterCondition…]]] | |
[GROUP by groupColumn [,GroupColumn…]] | 根据某一列或某几列的值将查询结果中的各行进行分组; |
[having filterCondition] | 指定包含在查询结果中的组必须满足的条件 |
[UNION [all] selectCommand] | 将一个SELECT的查询结果与另一个查询结果联接在一起; |
[ORDER by order_item [asc ! Desc][,order_item [asc ! Desc]…]] | 根据某列或某几列中的数据查询结果进行排序; |
[INTO [array arrayname | Cursor cursorName | 指定查询结果的去向; |
[nofilter | Readwrite] | Table tableName[additive] | |
! To printer [prompt] ! To screen]][prefference name][noconsole][plain][nowait] | |
[database databasename [name long TableName]]]] |
into array:将查询结果保存到数组中,该数组为二维数组,数组的列对应记录字段,数据的行对应记录;
into cursor:将查询结果保存到临时表中,查询执行后,存放查询结果的表成为当前表。临时表除不能被修改外,其他特点与普通表一样。应用程序被关闭时,临时表自动被删除。
into table tableName:将查询结果保存到永久表中;
to file:将查询结果保存到文本文件中;
to print[prompt]:将查询结果输出到打印机;prompt表示打印之前显示打印机设置对话框
from子句:列出所有从中检索数据的表,如果没有打开表,VF自动打开表,查询结束后关闭。
select子句:指定包括在查询结果中的项,一个项可以是以下内容(各元素用逗号分开):
1 通配符:*
2 表中的字段名称;
3 foxpro函数;
4 select中可用的列函数;
5 用户自定义的函数;
6 常数;
若在select子句中的字段名是唯一的,则不必在字段名前加别名修饰,SQL能自动找到这些字段。若字段名是非唯一的(即同一字段名出现在from子句中的两个或两个以上表中),则必须使用字段所在表的别名修饰该字段。
select中可使用的通配符:*,如上述;%,_;*只能用在select字句中,后面的%和_只能用在where子句中,和like一起使用,%表示一个字符串,而_表示一个字符。如:select 客户名 from 客户表 where 客户名 like "山东%银行"
as可以创建列的别名;
Distinct消除重复行:如:select distinct 客户名称 from 销售明细表;
where子句筛选行;
说明选择记录的条件,可以包含多个选择条件,各条件间用and\or连接而构成较长的逻辑表达式;
like匹配模式
between进行范围筛选;
in进行列表筛选;
is null测试空值;
ORDER BY排序列;
and,or和not组合及求反条件;
select * form 工资表 where 员工名称 in(select 员工名称 from 员工表 where 学历="大专"
使用宏替换:
如现有一个查询表单,用户自己可以输入查询条件,则[开始]按钮的click过程:
cSearch=alltrim(thisform.text1.value)
select * from customer where &cSearch
order by子句:对查询结果进行排序;
groud by子句:对查询结果进行分组小计;
having子句:分组条件,where子句只能对基表中的记录做筛选。
使用top子句选择一定数量或一定百分比的记录:如:select top 10 * from…
如果要查询所藏图书中,各个出版社的图书最高单价、平均单价和册数,请对下面的SQL语句填空。
SELECT 出版单位,MAX(单价),AVG(单价), COUNT(*) ;
FROM 图书管理!图书; GROUP BY 出版单位
SELECT pub-name
FROM publishers
WHERE pub-id IN
(SELECT pub-id
FROM titles
WHERE type = 'biography')
索引是排序的列表,在这个列表中索引列(或列表)的每个不同值和包含该值的行的硬盘地址存储在一起。DBMS无需检索整个表来定位行,而仅需扫描索引中的地址,就可以直接访问相应列。索引搜索通常要比顺序搜索快,但也是有代价的。其实质也就是另建了一张反映被索引表的行的地址清单;
视图是存储的select语句,它能返回基于一个或多个表(或称作基础表)检索得到的数据表;
视图的基础表可以是基本表、临时表或其他视图,是指定的数据列或数据行的集合。
CREATE VIEW view-customes
AS
SELECT ...
创建视力并不会有任何显示,只是为了让DBMS用一个命名的select语句存储视图,然后通过其检索数据;