范文一:html语言入门教程
HTML语言入门教程(一)
第一课 基础
Html是英文 HyperText Markup Language 的缩写,中文意思是“超文本标志语言”,用它编写的文件(文档)的扩展名是.html或.htm,它们是可供浏览器解释浏览的文件格式。您可以使用记事本、写字板或 FrontPage Editor 等编辑工具来编写Html文件。Html语言使用标志对的方法编写文件,既简单又方便,它通常使用<标志名>标志名>来表示标志的开始和结束(例如标志对),因此在Html文档中这样的标志对都必须是成对使用的。
当我们畅游Internet时,我们透过浏览器所看到的网站,是由HTML (HyperText Markup Language) 语言所构成。HTML ( 超文件标记语言 ) 是一种建立网页文件的语言,透过标记式的指令 (Tag),将影像、声音、图片、文字等连结显示出来。
HTML标记是由 < 和=""> 所括住的指令,主要分为 : 单标记指令、双标记指令 ( 由 < 起始标记="">,< 结束标记="">所构成 ) 。HTML网页文件可由任何文本编辑器或网页专用编辑器编辑,完成后 ( 以 .htm
或 .html 为文件后缀保存 ) 将HTML网页文件由浏览器打开显示,若测试没有问题则可以放到服务器 (Server) 上,对外发布信息。
HTML文件基本架构
文件开始
标头区开始标头区结束
本文区开始本文区内容
本文区结束
文件结束
网页文件格式。
标头区 : 记录文件基本资料,如作者、编写时间。注意事项
通常一份HTML网页文件包含二个部份 :
... 标头区、 ... 本文区。而 和 代表网页文件格式。习惯上一个网站的首页名称通常订为 index.htm 或 index.html 这样只要浏览网站,浏览器便会自动的找出 index.htm 文件。
第二课 字体
如 :
标题
标题
如 :
标题
( 标题置中 )标题
... 粗体字。
如 : 粗体字
粗体字
... 斜体字。
如 : 斜体字
斜体字
... 横线 ( 表示删除 )。 如 : 横线
... 打字体 ( 固定宽度文字 )。 如 : 打字体
打字体
... 上标字。
如 : 字体 上标字
上标字字体
... 下标字。
如 : 字体 下标字 字体 下标字
注解 ( 不会显示在浏览器上 ),可以多行。
如 : 更新日期 : 2000/1/1>
第三课 表格
表格是html的一项非常重要功能,利用其多种属性能够设计出多
样化的表格。使用表格可以使你的页面有很多意想不到的效果,使页面
更加整齐美观。
常用表格标记
相关属性 :
?align 调整
?bgcolor 背景颜色
?border 边框
?height 高度
?width 宽度
相关属性 :
?align 调整
?align 调整
相关属性 :
?align 调整
?colspan 栏宽
?rowspan 栏高
相关属性 :
?align 调整
?bgcolor 背景颜色
?height 高度
?width 宽度
?colspan 栏宽
?rowspan 栏高
举例
如 : ( 基础型 )
太平洋网络学院 | 太平洋网络学院 |
太平洋网络学院 | 太平洋网络学院 |
太平洋网络学院 太平洋网络学院
太平洋网络学院 太平洋网络学院
如 : ( 加强型 ) 增加背景颜色、表格标题、栏标题、跨栏宽、跨栏高。
行标题 1 | 行标题 2 | |||
---|---|---|---|---|
列标题 1 | a | a | a | a |
b | b | b | b | |
列标题 2 | c | c | c | c |
d | d | d | d |
表格标题
行标题 1 行标题 2
a a a a
列标题 1
b b b b
c c c c
列标题 2
d d d d
第四课 标示
html提供许多种类的标示标记,作项目标示,而且可以作巢状式标示~
常用标示标记
标示项目。
如 :
第一项
第二项
1. 第一项
2. 第二项
- ...
如 :
第一项
第二项
i. 第一项
ii. 第二项
... 符号标示,可标示数字或英文、罗马字母。
如 :
第一项
第二项
, 第一项
, 第二项
定义项目。
定义资料。
... 定义标示。 如 :
十进制 :0、1、2、3、4、5、6、7、8、9
十六进制 :0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
十进制 :
0、1、2、3、4、5、6、7、8、9 十六进制 :
0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
巢状式标示
巢状式标示 如 :
- 第一章
- 第一节
第一段 第二
段
第二节
三章
1. 第一章
i. 第一节
, 第一段
, 第二段
ii. 第二节
2. 第二章
3. 第三章
其他标示标记
网络学院 :
新手上路
软件教室
设计教室
开发教室
网络学院 :
, 新手上路
, 软件教室
, 设计教室
, 开发教室
注意事项
标示项目符号也可以用... 标记,以符号字元 ( ?、
?、◎、?、?...等 ) 标示。
如 : ?
特殊符号 :
在html文件中,有些符号是代表特定的意义的。所以当我们要使
用这些特殊符号时,便要用替代指令。
符号 替代指令
" " 或 "
& & 或 &
< <="" 或="" <="">
> > 或 >
不可分空格  
第五课 区段标记
一个网站不仅要内容丰富外,也要有美观简洁的版面。html所提供
的区段标记功能,如果可以好好的利用也会有相当不错的效果。
常用区段标记
产生水平线。
如 :
跳下一行。
如 : 太平洋网络学院,
网上学电脑的好去处。
太平洋网络学院,
网上学电脑的好去处。
...
段落,跳下一行并加一行空白。 ( 可省略 )如 : 太平洋网络学院,
网上学电脑的好去处。
太平洋网络学院,
网上学电脑的好去处。
如 :
置中
如 :
太平洋网络学院,网上学电脑的好去处。
...以文件原始格式显示。
如 :
原始格式: 文件
原始格式: 文件
第六课 链接
链接可说是html中最重要的功能~因为html拥有链接的功能,使你能接上internet、www ??享受多姿多彩的网络世界。 基本上链接分成 :
外部链接——链接至网络的某个url网址或文件,可参考考网络链接方式。
内部链接——链接html文件的某个区段。
网络链接方式
网络链接方式 : //主机名称 / 路径 / 文件名称 网址 如 : http : //www.pconline.com.cn/ 文件传输 如 : ftp : //ftp.pconline.com.cn/ gropher 传输 如 : gropher : //gropher.net.cn/ 远端登入 如 : telnet : //bbs.net.cn/ 文件下载 如 : file : //data/html/file.zip net news 传输 如 : news : talk.hinet.net.cn e-mail 如 : mailto : pcedu@pconline.com.cn 常用链接标记
上位置或路径。
相关属性 :
?href 链接的url位址或文件
?target 指定链接到的url位址或文件显示于那一个视窗 ( 可和
视窗标记配合使用或开新的视窗 )
如 :
?
相关属性 :
?href 链接的url位址或文件
?name 名称
?target 指定链接到的url位址或文件显示于那一个视窗 ( 可和 视窗标记配合使用或开新的视窗 )
如 :
外部链接
? ?
第六课 链接
内部链接
?ch1.htm 文件
? ( 欲链接至html文件 a 点 )
? ( html文件 a 点 )
?ch2.htm文件
? (欲链接至ch1.htm 文件 a 点 ) " ? " 表示链接点,可以是文字或图案。( 即游标移到时,会变成手指形状的地方 )
链接指令 ( 用于head区,设定css文件 )。 储存应用资讯,可设定时间载入网页 ( 用于head区 )。
相关属性 :
?charset 设定
?content 回应表头资料内容 , 若是数字表示秒数
?http-equiv 回应表头 , 若设定为refresh载入url设定 ?url html位置
如 :
?设定中文自动跳行。
?设定十秒回到首页。 ( 若不设定html文件位置则再载入原html文件 )
设定链接、未链接部份颜色
设定链接、未链接部份颜色,用
...标记。 相关属性 :?alink按下链接部份未放开时颜色
?link未看过的链接部份颜色
?vlink已看过的链接部份颜色
如 :
第八课 设置图片
图片增加了网站版面的美观,不过也不要放了大量的图片,而拖慢网站传输的效率
有关设定图片的方法共有以下几种 :
1. 设定html文件背景图片、背景颜色。
...标记。:
... 或 如...2. 设定图片。标记。
3. 设定地图。标记。
常用图片标记
指令
相关属性 :
?align 调整
?alt 提示字
?border 边框
?height 高度
?src 文件或url位址
?usemap 地图名称
?width 宽度
如 : 可插入图片 ( gif、jpg格式 )、avi电影
align=top border=1>
地图
相关属性 :
?name 名称
设定地图动作区域
相关属性 :
?coords 设定动作区域座标 ( 左上角座标 : x1,y1 ; 右下角座标 :
x2,y2 )
?href 动作区域连结点 ( 可载入位址或文件 )
?nohref 动作区域连结点不动作
?shape 外型
举例
设定地图
第九课 加入声音
html不仅能插入图片,也可以载入midi音乐、wav 音效喔~
常用音乐标记
相关属性 :
?loop 循环 , 背景音乐播放次数 ?src 文件或url位址 (可为wav、midi格式 ) 如 :
?height 高度
?width 宽度 ( 可设百分比% ) ?src 设定内嵌物件的 url 位址 ?loop 循环 , 背景音乐播放次数 ?autostart 自动播放
如 :
loop=true>
第十课 滚动条
这是由ie提供的滚动条,可不要被众多的属性吓到了,越多的属性功
能越强喔~
【文字卷动标记】
文字卷动 ( 滚动条 )。 【相关属性】
?behavior = 设定卷动方式
-- alternate 交替来回卷动
-- scroll 卷动 ( 预设 )
-- slide 滑动
?bgcolor = color 背景颜色
?direction = 设定卷动方向
?height = n 高度
?loop = n 循环 , 卷动次数 ( 预设循环 ) ?scrollamount = n 设定卷动距离
?scrolldelay = milliseconds 设定卷动时间 ?truespeed = milliseconds 设定卷动速度 ?width = n 宽度 ( 可设百分比% )
【举例】
如 :
如 : 一 html的标签
table,tbody,tr,td 称为html的标签,以双标签的形式出现,所谓双
标签,也就是有一个
适用于其他的双标签。
一般标签都为双标签。标签最终所显示的网页效果由各个属性来表达,
属性可选择使用,不一定全部都用。在整个图片或帖子里双标签以首尾
呼应的方式出现。
cellpadding=0 cellspacing=0 bordercolor=#0000ff width="100%">
这里是图片,文字或帖子内容.
align="center" valign="top" background="myweb.gif"
bgcolor="#0000ff" bordercolor="#cf0000" bordercolorlight="#00ff00" bordercolordark="#00ffff">
width="400"
表格宽度,接受绝对值(如width=80)及相对值(width=80%)。
border="1"
表格边框的厚度,不同浏览器有不同的内定值。
cellspacing="2"
表格格线的厚度
align="center"
表格的摆放位置(水平),可选值为: left(居左), right(居右), center(居中)
valign="top".
表格内内容的对齐方式(垂直),可选值为: top, middle, bottom。
background="myweb.gif" 表格的背景图片,与 bgcolor 不要同用。
bgcolor="#0000ff"
表格的背景颜色,与 background 不要同用
bordercolor="#cf0000" 表格边框颜色
bordercolorlight="#00ff00" 表格边框向光部分的颜色
bordercolordark="#00ffff" 表格边框背光部分的颜色,使用 bordercolorlight 或 bordercolordark 时 bordercolor 将会失效。 播放器宽度width和高度height的值根据需要自定 二 帖图格式
帖图基本代码如下:
称图形标记,主要用来插入图形标记。
三 文字设制
基本代码如下:
插入文字
align=center 表示字体居中,可选值为居右(right)居左(left) color=颜色代码
face=字体 常用字体为:宋体.黑体.楷体.仿宋.幻缘.新宋体.细明体等
size=字体大小,这里的最大值为7 取值越大文字就越大 四 加入音乐
常用属性如下:
src="your.mid"
设定 midi 档案及路径,可以是相对或绝对。
autostart=true
是否在音乐档下载完之后就自动播放。true 是,false 否 (内定值)。
loop="true"
是否自动反复播放。loop=2 表示重复两次,true 是, false 否。 hidden="true"
是否完全隐藏控制画面,true 为是,no 为否 (内定)。 starttime="分:秒"
设定歌曲开始播放的时间。如 starttime="00:30" 表示从第30秒处开始播放。
volume="0-100"
设定音量的大小,数值是0到100之间。内定则为使用系统本身的设定 width="整数" 和 high="整数"
设定控制面板的高度和宽度。(若 hidden="no")
align="center"
设定控制面板和旁边文字的对齐方式,其值可以是 top、bottom、center、baseline、 left、right、texttop、middle、absmiddle、absbottom
controls="smallconsole"
设定控制面板的外观。预设值是 console。
console 一般正常面板
smallconsole 较小的面板
playbutton 只显示播放按钮 pausecutton 只显示暂停按钮 stopbutton 只显示停止按钮 volumelever 只显示音量调节按钮 贴音乐的完整语法如下:
一: 隐藏播放器
二: 不隐藏播放器
入门
HTML>
网页的内容.......
例1-1
当你点开任何网页的源文件的时候,相信都可以在长长的字符中寻找到上面这些单词,或者你现在把上面这些单词复制到你新建的文档文件中,保存之后把后缀名改成.html,一个网页就诞生了。这就是HTML语言,它不象C++,VB等等程序语言要你摸不清头脑,HTML语言只是一个在SGML定义下的描述性语言,或者说是标识语言。
既然是标识语言,我们就从标识开始进行学习好了,也许当你完全掌握标识之后,就会发现基本上已经明白什么是HTML了。
标识的写法:
1.任何标识都应该写在"<"和">"之间,如
2.标识的字母没有大小写的区分。
3.在起始标识中加入“/”就是终止标识,一般情况下有起始表示就有终止标识。例如...
4.有的标识需要加入参数,有的不必,需要注意的是这些参数只能加在起始标识中。
现在我们开始认识第一类标识:文件标识
事实上你已经见过了这些标识,没错就是 ;
; ;.....
这段标识告诉浏览器现在运行HTML文件,所以你写HTML文件都应该以开头,.
.....这是HTML文件的开头部分,相应的
这里的文字就成了你所建立页面的标题,你可以更改一下例1-1中非标记部分。 这些标记就构成了HTML的基本构架,其中只有
具有参数设定,我们就通过一个例子还认识好了leftmargin= topmargin= bgproperties="fixed">
text=""
用以设定文字颜色。
link=""
设定一般文字连结颜色。
alink=""
设定刚按下时文字连结颜色。
vlink=""
设定连结后的颜色。(被按过)。
background=""
设定背景墙纸。
bgcolor=""
设定背景颜色。
leftmargin=
设定整份文件显示画面的左方边沿空间,单位为像素。
topmargin=
设定整份文件显示画面的上方边沿空间。
bgproperties="fixed"
固定背景墙纸,当卷动文字时墙纸不会跟著卷动。
这里需要说明的是色彩的问题,色彩是用 16 进制的 红,绿,蓝(red-green-blue, RGB) 值来表示的,所以一个颜色也就由RRGGBB的格式构成,而16 进制的数码有: 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f.
#000000, 其中红=00,蓝=00,绿=00,色彩即为黑色
#0000FF,其中红=00,绿=00,蓝=ff,色彩即为蓝色
如果你想深入了解色彩的问题,你可以查看诸如FLASH等等软件的色彩表. 首先我们看, 这两个标识都是用于控制字体的大小,色彩,字体,但 而只应用与之间,之间,控制全文的文字; 控制在它选择范围中的文字.两个标识出现在一个html文件中的时候,没有被选择的文字才会受到 下面我们就来看一个例子: color="#000000"> 欢迎来到H.S Workshop [例2-1] 我们看到 face= 设定字体。 size= (1,2,3,4,5,6,7,-x,+x) 设定字体大小,这里需要注意的是相对值和绝对值,我们在例2-1中,把的size的值改成"-2"你会发现效果是一样的,相应的把 color= 设定文字色彩. 这里我们还发现了一个问题, 接下来看 这是一个标题标识,从1到6替减,是一个围堵标识,我们需要注意的是这个标识独占一行并自动插入一个空行,你可以自己尝试一下,这里就不举例说明了。 : 这是对文字进行一些特殊处理的标识,我们就来看看他们的效果来进行学习好了. 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 你是否已经了解了呢,这些就是HTML实现字体特殊效果的标识,唯一特别的是,可以不用插入 昨天我们已经认识了文字标识,为了让整个网页更清晰美观,我们就不可以少了排版标识,那么现在就要我们开始来认识他们吧。 现在比较讲知识产权,呵呵~我们就先来看看如何告诉别人这是你的产权好了,当然我们还可以用它来告诉你的工作伙伴,这段开始是什么,那就是 HTML和其他的程序语言一样,可以在代码中添加注释,来告诉别人这里开始写的是什么,当然这也是告诉自己,方便以后的管理,不过你放心,这只存在于你的原代码中,不会在浏览器中发生任何影响。 现在我们开始认识对段落控制的标识, , 我们可以把他看做一个空行标识,既在网页中显示一段空白行,一般在DW或者FG等网页编辑工具中,回车即在HTML插入一个 ,这也是一个空标记,他的常用参数是 align="#"(#=right, left, center) 分别表示左对齐,右对齐,居中。默认值为left. 实现一下下面的例子你就明白了: H.S Wrokshop H.S Wrokshop H.S Wrokshop H.S Workshop [例3-1] 这两个标记分别表示换行和不换行,前者使网页中的元素直接在下一行,不插入 换行,对于一些必须在一行中显示的文字,对电话号码等空行,后者则表示不 等的显示比较有用。这里的 这时候我们就要通过一个另一个标识来实现对齐效果,....,当然这个标识有它更广泛的用途,在这里只简单的提一下其中的对齐参数运用。下面我们就来看一个简单的例子。 H.S Workshop Workshop [例3-2] 这样一来我们就可以实现对 现在我们把align=""的三个值提出来,发现他们其实自身也是标识,它们可以对单个,单行文字进行围堵,实现他的效果,这样又多了一个途径实现 这里把它从换行中分出来,是想大家于 预格式化文本标识,他们允许你在HTML原文件里输入空白,并显示出和你在HTML 编辑的一模一样的格式,区别就在 Please use your card. VISA Master Here is an order form. Fax Air Mail Please use your card. VISA Master Here is an order form. Fax Air Mail Please use your card. VISA Master Here is an order form. Fax Air Mail 大家可以自己看看三者的效果。 今天的最后一个标识称为水平线。顾名思义,它实现插入一条水平线的效果。 设定线条置放位置,可选择:left;right;center 三种设定值。 size= 设定线条厚度,以像素作单位. width= 设定线条长度,可以是绝对值(以像素作单位)或相对值,默认值为 100%。 color= 设定线条颜色,内定为黑色. noshade 设定线条为平面显示,若删去则具阴影或立体,这是默认值。 通过这三天的学习,你是否可以运用已知的标识写出一个网页了呢,呵呵~这就开始尝试一下吧. 今天我们学习的只有一个标识,重点并不在这个标标识本身,而在于这个标识的参数设置,现在我们就来认识一下吧。 图形对于一个网页来说其占的位置尽次于文字所占的比重,我们同过这个标识在网页中加入一张图片做到图文并茂,它只是一个空连接,现在我们就来看看它的参数设定。 lowsrc=""> src= 首先我们必须向HTML中导入一张图片,这张图片的格式可以是jpg,gif或者png,同时我们还要注意导入图片的途径书写,当你要求导入的图片和显示此图的html在同一个文件夹下,我们就可以只写文件名即可,如则需要完整的途径表示。 width=,height= 设定图象显示的大小,以象素为单位,不过一般情况下为了保持页面的美观,我们使用真实的大小为佳,通过专业的图形编辑工具来编辑图形的大小。 border= 设定图象边框的大小,单位也是象素,它可以是任何数值,在现代网页编辑中通常取值为1。 hspace=,vspace= 设定图象边缘的空白数,hspace设定左右,vspace设定上下,这样可以确保其他元素与图片的距离。 align=(top, middle, bottom, left, right)默认值为 botom 这个参数昨天我们已经讲过,在这里我们我们需要注意的是它的作用是控制文字的位置,具体的运用我们就通过这下面的例子来看看好了. alt= 在图片显示的位置插入一段文字,当图片还没有被读取或这浏览者使用的是文字游览器的时候,这段文字就会显示出来。 lowsrc= 同样在显示src所显示的图片之前先显示出一张图片,条件也是在src还没有被读取的时候,一般我们用于显示原图片的缩略图,使浏览者不会因为图片读取慢而失去浏览的兴趣。 表格在网页排版中所占的比重不用说相信大家也都知道,它把整个页面清晰的分成多个区域。专业的网页怎么可以少了对表格的操作呢~现在我们就来看看关于表格的标识。 首先我们必须建立一个表格,我们可以通过 valign="" background="" bgcolor="" bordercolor="" bordercolorlight="" bordercolordark="" cols="" rules="" frame=""> windth= 设定表格的宽度,一般来说在这层我们只需要指定一个表格的宽度就可以了。这个值可以是绝对的也可以是相对的。 border= 设定表格边框的厚度,当取值为0时或者不用这个参数的时候,表格就不在浏览器中显示出来,但表格中的元素仍然是按表格排列。 cellspacing= 表格线的厚度,为了和border=区别开来,我们看个例子 [例5-1] 比较一下这两个例子,我们就可以很清晰的看到两个例子的不同. cellpadding="" 文字和格线之间的距离,使文字看起来更清晰。 align=""(left, right, center) 这个值在前面我们已经重复的介绍过了,这里是对表格的位置进行水平位置设定. valign=""(top, middle, bottom) 这是对表格垂直位置的设定. background="" 导入表格的背景图片。 bgcolor="" 设定表格的背景颜色。 bordercolor="" 设定表格的边框颜色。(注意,当设定border=为0时,这个值无效) bordercolorlight="" 设定表格边框向光部分的颜色. bordercolordark="" 设定表格边框背光部分的颜色. cols="" 表格栏位数目,只是让浏览器在下载表格是先画出整个表格而己. frame=""(box,above,below,hsides,vsides,lhs,rhs,void) 显示边框,参数的含义依此是:显示所有边框,只显示上边框,只显示下边框,只显示上下边框,只显示左右边框,只显示左边框,只显示右边框,不显示任何边框. rules=""(all,groups,rows,cols,none) 显示分隔线,参数的含义依此是:显示所有分隔线,只显示组与组之间的分隔线,只显示行与行之间的分隔线,只显示列与列之间的分隔线,不显示任何分隔线。 建立了一个表格区,接着我们就要把这个表格分开,那么就必须用到 [例5-2] 现在我们就来看看 bordercolordark=""> align=""(left, right, center) 这就不多说了。水平位置的设定. valign=""(top, middle, bottom) 垂直位置的设定琀?瑧?瑬;开嫞??????。 bgcolor="" 这一列的背景色。 bordercolor="" 这一列的边框颜色 。 bordercolorlight="" 这一列的向光部分. bordercolordark="" 这一列的背光部分. 有了列,就要开始设定单元格,可以说单元格就是一个表格的最小单位。我们用过 bgcolor="" bordercolor="" bordercolorlight="" bordercolordark="" background=""> windth="" 通过相对值或绝对值设定这个单元格的宽. height="" 通过相对值或绝对值设定这个单元格的高. colspan="" rowspan="" 这里我们看一个例子来说明一下好了. align="CENTER"> 第一列第一栏之 第二栏及第三栏 第一列 第二列及第三列 之 第一栏 第二列第二栏 第二列第三栏 第三列第二栏 第三列第三栏 [例5-3] 同过标识,我们看到这实际上是个三列三行的表格,如果只看第一行第一列是不是认为这是两行两列的呢。没错,colspan就是向右合并单元格,rowspan则是向下合并单元格. align=""(left, right, center) 元素水平位置设定. valign=""(top, middle, bottom) 元素垂直位置设定. background="" 导入单元格的背景图片。 bgcolor="" 设定单元格的背景颜色。 bordercolor="" 设定单元格的边框颜色。(注意,当设定border=为0时,这个值无效) bordercolorlight="" 设定单元格边框向光部分的颜色. bordercolordark="" 设定单元格边框背光部分的颜色. 另一个单元格表示 今天最后一个标识 我们把他来给表格内容命题。关于它的参数有两个,分别是align和valigan,(left, right, center,top, middle, bottom) ODY> 标签的分析: cellspacing:单元格间距。当一个表格有多个单元格时,各单元格的距离就是cellspacing了,如若表格只有一个单元格,那么,这个单元格与表格上、下、左、右边边框的距离也是cellspacing。 width:表格的宽度。取值从0开始,默认以像素为单位,与显示器的分辨率的像素是一致的。800×600的显示分辨率下,如果表格设置成1000个像素的宽度,那么,得出的效果将导致IE的横向滚动条出现,只有通过滑动它才能看到表格最右边的内容,所以建议在设置表格的宽度时充分考虑显示分辨率问题。width的取值还可以使用百分比,如widht="100%",这种赋值法有个好处:表格的宽度将根据可显示的宽度来自我调整宽度。 background:表格的背景图。其值为一个有效的图片地址。 1:borderColorDark=#0d1737 暗边框,颜色为0d1737 当border值不为0时设置有效。暗边框指表格的右边和下边的边框。 2:borderColorLight=#24387a 亮边框,颜色为24387a 当border值不为0时设置此值有效。亮边框指表格的左边和上边的边框。 3:cellpadding:单元格衬距。指该单元格里的内容与cellspacing 区域的距离,如果cellspacing为0,则表示单元格里的内容与表格周 边边框的距离。 SQL语言入门教程 (1)介绍SQL SQL(Structured Query Language,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。使用SQL的常见关系数据库管理系统有:Oracle、 Sybase、 Microsoft SQL Server、 Access、 Ingres等等。虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统。但是,标准的SQL命令,比如"Select"、 "Insert"、 "Update"、 "Delete"、 "Create"和 "Drop"常常被用于完成绝大多数数据库的操作。 但是,不象其它的语言,如C、Pascal等,SQL没有循环结构(比如if-then-else、do-while)以及函数定义等等的功能。而且SQL只有一个数据类型的固定设置,换句话说,你不能在使用其它编程语言的时候创建你自己的数据类型。 SQL功能强大,但是概括起来,它可以分成以下几组: DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据; DDL(Data Definition Language,数据定义语言): 用于定义数据的结构,比如 创建、修改或者删除数据库对象; DCL(Data Control Language,数据控制语言):用于定义数据库用户的权限。 DML组可以细分为以下的几个语句: SELECT:用于检索数据; INSERT:用于增加数据到数据库; UPDATE:用于从数据库中修改现存的数据 DELETE:用于从数据库中删除数据。 DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令: CREATE TABLE ALTER TABLE DROP TABLE CREATE INDEX DROP INDEX DCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令: ALTER PASSWORD GRANT REVOKE CREATE SYNONYM 为了让你对SQL有一个直观的认识,下面先给出一个简单SQL语句的例子: 我们使用SQL语句来从Employees中检索Department ID为CS的姓名: SELECT Employees.Name FROM Employees WHERE Employees.DeptID = "CS" 可能你现在一开始不太理解这些语句,也许你会一头雾水,不要紧的,通过本教程的学习后, 你会发现这段语句是多么的普通。为了不让你困惑,下面我也进行一番解释: 先对FROM子句吧,语句中的FROM Employees意思是从Employees表中检索数据。 而语句WHERE Employees.DeptID = "CS"意思是检索Employees的DeptID列为”CS”的行,这样SQL语句检索的结果将是DeptID为CS的列的所有数据,比如: EmpID Name Dept 123 Purple CS 124 Zsc CS 最后,我们来解释一个SELECT子句,它指定了从Name列检索来的所有数据,比如 Name Purple Zsc 好吧,开始我们下一节的教程-------表的基本知识。 (2)表的基础知识 关系数据库通常包含多个表。数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的。表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象。例如,一个公司数据库中,会有雇员表、部门表、库存表、销售表、工资表等等。我们经常见到的成绩表就是一种表,它是有行和列组成的,我们并且可以通过名字来识别数据。列包含了列的名字、数据类型以及列的其它属性;行包含了列的记录或者数据。下面给出一个成绩单,其中姓名、语文、数学、英语都是列,而行包含了这个表的数据,即每个人的各科成绩: 姓名 语文 数学 英语 78 100 87 王小童 85 92 95 张柳风 65 89 86 紫云飞 98 67 75 黄天龙 (3)数据检索 在SQL中SELECT语句通常用于检索数据库,或者检索满足你设定条件的数据,以下是简单的SELECT语句的格式: select "column1"[,"column2",etc] from "tablename" [where "condition"]; [] = optional 其中列的名字跟着SELECT关键字,它决定了哪一列将被作为结果返回。你可以任意指定多个列,或者你可以使用"*"来选择所有的列。 表的名字是紧跟着FROM关键字的,它指出了哪个表格将作为最后结果被查询。 而WHERE子句(可选)指出哪个数据或者行将被返回或者显示,它是根据关键字WHERE后面描述的条件而来的。 在WHERE子句中可以有以下的条件选择: = 等于 > 大于 < 小于=""> >= 大于等于 <= 小于等于="">=> <> 不等于 LIKE 参见以下注释 注释:LIKE 模式匹配操作符同样可以使用在WHERE子句的条件条件中。LIKE是一个功能强大的操作符,它可以让你选择你"喜欢"指定的行。百分号"%" 可以被用来匹配任何可能的字符,它可以出现在指定字符的前面或者后面,例如: select first, last, city from empinfo where first LIKE 'Er%'; 以上这条SQL语句将会匹配任何名字以'Er'开始的名字,这里必须使用单引号。 或者你也可以使用"%"在字符的前面,例如: select first, last from empinfo where last LIKE '%s'; 这条SQL语句将会匹配任何名字以's'结尾的名字。这个"%"的作用就跟DOS命令的","号很相似。 select * from empinfo where first = 'Eric'; 以上的SQL语句只选择first名字为'Eric'的行。 (4)创建表 这个create table语句是用于创建一个新的表格。以下是一个简单创建表格语句的格式: create table "tablename" ("column1" "data type", "column2" "data type", "column3" "data type"); 如果你想使用可选的约束,创建表格的格式为: create table "tablename" ("column1" "data type" [constraint], "column2" "data type" [constraint], "column3" "data type" [constraint]); [ ] = optional 这里注意:你可以任意创建多列的表格,这个条件是可选的。 为了更好的理解,下面举个例子: create table employee (first varchar(15), last varchar(20), age number(3), address varchar(30), city varchar(20), state varchar(20)); 为了创建一个新表格,你可以在关键字create table之后跟着表的名字,然后一个圆左括号”(”,然后是第一列的名字,再是这一列的数据类型,接着是任意的可选约束,最后是圆右括号”)”。确保在开始表格内容之前使用圆左括号并且在表的最后一列定义之后使用圆右括号是相当重要的。你还要保证每一个列定义之间有逗号分隔。最后在SQL语句结束时候加上分号";"。 表格和列名必须以字母开头,第二个字符开始可以是字母、数字或者下划线,但是要保证名字的总长度不要超过30个字符。在定义表格和列名不要使用不要使用SQL预定的用于表格或者列名的关键字(比如"select"、"create"、 "insert"等等),以避免错误的发生。 数据类型是指在特定的列使用什么样数据的类型。如果一个列的名字为"Last_Name",它是用来容纳人名的,所以这个特定列就应该采用"varchar" (variable-length character,变长度的字符型) 数据类型。 以下是几种常见的数据类型: char(size) :固定长度的字符串型。Size是圆括号中指定的参数,它可以由用户随意设置,但是不能超过255个字节。 varchar(size) :变长度的字符串型。它的最大长度是由括号中的参数size设定的。 number(size):数值型。最大数字的位数由括号中的参数size设置。 date :日期数值型。 number(size,d) :数值型。它的最大数字的位数由括号中的参数sieze设定,而括号中的参数d是设置小数点的位数。 什么是约束呢,当表被创建的时候,可以一列也可以多列共用一个约束。约束是一个跟列有关的基本准则,返回的数据必须遵循这个准则。下面举个例子,一个约束指定在一列中不能有两个记录共用一个数值。它们必须单独的。其它两个流行的约束是:"not null",它设置了列不能留空白,即一定要有数据;以及"primary key"(主键),主键约束定义了表中每一个记录(或行)的唯一标识。所有的这些将在以后的教程中再作进一步阐述。 好吧,也许你已经有跃跃欲试的冲动了。作为本节练习,下面我们自己来设计和创建表格。 你可以开始创建一个公司的雇员表格。你需要创建一个包含firstname、lastname、 title、 age和 salary的表格。 (5)插入数据到表 Insert语句用于往表格中插入或者增加一行数据,它的格式为: insert into "tablename" (first_column,...last_column) values (first_value,...last_value); [] = optional 简单举个例子: insert into employee (first, last, age, address, city) values ('Luke', 'Duke', 45, '2130 Boars Nest', 'Hazard Co'); 这里要注意:每一个字符窜都要用单引号括起来。 为了往表中插入数据,要在关键字insert into之后紧跟着表名,然后是左圆括号,接着是以逗号分开的一系列的列名,再是一个右圆括号,然后在关键字values之后跟着一系列用圆括号括起的数值。这些数值是你要往表格中填入的数据,它们必须与指定的列名相匹配。字符串笔译用单引号括起来,而数字就不用。在上面的例子中,'Luke'必须与列first相匹配,而45必须与列age相匹配。 假如你想往employee表格中插入以下数据; Zhang Weiguo,28,北京601信箱,北京 那么你要使用以下的SQL语句: insert into employee (first, last, age, address, city) values (' Zhang', ' Weiguo' ,28, '北京601信箱', '北京'); (6)删除表 Drop table命令用于删除一个表格或者表中的所有行。其语法格式为: drop table "tablename" 下面举个例子: drop table employee; 为了删除整个表(包括所有的行),可以使用drop table命令后加上tablename。Drop table命令跟从表中删除所有记录是不一样的: 删除表中的所有记录是留下表格(只是它是空的)以及约束信息;而drop table是删除表的所有信息,包括所有行、表格以及约束信息等等。 (7)更新记录 Update语句用于更新或者改变匹配指定条件的记录,它是通过构造一个where语句来实现的。其语句格式如下: update "tablename" set "columnname" = "newvalue"[,"nextcolumn" = "newvalue2"...] where "columnname" OPERATOR "value" [and|or "column" OPERATOR "value"]; [] = optional 下面举个例子来说明: update phone_book set area_code = 623 where prefix = 979; 以上语句是在phone_book表中,在prefix=979的行中将area_code设置为623。 update phone_book set last_name = 'Smith', prefix=555, suffix=9292 where last_name = 'Jones'; 而以上的这段语句是在phone_book中,在last_name= 'Jones'的行中将last_name 设置为 'Smith', prefix为555, suffix为9292。 update employee set age = age+1 where first_name='Mary' and last_name='Williams'; 这段语句是在employee表中,在first_name='Mary' 和last_name='Williams'的行中将age加1。 作为每课一练,你在结束本教程之后要好好作以下的练习: 1 因为Jonie Weber 已经跟Bob Williams结婚,所以它需要将它的last名更新为Weber-Williams。 2 Dirk Smith的生日是今天,所以他的年龄应该加1。 3 所有的秘书都叫做"Administrative Assistant".所以要将所有的标题标题都相应地修改。 就作这几个练习,千万不可大意哟。 (8)删除记录 Delete语句是用来从表中删除记录或者行,其语句格式为: delete from "tablename" where "columnname" OPERATOR "value" [and|or "column" OPERATOR "value"]; [ ] = optional 下面还是举个例子: delete from employee; 这条语句没有where语句,所以它将删除所有的记录,因此如果没有使用where的时候,要千万小心。 如果你只要删除其中一行或者几行,可以参考以下的语句: delete from employee where lastname = 'May'; 这条语句是从emplyee表中删除lastname为'May'的行。 delete from employee where firstname = 'Mike' or firstname = 'Eric'; 这条语句是从emplyee表中删除firstname为'Mike'或者'Eric'的行。 为了从表中删除一个完整的记录或者行,就直接在"delete from"后面加上表的名字,并且利用where指明符合什么条件的行要删除即可。如果你没有使用where子句,那么表中的所有记录或者行将被删除。 (9)SELECT语句 在上面的教程中已经有用到SELECT语句。在本节教程中将详细对它进行阐述。SELECT语句是SQL的核心,在你的SQL语句中可能用的最多的就是SELECT语句了。由于大量的选项可以用于SELECT语句,所以整个教程好象就是围这SELECT语句转。当我们构造SQL查询语句(利用了SELECT语句)的时候,认识所有的可能选项和最好的或者最有效率的方法来实现是很有用的。这个教程将为你提供这些技能。 SELECT语句用于查询数据库并检索匹配你指定条件的选择数据。SELECT语句有五个主要的子句子你可以选择,而FROM是唯一必须的子句。每一个子句有大量的选择项、参数等等。这些子句将罗列在下面,而且它们每一个都将在以后的教程有更为详细的描述。 以下是SELECT语句的格式: SELECT [ALL | DISTINCT] column1[,column2] FROM table1[,table2] [WHERE "conditions"] [GROUP BY "column-list"] [HAVING "conditions] [ORDER BY "column-list" [ASC | DESC] ] 下面举个例子: SELECT name, age, salary FROM employee WHERE age > 50; 上面的这个语句将从employee表中选择age大于50的所有的name、age和salary列的数值。 注意:一定要在SQL语句末尾加上一个分号。这个分号提示SQL语句已经结束并准备被解释。 以下的表格给出了各种比较运算符号: = 等于 > 大于 < 小于=""> >= 大于等于 <= 小于等于="">=> <> 不等于 LIKE 字符串比较测验 举个例子吧: SELECT name, title, dept FROM employee WHERE title LIKE 'Pro%'; 上面的语句是从employee表中选择title是以'Pro'为开头的name、title和dept列中的所有行或者数值。 另外ALL和DISTINCT也是SQL中的关键字,它们用于在你的查询结果中选择ALL(缺 省)或者"distinct"或者单一记录。如果你想在指定的列中检索单一记录,你可以使用"DISTINCT" 关键子。 因为DISTNCT 将会丢弃所有你在SELECT指定的列复制的记录,比如 : SELECT DISTINCT age FROM employee_info; 这条语句将返回所有在employee_info表中单一的age数据。 而ALL就将显示所有指定的类,包括所有的复制数据。在没有指定的时候,这个ALL关键字是缺省的。 (10)合计函数 所有的合计函数如下表所示: MIN 返回一个给定列中最小的数值 MAX 返回一个给定列中最大的数值 SUM 返回一个给定列中所有数值的总和 AVG 返回一个给定列中所有数值的平均值 COUNT 返回一个给定列中所有数值的个数 COUNT(*) 返回一个表中的行数 合计函数用于从SELECT语句中计算一个”返回列的数据”。它们是总结了所选数据列的结果。虽然它们需要"GROUP BY"子句(后面一个教程介绍),但是这些函数也可以在不用使用"GROUP BY"子句的情况被使用,比如 : SELECT AVG(salary) FROM employee; 这条语句将返回单一的结果,它包含了从employee表中所有salary列数据的平均值。为了更好的理解,我们再举个例子: SELECT AVG(salary) FROM employee; WHERE title = 'Programmer'; 以上这条语句将返回employee表中所有title列为'Programmer'的数据的平均值。 下面的例子中使用的语句跟其它合计函数有点不用,因为没有一个类被指定给COUNT函数。这条语句实际上将返回employee表的行数,如下: SELECT Count(*) FROM employees; 最后给出本节教程的配套练习: 1)作一个公司的销售表items_ordered,里面有price、product和amount。 从items_ordered表中选择price最大的数据。这里提示:使用MAX函数。 2) 计算items_ordered表中的行数。 (11)GROUP BY子句 GROUP BY子句 首先讲讲GROUP BY 子句语法: SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list"; 这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦: 假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句: SELECT max(salary), dept FROM employee GROUP BY dept; 这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。 (12)HAVING子句 HAVING子句 下面先给出HAVING子句的语法: SELECT column1, SUM(column2) FROM "list-of-tables" GROUP BY "column-list" HAVING "condition"; 这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。 下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句: SELECT dept, avg(salary) FROM employee GROUP BY dept; 当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句: SELECT dept, avg(salary) FROM employee GROUP BY dept HAVING avg(salary) > 20000; (13)ORDER BY子句 ORDER BY子句 ORDER BY子句的语法为: SELECT column1, SUM(column2) FROM "list-of-tables" ORDER BY "column-list" [ASC | DESC]; [ ] = optional ORDER BY是一个可选的子句,它允许你根据指定要order by的列来以上升或者下降的顺序来显示查询的结果。例如: ASC = Ascending Order – 这个是缺省的 DESC = Descending Order 下面举个例子: SELECT employee_id, dept, name, age, salary FROM employee_info WHERE dept = 'Sales' ORDER BY salary; 这条SQL语句将从employee_info表中列dept等于'Sales'选择employee_id,、dept、 name、 age和 salary,并且根据他们的salary按升序的顺序来列出检索结果。 如果你想对多列排序的话,那么在列与列之间要加上逗号,比如 : SELECT employee_id, dept, name, age, salary FROM employee_info WHERE dept = 'Sales' ORDER BY salary, age DESC; (14)组合条件和布尔运算符 以下的SQL语句中就含有组合条件: SELECT column1, SUM(column2) FROM "list-of-tables" WHERE "condition1" AND "condition2"; AND运算符可以在WHERE子句中连接两个或者多个条件。AND条件的两旁必须都为true(真),即两个条件都同时满足的时候,这些行才将被显示。 当然,你也可以使用OR运算符,它也可以在WHERE子句中连接两个或者多个条件。但是,只要OR运算符两旁有一个为true的时候条件就满足了,因此行才会被显示。所以你使用OR运算符的时候,可以是OR运算符两旁只有一个为true或者两旁都为true。 下面举个例子吧: SELECT employeeid, firstname, lastname, title, salary FROM employee_info WHERE salary >= 50000.00 AND title = 'Programmer'; 这条SQL语句是从employee_info表中选择salary大于等于50000.00并且title等于'Programmer'的列employeeid、 firstname、 lastname、 title和 salary。此时必须AND运算符两旁的条件都为真,行才会最为检索结果返回。如果其中有一个条件为假,那么就什么都没有显示。 你可以使用圆括号将条件括起来,虽然它们也不一定是必须的,但是括起来看起来更清晰一些,这是一个编程习惯的问题。比如 : SELECT employeeid, firstname, lastname, title, salary FROM employee_info WHERE (salary >= 50000.00) AND (title = 'Programmer'); 下面再举个例子: SELECT firstname, lastname, title, salary FROM employee_info WHERE (title = 'Sales') OR (title = 'Programmer'); 这条语句将从employee_info表中选择title等于'Sales'或者等于'Programmer'的列firstname、 lastname, title和 salary。 (15)IN 和 BETWEEN 条件运算符 下面是IN条件运算符的SQL语句: SELECT column1, SUM(column2) FROM "list-of-tables" WHERE column3 IN (list-of-values); 下面是BETWEEN条件运算符的SQL语句: SELECT column1, SUM(column2) FROM "list-of-tables" WHERE column3 BETWEEN value1 AND value2; 实际上,IN条件运算符是一个设置成员测试运算符,也就是说,它用于测试是否一个数值处在IN关键字之后提供的数值之中。举个例子如下: SELECT employeeid, lastname, salary FROM employee_info WHERE lastname IN ('Hernandez', 'Jones', 'Roberts', 'Ruiz'); 这条语句是从employee_info表中选择lastname等于Hernandez、Jones、 Roberts或者 Ruiz lastname和 salary。如果它在其中就将返回行。 名字之一的列employeeid、 IN条件运算符可以使用混合条件来替代,比如你可以使用等号运算符或者使用OR运算符等等,但是结果是一样的,例如: SELECT employeeid, lastname, salary FROM employee_info WHERE lastname = 'Hernandez' OR lastname = 'Jones' OR lastname = 'Roberts' OR lastname = 'Ruiz'; 你可以观察到,利用IN运算符时语句会更加简短并且容易读,特别是在你测试两个或者三个数值以上的时候尤为突出。 当然你也可以使用NOT IN 来在你的列表中排除行的。 而BETWEEN条件运算符是用与测试一个数值是否处在BETWEEN关键字两边指定数值的中间,比如: SELECT employeeid, age, lastname, salary FROM employee_info WHERE age BETWEEN 30 AND 40; 这条SQL语句是从employee_info表中选择age处于30到40岁之间(包括30岁和40岁)的列employeeid、age、 lastname和salary。 这条语句同样可以不用BETWEEN运算符,而使用混合条件来替代,例如: SELECT employeeid, age, lastname, salary FROM employee_info WHERE age >= 30 AND age <= 40;="" 当然,你也可以类似于not="" in的方法,使用not="" between来排除一些数据。="" (16)数学运算符="">=> 标准的ANSI SQL-92支持下面四个基本的算术运算符: + 加 - 减 * 乘 / 除 % 求余 其中求余运算符决定除法的余数。这个运算符不是ANSI SQL支持的,但是,绝大多数的数据库支持他。下面是一些有用的数学函数,因为可能要用到它,所以我这里要集中提一下。在ANSI SQL-92中不支持这些函数,但是它们可能对于某些特殊的RDBMS是有效的。然而它们对于几个主要的数据库系统都是有效的。下面就说说这些数学函数吧: ABS(x) 返回x的绝对值 SIGN(x) 当x为负数、零、正数的时候分别返回x的符号-1、0或者1 MOD(x,y) 返回x除以y的余数,跟x%y作用一样 FLOOR(x) 返回小于等于x的最大整数 CEILING(x) 或 CEIL(x) 返回大于等于x的最小整数 POWER(x,y) 返回x的y次方的数值 ROUND(x) 返回最接近于x的数 ROUND(x,d) 返回小数点数为4的接近于x的数 SQRT(x) 返回x的平方根 下面举个例子: SELECT round(salary), firstname FROM employee_info 上面这条语句将从employee_info表中选择salary最接近的数以及firstname列。 (17)JOIN子句 不知你有没有发现直到现在我们利用SELECT语句来检索的时候只能从一个表中进行。如果你想从两个表或者更多的表中进行检索,该怎么办呢,好在我们可以使用SQL和关系数据库系统的一个很有用的特性,即"Join"。为了简单说明,实际上"Join"就是使得关系数据库系统相关的东东。"Join"允许你从两个表或者更多的表连接数据进行数据检索,而只需要利用一个SELECT语句。如果在FROM关键字之后有多个表的话,"Join"可以在SQL SELECT语句中识别它们。 下面举个例子: SELECT "list-of-columns" FROM table1,table2 WHERE "search-condition(s)" "Join" 通过示范当你只处理一个表的时候会发生什么事情可以使得"Join"的解释更简单,所以这里我没有使用"Join"。这个单一的数据库有事也被称为"flat table"(平表)。现在你有一个表的数据库用来检索所有顾客的信息以及他们从你的商店买了什么,下面就是这个表的所有列: 每次一个新行被插入到表中,所有的列都将被更新,这样就导致了不必要的”多余数据”。比如,每次Jenny买东西,下面的行都将被插入到表中: 为了避免”多余数据”,一个最好的方法:让数据库有两个表: 其中一个用来对顾客保持跟踪;另外一个用来对他们买什么东西保持跟踪。 即有"Customer_info" 表和"Purchases" 表: "Customer_info" 表为: customer_number firstnalastnaddrecitstate z me ame ss y ip "Purchases" 表为: customer_numbedate item price r 现在开始,不管顾客什么时候进行重复的购物,只有第二个表"Purchases" 需要更新。 这样我们就减少了多余的数据,也就是说我们规格化了这个数据库。 你仔细点就会发现两个表中还是有一个"cusomer_number"列是相同的。这个列包含了单 独的顾客号,它将用来JOIN(连接)两个表。下面举个例子来使用这两个表,假如你想搜 索顾客的名字以及他们所买的东西,你可以使用以下的语句来实现: SELECT customer_info.firstname, customer_info.lastname, purchases.item FROM customer_info, purchases WHERE customer_info.customer_number = purchases.customer_number; 特殊的"Join"有为"Inner Join" 或者"Equijoin",这是一个最常见的"Join"类型,以后我们经常 用使用到或者看到。 这里要注意每列总是在表名之前,这却也不是必需的。这是一个好的练习对于帮助你澄 清列后面跟着表的认识有很大帮助。如果两个表之间有一个相同的列,它就是必须的。我这 里推荐在使用JOIN的时候最好在所有列之后加上表名。 注意;上面描述的这个语法将在绝大多数的数据库系统起作用,本教程的也是一样。但 是结果你会发现你上面的语句并不起作用,请仔细检查一下吧。 当然你可以试一试修改以上的代码,你可以使用JOIN(ANSI SQL-92语法规范中的 INNER JOIN): SELECT customer_info.firstname, customer_info.lastname, purchases.item FROM customer_info INNER JOIN purchases ON customer_info.customer_number = purchases.customer_number; 再举另外一个例子: SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission FROM employee_info, employee_sales WHERE employee_info.employeeid = employee_sales.employeeid; 这个例子将从employee_info和employee_sales表中选择当employee_info表的employeeid等于employee_sales表的employeeid的employeeid 、emplyee_info表中lastname以及 employee_sales表中的comission数值。 从上面的例子中可以发现利用JION的语句比价简练。既然有这样的有点,我们何乐而不为 呢, (18)索引 索引允许DBMS更快地访问数据。系统创建了这个内部地数据结构(即索引),它导致 当查询以列为索引的时候搜索行,这样查询会快得多。这个索引对于给定列索引数值的时通 知DBMS找到表中某一行,这有点象书的索引,它告诉你对于给定的字你能找到哪一页。 下面让我们在AntiqueOwners列中为OwnerID创建索引: CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID); 下面语句是为名字创建所以: CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME, OWNERFIRSTNAME); 为了删除索引,你可以利用DROP: DROP INDEX OID_IDX; 就象前面教程中,我们也可以"drop"(删除)一个表。上面第二个例子中,是在两列上创建索引的。 有些DBMS不强迫要求主键,换句话说就是,类的唯一性不会自动强制。这是什么意思呢,好象听起来云里雾里的。好吧,再给你举个例子,如果你象插入另外一行到AntiqueOwners表中,比如这个OwnerID是02,有些系统可以让你这样做即使我们要求所有行的数值都要是不同的。为了避免两行有相同的值,我们有一种方法来克服,就是在列上创建唯一的索引,而在这个列上我们需要它成为主键,这样就可以系统不会出现复制的情况: CREATE UNIQUE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID); (19)DISTINCT和排除复制 假如你象列出所有买过古董的ID和名字,很明显,你可能会将所有的顾客都列出来而没有考虑有些顾客是买过多讲古董的,所以这时你会发现有些数据是重复的。这就意味着你需要通知SQL来排除复制的行,而不管这个顾客买过多少个古董只需要列出一次即可。为了实现这个目的,你可以使用DISTINCT关键字。 首先我们需要为AntiqueOwners表来一个equijoin以得到顾客的LastName和First的详细数据。但是,你要考虑到Antiques表中的SellerID列是AntiqueOwners表的一个外码,所以顾客只能在AntiqueOwners表列出ID和名字的行才被列出。我们还想在列的数据中排除SellerID复制的发生,所以我们要在发生重复的列上使用DISTINCT 。 为了防止复制的发生,我们还想将LastName以字母顺序排列,然后在按字母顺序排列FirstName最后排列OwnerID,因此我们还必须使用ORDER BY子句,具体语句如下: SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME FROM ANTIQUES, ANTIQUEOWNERS WHERE SELLERID = OWNERID ORDER BY OWNERLASTNAME, OWNERFIRSTNAME, OWNERID 在这个例子中,因为每个人都买都一个件古董,所以我们将Lasname以字母顺序列出所有的古董拥有者。 (20)Aliases 、In以及子查询 在本节教程中,我们将要介绍Aliases、 In以及子查询的用法。首先我们看一下一个查询语句,它搜索所有已经定货的顾客的LastName以及他们定什么货,语句如下: SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered FROM ORDERS ORD, ANTIQUEOWNERS OWN WHERE ORD.OWNERID = OWN.OWNERID AND ORD.ITEMDESIRED IN (SELECT ITEM FROM ANTIQUES); 这条查询语句的结果为: Last Name Item Ordered --------- ------------ Smith Table Smith Desk Akins Chair Lawson Mirror 下面好好解释一下上面的这条语句: "Last Name" 和"Item Ordered"给出了报告的数据头。 OWN & ORD是aliases(别名),它们使用在FROM子句中,可在它们的后面加一个点号再加列名就可以进行查询了。这样做就避免了模棱两可的情况,特别是在equijoin WHERE子句中当两个列都名为OwenerID的时候,而点号就通知SQL我们使用是两个不同表的不同OwnerID。 这里要注意,在FROM子句中Orders表被首先列出,并且确保AntiqueOwners表只用于详细的信息(Last Name)。更为重要的,在WHERE子句中的AND强迫In子查询被调用("= ANY" or "= SOME" 都等价于使用IN)。但这到底做了些什么呢,当这个子查询完成了,它就返回Antiques表的所有Items因为这里没有WHERE子句。然后,对于从Orders表列出的行,ItemDesired必须在从Antiques表中返回的Items列表中,然后在定货可以有另外的拥有者填写的情况下列出一个item。你可以想想这个方法:子查询从Orders 表中的每一个ItemDesired被比较中返回一系列的Items;如果ItemDesired是在从Antiques表中返回的,那么条件才为真。 (21)更多的子查询 我们可以使用在SELECT查询语句中再包括一个SELECT子查询语句。举个例子吧,首先我们列除所有购买贵重物品的顾客,贵重物品的标准是比所有卖出的物品价钱的平均值多100元的物品。具体语句如下: SELECT OWNERID FROM ANTIQUES WHERE PRICE > (SELECT AVG(PRICE) + 100 FROM ANTIQUES); 上面子查询语句是计算物品的平均价格再加100元,并搜索所有在ANTIQUES表中PRICE大于这个数值的OWNERID。这里你可以使用DISTINCT OWNERID来排除复制的现象。 下面的语句列出了所有在AntiqueOwners表中的有买过物品的人的LastName: SELECT OWNERLASTNAME FROM ANTIQUEOWNERS WHERE OWNERID = (SELECT DISTINCT BUYERID FROM ANTIQUES); 这个子查询返回了一系列的顾客,当且仅当物品拥有者的ID出现在子查询的列表中,古董的拥有者的LastName才会显示出来。 为了更新这个例子,我们假设有一个买过bookcase的顾客,他的FirstName在数据库中出错了,应该为John: UPDATE ANTIQUEOWNERS SET OWNERFIRSTNAME = 'John' WHERE OWNERID = (SELECT BUYERID FROM ANTIQUES WHERE ITEM = 'Bookcase'); 上面的语句中的子查询首先搜索买过bookcase的顾客的BuyerID,然后在外层的查询中来更新他的FirstName。 (22)EXISTS 和 ALL EXISTS使用了一个子查询作为条件,只有当子查询返回行的时候这个条件才为真,如果子查询不返回任何的行条件就为假。如果商店在处理Chair的时候,有个顾客想看看所有拥有者的列表,就可以使用EXSIST,语句如下: SELECT OWNERFIRSTNAME, OWNERLASTNAME FROM ANTIQUEOWNERS WHERE EXISTS (SELECT * FROM ANTIQUES WHERE ITEM = 'Chair'); 如果在Antiques列中有Chair,那么子查询就会返回一行或者多行,就使得EXISTS子句为真,然后让SQL列出拥有者来。如果没有搜索到Chair,则没有行被返回,条件就为假。 ALL是另外一个不寻常的关键字,因为ALL查询通常可以用不同的方法来进行,并且可能是一种更为简单的方法。举个例子来说明吧: SELECT BUYERID, ITEM FROM ANTIQUES WHERE PRICE >= ALL (SELECT PRICE FROM ANTIQUES); 上面这条语句将返回最高价格的Item以及它的买方。子查询返回了Antiques表中的所有的Price列,而外层的查询逐行查询Antiques表,并且如果它的Price大于等于(或者ALL)列中的Prices,它就会被列出,它就是最好价格的Item。这里必须使用">="的原因是最高价格的Item要等于列表中的最高价格,因为这个Item在Price列中。 (23)UNION 和 外部连接 有些时候,你可以想一起看多个查询的结果、组合它们的输出,你可以使用UNION关键字。为了合并以下两个查询的输出:显示所有买方的ID和已经有定货的顾客,你可以使用以下语句: SELECT BUYERID FROM ANTIQUEOWNERS UNION SELECT OWNERID FROM ORDERS; 这里要注意SQL要求SELECT的列表必须匹配,即列于数据类型匹配。在本例子中, BuyerID 和OwnerID都是相同的数据类型,同为Interger(整型)。同时还有一提的是,SQL但使用UNION的使用会进行自动复制排除。而在单一的查询中,你就必须使用DISTINCT。 Outer Join(外部连接)通常是在JOIN查询被联合,而行没有包括到JOIN中的时候使用,特别是在常量文本"flags"被包括的时候尤为有用。下面我们看看这个查询先: SELECT OWNERID, 'is in both Orders & Antiques' FROM ORDERS, ANTIQUES WHERE OWNERID = BUYERID UNION SELECT BUYERID, 'is in Antiques only' FROM ANTIQUES WHERE BUYERID NOT IN (SELECT OWNERID FROM ORDERS); 第一个查询做了一个连接以列出两个表中的每个owener,并且在ID后面放置一个标记线来重复引用。这个UNION合并了这个列表以及以下第二个的列表。第二个列表是列出不是在Orders 表的ID,这样就产生了在JOIN查询之外的ID列表,它是利用引用标签列出的。这可能是一种最容易的方法来产生这个列表。 这个概念对于主键跟外码有关的状况是很有用的,但是有些主键的外码值是NULL。比如,在一个表中,主键是salesperson,而在其它的表中主键是customers,并且它们的salesperson列在相同的行。然而,如果salesperson没有customers的时候,这个人的名字就不会出现在customer表中。如果所有salespersons的列表要显示出来,那么就要外部连接了。 (24)嵌入式SQL 为了更好的理解嵌入式SQL,本节利用一个具体例子来说明。嵌入式SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用、操作以及处理数据等等。以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告;这个程序必须在普通的编译之前先预编译SQL语句。嵌入SQL对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等。在嵌入SQL时,考虑网络、数据库管理系统、操作系统是相当重要的。 以下是详细的代码: #include /* 以下这部分是声明主机变量,它将使用于程序中*/ EXEC SQL BEGIN DECLARE SECTION; int BuyerID; char FirstName[100], LastName[100], Item[100]; EXEC SQL END DECLARE SECTION; /* 以下包括SQLCA变量,它可以用来进行错误检查 */ EXEC SQL INCLUDE SQLCA; main() { /* 以下连接数据库*/ EXEC SQL CONNECT UserID/Password; /* 以下是连接数据库并检查是否有错误产生T */ if(sqlca.sqlcode) { printf(Printer, "Error connecting to database server.\n"); exit(); } printf("Connected to database server.\n"); /* 下面声明一个 "Cursor"。它将在查询结果多于一行的时候使用*/ EXEC SQL DECLARE ItemCursor CURSOR FOR SELECT ITEM, BUYERID FROM ANTIQUES ORDER BY ITEM; EXEC SQL OPEN ItemCursor; /* 你可以在这里还可以加入另外一些错误检查的内容,这里就省略了*/ /* 当这个CURSOR没有数据, sqlcode将被产生以允许我们退出循环。这里注意,为了简单起见,我们使程序遇到错误的时候就退出任何的sqlcode。*/ EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID; while(!sqlca.sqlcode) { EXEC SQL UPDATE ANTIQUES SET PRICE = PRICE + 5 WHERE ITEM = :Item AND BUYERID = :BuyerID; EXEC SQL SELECT OWNERFIRSTNAME, OWNERLASTNAME INTO :FirstName, :LastName FROM ANTIQUEOWNERS WHERE BUYERID = :BuyerID; printf("%25s %25s %25s", FirstName, LastName, Item); EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID; } /* 关闭CURSOR,提交变化并退出程序。*/ EXEC SQL CLOSE DataCursor; EXEC SQL COMMIT RELEASE; exit(); } 在SQL Server中保存和输出图片 有时候我们需要保存一些binary data进数据库。SQL Server提供一个叫做image的特殊数据类型供我们保存binary data。Binary data可以是图片、文档等。在这篇文章中我们将看到如何在SQL Server中保存和输出图片。 建表 为了试验这个例子你需要一个含有数据的table(你可以在现在的库中创建它,也可以创建一个新的数据库),下面是它的结构: Column Name Datatype Purpose ID Integer identity column Primary key IMGTITLE Varchar(50) Stores some user friendly title to identity the image IMGTYPE Varchar(50) Stores image content type. This will be same as recognized content types of ASP.NET IMGDATA Image Stores actual image or binary data. 保存images进SQL Server数据库 为了保存图片到table你首先得从客户端上传它们到你的web服务器。你可以创建一个 web form,用TextBox得到图片的标题,用HTML File Server Control得到图片文件。确信 你设定了Form的encType属性为multipart/form-data。 Stream imgdatastream = File1.PostedFile.InputStream; int imgdatalen = File1.PostedFile.ContentLength; string imgtype = File1.PostedFile.ContentType; string imgtitle = TextBox1.Text; byte[] imgdata = new byte[imgdatalen]; int n = imgdatastream.Read(imgdata,0,imgdatalen); string connstr= ((NameValueCollection)Context.GetConfig ("appSettings"))["connstr"]; SqlConnection connection = new SqlConnection(connstr); SqlCommand command = new SqlCommand ("INSERT INTO ImageStore(imgtitle,imgtype,imgdata) VALUES ( @imgtitle, @imgtype,@imgdata )", connection ); SqlParameter paramTitle = new SqlParameter ("@imgtitle", SqlDbType.VarChar,50 ); paramTitle.Value = imgtitle; command.Parameters.Add( paramTitle); SqlParameter paramData = new SqlParameter ( "@imgdata", SqlDbType.Image ); paramData.Value = imgdata; command.Parameters.Add( paramData ); SqlParameter paramType = new SqlParameter ( "@imgtype", SqlDbType.VarChar,50 ); paramType.Value = imgtype; command.Parameters.Add( paramType ); connection.Open(); int numRowsAffected = command.ExecuteNonQuery(); connection.Close(); 从数据库中输出图片 现在让我们从数据库中取出我们刚刚保存的图片,在这儿,我们将直接将图片输出至浏 览器。你也可以将它保存为一个文件或做任何你想做的。 private void Page_Load(object sender, System.EventArgs e) { string imgid =Request.QueryString["imgid"]; string connstr=((NameValueCollection) Context.GetConfig("appSettings"))["connstr"]; string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = " + imgid; SqlConnection connection = new SqlConnection(connstr); SqlCommand command = new SqlCommand(sql, connection); connection.Open(); SqlDataReader dr = command.ExecuteReader(); if(dr.Read()) { Response.ContentType = dr["imgtype"].ToString(); Response.BinaryWrite( (byte[]) dr["imgdata"] ); } connection.Close(); } 在上面的代码中我们使用了一个已经打开的数据库,通过datareader选择images。接着 用Response.BinaryWrite代替Response.Write来显示image文件。 51单片机 C 语言学习杂记 学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语 言,还有众多种类的单片机选择真是件让人头痛的事。在众多单片机中 51架构的芯片风行 很久,学习资料也相对很多,是初学的较好的选择之一。 51的编程语言常用的有二种,一 种是汇编语言,一种是 C 语言。汇编语言的机器代码生成效率很高但可读性却并不强,复 杂一点的程序就更是难读懂,而 C 语言在大多数情况下其机器代码生成效率和汇编语言相 当,但可读性和可移植性却远远超过汇编语言,而且 C 语言还可以嵌入汇编来解决高时效 性的代码编写问题。对于开发周期来说,中大型的软件编写用 C 语言的开发周期通常要小 于汇编语言很多。综合以上 C 语言的优点,我在学习时选择了 C 语言。以后的教程也只是 我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一 起交流,一起学习,一起进步。 *注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只, 有望各位大侠高手指点错误提出建议。 明浩 2003-3-30 pnzwzw@163.com 第一课 建立您的第一个 C 项目 使用 C 语言肯定要使用到 C 编译器,以便把写好的 C 程序编译为机器码,这样单片机 才能执行编写好的程序。 KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一, 它支持众多不同公司的 MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持, PLM ,汇编和 C 语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易 学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发 51应用的工程师或 普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了 KEIL51软件,要使用 KEIL51软件,必需先要安装它。 KEIL51是一个 商业的软件,对于我们这些普通爱好者可以到 KEIL 中国代理周立功公司的网站上下载一份 能编译 2K 的 DEMO 版软件,基本可以满足一般的个人学习和小型应用的开发。 (安装的方 法和普通软件相当这里就不做介绍了) 安装好后,您是不是迫不及待的想建立自己的第一个 C 程序项目呢?下面就让我们一 起来建立一个小程序项目吧。或许您手中还没有一块实验板,甚至没有一块单片机,不过没 有关系我们可以通过 KEIL 软件仿真看到程序运行的结果。 首先当然是运行 KEIL51软件。怎么打开?噢,天!那您要从头学电脑了。呵呵,开个 玩笑,这个问题我想读者们也不会提的了:P 。运行几秒后,出现如图 1-1的屏幕。 图 1-1 启动时的屏幕 接着按下面的步骤建立您的第一个项目: (1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1-2。接着弹 出一个标准 Windows 文件对话窗口,如图 1-3,这个东东想必大家是见了 N 次的了,用法 技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在“文件名”中输入您的 第一个 C 程序项目名称,这里我们用“ test ” ,这是笔者惯用的名称,大家不必照搬就是了, 只要符合 Windows 文件规则的文件名都行。 “保存”后的文件扩展名为 uv2,这是 KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图 1-2 New Project菜单 图 1-3 文件窗口 (2)选择所要的单片机,这里我们选择常用的 Ateml 公司的 AT89C51。此时屏幕如图 1-4所示。 AT89C51有什么功能、特点呢?不用急,看图中右边有简单的介绍,稍后的章 节会作较详细的介绍。完成上面步骤后,我们就可以进行程序的编写了。 (3)首先我们要在项目中创建新的程序文件或加入旧程序文件。如果您没有现成的程 序,那么就要新建一个程序文件。在 KEIL 中有一些程序的 Demo ,在这里我们还是以一个 C 程序为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。点击图 1-5中 1的 新建文件的快捷按钮,在 2中出现一个新的文字编辑窗口,这个操作也可以通过菜单 File -New 或快捷键 Ctrl+N来实现。好了,现在可以编写程序了,光标已出现在文本编辑窗口 中,等待我们的输入了。第一程序嘛,写个简单明了的吧。下面是经典的一段程序,呵,如 果您看过别的程序书也许也有类似的程序: #include #include void main(void) { SCON = 0x50; //串口方式 1, 允许接收 TMOD = 0x20; //定时器 1定时方式 2 TCON = 0x40; //设定时器 1开始计数 TH1 = 0xE8; //11.0592MHz 1200波特率 TL1 = 0xE8; TI = 1; TR1 = 1; //启动定时器 while(1) { printf ( } } 图 1-4选取芯片 图 1-5新建程序文件 这段程序的功能是不断从串口输出“ Hello World!”字符,我们先不管程序的语法和意思吧, 先看看如何把它加入到项目中和如何编译试运行。 (4)点击图 1-5中的 3保存新建的程序,也可以用菜单 File -Save 或快捷键 Ctrl+S进行保存。因是新文件所以保存时会弹出类似图 1-3的文件操作窗口,我们把第一个程序 命名为 test1.c ,保存在项目所在的目录中,这时您会发现程序单词有了不同的颜色,说明 KEIL 的 C 语法检查生效了。如图 1-6鼠标在屏幕左边的 Source Group1文件夹图标上右击 弹出菜单,在这里可以做在项目中增加减少文件等操作。我们选“ Add File to Group ‘ Source Group 1’ ”弹出文件窗口,选择刚刚保存的文件,按 ADD 按钮,关闭文件窗,程序文件已 加到项目中了。这时在 Source Group1文件夹图标左边出现了一个小 +号说明,文件组中有 了文件,点击它可以展开查看。 图 1-6把文件加入到项目文件组中 (5) C 程序文件已被我们加到了项目中了,下面就剩下编译运行了。这个项目我们只 是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不 会生成用于芯片烧写的 HEX 文件,如何设置生成 HEX 文件就请看下面的第三课。我们先 来看图 1-7吧,图中 1、 2、 3都是编译按钮,不同是 1是用于编译单个文件。 2是编译当 前项目,如果先前编译过一次之后文件没有做动编辑改动,这时再点击是不会再次重新编译 的。 3是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。在 3右边的 是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。 5是菜单中的它们, 我个人就不习惯用它了。嘿嘿,这个项目只有一个文件,您按 123中的一个都可以编译。按 了?好快哦,呵呵。在 4中可以看到编译的错误信息和使用的系统资源情况等,以后我们要 查错就靠它了。 6是有一个小放大镜的按钮,这就是开启 \关闭调试模式的按钮,它也存在于 菜单 Debug -Start\Stop Debug Session,快捷键为 Ctrl+F5。 图 1-7编译程序 (6)进入调试模式,软件窗口样式大致如图 1-8所示。图中 1为运行,当程序处于停止 状态时才有效, 2为停止,程序处于运行状态时才有效。 3是复位,模拟芯片的复位,程序 回到最开头处执行。按 4我们可以打开 5中的串行调试窗口,这个窗口我们可以看到从 51芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中 也有,这里不再一一介绍大家不妨找找看,其它的功能也会在后面的课程中慢慢介绍。首先 按 4打开串行调试窗口,再按运行键,这时就可以看到串行调试窗口中不断的打印“ Hello World ! ” 。呵呵,是不是不难呀?这样就完成了您的第一个 C 项目。最后我们要停止程序运 行回到文件编辑模式中,就要先按停止按钮再按开启 \关闭调试模式按钮。然后我们就可以 进行关闭 KEIL 等相关操作了。 到此为止,第一课已经完结了,初步学习了一些 KEIL uVision2的项目文件创建、编译、 运行和软件仿真的基本操作方法。其中一直有提到一些功能的快捷键的使用,的确在实际的 开发应用中快捷键的运用可以大大提高工作的效率,建议大家多多使用,还有就是对这里所 讲的操作方法举一反三用于类似的操作中。 图 1-8调试运行程序 第二课 初步认识 51芯片 上一课我们的第一个项目完成了,可能有懂 C 语言的朋友会说, “这和 PC 机上的 C 语言 没有多大的区别呀” 。的确没有太大的区别,C 语言只是一种程序语言的统称,针对不同的 处理器相关的 C 语言都会有一些细节的改变。编写 PC 机的 C 程序时,如要对硬件编程您就 必须对硬件要有一定的认识,51单片机编程就更是如此,因它的开发应用是不可与硬件脱 节的,所以我们先要来初步认识一下 51苾片的结构和引脚功能。MSC51架构的芯片种类很 多, 具体特点和功能不尽相同 (在以后编写的附录中会加入常用的一些 51芯片的资料列表) , 在此后的教程中就以 Atmel 公司的 AT89C51和 AT89C2051为中心对象来进行学习,两者是 AT89系列的典型代表,在爱好者中使用相当的多,应用资料很多,价格便宜,是初学 51的 首选芯片。嘿嘿,口水多多有点卖广告之嫌了。 :P 图 2-1 AT89C51和 AT89C2051引脚功能图 AT89C51 AT89C2051 4KB 可编程 Flash 存储器(可擦写 1000次) 2KB 可编程 Flash 存储器(可擦写 1000三级程序存储器保密 两级程序存储器保密 静态工作频率:0Hz-24MHz 静态工作频率:0Hz-24MHz 128字节内部 RAM 128字节内部 RAM 2个 16位定时/计数器 2个 16位定时/计数器 一个串行通讯口 一个串行通讯口 6个中断源 6个中断源 32条 I/O 引线 15条 I/O 引线 片内时种振荡器 1个片内模拟比较器 表 2-1 AT89C51和 AT89C2051主要性能表 图 2-1中是 AT89C51和 AT89C2051的引脚功能图。 而表 2-1中则是它们的主要性能表。 以上可以看出它们是大体相同的,由于 AT89C2051的 IO 线很少,导致它无法外加 RAM 和程 序 ROM,片内 Flash 存储器也少,但它的体积比 AT89C51小很多,以后大家可根据实际需要 来选用。它们各有其特点但其核心是一样的,下面就来看看 AT89C51的引脚具体功能。 1.电源引脚 Vcc 40 电源端 GND 20 接地端 *工作电压为 5V,另有 AT89LV51工作电压则是 2.7-6V, 引脚功能一样。 2.外接晶体引脚 图 2-2 外接晶体引脚 XTAL1 19 XTAL2 18 XTAL1是片内振荡器的反相放大器输入端, XTAL2则是输出端,使用外部振荡器 时,外部振荡信号应直接加到 XTAL1,而 XTAL2悬空。内部方式时,时钟发生器对振 荡脉冲二分频, 如晶振为 12MHz , 时钟频率就为 6MHz 。 晶振的频率可以在 1MHz-24MHz 内选择。电容取 30PF 左右。 *型号同样为 AT89C51的芯片,在其后面还有频率编号, 有 12,16,20,24MHz 可选。 大家在购买和选用时要注意了。如 AT89C51 24PC就是最高振荡频率为 24MHz,40P6封 装的普通商用芯片。 3.复位 RST 9 在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿 时,将使单片机复位,只要这个脚保持高电平, 51芯片便循环复位。复位后 P0-P3口 均置 1引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由 高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。常用的复位电路如图 2-3所示。 *复位操作不会对内部 RAM 有所影响。 图 2-3 常用复位电路 4.输入输出引脚 (1) P0端口[P0.0-P0.7] P0是一个 8位漏极开路型双向 I/O 端口,端口置 1(对端 口写 1)时作高阻抗输入端。作为输出口时能驱动 8个 TTL。 对内部 Flash 程序存储器编程时,接收指令字节 ; 校验程序时输出指令字节,要 求外接上拉电阻。 在访问外部程序和外部数据存储器时, P0口是分时转换的地址 (低 8位 )/数据 总线,访问期间内部的上拉电阻起作用。 (2) P1端口 [P1.0-P1.7] P1是一个带有内部上拉电阻的 8位双向 I/0端口。输出时 可驱动 4个 TTL 。端口置 1时,内部上拉电阻将端口拉到高电平,作输入用。 对内部 Flash 程序存储器编程时,接收低 8位地址信息。 (3) P2端口 [P2.0-P2.7] P2是一个带有内部上拉电阻的 8位双向 I/0端口。输出时 可驱动 4个 TTL 。端口置 1时,内部上拉电阻将端口拉到高电平,作输入用。 对内部 Flash 程序存储器编程时,接收高 8位地址和控制信息。 在访问外部程序和 16位外部数据存储器时, P2口送出高 8位地址。而在访问 8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 (4) P3端口 [P3.0-P3.7] P2是一个带有内部上拉电阻的 8位双向 I/0端口。输出时 可驱动 4个 TTL 。端口置 1时,内部上拉电阻将端口拉到高电平,作输入用。 对内部 Flash 程序存储器编程时,接控制信息。除此之外 P3端口还用于一些 专门功能,具体请看 表 2-2. 。 *P1-3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出 一定的电流。 (磁动力工作室) 表 2-2 P3端口引脚兼用功能表 呼!一口气说了那么多,停一下吧。嗯,什么?什么叫上拉电阻?上拉电阻简单来说就 是把电平拉高,通常用 4.7-10K 的电阻接到 Vcc 电源,下拉电阻则是把电平拉低,电阻接 到 GND 地线上。具体说明也不是这里要讨论的,接下来还是接着看其它的引脚功能吧。 5.其它的控制或复用引脚 (1) 的低位字节。即使不访问外部存储器, ALE 端仍以不变的频率输出脉冲信号(此 频率是振荡器频率的 1/6)。在访问外部数据存储器时,出现一个 ALE 脉冲。对 Flash PROG AT89C51由外部程序存 储器取指令或常数时,每个机器周期输出 2个脉冲即两次有效。但访问外部数 据存储器时,将不会有脉冲输出。 要使 AT89C51只访问外部程序存储器(地址为 0000H-FFFFH) ,这时该引脚必须 保持低电平。对 Flash 存储器编程时,用于施加 Vpp 编程电压。Vpp 电压有两 种,类似芯片最大频率值要根据附加的编号或芯片内的特征字决定。具体如表 2-3所列。 Vpp = 12V Vpp = 5V 印刷在芯片面上的型号 AT89C51 xxxx YYWW AT89LV51 xxxx YYWW AT89C51 xxxx-5 YYWW AT89LV51 xxxx-5 YYWW 030H=1EH 030H=1EH 030H=1EH 030H=1EH 031H=51H 031H=61H 031H=51H 031H=61H 片内特征字 032H=FFH 032H=FFH 032H=05H 032H=05H 表 2-3 Vpp 与芯片型号和片内特征字的关系 看到这您对 AT89C51引脚的功能应该有了一定的了解了, 引脚在编程和校验时的时序我 们在这里就不做详细的探讨,通常情况下我们也没有必要去撑握它,除非您想自己开发编程 器。下来的课程我们要开始以一些简单的实例来讲述 C 程序的语法和编写方法技巧,中间穿 插相关的硬件知识如串口,中断的用法等等。 第三课 生成 HEX 文件和最小化系统 在开始C语言的主要内容时,我们先来看看如何用KEIL uVISION2来编译生成用于烧写 芯片的 HEX 文件。 HEX 文件格式是Intel公司提出的按地址排列的数据信息,数据宽度为字 节,所有数据使用16进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。它保 存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。 我们先来打开第一课 做的第一项目,打开它的所在目录,找到 test.Uv2的文件就可以打开先前的项目了。然后右 击图 3-1中的 1项目文件夹,弹出项目功能菜单,选 Options for Target’ Target1’ , 弹出项目选项 设置窗口,同样先选中项目文件夹图标,这时在 Project 菜单中也有一样的菜单可选。打开项 目选项窗口,转到 Output 选项页图 3-2所示,图中 1是选择编译输出的路径, 2是设置编译输 出生成的文件名, 3则是决定是否要创建 HEX 文件,选中它就可以输出 HEX 文件到指定的路 径中。选好了?好,我们再将它重新编译一次,很快在编译信息窗口中就显示 HEX 文件创建 到指定的路径中了,如图 3-3。这样我们就可用自己的编程器所附带的软件去读取并烧到芯 片了,再用实验板看结果,至于编程器或仿真器品种繁多具体方法就看它的说明书了,这里 也不做讨论。 (技巧:一、在图 3-1中的 1里的项目文件树形目录中,先选中对象,再单击它就可对它进 行重命名操作,双击文件图标便可打开文件。二、在 Project 下拉菜单的最下方有最近编辑过 的项目路径保存,这里可以快速打开最近在编辑的项目。 ) 。 图 3-1项目功能菜单 图 3-2 项目选项窗口 图 3-3 编译信息窗口 或许您已把编译好的文件烧到了芯片上, 如果您购买或自制了带串口输出元件的学习实 验板, 那您就可以把串口和 PC 机串口相联用串口调试软件或 Windows 的超级终端,将其波特 率设为 1200,就可以看到不停输出的“Hello World!”字样。也许您还没有实验板,那这 里先说说 AT89C51的最小化系统,再以一实例程序验证最小化系统是否在运行,这个最小化 系统也易于自制用于实验。 图 3-4便是 AT89C51的最小化系统,不过为了让我们可以看出它 是在运行的,我加了一个电阻和一个 LED,用以显示它的状态,晶振可以根据自己的情况使 用, 一般实验板上是用 11.0592MHz 或 12MHz,使用前者的好外是可以产生标准的串口波特率, 后者则一个机器周期为 1微秒,便于做精确定时。在自己做实验里,注意的是 VCC 是+5V 的, 不能高于此值,否则将损坏单片机,太低则不能正常工作。在 31脚要接高电平,这样我们 才能执行片内的程序,如接低电平则使用片外的程序存储器。下面,我们建一个新的项目名 为 OneLED 来验证最小化系统是否可以工作(所有的例程都可在我的主页下面下载到,网址: http://cdle.yeah.net 或 http://cdle.126.com ) 。程序如下: #include //预处理命令 void main(void) //主函数名 { //这是第一种注释方式 unsigned int a; //定义变量 a 为 int 类型 /* 这是第二种注释方式 */ do{ //do while 组成循环 for (a=0; a<50000; a++); >50000; a++); > P1_0 = 0; //设 P1.0口为低电平,点亮 LED for (a=0; a<50000; a++); >50000; a++); > P1_0 = 1; //设 P1.0口为高电平,熄灭 LED } while(1); } 图 3-4 AT89C51最小化系统 这里先讲讲 KEIL C 编译器所支持的注释语句。一种是以“//”符号开始的语句,符号 之后的语句都被视为注释,直到有回车换行。另一种是在“ /*” 和 “*/”符号之内的为注释。 注释不会被 C 编译器所编译。一个 C 应用程序中应有一个 main 主函数,main 函数可以调用 别的功能函数,但其它功能函数不允许调用 main 函数。不论 main 函数放在程序中的那个位 置,总是先被执行。用上面学到的知识编译写好的 OneLED 程序,并把它烧到刚做好的最小 化系统中。上电,刚开始时 LED 是不亮的(因为上电复位后所有的 IO 口都置 1引脚为高电 平) ,然后延时一段时间(for (a=0; a<50000; a++)这句在运行) ,led="" 亮,再延时,led="" 熄灭,然后交替亮、灭。第一个真正的小应用就做完,呵呵,先不要管它是否实用哦。如果="">50000; a++)这句在运行)> 第四课 数据类型 先来简单说说 C 语言的标识符和关键字。标识符是用来标识源程序中某个对象的名字 的,这些对象可以是语句、数据类型、函数、变量、数组等等。C 语言是大小字敏感的一种 高级语言,如果我们要定义一个定时器 1,可以写做“Timer1” ,如果程序中有“TIMER1” , 那么这两个是完全不同定义的标识符。标识符由字符串,数字和下划线等组成,注意的是第 一个字符必须是字母或下划线,如“1Timer”是错误的,编译时便会有错误提示。有些编译 系统专用的标识符是以下划线开头,所以一般不要以下划线开头命名标识符。标识符在命名 时应当简单,含义清晰,这样有助于阅读理解程序。在 C51编译器中,只支持标识符的前 32位为有效标识,一般情况下也足够用了,除非你要写天书:P。 关键字则是编程语言保留的特殊标识符,它们具有固定名称和含义,在程序编写中不允 许标识符与关键字相同。在 KEIL uVision2中的关键字除了有 ANSI C 标准的 32个关键字外 还根据 51单片机的特点扩展了相关的关键字。其实在 KEIL uVision2的文本编辑器中编写 C 程序,系统可以把保留字以不同颜色显示,缺省颜色为天蓝色。 (标准和扩展关键字请看 附录一中的附表 1-1和附表 1-2) 先看表 4-1,表中列出了 KEIL uVision2 C51编译器所支持的数据类型。在标准 C 语 言中基本的数据类型为 char,int,short,long,float 和 double,而在 C51编译器中 int 和 short 相同,float 和 double 相同,这里就不列出说明了。下面来看看它们的具体定义: 数据类型 长 度 值 域 unsigned char 单字节 0~255 signed char 单字节 -128~+127 unsigned int 双字节 0~65535 signed int 双字节 -32768~+32767 unsigned long 四字节 0~4294967295 signed long 四字节 -2147483648~+2147483647 float 四字节 ±1.175494E-38~±3.402823E+38 * 1~3字节 对象的地址 bit 位 0或 1 sfr 单字节 0~255 sfr16 双字节 0~65535 sbit 位 0或 1 表 4-1 KEIL uVision2 C51编译器所支持的数据类型 1. char 字符类型 char 类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字 符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。 unsigned char 类型用字节中所有的位来表示数值,所可以表达的数值范围是 0~255。 signed char 类型用字节中最高位字节表示数据的符号, “0”表示正数, “1”表示负数, 负数用补码表示。 所能表示的数值范围是-128~+127。 unsigned char 常用于处理 ASCII 字符或用于处理小于或等于 255的整型数。 *正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1。 2. int 整型 int 整型长度为两个字节,用于存放一个双字节数据。分有符号 int 整型数 signed int 和无符号整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范 围是-32768~+32767,字节中最高位表示数据的符号, “0”表示正数, “1”表示负数。 unsigned int 表示的数值范围是 0~65535。 好了,先停一下吧,我们来写个小程序看看 unsigned char 和 unsigned int 用于延时 的不同效果,说明它们的长度是不同的,呵,尽管它并没有实际的应用意义,这里我们学习 它们的用法就行。依旧用我们上一课的最小化系统做实验,不过要加多一个电阻和 LED,如 图 4-1。实验中用 D1的点亮表明正在用 unsigned int 数值延时,用 D2点亮表明正在用 unsigned char 数值延时。 图 4-1 第 4课实验用电路 我们把这个项目称为 TwoLED,实验程序如下: #include //预处理命令 void main(void) //主函数名 { unsigned int a; //定义变量 a 为 unsigned int 类型 unsigned char b; //定义变量 b 为 unsigned char 类型 do { //do while 组成循环 for (a=0; a<> P1_0 = 0; //65535次设 P1.0口为低电平,点亮 LED P1_0 = 1; //设 P1.0口为高电平,熄灭 LED for (a=0; a<30000; a++); >30000; a++); > for (b=0; b<> P1_1 = 0; //255次设 P1.1口为低电平,点亮 LED P1_1 = 1; //设 P1.1口为高电平,熄灭 LED for (a=0; a<30000; a++); >30000; a++); > } while(1); } 同样编译烧写,上电运行您就可以看到结果了。很明显 D1点亮的时间长于 D2点亮的时间。 程序中的循环延时时间并不是很好确定,并不太适合要求精确延时的场合,关于这方面我们 以后也会做讨论。这里必须要讲的是,当定义一个变量为特定的数据类型时,在程序使用该 变量不应使它的值超过数据类型的值域。 如本例中的变量 b 不能赋超出 0~255的值, 如 for (b=0; b<255; b++)改为 for (b="">255; b++)改为><256; b++),编译是可以通过的,但运行时就会有问题 出现,就是说="" b="" 的值永远都是小于="" 256的,所以无法跳出循环执行下一句="" p1_1 =" 1,从而" 造成死循环。同理="" a="" 的值不应超出="" 0~65535。大家可以烧片看看实验的运行结果,同样软="">256; b++),编译是可以通过的,但运行时就会有问题> 3. long 长整型 long 长整型长度为四个字节,用于存放一个四字节数据。分有符号 long 长整型 signed long 和无符号长整型 unsigned long,默认值为 signed long 类型。signed int 表示 的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号, “0”表示正 数, “1”表示负数。unsigned long 表示的数值范围是 0~4294967295。 4. float 浮点型 float 浮点型在十进制中具有 7位有效数字,是符合 IEEE-754标准的单精度浮点型数 据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。 5.* 指针型 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量 要占据一定的内存单元, 对不同的处理器长度也不尽相同, 在 C51中它的长度一般为 1~ 3个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。 6. bit 位标量 bit 位标量是 C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。 7. sfr 特殊功能寄存器 sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它可以访问 51单片机内部的所有特殊功能寄存器。如用 sfr P1 = 0x90这一句定 P1为 P1端口在片内 的寄存器,在后面的语句中我们用以用 P1 = 255(对 P1端口的所有引脚置高电平)之 类的语句来操作特殊功能寄存器。 *AT89C51的特殊功能寄存器表请看附录二 8.sfr16 16位特殊功能寄存器 sfr16占用两个内存单元,值域为 0~65535。sfr16和 sfr 一样用于操作特殊功能寄存 器,所不同的是它用于操作占两个字节的寄存器,好定时器 T0和 T1。 9. sbit 可录址位 sbit 同位是 C51中的一种扩充数据类型,利用它可以访问芯片内部的 RAM 中的可寻址 位或特殊功能寄存器中的可寻址位。如先前我们定义了 sfr P1 = 0x90; //因 P1端口的寄存器是可位寻址的,所以我们可以定义 sbit P1_1 = P1^1; //P1_1为 P1中的 P1.1引脚 //同样我们可以用 P1.1的地址去写,如 sbit P1_1 = 0x91; 这样我们在以后的程序语句中就可以用 P1_1来对 P1.1引脚进行读写操作了。 通常这些 可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直 接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件, 用您认为好记的名字。 关于数据类型转换等相关操作在后面的课程或程序实例中将有所提及。 大家可以用所讲 到的数据类型改写一下这课的实例程序,加深对各类型的认识。 第五课 常量 上一节我们学习了 KEIL C51编译器所支持的数据类型。而这些数据类型又是怎么用在 常量和变量的定义中的呢?又有什么要注意的吗?下面就来看看吧。晕!你还区分不清楚什 么是常量,什么是变量。常量是在程序运行过程中不能改变值的量,而变量是可以在程序运 行过程中不断变化的量。变量的定义可以使用所有 C51编译器支持的数据类型,而常量的数 据类型只有整型、浮点型、字符型、字符串型和位标量。这一节我们学习常量定义和用法, 而下一节则学习变量。 常量的数据类型说明是这样的 1. 整型常量可以表示为十进制如 123,0, -89等。 十六进制则以 0x 开头如 0x34,-0x3B 等。长整型就在数字后面加字母 L,如 104L,034L,0xF340等。 2. 浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如 0.888,3345.345,0.0等,整数或小数部分为 0,可以省略但必须有小数点。指数表 示形式为[±]数字[.数字]e[±]数字,[]中的内容为可选项,其中内容根据具体情 况可有可无,但其余部分必须有,如 125e3,7e9,-3.0e-3。 3. 字符型常量是单引号内的字符,如‘a’,‘d’等,不可以显示的控制字符,可以 在该字符前面加一个反斜杠“ \”组成专用转义字符。常用转义字符表请看表 5-1。 4. 字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内的没有字 符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在 C 中字符 串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上\o 转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不同的, 前者在存储时多占用一个字节的字间。 5. 位标量,它的值是一个二进制。 转义字符 含义 ASCII 码(16/10进制) \o 空字符(NULL) 00H/0 \n 换行符(LF) 0AH/10 \r 回车符(CR) 0DH/13 \t 水平制表符(HT) 09H/9 \b 退格符(BS) 08H/8 \f 换页符(FF) 0CH/12 \' 单引号 27H/39 \ \\ 反斜杠 5CH/92 表 5-1 常用转义字符表 常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下 面来加以说明。 #difine False 0x0; //用预定义语句可以定义常量 #difine True 0x1; //这里定义 False 为 0,True 为 1 //在程序中用到 False 编译时自动用 0替换,同理 True 替换为 1 unsigned int code a=100; //这一句用 code 把 a 定义在程序存储器中并赋值 const unsigned int c=100; //用 const 定义 c 为无符号 int 常量并赋值 以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的, 所以如果在这两句后面用了类似 a=110,a++这样的赋值语句,编译时将会出错。 说了一通还不如写个程序来实验一下吧。写什么程序呢?跑马灯!对,就写这个简单易 懂的吧,这个也好说明典型的常量用法。先来看看电路图吧。它是在我们上一课的实验电路 的基础上增加 6个 LED 组成的,也就是用 P1口的全部引脚分别驱动一个 LED,电路如图 5 -1所示。 新建一个 RunLED 的项目,主程序如下: #include //预处理文件里面定义了特殊寄存器的名称如 P1口定义为 P1 void main(void) { //定义花样数据 const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF, 0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0, 0xE7,0xDB,0xBD,0x7E,0xFF}; unsigned int a; //定义循环用的变量 unsigned char b; //在 C51编程中因内存有限尽可能注意变量类型的使用 //尽可能使用少字节的类型,在大型的程序中很 受用 do{ for (b=0; b<> { for(a=0; a<30000; a++); >30000; a++); > P1 = design[b]; //读已定义的花样数据并写花样数据到 P1口 } }while(1); } 程序中的花样数据可以自以去定义,因这里我们的 LED 要 AT89C51的 P1引脚为低电平才 会点亮,所以我们要向 P1口的各引脚写数据 O 对应连接的 LED 才会被点亮,P1口的八个引 脚刚好对应 P1口特殊寄存器的八个二进位,如向 P1口定数据 0xFE,转成二进制就是 11111110,最低位 D0为 0这里 P1.0引脚输出低电平,LED1被点亮。如此类推,大家不难算 出自己想要做的效果了。大家编译烧写看看,效果就出来,显示的速度您可以根据需要调整 延时 a 的值,不要超过变量类型的值域就很行了。哦,您还没有实验板?那如何可以知道程 序运行的结果呢?呵,不用急,这就来说说用 KEIL uVision2的软件仿真来调试 IO 口输出 输入程序。 图 5-1 八路跑马灯电路 编译运行上面的程序,然后按外部设备菜单 Peripherals-I/O Ports-Port1就打开 Port1的调试窗口了,如图 5-3中的 2。这时程序运行了,但我们并不能在 Port1调试窗口 上看到有会什么效果,这时我们可以用鼠标左击图 5-3中 1旁边绿色的方条,点一下就有 一个小红方格在点一下又没有了,哪一句语句前有小方格程序运行到那一句时就停止了,就 是设置调试断点,同样图 5-2中的 1也是同样功能,分别是增加/移除断点、移除所有断点、 允许/禁止断点、禁止所有断点,菜单也有一样的功能,另外菜单中还有 Breakpoints 可打 开断点设置窗口它的功能更强大,不过我们这里先不用它。我们在“P1 = design[b];”这 一句设置一个断点这时程序运行到这里就停住了,再留意一下 Port1调试窗口,再按图 5-2中的 2的运行键,程序又运行到设置断点的地方停住了,这时 Port1调试窗口的状态又不同 了。也就是说 Port1调试窗口模拟了 P1口的电平状态,打勾为高电平,不打勾则为低电平, 窗口中 P1为 P1寄存器的状态,Pins 为引脚的状态,注意的是如果是读引脚值必须把引脚 对应的寄存器置 1才能正确读取。图 5-2中 2旁边的{}样的按钮分别为单步入,步越, 步出和执行到当前行。图中 3为显示下一句将要执行的语句。图 5-3中的 3是 Watches 窗 口可查看各变量的当前值,数组和字串是显示其头一个地址,如本例中的 design 数组是保 存在 code 存储区的首地址为 D:0x08,可以在图中 4 Memory 存储器查看窗口中的 Address 地 址中打入 D:0x08就可以查看到 design 各数据和存放地址了。如果你的 uVision2没有显示 这些窗口,可以在 View 菜单中打开在图 5-2中 3后面一栏的查看窗口快捷栏中打开。 51 单片机 C 语言入门教程(磁动力工作室) 图 5-2 调试用快捷菜单栏 图 5-3 各调试窗口 第六课 变量 上课所提到变量就是一种在程序执行过程中其值能不断变化的量. 要在程序中使用变量 必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量 分配相应的存储空间.定义一个变量的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项.存储种类有四种: 自动(auto) ,外部(extern) ,静态(static)和寄存器( register) 缺省类型为自动(auto). , 这些存储种类的具体含义和用法,将在第七课《变量的存储》中进一步进行学习. 而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的. 说明 了一个变量的数据类型后,还可选择说明该变量的存储器类型.存储器类型的说明就是指定 该变量在 C51 硬件系统中所使用的存储区域,并在编译时准确的定位.表 6-1 中是 KEIL uVision2 所能认别的存储器类型.注意的是在 AT89C51 芯片中 RAM 只有低 128 位,位于 80H 到 FFH 的高 128 位则在 52 芯片中才有用,并和特殊寄存器地址重叠.特殊寄存器(SFR)的 地址表请看附录二 AT89C51 特殊功能寄存器列表 - 21 - 51 单片机 C 语言入门教程(磁动力工作室) 存储器类型 data bdata idata pdata xdata code 说 明 直接访问内部数据存储器(128 字节),访问速度最快 可位寻址内部数据存储器(16 字节) ,允许位与字节混合访问 间接访问内部数据存储器(256 字节) ,允许访问全部内部地址 分页访问外部数据存储器(256 字节) ,用 MOVX @Ri 指令访问 外部数据存储器(64KB),用 MOVX @DPTR 指令访问 程序存储器(64KB),用 MOVC @A+DPTR 指令访问 表 6-1 存储器类型 如果省略存储器类型, 系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器 类型去指定变量的存储区域.无论什么存储模式都可以声明变量在任何的8051存储区范围, 然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能. 还 有要指出的就是变量的存储种类与存储器类型是完全无关的. SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问 数据非常快,但SMALL存储模式的地址空间受限.在写小型的应用程序时,变量和数据放在 data内部数据存储器中是很好的因为访问速度快, 但在较大的应用程序中data区最好只存放 小的变量,数据或常用的变量(如循环计数,数据索引),而大的数据则放置在别的存储区 域. COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存 储区.外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用 @R0/R1. LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外 部数据区最多可有64KB,这要求用DPTR数据指针访问数据. 之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看. sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下: sfr 特殊功能寄存器名= 特殊功能寄存器地址常数; sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数; 我们可以这样定义AT89C51的P1口 sfr P1 = 0x90; //定义P1 I/O口,其地址90H sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好 有一定的含义如P1口可以用P1为名,这样程序会变的好读好多.等号后面必须是常数,不允 许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH), 具体可查看附录中的相关表.sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特 殊功能寄存器,如8052的T2定时器,可以定义为: sfr16 T2 = 0xCC; //这里定义8052定时器2,地址为T2L=CCH,T2H=CDH 用 sfr16 定义 16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物 理低位地址之上.注意的是不能用于定时器 0 和 1 的定义. sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要 用的如要访问 P1 口中的第 2 个引脚 P1.1.我们可以照以下的方法去定义: (1)sbit 位变量名=位地址 sbit P1_1 = Ox91; 这样是把位的绝对地址赋给位变量. sfr 一样 sbit 的位地址必须位于 80H-FFH 之间. 同 (2)Sbit 位变量名=特殊功能寄存器名^位位置 - 22 - 51 单片机 C 语言入门教程(磁动力工作室) sft P1 = 0x90; sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置 当可寻址位位于特殊功能寄存器中时可采用这种方法 (3)sbit 位变量名=字节地址^位位置 sbit P1_1 = 0x90 ^ 1; 这种方法其实和 2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在 C51 存储器类型中提供有一个 bdata 的存储器类型,这个是指可位寻址的数据存储器,位 于单片机的可位寻址区中,可以将要求可位录址的数据定义为 bdata,如: unsigned char bdata ib; //在可位录址区定义 ucsigned char 类型的变量 ib int bdata ab[2]; //在可位寻址区定义数组 ab[2],这些也称为可寻址位对象 sbit ib7=ib^7 //用关键字 sbit 定义位变量来独立访问可寻址位对象的其中一位 sbit ab12=ab[1]^12; 操作符 51 单片机 C 语言入门教程(磁动力工作室) 第七课 运算符和表达式(1) 上课到这一课相隔了好长一段时间,这些日子里收到不少网友的来信支持和鼓励,要求 尽快完成余下的部分.出门在外的人不得不先为吃饭而努力,似乎这也成为我的借口,以后 每晚抽空打一些吧这样大家也就可以不用隔太久就能看到一些新东西. 或许我的笔记并不是 很正确,但我尽量的保证每课的实验都会亲自做一次,包括硬件的部分,已求不会误人子弟. 随着访问量不断的增加, 网站已启用了 www.cdle.net 的国际域名,在这里我感谢各位一 直支持磁动力工作室的朋友,更要感激身在远方一直默默支持我的女友. 明浩 2003-7-14 晚 呵,费话少说了.上两课说了常量和变量,先来补充一个用以重新定义数据类型的的语 句吧.这个语句就是 typedef,这是个很好用的语句,但我自己却不常用它,通常我定义变 量的数据类型时都是使用标准的关键字,这样别人可以很方便的研读你的程序.如果你是个 DELPHI 编程爱好者或是程序员,你对变量的定义也许习惯了 DELPHI 的关键字,如 int 类型 常会用关键字 Integer 来定义,在用 C51 时你还想用回这个的话,你可以这样写: typedef int integer; integer a,b; 这两句在编译时,其实是先把 integer 定义为 int,在以后的语句中遇到 integer 就用 int 置换,integer 就等于 int,所以 a,b 也就被定义为 int. typedef 不能直接用来定义变量,它 只是对已有的数据类型作一个名字上的置换,并不是产生一个新的数据类型.下面两句就是 一个错误的例子: typedef int integer; integer = 100; 使用 typedef 可以有方便程序的移植和简化较长的数据类型定义. typedef 还可以定义结 用 构类型,这一点在后面详细解说结构类型时再一并说明.typedef 的语法是 typedef 已有的数据类型 新的数据类型名 运算符就是完成某种特定运算的符号. 运算符按其表达式中与运算符的关系可分为单目 运算符,双目运算符和三目运算符.单目就是指需要有一个运算对象,双目就要求有两个运 算对象,三目则要三个运算对象.表达式则是由运算及运算对象所组成的具有特定含义的式 子.C 是一种表达式语言,表达式后面加 51 单片机 C 语言入门教程(磁动力工作室) 在一些朋友的来信中会出现 51 单片机 C 语言入门教程(磁动力工作室) 图 7-1 MAX232 在上两课的电路的基础上按图 7-3 加上 MAX232 就可以了.这大热天的拿烙铁焊焊,还 真的是热气迫人来呀:P 串口座用 DB9 的母头,这样就可以用买来的 PC 串口延长线进行和 电脑相连接,也可以直接接到电脑 com 口上. 图 7-2 DB9 接头 - 26 - 51 单片机 C 语言入门教程(磁动力工作室) 图 7-3 加上了 MAX232 的实验电路 做好后我们就先用回第一课的 51 单片机 C 语言入门教程(磁动力工作室) 图 7-4 调试结果 第七课 运算符和表达式(2) 关系运算符 对于关系运算符,同样我们也并不陌生.C 中有六种关系运算符,这些家伙同样是在小 时候学算术时学习过的: > 大于 < 小于="">= 大于等于 <= 小于等于="=" 等于="" !="等于" 或者你是个非="" c="">=> 51 单片机 C 语言入门教程(磁动力工作室) 例程序.为了增加学习的趣味性和生动性,不妨我们来假设在做一个会做算术的机器人,当 然真正会思考对话的机器,我想我是做不出来的了,这里的程序只是用来学习关系运算符的 基本应用. #include #include 51 单片机 C 语言入门教程(磁动力工作室) 其实之前说过 51单片机 C 语言入门教程 (磁动力工作室) 下面我们来用程序语言去有表达,如下: #include #include void main(void) { unsigned char True = 1; //定义 unsigned char False = 0; SCON = 0x50; //串口方式 1,允许接收 TMOD = 0x20; //定时器 1定时方式 2 TH1 = 0xE8; //11.0592MHz 1200波特率 TL1 = 0xE8; TI = 1; TR1 = 1; //启动定时器 if (!True || False && True) printf( else printf( } 大家可以使用以往学习的方法用 keil 或烧到片子上用串口调试。可以更改“ !True || False && True”这个条件式,以实验不同算法组合来掌握逻辑运算符的使用方法。 - 31 - 云南师范大学附中学生会 SQL简单语句教程 SQL语言简单教程 云南师范大学附中学生会 2011年2月24日 SQL语句简单教程 第 1 页 共 10 页 云南师范大学附中学生会 T * FROM Persons WHERE FirstName=Bush 数值: 数值: 这是正确的: SELECT * FROM Persons WHERE Year>1965 这是错误的: SELECT * FROM Persons WHERE Year>?1965? DELETE 语句 DELETE 语句用于删除表中的行。 语法 DELETE FROM 表 名称 WHERE 列名称 = 值 Person: LastName Gates Wilson 删除某行 "Fred Wilson" 会被删除: DELETE FROM Person WHERE LastName = ?Wilson? 结果: 结果 LastName Gates 删除所有行 可以在不删除表的情况下 删除所有的行。这意味着表的结构、属性和索引都是完整的: DELETE FROM table_name 或者: DELETE * FROM table_name FirstName Bill Address Xuanwumen 10 City Beijing FirstName Bill Fred Address Xuanwumen 10 Zhongshan 23 City Beijing Nanjing SQL 语句简单教程 第 4 页 共 10 页 云南师范大学附中学生会 SQL 简单语句教程 INSERT INTO 语句 INSERT INTO 语句用于向表格中插入 新的行。 语法 INSERT INTO 表名称 VALUES (值 1, 值 2,....) 我们也可以指 定所要插入数据的列: 云南师范大学附中学生会 INSERT INTO table_name (列 1, 列 2,...) VALUES (值 1, 值 2,....) 插入新的 行 "Persons" 表: LastName Carter SQL 语句: 语句: INSERT INTO Persons VALUES (?Gates?, ?Bill?, ?Xuanwumen 10?, ?Beijing?) 结果: 结果: LastName Carter Gates 在指定的列中插入数据 "Persons" 表: LastName Carter Gates SQL 语句: 语句: INSERT INTO Persons (LastName, Address) VALUES (?Wilson?, ?Champs-Elysees?) 结果: 结果: LastName Carter Gates Wilson FirstName Thomas Bill Address Changan Street Xuanwumen 10 Champs-Elysees City Beijing Beijing FirstName Thomas Bill Address Changan Street Xuanwumen 10 City Beijing Beijing FirstName Thomas Bill Address Changan Street Xuanwumen 10 City Beijing Beijing FirstName Thomas Address Changan Street City Beijing SQL 语句简单教程 共 10 页 第 5 页 云南师范大学附中学生会 SQL 简单语句教程 Update 语句 Update 语句用于修改表中的数据。 语法: 语 法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName Gates Wilson 更新某一行中的一个列 我们为 lastname 是 "Wilson" 的人添加 firstname: FirstName Bill Address Xuanwumen 10 Champs-Elysees 云南师范大学附中学生会 City Beijing UPDATE Person SET FirstName = ?Fred? WHERE LastName = ?Wilson? 结果: 结果: LastName Gates Wilson 更新某一行中的若干列 我们会修改地址 (address),并添加城市名称(city): UPDATE Person SET Address = ?Zhongshan 23?, City = ?Nanjing? WHERE LastName = ?Wilson? 结果: 结果: LastName Gates Wilson FirstName Bill Fred Address Xuanwumen 10 Zhongshan 23 City Beijing Nanjing FirstName Bill Fred Address Xuanwumen 10 Champs-Elysees City Beijing SQL 语句简单教程 第 6 页 共 10 页 云南师范大学附中学生会 SQL 简单语句教程 云南师范大学附中学生会 关于 MYSQL 格式: 格式: mysql -h 一、连接 MYSQL。 主机地址 -u 用户名 ,p 用户密码 1、连接到本机上的 MYSQL。 首先打开 DOS 窗口,然后进入目录 mysql\bin,再键入命令 mysql -u root -p,回车后提示你输密码.注意用户名前可以有 空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好 MYSQL, 超级用户 root 是没有密码的, 故直接回车即可进入到 MYSQL 中了, MYSQL 的提示符是: mysql> 2、连接到远程主机上的 MYSQL。假设远程主机的 IP 为:110.110.110.110,用户名为 root,密码为 abcd123。则键入以下 命令: mysql -h110.110.110.110 -u root -p 123;(注:u 与 root 之间可以不用加空格,其它也一样) 3、退出 MYSQL 命令: exit (回车) 、 命令: 回车) 二、修改密码。 格式: 格式:mysqladmin -p 旧密码 password 新密码 1、给 root 加个密码 ab12。首先在 DOS -u 用户名 下进入目录 mysql\bin,然后键入以下命令 mysqladmin -u root -password ab12 注:因为开始时 root 没有密码,所以-p 旧密码一项就可以省略了。 2、再将 root mysqladmin -u root -p ab12 password djg345 三、增加新用的密码改为 djg345。 户。 (注意:和上面不同,下面的因为是 MYSQL 环境中的命令,所以后面都带一个分号作为命令结束符) 格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码” 1、增加一个用户 test1 密码为 abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。 首先用 root 用户连入 MYSQL,然后键入以下命令: grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”; 但增加的用户是十分危险的,你想如某个人知道 test1 的密码,那么他就可以在 internet 上的任何一台电脑上登录你的 mysql 数据库并对你的数据可以为所欲为了,解决办法见 2。 2、增加一个用户 test2 密码为 abc,让他只可以在 localhost 上登录,并可以对数据库 mydb 进行查询、插入、修改、删除 的操作(localhost 指本地主机,即 MYSQL 数据库所在的那台主机) , 这样用户即使用知道 test2 的密码, 他也无法从 internet 上直接访问数据库, 只能通过 MYSQL 主机上的 web 页来访问了。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”; 如果你不想 test2 有密码,可以再打一个命令将密码消掉。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”; 下篇我是 MYSQL 中有关数据库方面的操作。注意:你必须首先登录到 MYSQL 中,以下操作都是在 MYSQL 的提示符 下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重 打一遍命令,只要打个分号回车就可以了。 也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就 OK。 2、你可以使用光标上下键调 出以前的命令。 二、显示命令 1、显示当前数据库服务器中的数据库列表: mysql> SHOW DATABASES; 注意:mysql 库里面有 MYSQL 的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。 2、显示数据库中的数据表: SQL 语句简单教程 第 7 页 共 10 页 云南师范大学附中学生会 SQL 简单语句教程 mysql> USE 库名; 库名; mysql> SHOW TABLES; 3、显示数据表的结 构: 云南师范大学附中学生会 mysql> DESCRIBE 表名; 4、建立数据库: mysql> CREATE DATABASE ; mysql> CREATE TABLE 表名 库名; 5、建立数据表: mysql> USE 库名 (字段名 VARCHAR(20), 字段名 CHAR(1)); 6、删除数据库: mysql> DROP DATABASE 库名; 7、删除数据表: mysql> DROP TABLE 表名; 8、将表 中记录清空: mysql> DELETE FROM 表名; 9、显示表中的记录: mysql> SELECT * FROM 表名; 10、往表中插入记录: mysql> INSERT INTO 表名 VALUES (”hyq”,”M”); 11、更新表中数据: mysql-> UPDATE 表名 SET 字段 名 1=’a?,字段名 2=’b’ WHERE 字段名 3=’c?; 12、用文本方式将数据装入 数据表中: mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名; 13、导入.sql 文件命令: mysql> USE 数据库名; mysql> SOURCE d:/mysql.sql; 14、命令行修改 root 密码: mysql> UPDATE mysql.user SET ’) WHERE User=’root’; mysql> FLUSH password=PASSWORD(’新密码 PRIVILEGES; 15、显示 use 的数据库名: mysql> SELECT DATABASE(); 16、 显示当前的 user: mysql> SELECT USER(); 三、一个建库和建表以及插入数 create 据的实例 drop database if exists school; //如果存在 SCHOOL 则删除 database school; //建立库 SCHOOL use school; //打开库 SCHOOL create table teacher //建立表 TEACHER ( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default ‘深圳’, year date ); //建表结束 SQL 语句简单教程 第 8 页 共 10 页 云南师范大学附中学生会 SQL 简单语句教程 云南师范大学附中学生会 //以下为插入字段 insert into teacher values(”,’allen’,?大连一中’,?1976-10-10′); ’,?大连二中’,?1975-12-23′); 如果你在 mysql 提insert into teacher values(”,’jack 示符键入上面的命令也可以,但不方便调试。 (1)你可以将以上命令原样写入 一个文 入命令行后使用 mysql> source c:\\school.sql; 也可以将 school.sql 文件导 入数据库中。 四、将文本数据转到数据库中 1、文本数据应符合的格式:字段 数据之间用 tab 键隔开,null 值用[url=file://\\n]\\n[/url]来代替.例: 3 rose 大连 二中 1976-10-10 4 mike 大连一中 1975-12-23 假设你把这两组数据存为 school.txt 文件,放在 c 盘根目录下。 2、数据传入命令 load data local infile “c:\\school.txt” into table 表名; 注意:你最好将文件复制到 [url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下,并且要先用 use 命令打表所在的 库。 五、备份数据库: (命令在 DOS 的[url=file://\\mysql\\bin]\\mysql\\bin[/url] 目录下执行) 1.导出整个数据库 导出文件默认是存在 mysql\bin 目录下 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u user_name -p123456 database_name > outfile_name.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u user_name -p database_name table_name > outfile_name.sql 3.导出一个数据库 结构 mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql -d 没有数据 –add-drop-table 在每个 create 语句之前增加一个 drop table 4.带语言参数导出 mysqldump -uroot -p –default-character-set=latin1 –set-charset=utf-8 –skip-opt database_name > outfile_name.sql 注:MYSQL 部分加粗的语句请牢记,其他语句可以查询,不必全部记住。 SQL 语句简单教程 第 9 页 共 10 页 云南师范大学附中学生会 SQL 简单语句教程 云南师范大学附中学生会 SQL 语句简单教程 共 10 页 第 10 页 云南师范大学附中学生会 SQL语言入门教程:第一课 简介 2001-12-13 00:00:00 第一课 简介 SQL是英文Structured Query Language的缩写,意思为结构化查询语言。 SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。 目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create, 以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。 下面,我们就来详细介绍一下SQL语言的基本知识。 一个典型的关系型数据库通常由一个或多个被称作表格的对象组成。数据库中的所有数据或信息都被保存在这些数据库表格中。数据库中的每一个表格都具有自己唯一的表格名称,都是由行和列组成,其中每一列包括了该列名称,数据类型,以及列的其它属性等信息,而行则具体包含某一列的记录或数据。以下,是一个名为太平洋网络学院的数据库表格的实例。 栏目 用户群 新手上路 电脑初学者 软件教室 一般的电脑用户 设计教室 电脑设计爱好者 开发教室 电脑编程人员 该表格中“栏目”, “用户群”就是两个不同的列,而表格中的每一行则包含了具体的表格数据。 1. 创建表格 2. 数据查询 3. 向表格中添加、更新、删除记录 4. 删除数据库表格 SQL语言入门教程:第二课 创建表格 2001-12-13 10:45:38 第二课 创建表格 SQL语言中的create table语句被用来建立新的数据库表格。create table语句 的使用格式如下: create table tablename (column1 data type, column2 data type, column3 data type); 如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项: create table tablename (column1 data type [constraint], column2 data type [constraint], column3 data type [constraint]); 举例如下: create table employee (firstname varchar(15), lastname varchar(20), age number(3), address varchar(30), city varchar(20)); 简单来说,创建新表格时,在关键词create table后面加入所要建立的表格的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限制条件等。注意,所有的SQL语句在结尾处都要使用“;”符号。 使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字母,数字或下划线,名称的长度不能超过30个字符。注意,用户在选择表格名称时不要使用SQL语言中的保留关键词,如select, create, insert等,作为表格或列的名称。 数据类型用来设定某一个具体列中数据的类型。例如,在姓名列中只能采用varchar或char的数据类型,而不能使用number的数据类型。 SQL语言中较为常用的数据类型为: char(size):固定长度字符串,其中括号中的size用来设定字符串的最大长度。Char类型的最大长度为255字节。 varchar(size):可变长度字符串,最大长度由size设定。 number(size):数字类型,其中数字的最大位数由size设定。 Date:日期类型。 number(size,d):数字类型,size决定该数字总的最大位数,而d则用于设定该数字在小数点后的位数。 最后,在创建新表格时需要注意的一点就是表格中列的限制条件。所谓限制条件就是当向特定列输入数据时所必须遵守的规则。例如,unique这一限制条件要求某一列中不能存在两个值相同的记录,所有记录的值都必须是唯一的。除unique之外,较为常用的列的限制条件还包括not null和primary key等。not null用来规定表格中某一列的值不能为空。primary key则为表格中的所有记录规定了唯一的标识符。 SQL语言入门教程:第三课 数据查询 2001-12-13 00:00:00 第三课 数据查询 在众多的SQL命令中,select语句应该算是使用最频繁的。select语句主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。Select语句的语法格式如下: select column1 [, column2,etc] from tablename [where condition]; ([] 表示可选项) select语句中位于select关键词之后的列名用来决定那些列将作为查询结果返回。用户可以按照自己的需要选择任意列,还可以使用通配符“*”来设定返回表格中的所有列。 select语句中位于from关键词之后的表格名称用来决定将要进行查询操作的目标表格。 Select语句中的where可选从句用来规定哪些数据值或哪些行将被作为查询结果返回或显示。 在where条件从句中可以使用以下一些运算符来设定查询标准: = 等于 > 大于 < 小于=""> >= 大于等于 <= 小于等于="">=> <> 不等于 除了上面所提到的运算符外,LIKE运算符在where条件从句中也非常重要。LIKE运算符的功能非常强大,通过使用LIKE运算符可以设定只选择与用户规定格式相同的记录。此外,我们还可以使用通配符“%”用来代替任何字符串。举例如下: select firstname, lastname, city from employee where firstname LIKE ‘E% (注意,字符串必须被包含在单括号内) 上述SQL语句将会查询所有名称以E开头的姓名。或者,通过如下语句: select * from employee where firstname = ‘May’; 查询所有名称为May的行。 SQL语言入门教程:第四课 向表格中添加、更新、删除记录 2001-12-13 10:47:20 第四课 向表格中添加、更新、删除记录 添加新记录 SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语句的使用格式如下: insert into tablename (first_column,...last_column) values (first_value,...last_value); 例如: insert into employee (firstname, lastname, age, address, city) values (‘Li’, ‘Ming’, 45, ‘No.77 Changan Road’, ‘Beijing”); 简单来说,当向数据库表格中添加新记录时,在关键词insert into后面输入所要添加的表格名称,然后在括号中列出将要添加新值的列的名称。最后,在关键词values的后面按照前面输入的列的顺序对应的输入所有要添加的记录值。 更新记录 SQL语言使用update语句更新或修改满足规定条件的现有记录。update语句的格式为: update tablename set columnname = newvalue [, nextcolumn = newvalue2...] where columnname OPERATOR value [and|or column OPERATOR value]; 例如: update employee set age = age+1 where first_name= ‘Mary’and last_name= ‘Williams’; 使用update语句时,关键一点就是要设定好用于进行判断的where条件从句。 删除记录 SQL语言使用delete语句删除数据库表格中的行或记录。Delete语句的格式为: delete from tablename where columnname OPERATOR value [and|or column OPERATOR value]; 例如: delete from employee where lastname = May; 简单来说,当需要删除某一行或某个记录时,在delete from关键词之后输入表格名称,然后在where从句中设定删除记录的判断条件。注意,如果用户在使用delete语句时不设定where从句,则表格中的所有记录将全部被删除。 SQL语言入门教程:第五课 删除数据库表格 2001-12-13 10:47:51 第五课 删除数据库表格 在SQL语言中使用drop table命令删除某个表格以及该表格中的所有记录。drop table命令的使用格式为: drop table tablename; 例如: drop table employee; 如果用户希望将某个数据库表格完全删除,只需要在drop table命令后输入希望 删除的表格名称即可。drop table命令的作用与删除表格中的所有记录不同。删除表格中的全部记录之后,该表格仍然存在,而且表格中列的信息不会改变。而使用drop table命令则会将整个数据库表格的所有信息全部删除。 以上,我们对SQL语言主要的命令和语句进行了较为详细的介绍。应该说SQL语句的语法结构和风格还是相当简单和直观的,只要用户结合实践多加练习,一定会在短期内迅速掌握。 以Store_Information数据表为例,我们可以在GROUP BY一节中所使用的SQL命令中设置如下字段和数据表别名: SELECT A1.store_name Store, SUM(Sales) "Total Sales" FROM Store_Information A1 GROUP BY A1.store_name 查询结果显示为: Store Total Sales Los Angeles $1800 San Diego $250 Boston $700 转载请注明出处范文大全网 » html语言入门教程
欢迎来到H.S Workshop
欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop 欢迎来到H.S Workshop
换行。至于
是什么,我想看了明天的排版标识我就可以了解了。
,
,
是个空标识,
H.S Workshop
H.S Workshop H.S Workshop H.S Workshop H.S Workshop H.S Workshop H.S
H.S Workshop
的对齐效果了。
的对齐效果了,具体的就举例说明了,你可以自行尝试一下,注意,他们可是围堵标识哦。
对比一下,这是个建议折行的标识,当用户的分辨率无法完整的显示出一段文字的时候,你就可以插入这个标识,这时候就会发生于
同样的效果,如果达到了条件则没有效果产生,你可以自己尝试一下,它是一个空标识。接着我们来看看HTML两个在排版上非常使用的标识。 ,
显示出来的是设定好了的字体大小,
的基础上把html里的标识也显示出来。
。 align= 着个围堵标识来实现,着个标识的作用就好象告诉浏览器开始处理HTML文件一样,它告诉浏览器现在开始处理表格,其他所有的表格标识都必须写在
里面。 关于它的参数比较多,我们现在一个个来看它有什么作用。
1 2 3 4
1 2 3 4 这个标识,一般我们添加多少个 就表格就会分成多少行。一个表格的基本格式如下:
的参数设定吧。 来实现.在 下面写入多少个 就会在这一列中显示出多少个单元格。然后我们来看看对单元格有些什么参数可以设定吧。 第一列第一栏 第一列 之 第二栏及第三栏 第二列及第三列 之 第一栏 第二列第二栏 第二列第三栏 第三列第二栏 第三列第三栏 ,它同样也表示一个单元格,唯一不同的是 所标示的储存格中的文字是以粗体出现,当然若为 所标示的储存格中的文字加上粗体标记便等如 的效果。用它取代 即可显示效果,关于它的参数和 一样,这里就不详细说明了. :表体的起始符。紧跟在
此处加入文章内容 :表格的起始符。任意一个表格的开始都必须以它开头,且必须有终止符
。 也有此属性。同时设置背景色和背景图不冲突,也建议这么做,这样,当图片不能显示时,表格的外观依然是好看的。 之后,表示表体开始。必须有终止符<,tbody>,放在,tbody>
之前。在纯网页中可以不要tbody元素,但在论坛一定要使用,因为,当帖子用到较多的表格时,论坛的自动填充功能将可能会导致代码出错。 :表示表格的行,其中,t是table,r是row(行)。有多少组tr,这张表格就有多少行。 紧跟在 之后。必须有终止符。 :表示表格的列,t是table,d可理解为down(向下)。有多少组td,这张表格就有多少列。 紧跟在 之后。终止符为 。td与tr配合构成单元格。 范文二:SQL语言入门教程
范文三:C语言入门教程
范文四:SQL语言入门教程
范文五:SQL语言入门教程