⽤SQL语句创建表⽤SQL语句创建数据库
数据库中的所有数据存储在表中。数据表包括⾏和列。列决定了表中数据的类型。⾏包含了实际的数据。
例如,数据库pubs中的表authors有九个字段。其中的⼀个字段名为为au_lname,这个字段被⽤来存储作者的名字信息。每次向这个表中添加新作者时,作者名字就被添加到这个字段,产⽣⼀条新记录。
通过定义字段,你可以创建⼀个新表。每个字段有⼀个名字和⼀个特定的数据类型(数据类型在后⾯的“字段类型”⼀节中讲述),例如字段au_lname存储的是字符型数据。⼀个字段也可以存储其它类型的数据。
使⽤SQL Sever,创建⼀个新表的⽅法是很多的。你可以可执⾏⼀个SQL语句或使⽤SQL事务管理器(SQL Enterprise Manager)来创建⼀个新表。在下⼀节⾥,你将学会如何⽤SQL语句来创建⼀个新表。
⼀、⽤CREATE语句创建表
注意:
如果你还没有建⽴⾃⼰的数据库,现在就跳回到第三章创建这个库。你绝不能向master,tempdb或任何其他任何系统数据库中添加数据。
从SQL Sever程序组(在任务栏中)中启动ISQL/w程序。出现查询窗⼝后,从窗⼝顶部的下拉列表中选择你在第三章所创建的数据库。下⼀步,在查询窗⼝中键⼊下⾯的SQL语句,单击执⾏查询按钮,执⾏这个语句:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)
如果⼀切正常,你会在结果窗⼝中看到如下的⽂字(如果出现异常,请参阅第三章):
This command dit not return data ,and it did not return any rows
祝贺你,你已经建⽴了你的第⼀个表!
你所创建的表名为guestbook,你可以使⽤这个表来存储来字你站点访问者的信息。你是⽤CREATE TABLE语句创建的这个表,这个语句有两部分:第⼀部份指定表的名字;第⼆部份是括在括号中的各字段的名称和属性,相互之间⽤逗号隔开。
表guestbook有三个字段:visitor,comments 和entrydate。
Visitor 字段存储访问者的名字,
Comments 字段存储访问者对你站点的意见,
Entrydate 字段存储访问者访问你站点的⽇期和时间。
注意每个字段名后⾯都跟有⼀个专门的表达式。例如,字段名comments后⾯跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型决定了⼀个字段可以存储什么样的数据。因为字段comments包含⽂本信息,其数据类型定义为⽂本型。
⼆、字段类型
不同的字段类型⽤来存放不同类型的数据。创建和使⽤表时,你更应该理解五种常⽤的字段类型:字符型,⽂本型,数值型,逻辑性和⽇期型。
(1)字符型数据
字符型数据⾮常有⽤。当你需要存储短的字符串信息时,你总是要⽤到字符型数据。例如,你可以把从HTML form的⽂本框中搜集到的信息放在字符型字段中。
要建⽴⼀个字段⽤来存放可变长度的字符串信息,你可以使⽤表达式 VARCHAR。考虑你前⾯创建的表guestbook:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)
在这个例⼦中,字段visitor的数据类型为VARCHAR。注意跟在数据类型后⾯的括号中的数字。这个数字指定了这个字段所允许存放的字符串的最⼤长度。在这个例⼦中,字段visitor能存放的字符串最长为四⼗个字符。如果名字太长,字符串会被截断,只保留四⼗个字符。
VARCHAR类型可以存储的字符串最长为255个字符。要存储更长的字符串数据,可以使⽤⽂本型数据(下⼀节中讲述)。
另⼀种字符型数据⽤来存储固定长度的字符数据。下⾯是⼀个使⽤这种数据类型的例⼦:
CREATE TABLE guestbook (visitor CHAR(40),comments TEXT,entrydate DATETIME)
在这个例⼦中,字段visitor被⽤来存储四⼗个字符的固定长度字符串。表达式CHAR指定了这个字段应该是固定长度的字符串。
VARCHAR型和CHAR型数据的这个差别是细微的,但是⾮常重要。假如你向⼀个长度为四⼗个字符的
VARCHAR型字段中输⼊数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为⼗个字符——字符串Bill Gates的长度。
现在假如你把字符串输⼊⼀个长度为四⼗个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四⼗个字符。字符串的后⾯会被附加多余的空格。
当你建⽴⾃⼰的站点时,你会发现使⽤VARCHAR型字段要⽐CHAR型字段⽅便的多。使⽤VARCHAR型字段时,你不需要为剪掉你数据中多余的空格⽽操⼼。
VARCHAR型字段的另⼀个突出的好处是它可以⽐CHAR型字段占⽤更少的内存和硬盘空间。当你的数据库很⼤时,这种内存和磁盘空间的节省会变得⾮常重要。
(2)⽂本型数据
字符型数据限制了字符串的长度不能超过255个字符。⽽使⽤⽂本型数据,你可以存放超过⼆⼗亿个字符的字符串。当你需要存储⼤串的字符时,应该使⽤⽂本型数据。
这⾥有⼀个使⽤⽂本型数据的例⼦:
CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)
在这个例⼦中,字段comments被⽤来存放访问者对你站点的意见。注意⽂本型数据没有长度,⽽上⼀节中所讲的字符型数据是有长度的。⼀个⽂本型字段中的数据通常要么为空,要么很⼤。
当你从HTML form的多⾏⽂本编辑框(TEXTAREA)中收集数据时,你应该把收集的信息存储于⽂本型字段中。但是,⽆论何时,只要你能避免使⽤⽂本型字段,你就应该不适⽤它。⽂本型字段既⼤且慢,滥⽤⽂本型字段会使服务器速度变慢。⽂本型字段还会吃掉⼤量的磁盘空间。
警告:
⼀旦你向⽂本型字段中输⼊了任何数据(甚⾄是空值),就会有2K的空间被⾃动分配给该数据。除⾮删除该记录,否则你⽆法收回这部分存储空间。(3)数值型数据
SQL Sever⽀持许多种不同的数值型数据。你可以存储整数、⼩数、和钱数。
通常,当你需要在表中的存放数字时,你要使⽤整型(INT)数据。INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数。下⾯是⼀个如何使⽤INT型数据的例⼦:
CREATE TABLE visitlog (visitor VARCHAR(40),numvisits INT)
这个表可以⽤来记录你站点被访问的次数。只要没有⼈访问你的站点超过2,147,483,647次,nubvisits字段就可以存储访问次数。
为了节省内存空间,你可以使⽤SMALLINT型数据。SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的使⽤⽅法与INT型完全相同。
最后,如果你实在需要节省空间,你可以使⽤TINYINT型数据。同样,这种类型的使⽤⽅法也与INT型相同,不同的是这种类型的字段只能存储从0到255的整数。TINYINT型字段不能⽤来存储负数。
通常,为了节省空间,应该尽可能的使⽤最⼩的整型数据。⼀个TINYINT型数据只占⽤⼀个字节;⼀个INT型数据占⽤四个字节。这看起来似乎差别不⼤,但是在⽐较⼤的表中,字节数的增长是很快的。另⼀⽅⾯,⼀旦你已经创建了⼀个字段,要修改它是很困难的。因此,为安全起见,你应该预测以下,⼀个字段所需要存储的数值最⼤有可能是多⼤,然后选择适当的数据类型。
为了能对字段所存放的数据有更多的控制,你可以使⽤NUMERIC型数据来同时表⽰⼀个数的整数部分和⼩数部分。NUMERIC型数据使你能表⽰⾮常⼤的数——⽐INT型数据要⼤得多。⼀个NUMERIC型字段可以存储从-10^38到10^38范围内的数。NUMERIC型数据还使你能表⽰有⼩数部分的数。例如,你可以在NUMERIC型字段中存储⼩数3.14。
当定义⼀个NUMERIC型字段时,你需要同时指定整数部分的⼤⼩和⼩数部分的⼤⼩。这⾥有⼀个使⽤这种数据类型的例⼦:
CREATE TABLE numeric_data (bignumber NUMERIC(28,0), fraction NUMERIC (5,4) )
当这个语句执⾏时,将创建⼀个名为numeric_data的包含两个字段的表。字段bignumber可以存储直到28位的整数。字段fraction可以存储有五位整数部分和四位⼩数部分的⼩数。
⼀个NUMERIC型数据的整数部分最⼤只能有28位,⼩数部分的位数必须⼩于或等于整数部分的位数,⼩数部分可以是零。
你可以使⽤INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型⽤于此⽬的。如果你希望你的⽹点能挣很多钱,你可以使⽤MONEY型数据。如果你的野⼼不⼤,你可以使⽤SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到
922,337,203,685,477.5807的钱数。如果你需要存储⽐这还⼤的⾦额,你可以使⽤NUMERIC型数据。
SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,如果可以的话,你应该⽤SMALLMONEY型来代替MONEY型数据,以节省空间。下⾯的例⼦显⽰了如何使⽤这两种表⽰钱的数据类型:
CREATE TABLE products (product VARCHAR(40),price MONEY,
Discount_price SMALLMONEY)
这个表可以⽤来存储商品的折扣和普通售价。字段price 的数据类型是MONEY,字段discount_price的数据类型是SMALLMONEY。
(4)存储逻辑值
如果你使⽤复选框(CHECKBOX)从⽹页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。这⾥有⼀个如何使⽤这种字段的例⼦:
CREATE TABLE opinion (visitor VARCHAR(40),good BIT)
这个表可以⽤来存放对你的⽹站进⾏民意调查所得的信息。访问者可以投票表⽰他们是否喜欢你的⽹站。如果他们投YES,就在BIT型字段中存⼊1。反之,如果他们投NO,就在字段中存⼊0(在下⼀章⾥,你将学会如何计算投票)。
当⼼,在你创建好⼀个表之后,你不能向表中添加BIT型字段。如果你打算在⼀个表中包含BIT型字段,你必须在创建表时完成。
(5)存储⽇期和时间
当你建⽴⼀个⽹站时,你也许需要记录在⼀段时间内的访问者数量。为了能够存储⽇期和时间,你需要使⽤DATETIME型数据,如下例所⽰:
CREATE TABL visitorlog(arrivaltime DATETIME ,departuretime DATETIME)
这个表可以⽤来记录访问者进⼊和离开你⽹站的时间和⽇期。⼀个DATETIME型的字段可以存储的⽇期范围是从1753年1⽉1⽇第⼀毫秒到9999年12⽉31⽇最后⼀毫秒。
如果你不需要覆盖这么⼤范围的⽇期和时间,你可以使⽤SMALLDATETIME型数据。它与DATETIME型数据同样使⽤,只不过它能表⽰的⽇期和时间范围⽐DATETIME型数据⼩,⽽且不如DATETIME型数据精确。⼀个SMALLDATETIME型的字段能够存储从1900年1⽉1⽇到2079年6⽉6⽇的⽇期,它只能精确到秒。
DATETIME型字段在你输⼊⽇期和时间之前并不包含实际的数据,认识这⼀点是重要的。在下⼀章,你将学习怎样使⽤⼤量的SQL函数来读取和操作⽇期和时间(参见下⾯的“缺省值”⼀节)。你也可以在VBScript和JScript 中使⽤⽇期和时间函数来向⼀个DATETIME型字段中输⼊⽇期和时间。
三、字段属性
上⼀节介绍了如何建⽴包含不同类型字段的表。在这⼀节中,你将学会如何使⽤字段的三个属性。这些属性允许你控制空值,缺省值和标识值。
(1)允许和禁⽌空值
⼤多数字段可以接受空值(NULL)。当⼀个字段接受了空值后,如果你不改变它,它将⼀直保持空值。空值(NULL)和零是不同的,严格的说,空值表⽰没有任何值。
为了允许⼀个字段接受空值,你要在字段定义的后⾯使⽤表达式NULL。例如,下⾯的表中两个字段都允许接受空值:
CREATE TABLE empty (empty1 CHAR (40) NULL,empty2 INT NULL)
注意:
BIT型数据不能是空值。⼀个这种类型的字段必须取0或者1。
有时你需要禁⽌⼀个字段使⽤空值。例如,假设有⼀个表存储着信⽤卡号码和信⽤卡有效⽇期,你不会希望有⼈输⼊⼀个信⽤卡号码但不输⼊有效⽇期。为了强制两个字段都输⼊数据,你可以⽤下⾯的⽅法建⽴这个表:
CREATE TABLE creditcards (creditcard_number CHAR(20) NOT NULL,
Creditcard_expire DATETIME NOT NULL)
注意字段定义的后⾯跟有表达式NOT NULL。通过包含表达式NOT NULL,你可以禁⽌任何⼈只在⼀个字段中插⼊数据,⽽不输⼊另⼀个字段的数据。
你将会发现,在你建设⾃⼰的⽹站过程中,这种禁⽌空值的能⼒是⾮常有⽤的。如果你指定⼀个字段不能接受空值,那么当你试图输⼊⼀个空值时,会有错
误警告。这些错误警告可以为程序调试提供有价值的线索。
(2)缺省值
假设有⼀个存储地址信息的表,这个表的字段包括街道、城市、州、和国家。如果你预计地址的⼤部分是在美国,你可以把这个值作为country字段的缺省值。
为了在创建⼀个表时指定缺省值,你可以使⽤表达式DEFAULT。请看下⾯这个在创建表时使⽤缺省值的例⼦:
CREATE TABLE addresses (street VARCHAR(60) NULL,
city VARCHAR(40) NULL,
state VARCHAR(20) NULL
sql容易学吗zip VARCHAR(20) NULL,
country VARCHAR(30) DEFAULT ‘USA’)
在这个例⼦中,字段country的缺省值被指定为美国。注意单引号的使⽤,引号指明这是字符型数据。为了给⾮字符型的字段指定缺省值,不要把该值扩在引号中:
CREATE TABLE orders(price MONEY DEFAULT $38.00,
quantity INT DEFAULT 50,
entrydate DATETIME DEFAULT GETDATE())
在这个CREATE TABLE语句中,每个字段都指定了⼀个缺省值。注意DATETIME型字段entrydate所指定的缺省值,该缺省值是函数Getdate()的返回值,该函数返回当前的⽇期和时间。
(3)标识字段
每个表可以有⼀个也只能有⼀个标识字段。⼀个标识字段是唯⼀标识表中每条记录的特殊字段。例如,数据库pubs中的表jobs包含了⼀个唯⼀标识每个⼯作标识字段:
job_id job_desc
…………………………………………………………….
1 New Hire Job not specified
2 Chief Executive officer
3 Bushness Operations Manager
4 Chief Financial Officier
5 Publisher
字段job_id为每个⼯作提供了唯⼀的⼀个数字。如果你决定增加⼀个新⼯作,新增记录的job_id字段会被⾃动赋给⼀个新的唯⼀值。
为了建⽴⼀个标识字段,你只需在字段定义后⾯加上表达式IDENTITY即可。你只能把NUMERIC型或INT型字段设为标识字段,这⾥有⼀个例⼦:
CREATE TABLE visitorID (theID NUBERIC(18) IDENTITY,name VARCHAR(40))
这个语句所创建的表包含⼀个名为theid的标识字段。每当⼀个新的访问者名字添加到这个表中时,这个字段就被⾃动赋给⼀个新值。你可以⽤这个表为你的站点的每⼀个⽤户提供唯⼀标识。
技巧:
建⽴⼀个标⽰字段时,注意使⽤⾜够⼤的数据类型。例如你使⽤TINYINT型数据,那么你只能向表中添加255个记录。如果你预计⼀个表可能会变得很⼤,你应该使⽤NUMERIC型数据。
标识字段的存在会使你想尝试许多不可能的事情。例如,你也许想利⽤标识字段来对记录进⾏基于它们在表中位置的运算。你应该抛弃这种意图。每个记录的标识字段的值是互不相同的,但是,这并不禁⽌⼀个标识字段的标识数字之间存在间隔。例如,你永远不要试图利⽤⼀个表的标识字段来取出表中的前⼗个记录。这种操作会导致失败,⽐如说6号记录和7号记录根本不存在。
四、删除和修改表
要删除⼀个表,你可以使⽤SQL语句DROP TABLE。例如,⼜从数据库中彻底删除表mytable,你要使⽤如下的语句:
DROP TABLE mytable
警告:
使⽤DROP TABLE命令时⼀定要⼩⼼。⼀旦⼀个表被删除之后,你将⽆法恢复它。
当你建设⼀个站点时,你很可能需要向数据库中输⼊测试数据。⽽当你准备向世界提供你的⽹点时,你会想清空表中的这些测试信息。如果你想清除表中的所有数据但不删除这个表,你可以使⽤TRUNCATE TABLE语句。例如,下⾯的这个SQL语句从表mytable中删除所有数据:
TRUNCATE TABLE mytable
虽然你不能删除和修改已经存在的字段,但你可以增加新字段。最容易的实现⽅法是使⽤SQL事务管理器中的Manager Tables窗⼝。你也可以使⽤SQL语句ALTER TABLE。下⾯是⼀个如何使⽤这种语句的例⼦:
ALTER TABLE mytable ADD mynewcolumn INT NULL
这个语句向表mytable中增加了⼀个新字段mynewcolumn。当你增加新字段时,你必须允许它接受空值,因为表中原来可能已经有了许多记录。
总结
为了⼤家更容易理解我举出的SQL语句,本⽂假定已经建⽴了⼀个学⽣成绩管理数据库,全⽂均以学⽣成绩的管理为例来描述。
1.在查询结果中显⽰列名:
a.⽤as关键字:select name as'姓名'from students order by age
b.直接表⽰:select name '姓名'from students order by age
2.精确查:
a.⽤in限定范围:select*from students where native in ('湖南', '四川')
b.between and:select*from students where age between20and30
c.“=”:select*from students where name ='李⼭'
d.like:select*from students where name like'李%' (注意查询条件中有“%”,则说明是部分匹配,⽽且还有先后信息在⾥⾯,即查以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第⼆个字为李,则应为'_李%'或'_李'或'_李_'。)
e.[]匹配检查符:select*from courses where cno like'[AC]%' (表⽰或的关系,与"in()"类似,⽽且"[]"可以表⽰范围,
如:select*from courses where cno like'[A-C]%')
3.对于时间类型变量的处理
a.smalldatetime:直接按照字符串处理的⽅式进⾏处理,例如:
select*from students where birth >='1980-1-1'and birth <='1980-12-31'
4.集函数
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最⼤与最⼩
5.分组group
常⽤于统计时,如分组查总数:
select gender,count(sno)
from students
group by gender
(查看男⼥学⽣各有多少)
注意:从哪种⾓度分组就从哪列"group by"
对于多重分组,只需将分组规则罗列。⽐如查询各届各专业的男⼥同学⼈数,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"
select grade, mno, gender, count(*)
from students
group by grade, mno, gender
通常group还和having联⽤,⽐如查询1门课以上不及格的学⽣,则按学号(sno)分类有:
select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1
6.UNION联合
合并查询结果,如:
SELECT*FROM students
WHERE name like ‘张%’
UNION[ALL]
SELECT*FROM students
WHERE name like ‘李%’
7.多表查询
a.内连接
select g.sno,s.ursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON go=co
(注意可以引⽤别名)
b.外连接
b1.左连接
select courseso,max(coursename),count(sno)
from courses LEFT JOIN grades ON courseso=gradeso
group by courseso
左连接特点:显⽰全部左边表中的所有项⽬,即使其中有些项中的数据未填写完全。
左外连接返回那些存在于左表⽽右表中却没有的⾏,再加上内连接的⾏。
b2.右连接
与左连接类似
b3.全连接
select sno,name,major
from students FULL JOIN majors =
两边表中的内容全部显⽰
c.⾃⾝连接
select ursename,c1.ursename
from courses c1,courses c2 where c1.pno=c2o
采⽤别名解决问题。
d.交叉连接
select lastname+firstname from lastname CROSS JOIN firstanme
相当于做笛卡⼉积
8.嵌套查询
a.⽤关键字IN,如查询李⼭的同乡:
select*from students
where native in (select native from students where name=’ 李⼭’)
b.使⽤关键字EXIST,⽐如,下⾯两句是等价的:
select*from students
where sno in (select sno from grades where cno=’B2’)
select*from students where exists
(select*from grades where
grades.sno=students.sno AND cno=’B2’)
9.关于排序order
a.对于排序order,有两种⽅法:asc升序和desc降序
b.对于排序order,可以按照查询条件中的某项排列,⽽且这项可⽤数字表⽰,如:
select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by3
10.其他
a.对于有空格的识别名称,应该⽤"[]"括住。
b.对于某列中没有数据的特定查询可以⽤null判断,如select sno,courseno from grades where mark IS NULL
c.注意区分在嵌套查询中使⽤的any与all的区别,any相当于逻辑运算“||”⽽all则相当于逻辑运算“&&”
d.注意在做否定意义的查询是⼩⼼进⼊陷阱:
如,没有选修‘B2’课程的学⽣:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论