文档库 最新最全的文档下载
当前位置:文档库 › 基础SQL面试题

基础SQL面试题

基础SQL面试题
基础SQL面试题

基础SQL面试题

规律:数字不用单引号,字符用单引号

选择

1. 假设有一个名为email_table 的表,包含名字和地址两个字段,要得到Bill Gates 的e_mail地址,你可以使用下面的查询:

SELECT email from email_table WHERE name=’Bill Gates’

2. 前面说过,查询可以在查询条件中包含逻辑运算符。假如你想读取Bill Gates 或Clinton总统的所有email地址,你可以使用下面的查询语句:

SELECT email FROM email_table WHERE name=’Bill Gates’ OR

name=’president Clinton’

(select name,email,[add] from name where name=’zhd’) 单词不完整时,默认加[ ]

3. 你可以在一个SELECT语句中一次取出多个字段,比如:

SELECT au_fname ,au_lname, phone FROM authors

在SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:

SELECT * FROM authors

(SELECT * FROM NAME,NAME1)

4. 你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:

SELECT au_name,title FROM authors,titles,titleauthor

WHERE authors.au_id=titleauthor.au_id

AND titles.title_id=titleauthor.title_id

5. 要指明表titles和表publishers之间的关系,你只要让这两个表有一个公共的字段就可以了。在数据库pubs中,表titles和表publishers都有一个名为pub_id的字段。如果你想得到书名及其出版商的一个列表,你可以使用如下的语句:

SELECT title,pub_name FROM titles,publishers

WHERE titles.pub_id=publishers.pub_id

6. 在SELECT语句中,你可以在缺省字段名后面仅跟一个新名字来取代它。例如,可以用一个更直观易读的名字Author Last Name来代替字段名au_lname:SELECT au_lname ‘Author Last Name’ FROM authors

当这个SELECT语句执行时,来自字段au_lname的值会与“Author Last Name”相联系。查询结果可能是这样:

Author Last Name

White

Green

Carson

O’Leary

Straight

注意字段标题不再是au_lname,而是被Author Last Name所取代。

7. 如果你想把表titles中的所有书的价格加倍,你可以使用下面的SELECT语句:

SELECT price*2 FROM titles

当这个查询执行时,每本书的价格从表中取出时都会加倍。但是,通过这种途径操作字段不会改变存储在表中的书价。对字段的运算只会影响SELECT语句的输出,而不会影响表中的数据。为了同时显示书的原始价格和涨价后的新价格,你可以使用下面的查询:

SELECT price “Original price”, price*2 “New price” FROM titles

当数据从表titles中取出时,原始价格显示在标题Original price下面,加倍后的价格显示在标题New price下面。结果可能是这样:

original price new price

19.99 39.98

11.95 23.90

2.99 5.98

19.99 39.98

19.100

8. 你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进行运算,例如:

SELECT price*ytd_sales ‘total revenue’ FROM titles

在这个例子中,通过把价格与销售量相乘,计算出了每种书的总销售额。这个SELECT语句的结果将是这样的:

total revenue

81,859,05

46,318,20

55,978,78

81,859,05

40,619,68

最后,你还可以使用连接运算符(它看起来像个加号)来连接两个字符型字段:SELECT au_fname+’ ’+au_lname’author name’ FROM authors

(Select au_fname+au_lname’author name’ from authors)

这个语句的执行结果将是这样的:

author names

Johnson White

Marjorie Green

Cheryl Carson

Michael O’Leary

Dean Straight

(23 row(s) affected)

排序

通过使用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:SELECT au_lname FROM authors ORDER BY au_lname

当这个SELECT语句执行时,作者名字的显示将按字母顺序排列。ORDER BY子句将作者名字按升序排列。

你也可以同时对多个列使用ORDER BY子句。例如,如果你想同时按升序显示字段au_lname和字段au_fname,你需要对两个字段都进行排序:

SELECT au_lname,au_fname FROM authors ORDER BY au_lname ,au_fname

这个查询首先把结果按au_lname字段进行排序,然后按字段au_fname排序。记录将按如下的顺序取出:

au_lname au_fname …………………………………………………………………….

Bennet Abraham

Ringer Albert

Ringer Anne

Smith Meander

如果你想把查询结果按降序排列,你可以使用关键字DESC。

SELECT au_lname,au_fname FROM authors

WHERE au_lname=’Ringer’ ORDER BY au_lname ,au_fname DESC

这个查询从表authors中取出所有名字为Ringer的作者记录。ORDER BY子句根据作者的名字和姓,将查询结果按降序排列。结果是这样的:

au_lname au_fname ………………………………………………………………………………………. Ringer Anne

Ringer Albert

(2 row(s) affectec)

取出互不相同的值

一个表有可能在同一列中有重复的值。例如,数据库pubs的表authors中有两个作者的名字是Ringer。如果你从这个表中取出所有的名字,名字Ringer将会显示两次。

在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:

SELCET DISTINCT au_lname FROM authors WHERE au_lname=’Ringer’

警告:如同ORDER BY子句一样,强制服务器返回互不相同的值也会增加运行开销。不得不花费一些时间来完成这项工作。因此,不是必须的时候不要使用关键字DISTINCT。

创建表

在查询窗口中键入下面的SQL语句,单击执行查询按钮,执行这个语句:

CREATE TABLE guestbook (visitor VARCHAR(40),comments TEXT,entrydate DATETIME)

删除表和修改表

1.要删除一个表,你可以使用SQL语句DROP TABLE。

DROP TABLE mytable

警告:使用DROP TABLE命令时一定要小心。一旦一个表被删除之后,你将无法恢复它。

2.如果你想清除表中的所有数据但不删除这个表,你可以使用TRUNCATE TABLE 语句。

TRUNCATE TABLE mytable

3.虽然你不能删除和修改已经存在的字段,但你可以增加新字段。

ALTER TABLE mytable ADD mynewcolumn INT NULL

注意:ALTER TABLE 只允许添加可包含空值或指定了 DEFAULT 定义的列。

索引(有待深入理解)

对于包含索引的数据库,SQL Sever需要一个可观的额外空间。例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间。

索引有两种类型:聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。

聚簇索引非常象目录表,目录表的顺序与实际的页码顺序是一致的。非聚簇索引则更象书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。一本书也许有多个索引。例如,它也许同时有主题索引和作者索引。同样,一个表可以有多个非聚簇索引。

通常情况下,你使用的是聚簇索引,但是你应该对两种类型索引的优缺点都有所理解。

每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。通常你要对一个表按照标识字段建立聚簇索引。但是,你也可以对其它类型的字段建立聚簇索引,如字符型,数值型和日期时间型字段。

从建立了聚簇索引的表中取出数据要比建立了非聚簇索引的表快。当你需要取出一定范围内的数据时,用聚簇索引也比用非聚簇索引好。例如,假设你用一个表来记录访问者在你网点上的活动。如果你想取出在一定时间段内的登录信息,你应该对这个表的DATETIME型字段建立聚簇索引。

对聚簇索引的主要限制是每个表只能建立一个聚簇索引。但是,一个表可以有不止一个非聚簇索引。实际上,对每个表你最多可以建立249个非聚簇索引。你也可以对一个表同时建立聚簇索引和非聚簇索引。

假如你不仅想根据日期,而且想根据用户名从你的网点活动日志中取数据。在这种情况下,同时建立一个聚簇索引和非聚簇索引是有效的。你可以对日期时间字段建立聚簇索引,对用户名字段建立非聚簇索引。如果你发现你需要更多的索引方式,你可以增加更多的非聚簇索引。

非聚簇索引需要大量的硬盘空间和内存。另外,虽然非聚簇索引可以提高从表中取数据的速度,它也会降低向表中插入和更新数据的速度。每当你改变了一个建立了非聚簇索引的表中的数据时,必须同时更新索引。因此你对一个表建立非聚

簇索引时要慎重考虑。如果你预计一个表需要频繁地更新数据,那么不要对它建立太多非聚簇索引。另外,如果硬盘和内存空间有限,也应该限制使用非聚簇索引的数量。

这两种类型的索引都有两个重要属性:你可以用两者中任一种类型同时对多个字段建立索引(复合索引);两种类型的索引都可以指定为唯一索引。

1.非聚簇索引:CREATE INDEX mycolumn_index ON mytable (myclumn)

注意:蓝色必填,索引名字

2.如果你需要改变一个索引的类型,你必须删除原来的索引并重建一个。建立了一个索引后,你可以用下面的SQL语句删除它:

DROP INDEX mytable.mycolumn_index

聚簇索引:可以使用关键字CLUSTERED。

CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)

(旧版本:如果表中有重复的记录,当你试图用这个语句建立索引时,会出现错误。但是有重复记录的表也可以建立索引;你只要使用关键字ALLOW_DUP_ROW

把这一点告诉SQL Sever即可:CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

WITH ALLOW_DUP_ROW)

3.要对一个表建立唯一索引,可以使用关键字UNIQUE。对聚簇索引和非聚簇索引都可以使用这个关键字。这里有一个例子:

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn) 4.要建立一个对多个字段的索引──复合索引──在索引建立语句中同时包含多个字段名。下面的例子对firstname和lastname两个字段建立索引:CREATE INDEX name_index ON username(firstname,lastname)

添加修改删除数据

添加:向表中添加新记录

INSERT mytable (first_column,second_column,third_column)

VALUES (‘some data’,’some more data’,’yet more data’)

你可以使用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句(旧版本)。

如果你在INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:

1.如果该字段有一个缺省值,该值会被使用。

2.如果该字段可以接受空值,而且没有缺省值,则会被插入空值。

3.如果该字段不能接受空值,而且没有缺省值,就会出现错误。

4.最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。

向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录

的标识字段的值。考虑如下的SQL语句:

INSERT mytable (first_column) VALUES(‘some value’)

INSERT anothertable(another_first,another_second)

VALUES(@@identity,’some value’)

如果表mytable有一个标识字段,该字段的值会被插入表anothertable的another_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。(查询最后一个)

注意:SET IDENTITY_INSERT 表名 Off ,当 IDENTITY_INSERT 设置为 OFF 时,不能向表‘book’ 中的标识列插入显式值。

SET IDENTITY_INSERT 表名 on, 当 IDENTITY_INSERT 设置为 ON 时,必须指定表‘book’ 中标识列的显式值。

删除:要从表中删除一个或多个记录,需要使用SQL DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。

DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’

如果你不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除。如果你想删除应该表中的所有记录,应使TRUNCATE TABLE语句。当你使用TRUNCATE TABLE语句时,记录的删除是不作记录的。也就是说,这意味着TRUNCATE TABLE 要比DELETE快得多。

修改:要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。UPDATE mytable SET first_column=’Updated!’

Second_column=’Updated!’

Third_column=’Updated!’

WHERE first_column=’Update Me1’

如果你不提供WHERE子句,表中的所有记录都将被更新。

注意:你可以对文本型字段使用UPDATE语句。但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。

Insert和select、update

有一个方法可以使INSERT 语句一次添加多个记录。

INSERT mytable (first_column,second_column)

SELECT another_first,another_second

FROM anothertable

WHERE another_first=’Copy Me!’

这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段another_first的值为’Copy Me!’的记录才被拷贝。

如果你需要拷贝整个表,你可以使用SELECT INTO 语句。

SELECT * INTO newtable FROM mytable

你也可以指定只有特定的字段被用来创建这个新表。

SELECT first_column INTO newtable

FROM mytable

WHERE second_column=’Copy Me!’

假设你想从一个表中删除一个字段。使用SELECT INTO 语句,你可以创建该表的一个拷贝,但不包含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。

如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新

表。创建好该表后,你就可以结合使用UPDATE语句和SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可以修改表的结构,又能保存原有的数据。

其它常用表达式

1.假设你有一个表用来保存对你的站点进行民意调查的结果。现在你想向所有对你的站点的评价在7到10之间的访问者发送书面的感谢信。

SELECT username FROM opinion WHERE vote>6 and vote<11

这个SELECT 语句会实现你的要求。你使用下面的SELECT 语句也可以得到同样的结果:

SELECT username FROM opinion WHERE vote BETWEEN 7 AND 10

2.现在假设你只想取出对你的站点投了1或者10的访问者的名字。要从表opinion中取出这些名字,你可以使用如下的SELECT 语句:

SELECT username FROM opinion WHERE vote=1 or vote=10

这个SELECT语句会返回正确的结果,没有理由不使用它。但是,存在一种等价的方式。使用如下的SELECT可以得到相同的结果:

SELECT username FROM opinion WHERE vote IN (1,10)

注意表达式IN 的使用。这个SELECT 语句只取出vote的值等于括号中的值之一的记录。

3.你也可以使用IN来匹配字符数据。例如,假设你只想取出Bill Gates或President Clinton的投票值。

SELECT vote FROM opinion WHERE username IN (‘Bill Gates’,’President Clinton’)

4.你可以在使用BETWEEN或IN的同时使用表达式NOT。例如,要取出那些投票值不在7到10之间的人的名字,你可以使用如下的SELECT 语句:

SELECT username FROM opinion WHERE vote NOT BETWEEN 7 and 10

5.要选取那些某个字段的值不在一列值之中的记录,你可以同时使用NOT 和IN,如下例所示:

SELECT vote FROM opinion WHERE username NOT IN (‘Bill

Gates’,’President Clinton’)

转换数据:在需要的时候可以把大部分数值从一种类型转换为另一种类型。

假设你想从一个MONEY型字段中取出所有的值,并在结果后面加上字符串“US Dollars”。你需要使用函数CONVERT()

SELECT CONVERT(CHAR(8),price)+ ‘US Dollars’ FROM orders

函数CONVERT()带有两个变量。第一个变量指定了数据类型和长度。第二个变量指定了要进行转换的字段。在这个例子中,字段price被转换成长度为8个字符的CHAR型字段。字段price要被转换成字符型,才可以在它后面连接上字符串’US Dollars’。

当向BIT型,DATETIME型,INT型,或者NUMERIC型字段添加字符串时,你需要进行同样的转换操作。例如,下面的语句在一个SELECT语句的查询结果中加入字符串’The vote is’,该SELECT语句返回一个BIT型字段的值:

SELECT ‘The vote is’+CONVERT(CHAR(1),vote) FROM opinion

下面是这个语句的结果示例:

The vote is 1

The vote is 1

The vote is 0

操作字符串数据

1.要把一个字符串与另一个字符串的一部分相匹配,你需要使用通配符。你使用通配符和关键字LIKE来实现模式匹配。取出包含关键字trading card的站点的列表

SELECT SITE_name FROM site_directory WHERE site_desc LIKE ‘%trading cark%’

百分号是通配符的例子之一。它代表0个或多个字符。

2.目录分成更多页:

你想显示所有首字母在A到M之间的站点

SELECT site_name FROM site_directo ry WHERE site_name LIKE ‘[A-M]%’你想显示所有首字母在N到Z之间的站点

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[N-Z]%’3.你想显示那些以A,B或C开头的站点,

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[ABC]%’4.你可以取出那些首字母在C到F之间,或者以字母Y开头的站点:

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[C-FY]%’5.你也可以使用脱字符(^)来排除特定的字符或字符范围。要得到那些名字不以Y开头的站点,

SELECT site_name FROM site_directory WHERE site_name LIKE ‘[^Y]%’6.通过使用下划线字符(_),你可以匹配任何单个字符。例如,下面这个查询返回每一个其名字的第二个字符为任何字母的站点:

SELECT site_name FROM site_directo ry WHERE site_name LIKE ‘M_crosoft’与通配符’%’不同,下划线只代表单个字符。

注意:如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字符(-),应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。例如,下面的语句返回所有其描述中包含百分号的站点:

SELECT site_name FROM site_directory WHERE site_desc LIKE ‘%[%]%’

Microsoft SQL 有两个允许你按照发音来匹配字符串的函数(没实际操作过)1.函数SOUNDEX()给一个字符串分配一个音标码

如果你建立一个Internet目录,你也许想增加一个选项,允许访问者按照站点名的发音来搜索站点,而不是按名字的拼写。考虑如下的语句:

SELECT site_name FROM site_directory

WHERE DIFFERENCE(site_name , ‘Microsoft’>3)

这个语句使用函数DEFFERENCE()来取得其名字的发音与Microsoft非常相似的站点。函数DIFFERENCE()返回一个0到4之间的数字。如果该函数返回4,表示发音非常相近;如果该函数返回0,说明这两个字符串的发音相差很大。

2.函数DIFFERENCE()按照发音比较两个字符串

你可以用函数SOUNDEX()来返回函数DIFFERENCE()所使用的音标码。

SELECT site_name ‘site name’,SOUNDEX(site_name) ‘sounds like’

这个语句选取字段site_name的所有数据及其音标码。下面是这个查询的结果:site name sounds like ……………………………………………………………….

Yahoo Y000

Mahoo M000

Microsoft M262

Macrosoft M262

Minisoft M521

Microshoft M262

Zicrosoft Z262

如果你仔细看一下音标码,你会注意到音标码的第一个字母与字段值的第一个字母相同。

函数DIFFERENDE()比较两个字符串的第一个字母和所有的辅音字母。该函数忽略任何元音字母(包括y),除非一个元音字母是一个字符串的第一个字母。不幸的是,使用SOUNDEX()和DIFFERENCE()有一个欠缺。WHERE子句中包含这两个函数的查询执行起来效果不好。因此,你应该小心使用这两个函数。

删除空格

函数LTRIM()去除应该字符串前面的所有空格

函数RTRIM()去除一个字符串尾部的所有空格。

SELECT RTRIM(site_name) FROM site_directory

在这个例子中,如果任何一个站点的名字尾部有多余的空格,多余的空格将从查询结果中删去。

你可以嵌套使用这两个函数,把一个字符串前后的空格同时删去:

SELECT LTRIM(RTRIM(site_name)) FROM site_directory

日期和时间

1.通过函数GETDATE(),你可以获得当前的日期和时间。例如,语句SELECT GETDATE()返回如下的结果:

NOV 30 1997 3:29AM

函数GETDATE()可以用来作为DATEDIME()型字段的缺省值。这对插入记录时保存当时的时间是有用的。例如,假设有一个表用来保存你站点上的活动日志。每当有一个访问者访问到你的站点时,就在表中添加一条新记录,记下访问者的名字,活动,和进行访问的时间。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:

CREATE TABLE site_log (

username VARCHAR(40),

useractivity VARCHAR(100),

entrydate DATETIME DEFAULT GETDATE())

函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。

要得到不同格式的日期和时间,你需要使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒:

SELECT CONVERT(VARCHAR(30),GETDATE(),9)

注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间:

Nov 30 1997 3:29:55:170AM

在函数CONVERT()中你可以使用许多种不同风格的日期和时间格式。表11.1显示了所有的格式。

表11.1 日期和时间的类型

类型值标准输出

0 Default mon dd yyyy hh:miAM

1 USA mm/dd/yy

2 ANSI yy.mm.dd

3 British/French dd/mm/yy

4 German dd.mm.yy

5 Italian dd-mm-yy

6 – dd mon yy

7 – mon dd,yy

8 – hh:mi:ss

9 Default + milliseconds–mon dd yyyy

hh:mi:ss:mmmAM(or )

10 USA mm-dd-yy

11 JAPAN yy/mm/dd

12 ISO yymmdd

13 Europe Default + milliseconds–dd mon yyyy

hh:mi:ss:mmm(24h)

14 – hh:mi:ss:mmm(24h)

类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和13返回的月份用三位字符表示(用Nov代表November).

对表11.1中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:

SELECT CONVERT(VARCHAR(30),GETDATE(),111)

在这个例子中,函数CONVERT()把日期格式进行转换,显示为1997/11/30 2.当你分析表中的数据时,你也许希望取出某个特定时间的数据。你也许对特定的某一天中――比如说2000年12月25日――访问者在你站点上的活动感兴趣。要取出这种类型的数据,你也许会试图使用这样的SELECT语句:

SELECT * FROM weblog WHERE entrydate=’12/25/20000’

这个SELECT语句不会返回正确的记录――它将只返回日期和时间是12/25/2000 12:00:00:000AM的记录。换句话说,只有刚好在午夜零点输入的记录才被返回。问题是SQL Sever将用完整的日期和时间代替部分日期和时间。例如,当你输入

一个日期,但不输入时间时,SQL Sever将加上缺省的时间“12:00:00:000AM”。当你输入一个时间,但不输入日期时,SQL Sever将加上缺省的日期“Jan 1 1900”。

要返回正确的记录,你需要适用日期和时间范围。有不止一种途径可以做到这一点。例如,下面的这个SELECT 语句将能返回正确的记录:

SELECT * FROM weblog

WHERE entrydate>=”12/25/2000” AND entrydate<”12/26/2000”

这个语句可以完成任务,因为它选取的是表中的日期和时间大于等于

12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的记录。换句话说,它将正确地返回2000年圣诞节这一天输入的每一条记录。

另一种方法是,你可以使用LIKE来返回正确的记录。通过在日期表达式中包含通配符“%”,你可以匹配一个特定日期的所有时间。这里有一个例子:SELECT * FROM weblog WHERE entrydate LIKE ‘Dec 25 2000%’

这个语句可以匹配正确的记录。因为通配符“%”代表了任何时间。

使用这两种匹配日期和时间范围的函数,你可以选择某个月,某一天,某一年,某个小时,某一分钟,某一秒,甚至某一毫秒内输入的记录。但是,如果你使用LIKE 来匹配秒或毫秒,你首先需要使用函数CONVERT()把日期和时间转换为更精确的格式(参见前面“转换日期和时间”一节)。

五种常用的字段类型:字符型,文本型,数值型,逻辑性和日期型。

字符型:

1.VARCHAR类型可以存储的字符串最长为255个字符,存放可变长度的字符串信息。

2.CHAR指定了这个字段应该是固定长度的字符串。

3.VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符——字符串Bill Gates 的长度。

现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要。

文本型:

使用文本型数据,你可以存放超过二十亿个字符的字符串

无论何时,只要你能避免使用文本型字段,你就应该不适用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

警告:一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

数值型:

1.INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数。2.为了节省内存空间,你可以使用SMALLINT型数据。SMALLINT 型数据可以存

储从-32768到32768的整数。这种数据类型的使用方法与INT型完全相同。3.如果你实在需要节省空间,你可以使用TINYINT型数据。同样,这种类型的使用方法也与INT型相同,不同的是这种类型的字段只能存储从0到255的整数。TINYINT型字段不能用来存储负数。

注意:INYINT型数据只占用一个字节;一个INT型数据占用四个字节。4.NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。这里有一个使用这种数据类型的例子:

CREATE TABLE numeric_data (bignumber NUMERIC(28,0), fraction NUMERIC (5,4) )

一个NUMERIC型数据的整数部分最大只能有28位,小数部分的位数必须小于或等于整数部分的位数,小数部分可以是零。

5.MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC 型数据。

SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。SMALLMONEY型来代替MONEY型数据,以节省空间。

注意:除了numeric可以指定列宽之外,其他数据型不能指定列宽。

存储逻辑值:

BIT型字段只能取两个值:0或1。这里有一个如何使用这种字段的例子:CREATE TABLE opinion (visitor VARCHAR(40),good BIT)

这个表可以用来存放对你的网点进行民意调查所得的信息。访问者可以投票表示他们是否喜欢你的网点。如果他们投YES,就在BIT型字段中存入1。反之,如果他们投NO,就在字段中存入0。

注意:在你创建好一个表之后,你不能向表中添加BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。

存储日期和时间:

为了能够存储日期和时间,你需要使用DATETIME型数据,如下例所示:CREATE TABL visitorlog( visitor VARCHAR (40), arrivaltime DATETIME , departuretime DATETIME)

这个表可以用来记录访问者进入和离开你网点的时间和日期。一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31

日最后一毫秒。

如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。注意:不能指定列宽。

字段属性:控制空值,缺省值和标识值

允许和禁止空值:

空值(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)

缺省值:(默认值)没填,保存时,自动生成默认值。

为了在创建一个表时指定缺省值,你可以使用表达式DEFAULT。请看下面这个在创建表时使用缺省值的例子:

CREATE TABLE addresses (street VARCHAR(60) NULL,

city VARCHAR(40) NULL,

state VARCHAR(20) NULL,

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())

注意:DATETIME型字段entrydate所指定的缺省值,该缺省值是函数Getdate()的返回值,该函数返回当前的日期和时间。

标识字段:

每个表可以有一个也只能有一个标识字段。一个标识字段是唯一标识表中每条记录的特殊字段。为了建立一个标识字段,你只需在字段定义后面加上表达式IDENTITY即可。你只能把NUMERIC型或INT型字段设为标识字段,这里有一个例子:

CREATE TABLE visitorID (theID NUBERIC(18) IDENTITY,name VARCHAR(40))

1.2都是自动生成

技巧:建立一个标示字段时,注意使用足够大的数据类型。例如你使用TINYINT 型数据,那么你只能向表中添加255个记录。如果你预计一个表可能会变得很大,你应该使用NUMERIC型数据。

五种类型的集合函数:统计记录数目,平均值,最小值,最大值,求和

统计记录数目:函数COUNT()也许是最有用的集合函数。

1.你可以用这个函数来统计一个表中有多少条记录。

SELECT COUNT(au_lname) FROM authors

这个例子计算表authors中名字(last name)的数目。如果相同的名字出现了不止一次,该名字将会被计算多次。

2.如果你想知道名字为某个特定值的作者有多少个,你可以使用WHERE子句,

如下例所示:

SELECT COUNT(au_lname) FROM authors WHERE au_lname=’Ringer’

这个例子返回名字为’Ringer’的作者的数目。如果这个名字在表authors中出现了两次,则次函数的返回值是2。

3.假如你想知道有不同名字的作者的数目。你可以通过使用关键字DISTINCT

来得到该数目。

SELECT COUNT(DISTINCT au_lname) FROM authors

如果名字’Ringer’出现了不止一次,它将只被计算一次。关键字DISTINCT 决定了只有互不相同的值才被计算。

通常,当你使用COUNT()时,字段中的空值将被忽略。一般来说,这正是你所希望的。但是,如果你仅仅想知道表中记录的数目,那么你需要计算表中所有的记录─不管它是否包含空值。

SELECT COUNT(*) FROM authors

注意函数COUNT()没有指定任何字段。这个语句计算表中所有记录所数目,包括有空值的记录。因此,你不需要指定要被计算的特定字段。

函数COUNT()在很多不同情况下是有用的。例如,假设有一个表保存了对你站点的质量进行民意调查的结果。这个表有一个名为vote的字段,该字段的值要么是0,要么是1。0表示反对票,1表示赞成票。要确定赞成票的数量,你可以所有下面的SELECT 语句:

SELECT COUNT(vote) FROM opinion_table WHERE vote=1

平均值:使用函数AVG(),你可以返回一个字段中所有值的平均值。SELECT AVG(vote) FROM opinion

函数AVG()只能对数值型字段使用。这个函数在计算平均值时也忽略空值。

最小值:使用函数min(),你可以返回一个字段中所有值的最小值。SELECT MIN(vote) FROM opinion

函数MIN()返回一个字段的所有值中的最小值。如果字段是空的,函数MIN()返回空值。

最大值:使用函数max(),你可以返回一个字段中所有值的最大值。SELECT MAX(vote) FROM opinion

求和:使用函数sum(),你可以返回一个字段中所有值的和值。

SELECT SUM(purchase_amount) FROM orders

sql数据库基础面试题复习试题考试题_全

不定项选择题(针对以下题目,请选择最符合题目要求的答案,每道题有一项或二项正确答案。针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分。题量为50道,每题2分,总分为100分。) 第一章 1、是SQLServer数据库的主数据文件的扩展名。(选择一项) A、.sql B、.mdb C、.ldf D、.mdf 2、在SQL Server 2005中,有系统数据库和用户数据库,下列不属于系统数据库的是()。 (选择一项) A、master B、pubs C、model D、msdb 3、当安装完SQL Server2005数据库时,系统默认当前的超级管理员是( ) (选择一项) A、sa B、master C、administrator D、super 4、在使用SQL Server2005数据库时,有时需要将本机的数据库移动到其他机器上,恢复成对应的数据库使用。移动数据库分两步进行,应包括()和附加数据库(选择一项)A、分离数据库 B、删除数据库 C、新建数据库 D、合并数据库 5、在SQL Server2005中,附加数据库操作是指()(选择一项) A、把SQL Server 数据库文件保存为其他数据文件 B、根据数据库物理文件中的信息,把数据库在SQL Server 2005中恢复 C、把所有该数据库表的数据清空 D、把数据库删除掉 6、某单位由不同的部门组成,不同的部门每天都会生产一些报告、报表等数据,以为都采用纸张的形式来进行数据的保存和分类,随着业务的发展,这些数据越来越多,管理这些报告越来越费力,此时应考虑()(选择一项) A、由多个人来完成这些工作 B、在不同的部门中,由专门的人员去管理这些数据 C、采用数据库系统来管理这些数据 D、把这些数据统一成一样的格式 7、在SQL Server 2005中,对于数据库的定义正确的是()(选择一项) A、数据库是用来描述事物的符号记录 B、数据库是位于用户与操作系统之间的一层数据管理软件

SQL经典面试50题

1.一般面试时考SQL,主要就是考你“统计分析”这一块,下面我们来看面试官经常采用的手段。 2. 3. 4.由4张简单的不能再简单的表,演变出50道SQL 5. 6. 7.哈哈哈哈,够这个面试官面个15,20个人,不带重复的了,而且每个SQL你真的不动动脑子还 写不出呢,你别不服气,下面开始。 8. 9.表结构: 10. 11. 12. 13.表Student 14. 15.(S#,Sname,Sage,Ssex) 学生表 16. 17. 18.S# student_no 19. 20.Sage student_age 21. 22.Ssex student_sex 23. 24. 25. 26.表Course 27. 28.(C#,Cname,T#) 课程表 29. 30. 31.C# course_no 32. https://www.wendangku.net/doc/702825244.html,ame course_name 34. 35.T# teacher_no 36. 37. 38. 39. 40. 41. 42.表SC(学生与课程的分数mapping 表) 43.

44.(S#,C#,score) 成绩表 45. 46. 47.S# student_no 48.C# course_no 49.score 分数啦 50. 51. 52. 53. 54. 55. 56.表Teacher 57. 58.(T#,Tname) 教师表 59. 60. 61.T# teacher_no 62.Tname teacher_name 63. 64. 65. 66. 67. 68. 69.50道问题开始 70. 71. 72. 73. 74. 75. 76.1、查询“001”课程比“002”课程成绩高的所有学生的学号; 77. 78. 79. select a.S# from (select s#,score from SC where C#='001') a,(select s#,sco re 80. 81. from SC where C#='002') 82. 83. 84. 85. 86. where a.score>b.score and a.s#=b.s#;

SQL经典面试题及答案

SQL经典面试题及答案 1.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负 如果要生成下列结果, 该如何写sql语句? 胜负 2005-05-09 2 2 2005-05-10 1 2 ------------------------------------------ create table #tmp(rq varchar(10),shengfu nchar(1)) insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','胜') insert into #tmp values('2005-05-09','负')

insert into #tmp values('2005-05-09','负') insert into #tmp values('2005-05-10','胜') insert into #tmp values('2005-05-10','负') insert into #tmp values('2005-05-10','负') 1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum (case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq 2) select N.rq,N.勝,M.負 from ( select rq,勝=count(*) from #tmp where shengfu='胜'group by rq)N inner join (select rq,負=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq 3)select a.col001,a.a1 胜,b.b1 负 from (select col001,count(col001) a1 from temp1 where col002='胜'

Sql常见面试题 受用了

Sql常见面试题受用了 1. 用一条SQL 语句查询出每门课都大于80 分的学生姓名 name kecheng fenshu 张三语文81 张三数学75 李四语文76 李四数学90 王五语文81 王五数学100 王五英语90 A: select distinct name from table where name not in (select distinct name from table where fenshu<=80) select name from table group by name having min(fenshu)>80 2. 学生表如下: 自动编号学号姓名课程编号课程名称分数 1 2005001 张三0001 数学69 2 2005002 李四0001 数学89 3 2005001 张三0001 数学69 删除除了自动编号不同, 其他都相同的学生冗余信息 A: delete tablename where 自动编号not in(select min( 自动编号) from tablename group by 学号, 姓名, 课程编号, 课程名称, 分数) 3. 一个叫team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合. 你先按你自己的想法做一下,看结果有我的这个简单吗? 答:select https://www.wendangku.net/doc/702825244.html,, https://www.wendangku.net/doc/702825244.html, from team a, team b where https://www.wendangku.net/doc/702825244.html, < https://www.wendangku.net/doc/702825244.html, 4. 请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。 数据库名:JcyAudit ,数据集:Select * from TestDB 答:select a.* from TestDB a ,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID='101' group by Occmonth) b where a.Occmonth=b.Occmonth and a.DebitOccur>b.Debit101ccur ******************************************************************************* ***** 5. 面试题:怎么把这样一个表儿 year month amount 1991 1 1.1

Oracle_PL_SQL经典练习题

Oracle 作业题 一.创建一个简单的PL/SQL程序块 使用不同的程序块组件工作 使用编程结构编写PL/SQL程序块 处理PL/SQL程序块中的错误 1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。 declare v_emp emp%rowtype; begin select * into v_emp from emp where ename='SMITH'; dbms_output.put_line('员工的工作是:'||v_emp.job||' ;他的薪水是: '||v_emp.sal); end; 2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。方法一:(传统方法) declare v_loc deptcp.dname%type; v_dname deptcp.dname%type; v_deptno deptcp.deptno%type; begin v_deptno :=&部门编号; select loc,dname into v_loc,v_dname from deptcp where deptno=v_deptno; dbms_output.put_line('员工所在地是:'||v_loc||';部门名称是:'||v_dname); exception when no_data_found then dbms_output.put_line('您输入的部门编号不存在,请从新输入,谢谢'); end; 方法二:(使用%rowtype) declare v_dept dept%rowtype; begin select * into v_dept from dept where deptno=&部门号; dbms_output.put_line(v_dept.dname||'--'||v_dept.loc); end; 3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)。(*期末考试试题*) declare v_sal emp.sal%type; begin select sal+comm into v_sal from emp where empno=&雇员号;

SQL经典面试题及答案

1. 用一条SQL 语句查询出每门课都大于80 分的学生姓名 name kechengfenshu 张三语文81 张三数学75 李四语文76 李四数学90 王五语文81 王五数学100 王五英语90 A: select distinct name from table where name not in (select distinct name from table where fenshu<=80) select name from table group by name having min(fenshu)>80 select name from table group by name having count(kecheng)>=3 and min(fenshu)>=80 2. 学生表如下: 自动编号学号姓名课程编号课程名称分数 1 2005001 张三0001 数学69 2 2005002 李四0001 数学89 3 2005001 张三0001 数学69 删除除了自动编号不同, 其他都相同的学生冗余信息 A: delete tablename where 自动编号not in(select min( 自动编号) from tablename group by 学号, 姓名, 课程编号, 课程名称, 分数) 3. 面试题:怎么把这样一个表儿 year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 查成这样一个结果 year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4

SQL数据库经典面试题(修改笔试题)(有答案)

28、?数据库:抽出部门,平均工资,要求按部门得字符串顺序排序,不能含有"human resource"部门,employee结构如下: employee_id,employee_name,depart_id,depart_name,wage 答:?select depart_name, avg(wage) fromemployee where depart_name〈〉'humanresource'?group by depart_nameorder by depart_name ---—--——----—-——----—--——-—---———----—————-—- 29、 —-—--—---—-—--————-——--——--——? 给定如下SQL数据库:Test(num INT(4))请用一条SQL语句返回num得最小值,但不许使用统计功能,如MIN,MAX等 答: select top1 num from Test orderbynum ----—-----——-—----———----—---—----—-—-—-———-—- 33、一个数据库中有两个表:——----—-—----—--—--——--—----? 一张表为Customer,含字段ID,Name; 一张表为Order,含字段ID,CustomerID(连向Customer中ID得外键),Re venue;?写出求每个Customer得Revenue总与得SQL语句。 建表create table customer?(ID int primary key,Namechar (10)) go create table [order]?(ID int primary key,CustomerID int foreign key references customer(id),Revenue float) go --查询?select Customer、ID, sum(isnull([Order]、Revenue,0))?from customer full join [order]on([order]、custome rid=customer、id) groupby customer、id selectcustomer、id,sum(order、revener) fromorder,customer where customer、id=customerid group by customer、id select customer、id,sum(order、revener)from customer fulljoin order on(order、customerid=customer、id)group bycustomer、id 5数据库(10) a tabel called “performance”contain :name andscore,please用SQL语言表述

常见SQL笔试题

精心整理 SQL笔试题 1.统计查询SQL练习 数据库中表结构如下,字段分别任rg(日期),shengfu(胜负),考察groupby语句的使用:2005-05-09胜 2005-05-09胜 2005-05-09负 2005-05-09负 2005-05-10胜 2005-05-10负 2005-05-10负 如果要生成下列结果,该如何写sql语句? 胜负 2005-05-0922 2005-05-1012 答案: 1)selectrq,sum(casewhenshengfu='胜'then1else0end)'胜',sum(casewhenshengfu='负' then1else0end)'负'from#tmpgroupbyrq 2)selectN.rq,N.胜,M.负from( selectrq,胜=count(*)from#tmpwhereshengfu='胜'groupbyrq)Ninnerjoin (selectrq,负=count(*)from#tmpwhereshengfu='负'groupbyrq)MonN.rq=M.rq 3)selecta.col001,a.a1胜,b.b1负from (selectcol001,count(col001)a1fromtemp1wherecol002='胜'groupbycol001)a,

(selectcol001,count(col001)b1fromtemp1wherecol002='负'groupbycol001)b wherea.col001=b.col001 2.条件判断SQL练习 表中有ABC三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列 答案: select(casewhena>bthenaelsebend), (casewhenb>cthenbeslecend) fromtable_name 3.日期统计SQL练习 请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间) 答案: select*fromtbwheredatediff(dd,SendTime,getdate())=0 4.统计查询SQL练习 有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70 分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路): 大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。 显示格式: 语文数学英语

SQL_面试题含建表语句

Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 建表语句 Create table Student ( S# number(4), Sname varchar2(9) not null, Ssex varchar2(3), Sage date, constraint Student_S#_Pk primary key(S#) ); insert into Student values(1001,'李志国','男',to_date('26-9-1985','dd-mm-yyyy')); insert into Student values(1002,'李甜甜','女',to_date('6-2-1987','dd-mm-yyyy')); insert into Student values(1003,'张小燕','女',to_date('18-11-1984','dd-mm-yyyy')); insert into Student values(1004,'王菲','男',to_date('3-6-1985','dd-mm-yyyy')); insert into Student values(1005,'杜宇','女',to_date('25-4-1986','dd-mm-yyyy')); insert into Student values(1006,'彭大生','男',to_date('28-12-1988','dd-mm-yyyy')); insert into Student values(1007,'王亮','男',to_date('1-8-1983','dd-mm-yyyy')); insert into Student values(1008,'赵婷婷','女',to_date('2-2-1984','dd-mm-yyyy')); Create table Teacher ( T# number(4), Tname varchar2(9) not null, constraint Teacher_T#_Pk primary key(T#) ); insert into Teacher values(2001,'李华'); insert into Teacher values(2002,'王力宏'); insert into Teacher values(2003,'叶平'); insert into Teacher values(2004,'王倩倩'); insert into Teacher values(2005,'李莉莉');

sql经典笔试题目(整理)

一单词解释(2分/个) 34 Data 数据 Database 数据库 RDBMS 关系数据库管理系统 GRANT 授权 REVOKE取消权限 DENY 拒绝权限 DECLARE 定义变量 PROCEDURE存储过程 Transaction事务 TRIGGER触发器继续 continue 唯一 unqiue 主键 primary key 标识列 identity 外键 foreign kdy 检查 check 约束 constraint 二编写SQL语句(5分/题)50 1) 创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话Create table stu (学号 int , 姓名 varchar(8), 年龄 int, 性别 varchar(4), 家庭地址 varchar(50), 联系电话 int ); 2) 修改学生表的结构,添加一列信息, 学历 Alter table stu add 学历 varchar(6); 3) 修改学生表的结构,删除一列信息,家庭住址 Alter table stu drop column 家庭地址 4) 向学生表添加如下信息: 学号姓名年龄性别联系电话学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 Insert into stu values('1', 'A', '22', '男' , ' 123456', '小学') Insert into stu values('2', 'B', '21', '男', '119' , '中学') Insert into stu values('3', 'C', '23', '男', '110', '高中') Insert into stu values('4' , 'D', '18', '女', '114', '大学') 5) 修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” Update stu set 学历=’大专’ where 联系电话 like ‘11%’ 6) 删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 Delect from stu where 性别=’男’ and 姓名 like ‘c%’ 7) 查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号示出来 Select 姓名,学号 from stu where 年龄<22 and 学历=’大专’ 8) 查询学生表的数据,查询所有信息,列出前25%的记录 Select top 25 percent * from stu 9) 查询出所有学生的姓名,性别,年龄降序排列

(完整版)常见SQL笔试题

SQL笔试题 1.统计查询SQL练习 数据库中表结构如下,字段分别任rg(日期),shengfu(胜负),考察group by 语句的使用: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负 如果要生成下列结果, 该如何写sql 语句? 胜负 2005-05-09 2 2 2005-05-10 1 2 答案: 1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq 2) select N.rq,N.胜,M.负from ( select rq,胜=count(*) from #tmp where shengfu='胜'group by rq)N inner join

(select rq,负=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq 3)select a.col001,a.a1 胜,b.b1 负from (select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a, (select col001,count(col001) b1 from temp1 where col002='负' group by col001) b where a.col001=b.col001 2.条件判断SQL练习 表中有A B C 三列,用SQL 语句实现:当A 列大于B 列时选择A 列否则选择B 列, 当B 列大于C 列时选择B 列否则选择C 列 答案: select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name 3.日期统计SQL练习 请取出tb_send 表中日期(SendTime 字段) 为当天的所有记录?(SendTime 字段为 datetime 型,包含日期与时间)

sql面试题

2.存储过程的优缺点是什么? 优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置。 2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划--实际上是Microsoft SQL Server为在存储过程中获取由T-SQL 指定的结果而必须采取的步骤的记录。)缓存改善性能。 ……..但sql server新版本,执行计划已针对所有T-SQL 批处理进行了缓存,而不管它们是否在存储过程中,所以没比较优势了。 3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。 4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用(RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。 5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。 6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。 7.更好的版本控制,通过使用Microsoft Visual SourceSafe 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。 8.增强安全性: a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问; b、提高代码安全,防止SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数); c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。 缺点: 1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新GetValue() 调用,等等,这时候估计比较繁琐了。 2.可移植性差 由于存储过程将应用程序绑定到SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不

面试真题及答案SQL面试题目汇总

面试真题 面试范本SQL面试题目汇总 1.触发器的作用? 答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 2.什么是存储过程?用什么来调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。 3.索引的作用?和它的优点缺点是什么? 答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 4.什么是内存泄漏? 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。 5.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? 答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

sql面试题

1.用一条SQL 语句查询出每门课都大于80 分的学生姓名(表名:tablename) name kecheng fenshu 张三语文81 张三数学75 李四语文76 李四数学90 王五语文81 王五数学100 王五英语90 答: (1)select distinct name from table where name not in (select distinct name from table where fenshu<=80) (2)select name from table group by name having min(fenshu)>80

2.学生表(表名:tablename)如下: 自动编号学号姓名课程编号课程名称分数 1 2005001 张三0001 数学69 2 2005002 李四0001 数学89 3 2005001 张三0001 数学69 删除除了自动编号不同, 其他都相同的学生冗余信息 答: delete tablename where 自动编号not in(select min( 自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)

3.一个叫team 的表,里面只有一个字段name, 一共有4 条纪录,分别是a,b,c,d, 对应四个球对,现在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合. 答: select https://www.wendangku.net/doc/702825244.html,, https://www.wendangku.net/doc/702825244.html, from team a, team b where https://www.wendangku.net/doc/702825244.html, < https://www.wendangku.net/doc/702825244.html, 4.请用SQL 语句实现:从TestDB 数据表中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。请注意:TestDB 中有很多科目,都有1 -12 月份的发生额。 AccID :科目代码,Occmonth :发生额月份,DebitOccur :发生额。 数据库名:JcyAudit ,数据集:Select * from TestDB 答:select a.* from TestDB a

SQL数据库面试题目及其答案

1.触发器的作用? 答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。 它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 2.什么是存储过程?用什么来调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。 3.索引的作用?和它的优点缺点是什么? 答:索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。 缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 3。什么是内存泄漏? 答:一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new 等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。 4.维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? 答:我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。 5.什么是事务?什么是锁? 答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。 要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

sql数据库面试题及答案

sql数据库面试题及答案 【篇一:sql数据库经典面试题(笔试题)】 =txt>1.一道sql语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负 如果要生成下列结果, 该如何写sql语句? 胜负 2005-05-09 2 2 2005-05-10 1 2 ------------------------------------------ create table #tmp(rq varchar(10),shengfu nchar(1)) insert into #tmp values(2005-05-09,胜) insert into #tmp values(2005-05-09,胜) insert into #tmp values(2005-05-09,负) insert into #tmp values(2005-05-09,负) insert into #tmp values(2005-05-10,胜) insert into #tmp values(2005-05-10,负) insert into #tmp values(2005-05-10,负) 1)select rq, sum(case when shengfu=胜 then 1 else 0 end)胜,sum(case when shengfu=负 then 1 else 0 end)负 from #tmp group by rq 2) select n.rq,n.勝,m.負 from ( select rq,勝=count(*) from #tmp where shengfu=胜group by rq)n inner join (select rq,負=count(*) from #tmp where shengfu=负group by rq)m on n.rq=m.rq 3)select a.col001,a.a1 胜,b.b1 负 from (select col001,count(col001) a1 from temp1 where col002=胜group by col001) a,

java、sql、oracle面试题汇总

1.(口述题)请简述迅雷、 BT 等 p2p 下载软件的实现原理。如何资源分布。解释:A 想来 B 家做客 ,但是遭到了 B 的管家 NAT B 的拒绝 ,理由是 :我从来没有听我家 B 提过你的名字,这时 A 找到了 A,B 都认识的朋友 server,要求 server给 B 报一个信 ,让 B 去跟管家说 A 是我的朋友 ,于是 ,B 跟管家 NAT B 说 ,A 是我认识的朋友 ,这样 A 的访问请求就不会再被管家 NAT B 所拒绝了 .简而言之 ,UDP 打洞 就是一个通过 server保存下来的地址使得彼此之间能够直接通信的过程,server只 管帮助建立连接 ,在建立间接之后就不再介入了 . 2.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么解 释:尽可能用约束(包括 CHECK 、主键、唯一键、外键、非空字段)实现,这 种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访 问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现, 但这种方式效率最低、编程最复杂,当为下下之策。 3.A=10,b=20 在不使用第三变量使两值互换 解释 : a=10,b=8 a=a-b b=b+a a=b-a 4.override 与重载的区别 解释: o verride是把继承于父类的方法给覆盖掉 重载是同一个函数名接受不同类型、个数的参数,完成不同的功能,调用起来 方便 5.抽象类跟接口的区别 解释:抽象类可以有非抽象方法,接口中只能有抽象方法。接口可以实现多继 承。 6.try {}里有一个return语句,那么紧跟在这个try 后的 finally{} 里的code 会不会被执行,什么时候被执行,在return前还是后? 解释: inally 里的代码会执行,在return 之前执行 7.实现一个冒泡排序 解释: ArrayList list=new ArrayList(); list.add(76); list.add(4); list.add(786); list.add(43); list.add(21); list.add(432); list.add(10); for(int i=0;i

经典SQL面试题总结

表 Student(S#,Sname,Sage,Ssex) 学生表 CREATE TABLE student ( sid varchar(10) NOT NULL, sName varchar(20) DEFAULT NULL, sAge datetime DEFAULT '1980-10-12 23:12:36', sSex varchar(10) DEFAULT NULL, PRIMARY KEY (sid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Course(C#,Cname,T#) 课程表 CREATE TABLE course ( cid varchar(10) NOT NULL, cName varchar(10) DEFAULT NULL, tid int(20) DEFAULT NULL, PRIMARY KEY (cid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SC(S#,C#,score) 成绩表 CREATE TABLE sc ( sid varchar(10) DEFAULT NULL, cid varchar(10) DEFAULT NULL, score int(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8; Teacher(T#,Tname) 教师表 CREATE TABLE teacher ( tid int(10) DEFAULT NULL, tName varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 数据:(MySQL) insert into teacher(tid,tName) values (1,'李老师'),(2,'何以琛'),(3,'叶平'); insert into student(sid,sName,sAge,sSex) values ('1001','张三丰','1980-10-12 23:12:36','男'),('1002','张无极','1995-10-12 23:12:36','男'),('1003','李奎','1992-10-12 23:12:36','女'),('1004','李元宝','1980-10-12 23:12:36','女'),('1005','李世明','1981-10-12 23:12:36','男'),('1006','赵六','1986-10-12 23:12:36','男'),('1007','田七','1981-10-12 23:12:36','女'); insert into sc(sid,cid,score) values ('1','001',80),('1','002',60),('1','003',75),('2','001',85),('2','002',70),('3','004',100), ('3','001',90),('3','002',55),('4','002',65),('4','003',60); insert into course(cid,cName,tid) values ('001','企业管理',3),('002','马克思',3),('003','UML',2),('004','数据库',1),('005 ','英语',1); 1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score>b.score and a.s#=b.s#; 2、查询平均成绩大于60分的同学的学号和平均成绩;

相关文档