重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
简单说:
成都创新互联公司专业为企业提供双湖网站建设、双湖做网站、双湖网站设计、双湖网站制作等企业网站建设、网页设计与制作、双湖企业网站模板建站服务,十余年双湖做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
html 是超文本标记语言,就是在浏览器上查看的内容均是通过转换成HTML标记的文本进行解析查看的。
php,asp,aspx 这些是动态的网页编程语言,用来动态控制程序进而生成HTML。
IIS apache 是用来执行网站程序的web服务器。
mysql sqlserver 是数据库软件 用于动态网站存储相关数据的载体。
他们的关系是:通过IIS 或者Apache 建立web服务器 用来执行通过php、asp、aspx等语言开发的具有后台数据管理的网站页面经过解析成HTML供浏览器输出。
Php (Hyprtext Preprocessor) 是一种HTML内嵌式的编程语言,它是一种在服务器端执行的嵌入HTML文档的脚本语言。PHP是开源的, 而且项目建设的成本很低, 而语言的编写方式上比起Java, C等强类型语言要自由和方便很多, 在WEB项目的开发上应用很广泛(如 网站项目, 游戏服务器端等)
MySQL是一种小型的 关系型数据库. 数据库对于项目来说提供数据存储,同时可以便于访问数据,计算数据。MySql也同样应用于此功能.
PHP+MySql 技术开发. 是说以PHP语言为技术实现主体, 以MySql作为数据存储/访问的 数据库管理系统, 来实现项目的建设与开发. (简单点说就是 用PHP语言,以MySql做为服务器,来开发项目)
这些都是关于PHP与MySql的基本介绍, 至于具体的技术,不是几句话能说明白的. 要系统的学习才可以, 不过这两种技术上手都很快.
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 Product)
自然接合
* 在接合中加上一项接合条件,要求两档的共通栏(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
数据库的定义可以查查专业的详细定义,直白一点儿就是存放数据的东西,不过不只是数据存放,也提供强大的信息处理功能。数据库支持的语言理论上是没限制的,关键是那种语言有没有提供该数据库的访问接口。
PHP,ASP 等都不是数据库,是编程语言,目前的数据库用的比较多的就是 MySQL,SQLSERVER,ORACLE
数据库管理系统软件:
1、OracleDatabase
知名的Oracle数据库,一直处于行业领先地位,是许多人认可的、世界上最流行的关系数据库管理系统。
作为“十大数据库管理系统排名榜”之首,Oracle数据库使用方便、功能强大,可扩展性强、数据安全性强,系统可移植性好、稳定性佳,适用于各类大、中、小微机环境。2019年,艾媒金榜发布“企业服务品牌之HRM系统排行榜”,Oracle数据库位列第一。
2、Navicat
Navicat是一套可创建多个连接的数据库管理工具,可以方便管理Oracle、MySQL、PostgreSQL等多个不同类型的数据库,并支持管理腾讯云、阿里云等云数据库。
整体而言,Navicat的功能可以满足专业开发人员的需求,同时对数据库服务器初学者来说又相对容易。曾有一项数据统计,《财富》世界500强中有超过100家公司使用了Navicat。
3、DBeaver
DBeaver是一个通用的数据库管理工具和SQL客户端,具有相对较高的易用性,并且免费、支持跨平台使用、允许扩展插件。
支持的操作系统包括Windows、Linux、MacOS、Solaris、AIX、HPUX;基本特性编辑:支持数据库元数据浏览,支持元数据编辑(包括表/列/键/索引),支持SQL语句和脚本的执行,支持SQL关键字高亮显示,简单友好的显示页面。
4、Mysql
MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL也是最好的RDBMS应用软件之一。
作为十大数据库管理系统之一,MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言;其软件采用双授权政策,分社区版、商业版,由于其速度快、体积小、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
5、PhpMyAdmin
phpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理系统软件,管理者可用Web接口管理MySQL数据库。
功能特性包括但不限于:支持大多数MySQL功能;从CSV和SQL导入数据,将数据导出为各种格式;以各种格式创建数据库布局的图形;使用逐例查询(QBE)创建复杂查询;使用一组预定义的函数将存储的数据转换为任何格式。
6、IBMDB2
DB2是IBM公司开发的关系型数据库系统,主要应用于大型应用系统,具有较好的可伸缩性,支持从大型机到单用户环境。
DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令。DB2可以在Windows、UNIX和Linux操作系统上运行,是最强大的十大数据库管理系统之一。
7、MSSQLServer
SQL Server是微软推出的关系型数据库管理系统,具有使用方便、可伸缩性佳、与相关软件集成程度高等优点,可跨平台使用。SQL Serve最初是由微软、Sybase 和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。
在Windows NT推出后,Microsoft与Sybase在SQL Server的开发上就分道扬镳了,Microsoft将SQL Server移植到Windows NT系统上,专注于开发推广SQL Server的Windows NT版本。Sybase则较专注于SQL Server在Unix系统上的应用。
8、ApacheCassandra
数据库管理软件哪个好?ApacheCassandra是一款优秀的分布式数据库软件。
该DBMS软件突出特点:一,模式灵活,使用时就像文档存储,用户不必提前解决记录中的字段,可以在系统运行时随意的添加或移除字段,最终提升效率。
二,具有纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台计算机,用户不必重启任何进程,改变应用查询,或手动迁移任何数据。三,多数据中心识别。
9、Redis
Redis是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL的数据库。
其主要特点:性能优秀,数据是存储在内存中,读写速度非常快,可支持并发10WQPS;可作为分布式锁;支持五种数据类型;支持数据持久化到磁盘;可以作为消息中间件使用等。数据缓存是Redis极其重要的一个场景。
10、Sybase
十大数据库管理系统排名榜中的Sybase,是一种典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。
Sybase还提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。
数据库管理系统软件(DBMS)有哪些呢?目前互联网上常见的数据库管理软件有SYBASE、DB2、ORACLE、MySQL、ACCESS、Visual Foxpro、MS SQL Server、Informix、PostgreSQL这几种。
数据库管理系统软件的种类有很多,常见的也很多,但是针对不同人群的不同需求,常用的数据库管理系统软件也那么三五种:ORACLE、MySQL、ACCESS、MS SQL Server这些是不同领域常用的数据库管理系统软件,下面我们来介绍一下这些软件各自的优势何在。