PHP是什么?什么是SQL?
在最底层,PHP可以做任何其他CGI程序可以做的事情,比如收集表格数据、生成动态页面内容或者发送和接收cookies。也许最强大和最有意义的特性是PHP支持广泛的数据库。编写一个支持数据库的网页非常简单。
目前支持以下数据库:
阿达巴斯D层间固体
数据库mSQL Sybase
女皇MySQL Velocis
Oracle Unix数据库管理系统
Informix PostgreSQL
PHP还支持通过协议与其他服务“对话”,如IMAP、SNMP、NNTP、POP3甚至HTTP。您还可以打开模糊的网络接口来与其他协议交互。
PHP简史
1994年的秋天,拉斯马斯·勒德尔夫开始构思PHP。早期的非发布版本被用在他的主页上,以跟踪谁在阅读他的在线简历。第一版于1995年初发布。那时候PHP只被认为是个人主页开发工具。它由一个非常简单的分析引擎组成,只能理解主页后端使用的一些特殊宏和一些常用工具,如留言簿、计数器和其他东西。这个分析器在1995中间被重写,命名为PHP/FI version 2。FI来自Rasmus写的另一个包。用于解释html格式的数据。他把个人主页工具脚本和表单解析器结合起来,加入了mSQL支持。于是,PHP/FI应运而生。PHP/FI以惊人的速度发展,人们开始为它贡献自己的代码。
很难给出它的硬性统计,但可以估计到1996年底,全世界至少有15000个网站在使用PHP/FI。到了1997中期,这个数字已经超过了50。000.这个时候PHP的发展也发生了变化。拉斯姆斯自己和几个人开发的项目已经成为一个更有组织的团体成果。Zeev Suraski和Andi Gutmans重写了解析器。这个新的解析器成为了PHP版本3的基础。很多有用的代码都是从PHP/FI继承到PHP3的,很多都是完全重写的。
今天(65438+mid-0999),PHP/FI和PHP3都捆绑了很多商业产品,比如C2级的Web服务器和Red Hat Linux。根据NetCraft提供的数据,保守估计全球使用PHP的网站超过15万个。从这个角度来看,它比互联网上运行网景旗舰企业服务器的网站更多。
PHP是一种用于制作动态网页的服务器端脚本语言。你通过PHP和HTML创建页面。当访问者打开网页时,服务器会处理PHP指令,然后将处理结果发送到访问者的浏览器,就像ASP或ColdFusion一样。但是,PHP不同于ASP或ColdFusion,它是跨平台的开源代码。PHP可以在Windows NT和许多不同的Unix版本中执行。它也可以被编译成Apache模块或CGI二进制文件。PHP编译成Apache模块特别轻便。它没有任何繁琐程序带来的负担,可以快速返回结果,也不需要为了保留一个很小的服务器内存镜像而调整mod_perl。
1.介绍
什么是SQL?
* SQL(结构化查询语言)代表结构化查询语言。
*当用户发送查询时,他可以从数据库文件中获得一些信息。该查询是基于用户提供的条件的检索。SQL是一种允许用户列出条件的查询语言。这样,用户只需要指定查询条件,而不需要实际了解相关的检索方法。
*通用数据库管理软件系统(DBMS)包含SQL功能。
SQL的概念
*通过SQL指令,用户首先列出数据库文件和查询条件,SQL程序会检查该数据库文件中的每条记录是否满足该条件,并显示相关信息。这个过程叫做检索。(参见示例2)
*除了直接查询每条记录的数据外,用户还可以查询几个统计项目,如最大值、最小值、总和、平均值等。
*查询结果将以表格的形式显示,用户也可以指示SQL程序将结果存储为数据库文件。
如何在FoxPro中使用SQL
*要使用SQL,必须首先打开相关的数据库文件。
*用户可以使用命令窗口直接输入命令,或者使用对话框输入命令。
*如果用户选择字符串的完整配对,他们必须输入SET ANSI ON。
2.SQL检索指令的基本结构
常规语法SELECT,ALL/DISTINCT,*,
从哪里来
比较IN,BETWEEN,LIKE“% _”
分组依据,拥有,
计数( ),总和( ),AVG( ),最大值( ),最小值()
显示订单订单依据,ASC/DESC
逻辑运算符AND、OR、NOT
输出到表/光标中。
文件[添加剂],打印机,屏幕
联合工会
缩写:
Expr =表达式,groupexpr =组表达式。
Col =列,comcol =公共列。
Colname =列名column name
Nullval =空值null value
示例:学生的个人信息
示例:考虑下面的数据库文件STUDENT。用于存储学生数据的DBF:
(i) hcode表示学生的社团名称(即红黄蓝绿四个社团)。
R =红色,Y =黄色,B =蓝色,G =绿色
(二)dcode表示学生居住地的区号。
例如TST =尖沙咀),MKK =旺角。
(三)减免表明学生是否有权享受学费减免:
。T. =享受学费减免,。F. =无学费减免。
(四)mtest存储学生数学考试成绩,满分100。
列名类型列宽内容
身份证号4学号
姓名字符10学生姓名
出生日期8出生日期
性别特征1性别:男/女
类别字符2类别
Hcode字符1社会名:r,y,b,g。
Dcode字符3区号
减免逻辑1学费减免
第二次数学测验分数
一.普通语法
挑选......从......在哪里......
SELECT[ALL/DISTINCT]expr 1[AS col 1],expr 2[AS col 2];
FROM tablename WHERE条件
–SQL程序将从数据库文件tablename中选择符合条件的行,并以表格格式显示它们。
–表达式expr1,expr2可以是(1)字段,或者(2)由函数和字段组成的表达式。
–and col 1,col2是输出结果表中表达式expr1,expr2的列名。
–选项DISTINCT将删除重复的行(即,它将只显示一次),而选项ALL将保留所有重复的行。
–条件条件可以是(1)等式或不等式,或者(2)字符串比较,使用逻辑运算符and、or、NOT。
使用SQL之前,请打开数据库文件:
使用学生
例1求所有学生的数据。
从学生中选择*
注:1)这条指令没有提出任何条件,所以省略了WHERE部分。
2)在选择部分使用*表示领料来源表的所有列。
3)查询结果将存储在一个临时表中。
身份证明(identification)
名称出生日期性别类别mtest hcode dcode缓解
彼得06/04/86 M 1A 70 R SSP .F。
9802玛丽01/10/86 F 1A 92Y HHM F
9803约翰尼03/16/86米1A 91克SSP .T。
9804温迪07/09/86 F 1B 84b YMT F
YMT,邮编:9805
: : : : : : : : :
例2找出1A班学生的姓名和社团名称。
从学生中选择姓名、代码、班级;
其中class="1A "
注意:此示例使用条件class="1A "从1A班中选择学生:SQL程序将从源表中的每一行逐一检查是否满足此条件。然后SQL程序会根据SELECT的选项在这些列中保留三列,即name、hcode和class。最后,程序会将结果存储在一个临时表中。
名字
hcode类
彼得R 1A
玛丽Y 1A
约翰尼G 1A
卢克G 1A
鲍比B 1A
亚伦R 1A
: : :
例3找出红十字会成员的居住区。(hcode="R ")
从学生中选择不同的数据代码;
其中hcode="R "
注意:如果两个或更多的学生住在同一地区,使用DISTINCT选项可以忽略重复的结果。
数据代码
HHM
KWC
MKK
法定病假工资
测验(test)
台湾山叶
例4找出1B班女生的姓名和年龄。(精确到小数点后一位)
从学生中选择姓名,ROUND((DATE( )-dob)/365,1)作为年龄;
其中class="1B "和sex="F "
注:1)“1B班女生”的条件包括class="1B "和sex="F "两部分。而且这个条件必须同时满足,所以用逻辑运算符AND。
2)这个数据库文件中没有直接存储年龄的列,所以我们需要使用学生的出生日期dob来计算。首先DATE( )-dob表示学生的“岁”,然后除以365就变成了“岁”。然后使用选项AS age来解释列的名称。
名字
年龄
温迪12.1
小猫11.5
珍妮特12.4
桑迪12.3
咪咪12.2
例5找出1A班没有学费减免的学生的姓名和编号。
从学生中选择姓名、id、班级。
其中class="1A "且未缓解
注:1)这里有两个条件:学生必须在1A班,不享受学费减免。因此,在WHERE部分添加运算符AND。
2)由于提醒是一个逻辑字段,所以可以直接用在逻辑表达式中。在提醒前加上NOT颠倒了意思。
名字
id类别
彼得9801 1A
玛丽9802 1A
卢克9810 1A
鲍比9811 1A
亚伦9812 1A
Ron 9813 1A
Gigi 9824 1A
: : :
二比较
表达式输入(值1,值2,值3)
值1和值2之间的表达式
类似“%_”的表达式
–在WHERE部分,可以使用上述比较术语:
1)如果expr的值等于value 1、value2和value3中的一个,子句exprin (value1,value 2,value 3)将返回逻辑值。Expr可以是数值或字符串。
2)如果expr介于value1和value2之间,则子句
值1和值2之间的Expr将返回逻辑值。
3)如果字符串expr符合“%_”的模式,子句expr LIKE“% _”将返回逻辑值。在样式中,“%”表示任意长度的字符串,而“_”表示任意单个字符。
例6找出所有星期三或星期六出生的学生。
从学生中选择姓名、班级、CDOW(出生日期)作为日期。
(4,7)中的DOW(dob)
注意:如果学生出生在周三和周六,那么DOW(dob)会发回4或7的值,所以IN (4,7)将用于检查。
名字
b类日期
彼得1A星期三
温迪1B星期三
星期六
路加福音1A星期三
亚伦1A星期六
: : :
例7找出所有不是在一月、三月、六月或九月出生的学生。
从学生中选择姓名、班级、出生日期;
其中月份(日期)不在(1,3,6,9)中
注意:我们不希望MONTH(dob) = 1,3,6或9,所以我们使用NOT IN (1,3,6,9)来检查。
名字
dob类
温迪1B 07/09/86
Tobe 1B 10
埃里克1C 1987年5月5日
帕蒂1C 08/13/87
凯文1C 11/21/87
鲍比1A 02/16/86
亚伦1A 1986年2月8日
: : :
例8找出1A班学生的名字,数学考试的分数在80到90之间。
SELECT name,mtest FROM student
其中class="1A "和mtest介于EN 80和90之间
注:1)这里用了两个条件:第一个是class="1A ",第二个是考试成绩在80到90之间。这两个条件必须同时成立,所以必须用AND。
2)考试成绩在80-90之间,可以用mtest BETWEEN 80和90来表示。
名字
mtest
路加福音第86章
亚伦83
Gigi 84
例9找出所有名字以“T”开头的学生。
从学生中选择姓名、班级;
像“T%”这样的名字
注意:这里使用的样式是“T%”,这意味着第一个字符必须是“T”,然后它可以是任何字符串。
名字
班级
托比1B
泰迪1B
蒂姆·2A
例10查出红十字会全体成员的第二个字母是“A”。
从学生中选择姓名、班级、代码;
其中名称如“_a%”和hcode="R "
注意:这里使用的样式是“_a%”,其中的“_”符号代表任意单个字符,即第一个字符是任意的。第二个字符必须是“a”,其后的“%”表示任意字符串。
名字
hcode类
亚伦1A R
珍妮特1B R
保拉·2A河
第三组
挑选......从......条件在哪里;
GROUP BY GROUP expr[有要求]
分组函数:COUNT()、SUM()、AVG()、MAX()、MIN()
–-GROUP BY GROUP expr列出组成组的表达式。它通常是数据库文件中的一列。
–where condition列出了各个行必须满足的条件,而HAVING requirement列出了各个组必须满足的条件。
–您可以使用group函数来计算统计数据:
COUNT():记录出现的项目数。
SUM (): sum
AVG():平均值
MAX():最大值
MIN():最小值
例11求每个班的人数。
选择班级,从学生中计数(*)
按类别分组
注意:1)使用GROUP BY class,SQL程序将首先根据类排列表中的行。
2)然后SQL程序将根据类对连接的行进行分组。
3)最后用分组函数COUNT(*)统计每组的个数。
班级
(cannot)不能
1A 10
1B 9
1C 9
2A 8
2B 8
2C 6
例12求每个班的平均数学考试成绩。
按班级从学生组中选择班级,AVG(mtest)
注意:SQL程序会先按类分组,然后计算每组中组的平均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;
其中sex="F "按数据代码分组
注意:查询条件为sex="F "。SQL程序将首先选择满足该条件的行,然后根据dcode对这些行进行分组。
数据代码
(cannot)不能
HHM 6
KWC 1
MKK 1
SSP 5
TST 4
YMT 8
例14求某学生在各区数学考试的最高分和最低分。
从学生中选择最大(mtest)、最小(mtest)、dcode
其中类如“1_”按dcode分组
最大测试次数
最小测试代码
92 36 HHM
91 19 MKK
91 31 SSP
92 36 TST
75 75 TSW
88 38
注意:在这种情况下,类似“1_”的条件类用于选择每个区的高一学生。
例15列出了各班男生数学考试的平均分,但男生少于3人的班级不算。
从学生中选择AVG(mtest),班级;
其中sex = " M " GROUP BY class HAVING COUNT(*)& gt;= 3
注意:SQL程序会先整理出满足sex="M "个体条件的行,然后按类分组,计算每组的平均mtest。最后,SQL程序检查组条件计数(*)= 3 .(在这种情况下,2C班的男生人数少于3人,所以没有显示在结果中。)
平均平均测试时间
班级
86.00 1A
77.75 1B
35.60 1C
86.50 2A
56.50 2B
IV显示顺序
挑选......从......在哪里......分组依据.....;
按colname ASC / DESC订购
–order by colname控制结果的显示顺序。colname代表结果表中的一列。ASC =上升幂,DESC =下降幂。
例16列出1A班男生的名字,按名字顺序显示。
从学生中选择姓名、id。
其中sex="M "和class="1A "按名称排序
名称id名称id
彼得(男子名)
9801亚伦9812
约翰尼9803鲍比9811
卢克9810约翰尼9803
鲍比9811卢克9810
亚伦9812彼得9801
罗恩9813罗恩9813
示例17列出了2A班的学生数据,并按居住地顺序显示。
从学生中选择姓名、id、班级、数据代码。
其中class="2A "按dcode排序
名称id类dcode
2A·HHM
2A·HHM
萨穆尔9714 2A时间
罗莎9703 2A SSP
海伦9702 2A TST
约瑟夫9715 2A TSW
宝拉9701 2A YMT
苏珊9704 2A YMT
例18找出每个区居住的学生人数,按降序显示。
SELECT COUNT(*)作为cnt,dcode FROM student
按DESC中心的代码顺序分组
(cannot)不能
文档代码
11 YMT
10 HHM
10 SSP
9 MKK
5 TST
2 TSW
1 KWC
1 MMK
1先令
例19列出各社团男性成员的姓名,并按班级顺序显示。(也就是社团和班级的两级顺序)
从学生中选择姓名、代码、班级;
其中sex="M" ORDER BY hcode,class
注意:这些行先按hcode排列(即第一层排列);并且以类顺序显示相同的hcode。
命名hcode类
警察
B 1A
泰迪B 1B
约瑟夫·2A
锡安·2B
莱斯利B 2C
约翰尼G 1A
卢克G 1A
凯文G 1C
乔治G 1C
: : :
: : :
五输出
INTO表tablename
将查询结果存储到数据库文件中。
进入光标温度
将查询结果临时存储在计算机的工作内存中。
到文件文件名[附加]
将查询结果存储为文本文件。(添加剂=附加)
将输出打印到打印机。
将屏幕输出到屏幕。
示例20根据学生姓名的降序列出所有学生的数据,并将结果存储为数据库文件名. DBF。
SELECT * FROM student
ORDER BY name DESC放入表name.dbf
注意:1)导入表名. dbf需要SQL程序将结果保存为文件。
2)此指令相当于数据库指令SORT。
SQL程序将结果存储为新的数据库文件名. dbf。
身份证明(identification)
名称出生日期性别类别mtest hcode dcode缓解
9707锡安07/29/85米2B 51 B MKK。
9709伊冯娜08/24/85 F 2C 10 R TST。
9804温迪07/09/86 F 1B 84b YMT F
MKK市,邮编:9865438
YMT,邮编:9805
2A 91 R HHM。
9816泰迪01/30/86M 1B 64 B SSP . f。
:
: : : : : : : :
示例21按级别、性别和姓名的顺序打印出红十字会成员的信息。
从学生中选择班级、姓名、性别;
其中hcode = " R
按班级、性别、DESC、打印机名称排序
注:1)这个指令要求程序先找出绿社成员,然后将这些列按照阶级、性别、姓名的顺序排列。
2) SQL程序先将查询结果临时存储在工作内存中,然后将结果输出到打印机。
班级
说出性别
1A
亚伦·M
1A
彼得·M
1A Ron M
1B为M
珍妮特·F
1B Kitty F
1B
咪咪F
: : :
3.数据库并、交、差
考虑两个结构相同的数据库文件A和B。
a和b的组合
(一)工会
检索属于a或b的所有行。
a和b的交集
十字路口
检查a和b共享的行。
a和b之间的区别
(A–B)difference获取只属于A而不属于B的行。(也就是说,B的一部分从A中排出)
挑选......从......在哪里......;
工会;
挑选......从......在哪里......
挑选......从表1;
其中col IN(从表2中选择col)
挑选......从表1;
其中列不在(从表2中选择列)
例如:桥牌俱乐部和象棋俱乐部
考虑学校桥牌俱乐部和象棋俱乐部的成员,他们的数据存储在同一个结构数据库文件bridge中。DBF和象棋。DBF分别为:
列名类型列宽内容
身份证号4学号
姓名字符10学生姓名
性别特征1性别:男/女
类别字符2类别
桥牌国际象棋
身份证姓名性别类别身份证姓名性别类别
1 9812亚伦M 1A 1 9802玛丽F 1A
2 9801彼得M 1A 2 9801彼得M 1A
3 9814肯尼M 1B 3 9815艾迪M 1B
4 9806 Kitty F 1B 4 9814肯尼M 1B
埃德蒙M 18乔治M 1C
: : : : : : : :
在使用SQL之前,请打开这两个数据库文件:
选择一个
使用桥
选择B
使用国际象棋
我们学校计划举办一次“棋桥活动”,棋社和桥牌社的成员都必须参加。试着按阶级和名字的顺序列出两个协会的成员。(即两会的联合)
SELECT * FROM bridge
工会;
SELECT * FROM chess
按班级排序,姓名入表党
注意:需要的是两个协会的所有成员,是两个协会的组合。
聚会
id名称性别类别
1 9812亚伦M 1A
2 9802玛丽F 1A
3 9801彼得M 1A
4 9815艾迪M 1B
5 9814肯尼M 1B
6 9806 Kitty F 1B
7 9818埃德蒙M 1C
8 9817乔治M 1C
: : : :
例23打印NPC和CPPCC的普通成员。(也就是两会的交集)
SELECT * FROM bridge
其中id IN(从chess中选择id);
至打印机
注意:在这种情况下,我们必须找出两个协会之间的共同成员。SQL程序必须检查桥牌俱乐部的每个成员是否也属于象棋俱乐部。如果属于,这个人符合这个要求。
普通的
id名称性别类别
1 9801彼得M 1A
2 9814肯尼M 1B
: : : :
例24找出只参加桥牌俱乐部的成员名单。(也就是两届的区别)
SELECT * FROM bridge
其中id不在(从国际象棋中选择id);
INTO表差异
注:1)这种情况下,不属于棋社的人必须从桥牌社中挑选。所以SQL程序必须使用FROM bridge,即逐个检查桥牌社成员是否属于棋牌社。如果不是,这个人符合这个要求。
2)“区别”是不对称的:如果要找出“只参加过棋社的会员名单”,结果会完全不同。
差速器
Id名称性别类别
1 9812亚伦M 1A
2 9806 Kitty F 1B
3 9818埃德蒙M 1C
: : : :
4.多个数据库
当查询的数据存储在两个数据库文件中时,需要一个连接。联接的功能是将一个数据库文件中的一行与另一个数据库文件中的一行联接起来,从而列出所有不同的组合。(数学:笛卡尔积)
天然接缝
*在关节中添加一个关节条件,要求两个齿轮的公共列的值相同。这叫自然关节。本文的目的是将这两个文件的相关信息合并成一个大的集成表,然后从这个表执行查询工作。
考虑以下两个数据库文件T1和T2:
SELECT a.comcol,a.col1,b.col2,expr1,expr2
从表1 a,表2b;
其中a.comcol = b.comcol
–在自然联接中,两个数据库文件中的一列必须相同,这称为公共列。SQL程序将首先列出这两个文件的所有组合,然后选择公共列值相同的行。
–A和B分别是table1和table2的代号,用来表示每一列所属的文件。
–表达式expr1,expr2可以使用表1和表2中的列。
例如:乐器类
学校规定每个学生都应该学一种乐器。现在,数据库文件音乐。DBF用于存储学生学习过的乐器名称(而学生的其他资料存储在STUDENT。DBF)。
列名类型列宽内容
身份证号4学号
类型字符10仪器名称
例25列出了所有学生的名字和他们学过的乐器的名字。
从学生s,音乐m中选择s.class,s.name,s.id,m . type;
其中s.id=m.id ORDER BY class,name
注:1)这里S代表student.dbf,M代表music.dbf。
2)啮合条件为s.id=m.id,即两个齿轮的排必须按照id啮合。
班级
名称id类型
1A亚伦9812钢琴
1A鲍比9811长笛
1A吉吉9824录音机
1A吉尔9820钢琴
1A约翰尼9803小提琴
卢克9810钢琴
1A玛丽9802长笛
: : : :
找出每个班学习钢琴的学生人数。
SELECT s.class,COUNT(*) FROM student s,music m;
其中s.id=m.id,m.type = " Piano
按类分组按类排序
注:在1)中,首先两个齿轮自然接合,接合条件s.id=m.id。
2)然后,SQL程序从连接的结果(以表格形式)中选择满足条件m.type="Piano "的行。
3)最后将SQL程序按类分组,统计类的数量。
类别计数
1A 4
1B 2
1C 1
外部接头
*外部啮合是自然啮合加上非匹配部分。
SELECT a.common,a.column1,b.column2,expr1,expr2
从表1 a,表2b;
其中a . com col = b . com col;
工会;
SELECT comcol,col1,nullval,nullval,null val;
从表1;
其中a.comcol不在(从表2中选择comcol)
–外部接头的说明由两个选定部分组成,这两个部分通过接头结合在一起。
–第一部分自然接合(即成功接合),第二部分未接合(即第一部分无法自然接合的行)。
–为了使第二部分的结构与第一部分相同,第二部分中没有数值的位置必须用空值填充,即空字符串"",数值零,逻辑值。f或空日期{//}。
例27列出了尚未选择乐器的学生的姓名。(即不匹配)
从学生中选择班级、姓名、id。
其中id不在(从音乐中选择id);
按类别、名称排序
注意:1)这个命令将从student.dbf中选择那些在另一个文件music.dbf中不匹配的行。
2)(从音乐中选择id)选择那些出现在数据库文件music.dbf中的id,因此条件id不在(...)可以检索不成对的行。
班级
姓名id
1A曼迪9821
1B肯尼9814
1B变为9805
1C埃德蒙9818
乔治9817
: : :
列出清单,检查所有学生学习的乐器。名单必须包括尚未参加乐器课的学生姓名。(即外部参与)
SELECT s.class,s.name,s.id,m . type;
斯图给的