❶ php可以和sql结合吗
你说的 sql 估计是 Microsoft SQL Server
可以参考下面的文字
SQL Server 数据库函数库
------------------------------------------------------
本函数库共有 16 个函数
SQL Server 是 Microsoft 从 SyBASE 取得并修改的数据库系统,它只能在 Windows NT Server 上面执行。使用本函数只能使用 Windows NT Server 作为 PHP 的执行平台。
Microsoft SQL Server 的 query 语法为 Transact-SQL,和 SyBASE 的语法几乎相同。本数据库可能是所有 PHP 所支持数据库中,中文书籍最多的数据库了。
mssql_affected_rows: 取得最后 query 影响的记录数。
mssql_close: 关闭与数据库的连接。
mssql_connect: 连上数据库。
mssql_data_seek: 移动列指标。
mssql_fetch_array: 返回数组数据。
mssql_fetch_field: 取得字段信息。
mssql_fetch_object: 返回对象数据。
mssql_fetch_row: 返回单列的各字段。
mssql_field_seek: 设定指标到返回值的某字段。
mssql_free_result: 释放返回占用内存。
mssql_num_fields: 取得返回字段的数目。
mssql_num_rows: 取得返回列的数目。
mssql_pconnect: 打开 MS SQL 服务器长期连接。
mssql_query: 送出一个 query 字符串。
mssql_result: 取得查询 (query) 的结果。
mssql_select_db: 选择一个数据库。
详细资料:
-----------------------------------------------------
mssql_affected_rows
取得最后 query 影响的记录数。
语法: int mssql_affected_rows(int [link_identifier]);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数用来取得最后一次对数据库下 query 指令所影响的记录数,会影响的为 INSERT、UPDATE 或 DELETE 等指令,而 SELECT 不会影响。参数 link_identifier 可省略,为打开数据库的连接代号。返回值即为记录数。
-----------------------------------------------------
mssql_close
关闭与数据库的连接。
语法: boolean mssql_close(int [link_identifier]);
返回值: 布尔值
函数类型: 数据库功能
内容说明
本函数用来关闭与 MS SQL Server 数据库的连接,能关闭的为使用 mssql_connect() 函数打开的数据库,若使用 mssql_pconnect() 打开的数据库则不能以本函数关闭。参数 link_identifier 可省略,为打开数据库的连接代号。关闭成功则返回 true 值。
参考
mssql_connect() mssql_pconnect()
-----------------------------------------------------
mssql_connect
连上数据库。
语法: int mssql_connect(string [servername], string [username], string [password]);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数用来打开与 MS SQL Server 数据库的连接。参数 servername 为欲连上的数据库服务器名称。参数 username 及 password 可省略,分别为连接使用的帐号及密码。使用本函数需注意早点关闭数据库,以减少系统的负担。连接成功则返回数据库的连接代号,失败返回 false 值。
参考
mssql_close() mssql_pconnect()
-----------------------------------------------------
mssql_data_seek
移动列指标。
语法: boolean mssql_data_seek(int result_identifier, int row_number);
返回值: 布尔值
函数类型: 数据库功能
内容说明
本函数用来移动 MS SQL Server 数据文件中的列指标到指定的列上,可供 mssql_fetch_row() 等函数使用。参数 result_identifier 为查询的代号值。参数 row_number 则为欲移往的记录数。若失败则返回 false 值。
参考
mssql_close() mssql_pconnect()
-----------------------------------------------------
mssql_fetch_array
返回数组数据。
语法: array mssql_fetch_array(int result);
返回值: 数组
函数类型: 数据库功能
内容说明
本函数用来将查询结果 result 拆到数组变量中。若 result 没有数据,则返回 false 值。而本函数可以说是 mssql_fetch_row() 的加强函数,除可以将返回列及数字索引放入数组之外,还可以将文字索引放入数组中。
-----------------------------------------------------
mssql_fetch_field
取得字段信息。
语法: object mssql_fetch_field(int result, int field_offset);
返回值: 对象
函数类型: 数据库功能
内容说明
本函数返回的对象数据为 result 的字段 (Column) 信息。返回对象的属性如下:
name - 字段名称
column_source -字段所在表格的数据文件名称
max_length - 字段的最大长度
numeric - 若为 1 表示本字段为数字定义 (numeric)
参考
mssql_field_seek()
-----------------------------------------------------
mssql_fetch_object
返回对象数据。
语法: object mssql_fetch_object(int result);
返回值: 对象
函数类型: 数据库功能
内容说明
本函数用来将查询结果 result 拆到对象变量中。使用方法和 mssql_fetch_array() 几乎相同,不同的地方在于本函数返回值是对象而不是数组。若 result 没有数据,则返回 false 值。另外值得注意的地方是,取回的对象数据的索引只能是文字而不能用数字,这是因为对象的特性。对象数据的特性中所有的属性 (property) 名称都不能是数字,因此只好乖乖使用文字字符串当索引了。关于速度方面,本函数的处理速度几乎和 mssql_fetch_array() 及 mssql_fetch_row() 二函数差不多,要用哪个函数还是看使用的需求决定。
参考
mssql_fetch_array() mssql_fetch_row()
-----------------------------------------------------
mssql_fetch_row
返回单列的各字段。
语法: array mssql_fetch_row(int result);
返回值: 数组
函数类型: 数据库功能
内容说明
本函数用来将查询结果 result 之单列拆到数组变量中。数组的索引是数字索引,第一个的索引值是 0。若 result 没有数据,则返回 false 值。
参考
mssql_fetch_array() mssql_fetch_object() mssql_data_seek() mssql_result()
-----------------------------------------------------
mssql_field_seek
设定指标到返回值的某字段。
语法: int mssql_field_seek(int result, int field_offset);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数设定目前的指标到返回值的特定字段中。参数 result 为返回值代码。参数 field_offset 则为指定的字段序数。
使用范例
mssql_fetch_field
-----------------------------------------------------
mssql_free_result
释放返回占用内存。
语法: int mssql_free_result(int result);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数可以释放目前 MS SQL Server 数据库 query 返回所占用的内存。一般只有在非常担心在内存的使用上可能会不足的情形下才会用本函数。PHP 程序会在结束时自动释放。
-----------------------------------------------------
mssql_num_fields
取得返回字段的数目。
语法: int mssql_num_fields(int result);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数可以得到返回字段的数目。参数 result 为返回值代码。
参考
mssql_query() mssql_fetch_field() mssql_num_rows()
-----------------------------------------------------
mssql_num_rows
取得返回列的数目。
语法: int mssql_num_rows(int result);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数可以得到返回列的数目。参数 result 为返回值代码。
参考
mssql_query() mssql_fetch_field() mssql_num_fields()
-----------------------------------------------------
mssql_pconnect
打开 MS SQL 服务器长期连接。
语法: int mssql_pconnect(string [servername], string [username], string [password]);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数和 mssql_connect() 雷同。不同的地方在于使用本函数打开数据库时,程序会先寻找是否曾经执行过本函数,若执行过则返回先前执行的 ID。另一个不同的地方是本函数无法使用 mssql_close() 关闭数据库。参数 servername 为欲连上的数据库服务器名称。参数 username 及 password 可省略,分别为连接使用的帐号及密码。
-----------------------------------------------------
mssql_query
送出一个 query 字符串。
语法: boolean mssql_query(string query, int plink_identifier]);
返回值: 布尔值
函数类型: 数据库功能
内容说明
本函数送出 query 字符串供 MS SQL Server 做相关的处理或者执行。若没有指定 link_identifier 参数,则程序会自动寻找最近打开的 ID。成功则返回 true 值。
-----------------------------------------------------
mssql_result
取得查询 (query) 的结果。
语法: int mssql_result(int result, int row, mixed field);
返回值: 整数
函数类型: 数据库功能
内容说明
本函数取得一格 query 的结果。参数 field 可以是字段名称、顺序或者是 fieldname.tablename 的格式。在返回值量少时,可以使用本函数来处理。当数据库大时,本函数的效率就有待考虑了,这时可以使用较有效率的 mssql_fetch_row()、mssql_fetch_array() 或 mssql_fetch_object() 等函数。
-----------------------------------------------------
mssql_select_db
选择一个数据库。
语法: boolean mssql_select_db(string database_name, int [link_identifier]);
返回值: 布尔值
函数类型: 数据库功能
内容说明
本函数选择 MS SQL Server 中的数据库以供之后的数据查询作业 (query) 处理。成功返回 true,失败则返回 false。
-----------------------------------------------------
❷ sql怎么统计某一课程的各分数段的人数(在php程序里)
实现上面sql查询结果的记录总数
$sql = select count(C.`cid`) as `c` from (select * from `ctable` group by pid) as C left join `ptable` as P on P.`pid` = C.`pid`;
详解,此语句用到了sql子查询,先使用子查询对ctable进行分组查询,然后对分组后的结果集进行统计.
❸ sql查询语句有php变量时查询不到
你没有搞清楚sql语句的语法
如果你的字段是数字类型的,比如:int bigint 等字段类型,那值就不要加引号
你说的直接换成109可以查询到,估计应该是这样吧?
$sql="select*fromer_memberwheregeo_longitude<=109andgeo_longitude>=107andgeo_latitude<=35andgeo_latitude>=33";
而你所说的有变量查询不到,而且$nowLongitude_max是一个数值,那么,你的sql运行后,应该是会变成这样:
$sql="select*fromer_memberwheregeo_longitude<='109'andgeo_longitude>=107andgeo_latitude<=35andgeo_latitude>=33";
你自己看看两条sql语句有什么不同啊?
❹ PHP获取sql数据表并显示在页面上
首先计算出总条数,
$query = mysql_query("select * from my_lyb");
$maxclou = mysql_num_rows($query);
算出总页数,
$maxpage = ceil($maxclou/5);
用get方法获得当前页(如果为空,默认第一页),算出上页 下一页
❺ 求大神详细讲解php连接mssql
为了能让PHP连接MSSQL,系统需要安装MSSQL,PHP,且在PHP.ini中的配置中,将 ;extension=php_mssql.dll前面的;去掉
1.连接MSSQL
$conn=mssql_connect("实例名或者服务器IP","用户名","密码");
//测试连接
if($conn)
{
echo "连接成功";
}
2.选择要连接的数据库
mssql_select_db("dbname");
3.执行查询
$rs = mssql_query("select top 1 id,username from tbname",$conn);
// 或者直接执行update,insert等语句,可以不用为返回结果赋值
mssql_query("update tbname set username='niunv' where id=1");
4.获取记录集行数
echo mssql_num_rows($rs);
5.获取记录集
if($row=mssql_fetch_array($rs))
{
$id = $row[0];//获取ID字段值
$username = $row[1];//获取username字段值
}
6.获取新增记录的ID
将id字段设置为IDENTITY字段,执行insert语句以后,就会产生一个
@@IDENTITY 全局变量值,查询出来就是最后一条新增记录的ID了.
mssql_query("insert into tbname(username) values ('nv')",$conn);
$rs = mssql_query("select @@IDENTITY as id",$conn);
if($row=mssql_fetch_array($rs))
{
echo $row[0];
}
7.释放记录集
mssql_free_result($rs);
8.关闭连接
mssql_close($conn);
注:用PHP操作MSSQL比在ASP连接MYSQL要简单,所以,当需要MSSQL与MYSQL并存时,用PHP连接MSSQL来操作MYSQL与MSSQL并存比较简单好用.如果是ASP连接MYSQL,需要安装一个MYSQL驱动,默认windows的ODBC没有安装,很遗憾...
在web服务器上至少安装了mssql的客户端
打开php.ini把;extension=php_mssql.dll
前面的分号去掉
有必要话:需要制定extension_dir
推荐使用 php<=4.0.9
<=5.0.3目前 我还没有连接成功过4.010和 5.0.3
数据库的 连接分页可以到phpe.net上获取到相应的class
下面是我修改的 一个class
<?php
/**
*mssql 数据库连接类
**/
class SQL{
var $server;
var $userName;
var $passWord;
var $dataBase;
var $linkID = 0;
var $queryResult;
var $lastInsertID;
var $pageNum = 0;//分页用---共有几条数据
var $ER;
/**
*构造函数
**/
function SQL($Server='',$UserName='',$PassWord='',$DataBase=''){
$this->server = $Server;
$this->userName = $UserName;
$this->passWord = $PassWord;
$this->dataBase = $DataBase;
}
/**
*数据库连接
**/
function db_connect(){
$this->linkID = mssql_pconnect($this->server,$this->userName,$this->passWord);
if(!$this->linkID){
$this->ER = "db_connect($this->server,$this->userName,$this->passWord) error";
return 0;
}
if (!mssql_select_db($this->dataBase,$this->linkID)) {
$this->ER = "mssql_select_db($this->dataBase,$this->lastInsertID) error";
return 0;
}
return $this->linkID;
}
/**public
* function: Check the database, if exist then select
* exist: return 1
* not exist: return 0
*/
function selectDatabase(){
if(mssql_select_db($this->dataBase))
return 1;
else
return 0;
}
/**
*数据操作
**/
function query($Str){
if ($this->linkID == 0) {
$this->ER = "数据库还没有连接!!";
}
$this->queryResult = mssql_query($Str);
//$this->queryResult = mssql_query($Str,$this->linkID);
if (!$this->queryResult) {
$this->ER = "$Str.没有操作成功,query error!!";
return 0;//****************对于php 4.3.9以上版本的错误用1
}
return $this->queryResult;
}
/**
*数据获取
**/
function fetch_array($result){
if($result != "") $this->queryResult = $result;
$rec =mssql_fetch_array($this->queryResult);
if(is_array($rec)){
return $rec;
}
//$this->ER = "没有获取数据!";
return 0;
}
/**public
* function: Free the Query Result
* success return 1
* failed: return 0
*/
function freeResult($result=""){
if($result != "") $this->queryResult = $result;
return mssql_free_result($this->queryResult);
}
/**
*获取影响的的行数
*获取操作过的行数
**/
function num_rows($result=""){
if ($result != "") {
$this->queryResult = $result;
$row = mssql_num_rows($this->queryResult);
return $row;
}
}
/**
*获取查询结果---多个
**/
function result_ar($str=''){
if (empty($str)) {
return 0;
}
$back = array();
$this->queryResult = $this->query($str);
while ($row = $this->fetch_array($this->queryResult)) {
$back[] = $row;
}
return $back;
}
/**
*数据库信息分页
*$Result 数据库操作
*str ==sql语句
*page ==第几页
*showNum ==显示几页
*/
function page($Str,$Page=0,$ShowNum=5){
$back = array();//返回数据
$maxNum = 0;
if ($Str == "") {
$this->ER = "没有数据";
return 0;
}
$this->queryResult = $this->query($Str);
if($this->queryResult){
if($Page==""){
$nopa=0;
}else{
$nopa = ($Page-1)*$ShowNum;
if ($nopa<0) {
$nopa = 0;
}
}
$maxNum=$this->num_rows($this->queryResult);
$k=0;
$i=0;
$dd=$this->fetch_array($this->queryResult);
while($dd&&$nopa<=$maxNum&&$i<$ShowNum){
if($nopa >= $maxNum) $nopa = $maxNum;
mssql_data_seek($this->queryResult,$nopa);
$row=$this->fetch_array($this->queryResult);
$nopa++;
$i++;
$back[] = $row;
if ($nopa >=$maxNum) {
break;
}
}
}
$this->pageNum = $maxNum;
return $back;
}
/**
*分页的html页码
*/
function page_html($DataNum=0,$Page=1,$ShowNum=3,$web,$Post=''){
if ($DataNum == 0) {
$back = "没有要查询的数据";
}else {
if ($ShowNum<=0) {
$ShowNum = 3;
}
if ($Page<=0) {
$Page = 1;
}
if (empty($web)) {
$web = "#";
}
$pageNum = ceil($DataNum/$ShowNum);
if ($Page <= 1) {
$top = "首页<<";
}else {
$top = "<a href='".$web."?page=0&".$Post."' target='_self'>首页<< </a>";
}
if ($Page !==1) {
$upPage = "<a href='".$web."?page=".($Page-1)."&".$Post."' target='_self'>上一页</a>";
}else {
$upPage = "上一页";
}
if ($Page < $pageNum) {
$downPage = "<a href='".$web."?page=".($Page+1)."&".$Post."' target='_self'>下一页</a>";
}else {
$downPage = "下一页";
}
if ($Page == $pageNum) {
$foot = ">>尾页";
}else {
$foot = "<a href='".$web."?page=".$pageNum."&".$Post."' target='_self'> >>尾页</a>";
}
$back = <<<EOT
共 $pageNum 页
第 $Page/$pageNum 页 $top $upPage $downPage $foot
EOT;
}
return $back;
}
}//end class
?>
以上就是PHP连接MSSQL方法的总结,
❻ php sql 查询最后一条数据
SELECT * FROM 当前表
WHERE id = ( SELECT MAX( id ) FROM 当前表 WHERE userid= '10000' )
解释一下:首先括号里先查出此userid登录的所有记录,然后去max最大的id,最后把最大的id的记录查出来,即检索出上次此用户登录的信息
❼ 什么是PHP 什么是SQL
PHP 是一种服务器端的,嵌入HTML的脚本语言。PHP区别其他像客户端Javascript的地方是它的代码在服务器端执行.PHP能做什么?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格数据,生成动态页面内容,或者收发cookies.可能最强大,最有意义的特性是PHP支持大范围的数据库.书写一个支持数据库的Web 页面是难以置信的简单.
下面是当前支持的数据库:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL
PHP通过协议也支持与其他服务的"交谈",像IMAP, SNMP, NNTP, POP3, 甚至是 HTTP. 你也可以打开晦涩的 网络接口和其他协议交互.
PHP的简要历史
1994年秋季, Rasmus Lerdorf 开始构思 PHP. 早期的非发行版本被用在他的主页上,以追踪谁在看他的在线简历. 1995年年初第一版本出台,当时PHP只被认为是个人主页开发工具.它由一个非常单纯的只能理解很少数特殊宏的分析引擎和 一些用在主页后端通用的工具组成.如留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 PHP/FI 第二版. FI来自 Rasmus 写的另外一个包, 用于解释 html 形式的数据.他结合了个人主页工具脚本和形式解析器,并加 上mSQL支持.这样就产生 PHP/FI 了. PHP/FI以令人惊奇的步调成长,人们开始把自己的代码贡献给它.
很难给出它的硬统计表,但可以估计在1996年末,整个世界至少有15,000个网站在用PHP/FI.到1997年年中,这个 数字已经超过50,000了. 而在此时PHP的发展也发生了变化.由Rasmus自己偏爱的和几个人开发的项目变成一个更有组织的团 体成就.Zeev Suraski和Andi Gutmans重写了解析器.这个新的解析器成为PHP版本3的基础.许多有用的代码从PHP/FI 继承到PHP3,并且很多是完全重写的.
今天(1999年年中)不管是PHP/FI或PHP3与很多商业产品捆绑在一块,例如C2级强度的Web服务器和红帽子Linux. 根据NetCraft提供的数据推断,保守估计全世界应用PHP的网站已超过150,000个.由此看来,它比在因特网上运行Netscape 的旗舰企业服务器的站点还多.
PHP 是一种用来制作动态网页的服务器端脚本语言。你通过PHP和HTML创建页面。当访问者打开网页时,服务器端便会处理 PHP 指令,然后把其处理结果送到访问者的浏览器上面,就好像 ASP 或者是 ColdFusion 一样。然而,PHP 跟 ASP 或 ColdFusion 不一样的地方在于,它是跨平台的开放源代码。PHP 可以在 Windows NT 以及很多不同的 Unix 版本中执行,它也可以被编译为一个 Apache 模块,或者是一个CGI二进制文件。当被编译为 Apache 模快时,PHP 尤其轻巧方便。它没有任何繁琐程序所产生的负担,因此可以很快的返回结果,同时也不需为了保持较小的服务器内存映象,而去调整mod_perl。
1. 引言
SQL是什么?
* SQL (Structured Query Language)代表结构化查询语言。
* 当用户发出一项查询,便可从数据库档内获得若干资料。这项查询是根据用户所提供的条件 (condition) 所作出的一项检索。而 SQL则是一个可让用户把条件列明的查询语言。这样,用户只须列明查询的条件,而不须要实际知道有关的检索方法。
* 一般的数据库管理软件系统 (DBMS) 都包含 SQL 功能。
SQL的概念
* 通过 SQL 指令,用户先列出数据库档及查询的条件, SQL 程序便会在这数据库档内检查每笔记录是否符合这项条件,并把有关的资料显示出来。这个过程称为检索。 (见例 2)
* 用户除了直接查问各笔记录的资料外,也可查问统计数项,例如最大值、最小值、总和及平均值。
* 查询所得的结果会以表格的形式显示,用户亦可指示 SQL 程序把结果贮存成为数据库档。
在 FoxPro 如何使用 SQL
* 使用 SQL,必须先把有关数据库档开启。
* 用户可使用指令视窗 (Command Window) 直接把指令输入,亦可使用对话方块把指令输入。
* 若用户选用字符串的完全配对时,便须输入 SET ANSI ON。
2. SQL检索指令的基本结构
一般语法 SELECT, ALL / DISTINCT, *,
AS, FROM, WHERE
比较 IN, BETWEEN, LIKE "% _"
群组 GROUP BY, HAVING,
COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
显示次序 ORDER BY, ASC / DESC
逻辑运算符 AND, OR, NOT
输出 INTO TABLE / CURSOR
TO FILE [ADDITIVE], TO PRINTER, TO SCREEN
联合 UNION
简称:
expr = 表达式 expression, groupexpr = 群组表达式 group expression
col = 栏 column, comcol = 共同栏 common column
colname = 栏名 column name
nullval = 空值 null value
实例:学生个人资料
例子: 考虑以下贮存学生数据的数据库档 STUDENT. DBF:
(i) hcode 表示学生的社名(即红黄蓝绿四社)。
R = Red, Y = Yellow, B = Blue, G = Green
(ii) dcode 表示学生的居住地区码。
eg. TST = 尖沙咀(Tsim Sha Tsui), MKK = 旺角(Mong Kok)
(iii) remission 表示学生是否享有学费减免:
.T. =享有学费减免, .F. = 没有学费减免
(iv) mtest 贮存学生数学测验的分数,满分为100。
栏名 类型 栏宽 内容
id 数字 4 学生编号
name 字符 10 学生名字
dob 日期 8 出生日期
sex 字符 1 性别: M / F
class 字符 2 班别
hcode 字符 1 社名: R, Y, B, G
dcode 字符 3 地区码
remission 逻辑 1 学费减免
mtest 数字 2 数学测验分数
I 一般语法
SELECT ...... FROM ...... WHERE ......
SELECT [ALL / DISTINCT] expr1 [AS col1], expr2 [AS col2] ;
FROM tablename WHERE condition
– SQL 程序会从数据库档 tablename 选取符合条件的横列 (row) 并以表格的格式显示。
– 表达式 expr1, expr2 可以是 (1) 字段,或 (2) 以函数和字段组成的表达式。
– 而 col1, col2 是表达式 expr1, expr2 在输出结果的表格内的栏名。
– 选项 DISTINCT 会把重覆出现的横列删去(即只显示一次),而选项 ALL 则会把所有重覆的保留。
– 条件 condition 可以是 (1) 等式或不等式,或 (2) 字符串的比较,并使用逻辑运算符 AND, OR, NOT。
在使用SQL之前,开启数据库档:
USE student
例 1 求出所有学生的资料。
SELECT * FROM student
注意: 1) 这个指令并不提出任何条件,所以把 WHERE 部分省去。
2) 在 SELECT 部分中使用 * 来表示拣选来源表格的所有栏。
3) 查询所得的结果将贮存于一个暂时的表格内。
id
name dob sex class mtest hcode dcode remission
9801 Peter 06/04/86 M 1A 70 R SSP .F.
9802 Mary 01/10/86 F 1A 92 Y HHM .F.
9803 Johnny 03/16/86 M 1A 91 G SSP .T.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
: : : : : : : : :
例 2 求出 1A 班学生的名字和社名。
SELECT name, hcode, class FROM student ;
WHERE class="1A"
注意: 这例使用条件 class="1A" 拣选 1A 班学生:SQL 程序会从来源表格中的每一横列逐一地检查是否符合这条件。然后 SQL 程序会根据 SELECT 的选项而保留这些横列内的三栏,即 name, hcode 及 class。最后程序会把所得的结果贮存于一个暂时的表格内。
name
hcode class
Peter R 1A
Mary Y 1A
Johnny G 1A
Luke G 1A
Bobby B 1A
Aaron R 1A
: : :
例 3 求出红社社员的居住地区。(hcode="R")
SELECT DISTINCT dcode FROM student ;
WHERE hcode="R"
注意: 若两个或以上的学生居住于同一地区,使用选项 DISTINCT 便可把重覆的结果省去。
dcode
HHM
KWC
MKK
SSP
TST
YMT
例 4 求出 1B 班女生的名字和年龄。(准至一位小数)
SELECT name, ROUND((DATE( )-dob)/365,1) AS age FROM student ;
WHERE class="1B" AND sex="F"
注意: 1) “1B 班女生”的条件包括两部分:class="1B" 和 sex="F"。而这项条件必须同时符合,所以要使用逻辑运算符 AND。
2) 在这数据库档裏并没有一栏直接贮存年龄,所以我们须要使用学生的出生日期 dob 来计算。首先,DATE( )-dob 表示该生的"日岁",再除 365 就变成"年岁"。再用选项 AS age 去说明该栏的名称。
name
age
Wendy 12.1
Kitty 11.5
Janet 12.4
Sandy 12.3
Mimi 12.2
例 5 求出 1A 班没有学费减免的学生的名字和编号。
SELECT name, id, class FROM student ;
WHERE class="1A" AND NOT remission
注意: 1) 这裏包括两项条件:学生必须是 1A 班,而且没有享有学费减免。 所以在 WHERE 部分中加上运算符 AND。
2) 因 remission 是一个逻辑字段,所以可直接在逻辑表达式中使用 。在 remission 之前加上 NOT 便把意思相反。
name
id class
Peter 9801 1A
Mary 9802 1A
Luke 9810 1A
Bobby 9811 1A
Aaron 9812 1A
Ron 9813 1A
Gigi 9824 1A
: : :
II 比较
expr IN ( value1, value2, value3)
expr BETWEEN value1 AND value2
expr LIKE "%_"
– 在 WHERE 部分中,可使用以上的比较条款:
1) 若 expr 的值是相等于 value1, value2, value3 其中的一个时,条款 expr IN ( value1, value2, value3) 便会送回逻辑值 .T.。而 expr 可以是数值或字符串。
2) 若expr 是界乎于 value1 和 value2 之间,条款
expr BETWEEN value1 AND value2 便会送回逻辑值 .T.。
3) 若字符串 expr 符合 "%_" 的样式,条款 expr LIKE "%_" 便会送回逻辑值 .T.。在样式中, "%" 代表任何长度的字符串,而 "_" 则代表任何的单一字符。
例 6 求出所有出生于星期三或星期六的学生。
SELECT name, class, CDOW(dob) AS bdate FROM student ;
WHERE DOW(dob) IN (4,7)
注意: 学生若在星期三星期六出生, DOW(dob) 使会送回 数值 4 或 7,所以用 IN (4,7) 来检查。
name
class bdate
Peter 1A Wednesday
Wendy 1B Wednesday
Kevin 1C Saturday
Luke 1A Wednesday
Aaron 1A Saturday
: : :
例 7 求出所有不是在一月、三月、六月或九月出生的学生。
SELECT name, class, dob FROM student ;
WHERE MONTH(dob) NOT IN (1,3,6,9)
注意: 我们不想 MONTH(dob) = 1, 3, 6 或 9, 所以使用 NOT IN (1,3,6,9) 来检查。
name
class dob
Wendy 1B 07/09/86
Tobe 1B 10/17/86
Eric 1C 05/05/87
Patty 1C 08/13/87
Kevin 1C 11/21/87
Bobby 1A 02/16/86
Aaron 1A 08/02/86
: : :
例 8 求出1A 班的学生名字,其数学测验分数界乎于 80 至 90 分之间。
SELECT name, mtest FROM student ;
WHERE class="1A" AND mtest BETWEEN 80 AND 90
注意: 1) 这裏用了两个条件:第一个是 class="1A",第二个是测验分数界乎于 80 至 90 分之间。这两个条件必须同时成立,所以须用 AND。
2) 测验分数界乎于 80 至 90 分之间可用 mtest BETWEEN 80 AND 90 来表示。
name
mtest
Luke 86
Aaron 83
Gigi 84
例 9 求出所有学生其名字是以 "T" 为起首。
SELECT name, class FROM student ;
WHERE name LIKE "T%"
注意: 这裏所用的样式是 "T%" ,这表示第一个字符必须是 "T" 而其后可以是任何的字符串。
name
class
Tobe 1B
Teddy 1B
Tim 2A
例10 求出所有红社社员其名字的第二个字母是"a"。
SELECT name, class, hcode FROM student ;
WHERE name LIKE "_a%" AND hcode="R"
注意: 这裏所用的样式是 "_a%" ,而其中的 "_" 符号代表任何单一字符,亦即第一个字符是任意的。第二个字符则必须是 "a",而其后的 "%" 代表任何的字符串。
name
class hcode
Aaron 1A R
Janet 1B R
Paula 2A R
III 群组
SELECT ...... FROM ...... WHERE condition ;
GROUP BY groupexpr [HAVING requirement]
群组函数: COUNT( ), SUM( ), AVG( ), MAX( ), MIN( )
–GROUP BY groupexpr 列出群组组成所依照的表达式。一般都是数据库档的一栏。
– WHERE condition 列出个别横列所须符合的条件,而 HAVING requirement 则列出个别群组须符合的条件。
– 可使用以群组函数来计算统计数项:
COUNT( ): 记录出现的目数
SUM( ): 总和
AVG( ): 平均值
MAX( ): 最大值
MIN( ): 最小值
例11 求出每一班的人数。
SELECT class, COUNT(*) FROM student
GROUP BY class
注意: 1) 使用 GROUP BY class, SQL 程序便会先把表格裏的横列按照 class 排列起来。
2) 然后 SQL 程序会把相连的横列依照 class 来群组。
3) 最后使用群组函数 COUNT(*) 去算数每组的数目。
class
cnt
1A 10
1B 9
1C 9
2A 8
2B 8
2C 6
例12 求出每一班的数学测验平均分。
SELECT class, AVG(mtest) FROM student GROUP BY class
注意: SQL 程序会先依照 class 来群组,然后在每一组中计算该组的 mtest 平均值。
class
avg_mtest
1A 85.90
1B 70.33
1C 37.89
2A 89.38
2B 53.13
2C 32.67
例13 求出每一居住地区的女生数目。
SELECT dcode, COUNT(*) FROM student ;
WHERE sex="F" GROUP BY dcode
注意: 查询的条件为 sex="F"。而 SQL 程序会先把符合这条件的横列选出,然后把这些横列依照 dcode 为群组。
dcode
cnt
HHM 6
KWC 1
MKK 1
SSP 5
TST 4
YMT 8
例14 求出每一区中一学生数学测验的最高分及最低分。
SELECT MAX(mtest), MIN(mtest), dcode FROM student ;
WHERE class LIKE "1_" GROUP BY dcode
max_mtest
min_mtest dcode
92 36 HHM
91 19 MKK
91 31 SSP
92 36 TST
75 75 TSW
88 38 YMT
注意: 这例使用条件 class LIKE "1_" 来拣选每区的中一学生。
例15 列出每一班男生数学测验的平均分,但男生人数不及三人的班则不计算在内。
SELECT AVG(mtest), class FROM student ;
WHERE sex="M" GROUP BY class HAVING COUNT(*) >= 3
注意: SQL 程序会先把符合个别条件 sex="M" 的横列拣选出来,然后依照 class 来群组并计算每组的 mtest 平均值。最后 SQL 程序会检查群组条件 COUNT(*) >= 3。(这例中 2C 班男生人数不及三人,所以并没有在结果裏显示出来。)
avg_mtest
class
86.00 1A
77.75 1B
35.60 1C
86.50 2A
56.50 2B
IV 显示次序
SELECT ...... FROM ...... WHERE ...... GROUP BY ..... ;
ORDER BY colname ASC / DESC
– ORDER BY colname 控制结果的显示序。而 colname 代表结果表格的一栏。而ASC = 升幂, DESC = 降幂。
例16 列出 1A 班男生的名字,并按名字序显示。
SELECT name, id FROM student ;
WHERE sex="M" AND class="1A" ORDER BY name
name id name id
Peter
9801 Aaron 9812
Johnny 9803 Bobby 9811
Luke 9810 Johnny 9803
Bobby 9811 Luke 9810
Aaron 9812 Peter 9801
Ron 9813 Ron 9813
例17 列出 2A 班的学生资料,并按居住地区序显示。
SELECT name, id, class, dcode FROM student ;
WHERE class="2A" ORDER BY dcode
name id class dcode
Jimmy 9712 2A HHM
Tim 9713 2A HHM
Samual 9714 2A SHT
Rosa 9703 2A SSP
Helen 9702 2A TST
Joseph 9715 2A TSW
Paula 9701 2A YMT
Susan 9704 2A YMT
例18 求出每区居住学生的人数,并按降幂显示。
SELECT COUNT(*) AS cnt, dcode FROM student ;
GROUP BY dcode ORDER BY cnt DESC
cnt
docode
11 YMT
10 HHM
10 SSP
9 MKK
5 TST
2 TSW
1 KWC
1 MMK
1 SHT
例19 列出每社的男社员名字并按班别序显示。(即社和班的两层次序)
SELECT name, hcode, class FROM student ;
WHERE sex="M" ORDER BY hcode, class
注意: 这些横列先按 hcode 排列(即第一层排列);而相同的 hcode,再按 class 次序显示。
name hcode class
Bobby
B 1A
Teddy B 1B
Joseph B 2A
Zion B 2B
Leslie B 2C
Johnny G 1A
Luke G 1A
Kevin G 1C
George G 1C
: : :
: : :
V 输出
INTO TABLE tablename
把查询所得的结果贮存成数据库档。
INTO CURSOR temp
把查询所得的结果暂时贮存于电脑的工作记忆裏。
TO FILE filename [ADDITIVE]
把查询所得的结果贮存成文字档。(additive = 附加)
TO PRINTER 输出到打印机。
TO SCREEN 输出到萤幕。
例20 按学生名字的降幂,列出学生的所有资料,并把结果贮存成数据库档NAME.DBF。
SELECT * FROM student ;
ORDER BY name DESC INTO TABLE name.dbf
注意: 1) INTO TABLE name.dbf 要求 SQL 程序把结果贮存成档案。
2) 这指令相等于数据库指令 SORT。
3) SQL 程序会把结果贮存成一个新的数据库档 name.dbf。
id
name dob sex class mtest hcode dcode remission
9707 Zion 07/29/85 M 2B 51 B MKK .F.
9709 Yvonne 08/24/85 F 2C 10 R TST .F.
9804 Wendy 07/09/86 F 1B 84 B YMT .F.
9819 Vincent 03/15/85 M 1C 29 Y MKK .F.
9805 Tobe 10/17/86 M 1B 88 R YMT .F.
9713 Tim 06/19/85 M 2A 91 R HHM .T.
9816 Teddy 01/30/86 M 1B 64 B SSP .F.
:
: : : : : : : :
例21 按社员的班别、性别及名字的次序,把红社社员的资料打印出来。
SELECT class, name, sex FROM student ;
WHERE hcode="R" ;
ORDER BY class, sex DESC, name TO PRINTER
注意: 1) 这指令要求程序先找出绿社社员,然后把这些横列以 class, sex 和 name 的次序排列。
2) SQL 程序先把查询的结果暂时贮存于工作记忆裏,然后把这结果输出到打印机。
class
name sex
1A
Aaron M
1A
Peter M
1A Ron M
1B Tobe M
1B Janet F
1B Kitty F
1B
Mimi F
: : :
3. 数据库联合、相交及差分
考虑两个结构相同的数据库档 A 和 B。
A 和 B 的联合
(A B) union
检取属于 A 或 B 的所有横列。
A 和 B 的相交
(A B) intersection
检取 A 和 B 所共有的横列。
A 和 B 的差分
(A–B) difference 检取只属于 A 而不属于 B 的横列。(即从 A 把 B 的部分排出)
SELECT ...... FROM ...... WHERE ...... ;
UNION ;
SELECT ...... FROM ...... WHERE ......
SELECT ...... FROM table1 ;
WHERE col IN ( SELECT col FROM table2 )
SELECT ...... FROM table1 ;
WHERE col NOT IN ( SELECT col FROM table2 )
实例:桥牌会和棋艺会
考虑学校桥牌会和棋艺会的会员,他们的资料分别贮存于同一结构的数据库档 BRIDGE.DBF 和 CHESS.DBF 内:
栏名 类型 栏宽 内容
id 数字 4 学生编号
name 字符 10 学生名字
sex 字符 1 性别: M / F
class 字符 2 班别
Bridge [A] Chess [B]
id name sex class id name sex class
1 9812 Aaron M 1A 1 9802 Mary F 1A
2 9801 Peter M 1A 2 9801 Peter M 1A
3 9814 Kenny M 1B 3 9815 Eddy M 1B
4 9806 Kitty F 1B 4 9814 Kenny M 1B
5 9818 Edmond M 1C 5 9817 George M 1C
: : : : : : : :
在使用SQL之前,开启这两个数据库档:
SELECT A
USE bridge
SELECT B
USE chess
例22 本校计划举行一次 "棋桥活动",所有棋艺会和桥牌会的会员必须出席。试以班别和名字的次序,列出两会会员的名单。(即两会的联合)
SELECT * FROM bridge ;
UNION ;
SELECT * FROM chess ;
ORDER BY class, name INTO TABLE party
注意: 所要求的是两会的所有会员,这便是两会的联合。
Party
id name sex class
1 9812 Aaron M 1A
2 9802 Mary F 1A
3 9801 Peter M 1A
4 9815 Eddy M 1B
5 9814 Kenny M 1B
6 9806 Kitty F 1B
7 9818 Edmond M 1C
8 9817 George M 1C
: : : :
例23 打印两会的共同会员。(即两会的相交)
SELECT * FROM bridge ;
WHERE id IN ( SELECT id FROM chess ) ;
TO PRINTER
注意: 这例须找出两会所共通的会员。SQL 程序须检查桥牌会的每一个会员是否也属于棋艺会。若是属于的话,这人便符合这个要求了。
Common
id name sex class
1 9801 Peter M 1A
2 9814 Kenny M 1B
: : : :
例24 求出只参加了桥牌会的会员名单。(即两会之差分)
SELECT * FROM bridge ;
WHERE id NOT IN ( SELECT id FROM chess ) ;
INTO TABLE diff
注意: 1) 这例须从桥牌会中拣选那些并不属于棋艺会的人。所以 SQL 程序须使用 FROM bridge,即从逐一检查桥牌会的会员是否属于棋艺会,若不属于的话,这人便符合这个要求了。
2) "差分"不是对称的:若想找出"只参加了棋艺会的会员名单",其结果则会完全不同。
Diff
Id name sex class
1 9812 Aaron M 1A
2 9806 Kitty F 1B
3 9818 Edmond M 1C
: : : :
4. 多个数据库
当所查询的资料贮放于两个数据库档时,就须使用接合 (join)。 接合的作用是把一个数据库档内的一个横列与另一个数据库档内的横列连合起来,从而把所有不同的组合列出来。 (数学: Cartesian Proct)
自然接合
* 在接合中加上一项接合条件,要求两档的共通栏(common column)的值是相同,这称为自然接合。这目的是要把这两档的相关资料连合起来,变成一个合一的大表格,再从这表格中执行查询工作。
考虑以下两个数据库档 T1 和 T2:
SELECT a.comcol, a.col1, b.col2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol
– 在自然接合中,这两个数据库档须要有一个栏是相同的,这一栏称为共通栏 。SQL 程序会先把这两档的所有组合列出,然后从中拣选共通栏的值是相同的横列。
– a 和 b 分别是 table1 和 table2的代号,用以指明各栏所属的档。
– 表达式 expr1, expr2 可以使用 table1 和 table2内的各栏。
实例:乐器班
学校规定每个学生都须要学习一件乐器。现在使用数据库档 MUSIC.DBF 贮存学生所学的乐器名称 (而学生的其他资料则贮存于 STUDENT.DBF 内)
栏名 类型 栏宽 内容
id 数字 4 学生编号
type 字符 10 乐器名称
例25 列出所有学生的名字及所学习的乐器名称。
SELECT s.class, s.name, s.id, m.type FROM student s, music m ;
WHERE s.id=m.id ORDER BY class, name
注意: 1) 这裏用了s 代表 student.dbf 而 m 代表 music.dbf。
2) 接合条件是 s.id=m.id,表示两档的横列须要依照 id 而接合。
class
name id type
1A Aaron 9812 Piano
1A Bobby 9811 Flute
1A Gigi 9824 Recorder
1A Jill 9820 Piano
1A Johnny 9803 Violin
1A Luke 9810 Piano
1A Mary 9802 Flute
: : : :
例26 求出每班学习钢琴的学生数目。
SELECT s.class, COUNT(*) FROM student s, music m ;
WHERE s.id=m.id AND m.type="Piano" ;
GROUP BY class ORDER BY class
注意: 1) 裏先首先用了接合条件 s.id=m.id 把两档自然接合起来。
2) SQL 程序然后从接合的结果(表格形式)中再拣选去符合条件 m.type="Piano" 的横列。
3) 最后 SQL 程序会依照 class 而群组,并数算每班的数目。
class cnt
1A 4
1B 2
1C 1
外接合
* 外接合是自然接合再加上没有配合的部分。
SELECT a.common, a.column1, b.column2, expr1, expr2 ;
FROM table1 a, table2 b ;
WHERE a.comcol = b.comcol ;
UNION ;
SELECT comcol, col1, nullval, nullval, nullval ;
FROM table1 ;
WHERE a.comcol NOT IN ( SELECT comcol FROM table2 )
– 外接合的指令包括两个 SELECT 部分,再以 UNION 联会起来。
– 第一部分是自然接合(即成功接合),第二部分则是没有配合(即是在第一部分不能自然接合的横列)。
– 为了使第二部分与第一部分的结构一样,第二部分中没有数值的位置须填上空值 (null value),即空字符串""、数值零、 逻辑值 .F. 或空日期 { / / } 。
例27 列出尚未选择乐器的学生名字。(即没有相配)
SELECT class, name, id FROM student ;
WHERE id NOT IN ( SELECT id FROM music ) ;
ORDER BY class, name
注意: 1) 这指令会从 student.dbf 中选出那些在另一档 music.dbf 没有配合的横列。
2) ( SELECT id FROM music) 选出那些在数据库档 music.dbf 出现的 id,所以条件 id NOT IN (...) 能检索出没有配对的横列。
class
name id
1A Mandy 9821
1B Kenny 9814
1B Tobe 9805
1C Edmond 9818
1C George 9817
: : :
例28 列出一份名单,去查核所有学生学习的乐器。名单须包括尚未参加乐器班的学生名字。(即外接合)
SELECT s.class, s.name, s.id, m.type ;
FROM stu