SQL是Structured Quevy Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
一.建一个新的数据库
例:creat database mydata /*mydata是你想要建的库的名字*/
二.在库中建一个新表单
例:CREATE TABLE mydiary (weather VARCHAR(40),comments TEXT,thedate DATETIME)
注意每个字段名后面都跟有一个专门的表达式。例如,字段名comments后面跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型决定了一个字段可以存储什么样的数据。因为字段comments包含文本信息,其数据类型定义为文本型。
字段有许多不同的数据类型。创建和使用表时,更你应该理解五种常用的字段类型:字符型,文本型,数值型,逻辑性和日期型。
1.字符型数据
请看下面这个例子:
CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)
CREATE TABLE mydairy (weather CHAR(40),comments TEXT,thedate DATETIME)
用VARCHAR定义的字段可用来存放可变长度的字符串信息.但是VARCHAR类型可以存储的字符串最长为255个字符。要存储更长的字符串数据,可以使用文本型数据。而表达式CHAR指定了这个字段应该是固定长度的字符串。VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符--字符串Bill Gates的长度。
现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。
2.文本型数据
例子:
CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)
在这个例子中,字段comments被用来存一段信息。注意文本型数据没有长度. 一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。
3.数值型数据
例子:
CREATE TABLE article (articlename VARCHAR(40),article_charnum INT)
为了节省内存空间,你可以使用SMALLINT型数据。SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的使用方法与INT型完全相同。
最后,如果你实在需要节省空间,你可以使用TINYINT型数据。同样,这种类型的使用方法也与INT型相同,不同的是这种类型的字段只能存储从0到255的整数。TINYINT型字段不能用来存储负数。
为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数--比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数0.01。
当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。这里有一个使用这种数据类型的例子:
CREATE TABLE numeric_data (bignum NUMERIC(28,0),smallnum NUMERIC (6,3) )
4.存储逻辑值
BIT型字段不能取空值,只能取两个值:0或1。这里有一个如何使用这种字段的例子:
CREATE TABLE right_falese (word VARCHAR(20),last_key BIT)
5.存储日期和时间
如要存储日期和时间,你需要使用DATETIME型数据,如下例所示:
CREATE TABL studylog( coursename VARCHAR (50), begintime DATETIME ,endtime DATETIME)
一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。
DATETIME型字段在你输入日期和时间之前并不包含实际的数据,认识这一点是重要的。
6.字段属性(空值,缺省值和标识值)。
(1).允许和禁止空值
大多数字段可以接受空值(NULL)。当一个字段接受了空值后,如果你不改变它,它将一直保持空值。空值(NULL)和零是不同的,严格的说,空值表示没有任何值。
为了允许一个字段接受空值,你要在字段定义的后面使用表达式NULL。例如,下面的表中两个字段都允许接受空值:
CREATE TABLE course (coursename CHAR (50) NULL,hours INT NULL)
(2).缺省值
为了在创建一个表时指定缺省值,你可以使用表达式DEFAULT。请看下面这个在创建表时使用缺省值的例子:
CREATE TABLE message (name VARCHAR(10) NOT NULL,
address VARCHAR(40) NOT NULL,
tel int NULL,
relation VARCHAR(20) DEFAULT ’classmate’)
在这个例子中,字段relation的缺省值被指定为classmate。注意单引号的使用,引号指明这是字符型数据。为了给非字符型的字段指定缺省值,不要把该值扩在引号中。
(3)标识字段
每个表可以有一个也只能有一个标识字段。一个标识字段是唯一标识表中每条记录的特殊字段。例如,数据库courses中的表course包含了一个唯一标识每个工作标识字段:
courseid coursename
…………………………………………………………….
1 english
2 chinese
3 math
4 physics
5 chemistry
字段courseid为每个工作提供了唯一的一个数字。如果你决定增加一个新工作,新增记录的course字段会被自动赋给一个新的唯一值。
为了建立一个标识字段,你只需在字段定义后面加上表达式IDENTITY即可。你只能把NUMERIC型或INT型字段设为标识字段,这里有一个例子:
CREATE TABLE studentID (theID NUBERIC(15) IDENTITY,name VARCHAR(20))
建立一个标示字段时,注意使用足够大的数据类型。例如你使用TINYINT型数据,那么你只能向表中添加255个记录。如果你预计一个表可能会变得很大,你应该使用NUMERIC型数据。
三.在表中查询
1.输入以下的SELECT语句:
SELECT studentname FROM students
这个查询执行后,会取出表students中的所有学生姓名(没有特定的顺序)。如果表students中包含几百名学生,会有几百个记录被取出,如果表中有三万名学生,这三万条记录都会被取出(这也许需要一些时间)。
2.你也可以在一个SELECT语句中一次取出多个字段,比如:
SELECT studentname ,studentid FROM students
在SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:
SELECT * FROM students
这个SELECT语句执行后,表中的所有字段的值都被取出。你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:
SELECT studentname,specialityname FROM students, specialitys
这个SELECT语句执行时,同时从表students和表specialitys中取出数据。从表students中取出所有的学生名字,从表specialitys中取出所有的专业名。但你考虑到没有上例从两个表中选出记录组合有没有意义?答案是否定的.要解决这个问题你需要通过建立两表中字段的关系来关联两个表。要做到这一点的途径之一是创建第三个表,专门用来描述另外两个表的字段之间的关系。
表students有一个名为studentid的字段,包含有每个作者的唯一标识。表specialitys有一个名为specialityid的字段,包含每个专业名的唯一标识。如果你能在字段studentid和字段specialityid之间建立一个关系,你就可以关联这两个表。数据库teaching中有一个名为studentspeciality的表,正是用来完成这个工作。表中的每个记录包括两个字段,用来把表students和表specialitys关联在一起。下面的SELECT语句使用了这三个表以得到正确的结果:
SELECT studentname,speciality FROM students,specialitys,studentspeciality
WHERE students.specialityid=studentspeciality.specialityid
AND specialitys.specialityid=studentspeciality.specialityid
当这个SELECT语句执行时,每个学生都与专业相匹配。表studentspeciality指明了表students和表specialitys的关系,它通过包含分别来自两个表的各一个字段实现这一点。第三个表的唯一目的是在另外两个表的字段之间建立关系。它本身不包含任何附加数据。
注意:在这个例子中字段名是如何书写的。为了区别表students和表specialitys中相同的字段名specialityid,每个字段名前面都加上了表名前缀和一个句号。
3.通常,当你从一个表中取出字段值时,该值与创建该表时所定义的字段名联系在一起。
下例:SELECT studentname "the name of student" FROM students
当这个SELECT语句执行时,来自字段studentname的值会与"the name of student"相联系。查询结果可能是这样:
the name of student
……………………………………………………………………..
小新
小白
小生
......
(30 row(s) affected)
你也可以通过执行运算,来操作从一个表返回的字段值。例如,如果你想把表books中的所有书的价格加倍,你可以使用下面的SELECT语句:
SELECT a _book_price*2 FROM books
你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进行运算,例如:
SELECT a_book_price*sales_num"total money" FROM books
4.排序查询结果
看一列没有特定顺序的名字是很不方便的。如果把这些名字按字母顺序排列,读起来就会容易得多。通过使用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:
SELECT studentname FROM students ORDER BY studentname
当这个SELECT语句执行时,学生名字的显示将按字母顺序排列。ORDER BY子句将学生名字按升序排列。
而下例:SELECT studentname,speciality FROM students ORDER BY studentname ,speciality
这个查询首先把结果按studentname字段进行排序,然后按字段speciality排序。记录将按如下的顺序取出:
studentname speciality
…………………………………………………………………….
小白 幼教
小新 光电
小生 无线电
小军 档案
…
(23 row(s) affected)
你也可以按数值型字段对一个查询结果进行排序。例如,如果你想按降序取出所有书的价格,你可以使用如下的SQL查询:
SELECT a_book_price FROM books ORDER BY a_book_price DESC
这个SELECT语句从表中取出所有书的价格,显示结果时,价格低的书先显示,价格高的书后显示。
5.取出互不相同的记录
在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:
SELCET DISTINCT studentname FROM students WHERE studentname=’小白’
当这个SELECT语句执行时,只返回一个记录。通过在SELECT语句中包含关键字DISTINCT,你可以删除所有重复的值。
四.向表中添加数据
向表中添加一个新记录,你要使用 INSERT 语句。这里有一个如何使用这种语句的例子:
INSERT students (studentname) VALUES (’one name’)
这个语句把字符串’one name’插入表students的sudentname字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。
INSERT 语句的完整句法如下:
INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |Values_list | elect_statement}
如果你在INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:
1.如果该字段有一个缺省值,该值会被使用。
2.如果该字段可以接受空值,而且没有缺省值,则会被插入空值。
3.如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:The column in table mytable may not be null.
4. 最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。
五.删除记录
要从表中删除一个或多个记录,需要使用DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字段studentname的值等于’小生’的记录:
DELETE students WHERE studentname=’小生’
DELETE 语句的完整句法如下:
DELETE [FROM] {table_name|view_name} [WHERE clause]
在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句 中使用。例如,下面的这个DELETE语句只删除那些studentname字段的值为’小白’或speciality字段的值为’幼教’的记录:
DELETE students WHERE studentname=’小白’ OR speciality=’幼教’
六.更新记录
要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:
UPDATE students SET speciality=’教育’ WHERE speciality=’幼教’
这个UPDATE 语句更新所有speciality字段的值为’幼教’的记录。对所有被选中的记录,字段speciality的值被置为’教育’。
下面是UPDATE语句的完整句法:
UPDATE {table_name|view_name} SET [{table_name|view_name}]
{column_list|variable_list|variable_and_column_list}
[,{column_list2|variable_list2|variable_and_column_list2}…
[,{column_listN|variable_listN|variable_and_column_listN}]]
[WHERE clause]
注意:如果你不提供WHERE子句,表中的所有记录都将被更新。
七.建立索引
索引有两种类型:聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。
如:CREATE INDEX studentname_index ON students (studentname)
这个语句建立了一个名为studentname_index的索引。你可以给一个索引起任何名字,但你应该在索引名中包含所索引的字段名,这对你将来弄清楚建立该索引的意图是有帮助的。
索引studentname_index对表students的studentname字段进行。这是个非聚簇索引,也是个非唯一索引。(这是一个索引的缺省属性)
如果你需要改变一个索引的类型,你必须删除原来的索引并重建 一个。建立了一个索引后,你可以用下面的SQL语句删除它:
DROP INDEX students.studentname_index
要建立一个聚簇索引,可以使用关键字CLUSTERED。记住一个表只能有一个聚簇索引。这里有一个如何对一个表建立聚簇索引的例子:
CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)
如果表中有重复的记录,当你试图用这个语句建立索引时,会出现错误。但是有重复记录的表也可以建立索引;你只要使用关键字ALLOW_DUP_ROW把这一点告诉SQL Sever即可:
CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)
WITH ALLOW_DUP_ROW
这个语句建立了一个允许重复记录的聚簇索引。你应该尽量避免在一个表中出现重复记录,但是,如果已经出现了,你可以使用这种方法。
要对一个表建立唯一索引,可以使用关键字UNIQUE。对聚簇索引和非聚簇索引都可以使用这个关键字。这里有一个例子:
CREATE UNIQUE COUSTERED INDEX studentname_clust_index ON students(studentname)
唯一索引是指该字段不能有重复的值,而不是只能建立这一个索引。
最后,要建立一个对多个字段的索引──复合索引──在索引建立语句中同时包含多个字段名。下面的例子对studentname和speciality两个字段建立索引:
CREATE INDEX student_speciality_index ON students(studentname,speciality)
这个例子对两个字段建立了单个索引。在一个复合索引中,你最多可以对16个字段进行索引。
http://ecourse.gdqy.edu.cn/jp_shengji/2007/database/jp/show_text.asp?id=87