Sql小题几道
2008-10-05 23:36
218 查看
前题条件
(user)用户表 id,un,pwd,regtime
类型 bigint,nvarchar(50),varchar(32),smalldatetime
1.bigint相当于.net中什么数据类型:long 类似问题对应
基本对应关系
sqlserver类型:C#类型 .net类型
bigint:long Int64
int:int Int32
smallint:short Int16
tinyint:byte Byte
bit:bool Boolean
2.nvarchar与varchar或nchar与char的区别:带n 的可以存Unicode码中文算一个字符
带var的和不带var的区别,及优缺点:带var的长度可变省空间(例 varchar(10) 存'a'个只站1个的空间 char(10)不管存几个都站10个,空格补),不带var的省时间(可变长度意味着原有的存储地方没有留出足够空间,移动数据是要时间的。)
3.nvarchar(x)这个x最多可以是多大:nvarchar(4000)=nvarchar(MAX)两种写法都行
4.如果字符串长度超过4000怎么办?(2005):用ntext,(2000):使用二进制存,或用数组。
5.smalldatetime与datetime区别:
datetime 1753 年 到9999 最小单位 3.33 毫秒
smalldatetime 1900 年 到 2079 最小单位 1 分钟(一般用这个就行,看情况了)
6.插入1条数据到表:
7.上面,为什么user加[]:因为user是关键字,关键字做表,字段名时务必加[]
8.sql中的字符串可以用双引号不?:不行,只能单引。
9.获取当前时间用什么函数:MsSql用getdate(),MsAccess用Now()
10.6.中所示为什么不插入ID:ID是自增的情况下一定不要插入ID,否则会出错。
11.我要改密码,我的用户名是yang,我把密码改成1234:
12.where条件有哪些关键字:
and 同时2个
or 至少一个
not 不是: where not un='x'
in 在一个集合内 where un in ('yang','5411','ding')
between and 在一个连续集合内 where id between 10 and 20(id介于10和20间的)
<> 不等于
all 全部符合 where un=all(select un from [user])
any 符合一条就行 where un=any(select un from [user])
exists存在就行 where exists(select 1 from [user])
like 模糊匹配 %表示个字符_表示1个字符
13.删除名中带yang的:
删除yang开头的:
删除第二个字母是y的:
14.查询最后10个注册的用户
*是什么意思:查询全部
不用*而用id,un,pwd,regtime可以吗:可以,是一样的效果,id,un,pwd,regtime这样全列出来性能更高,但书写费时,真正做项目时尽量少用*
top后的()可以省略吗:部分语境下必须要,有一些还可有可无,为免除不必要的麻烦,尽量带。
这个还有其它写法吗?:id如果是自增的话也可以order by id desc一样的。
desc相反的那个是什么?desc为倒序,正序为asc可以省略,order by regtime asc=order by regtime
15.当前注册用户数量:
*不是效率不高嘛 ,那我们怎么办?:我通常select count(1) ...
select 后面是只能带字段和*吗?不是,任何常量也行 select 'yang',1,un,pwd from [user]也是合法
16.最第20-30个用户的用户名:
这是一个分页问题
17.sql区分大小写吗?:不区分
18.Sql下注释怎么写?:--(两个减号)
19.什么是GUID:全球统一标识,微软创的,所随机生成的序列全世界也不可能相同形如:65D5ACD1-BA86-4f4e-9A83-689774A716F2
20.随机取10个用户名:
NewID()是干毛的函数:生成一个GUID。
30.生成的列名太死板了,我想自己定义名怎么办?:用as关键字,如:
我定义第二个表,Friend好友表
id uid1 uid2
bigint bigint bigint
uid1是第一个用户,uid2是第二个用户(的id)
31.列出id为11这个用户的所有好友的名字:
上面的这个不对uid1为11的要算,uid2为11时的uid1并没有被取出啊
id uid1 uid2
1 11 12
2 13 11
如上12被取出了,但13也是11的好友没被取出,应该怎么办?
union 是什么?:并集,将两个SQL的结果合并
union的前提:两个SQL语句select的字段数量相同,且类型对应,以2个下为错例:
32.去掉重复的数据。如取用户的密码列表(可能重,这就要去掉重复数据了)
33.删除用户名重复的用户(每个用户只留一个)
group by 是什么意思?按后面的字段分组,如果使用它一定要使用聚合函数(例如avg,max,min,sum,count)
什么是聚合函数:见上行。
34.取uid2为22的uid1的名(这回不取全好友关系了):
利用表关联:
friend.uid2这么写有点长,有没有其它办法?
除inner join(内联) 外还有什么?:outer join (外联)/left join(左联)和 right join(右联) 及cross join(迪卡尔积)
哪个性能高?:通常inner join 很少用另几个
上文这样写也行
select un from [user],[friend] where friend.uid2=22 and friend.uid1=[user].id
为什么我们通常写inner join :上面写法默认解析为outer join 效率低
(user)用户表 id,un,pwd,regtime
类型 bigint,nvarchar(50),varchar(32),smalldatetime
1.bigint相当于.net中什么数据类型:long 类似问题对应
基本对应关系
sqlserver类型:C#类型 .net类型
bigint:long Int64
int:int Int32
smallint:short Int16
tinyint:byte Byte
bit:bool Boolean
2.nvarchar与varchar或nchar与char的区别:带n 的可以存Unicode码中文算一个字符
带var的和不带var的区别,及优缺点:带var的长度可变省空间(例 varchar(10) 存'a'个只站1个的空间 char(10)不管存几个都站10个,空格补),不带var的省时间(可变长度意味着原有的存储地方没有留出足够空间,移动数据是要时间的。)
3.nvarchar(x)这个x最多可以是多大:nvarchar(4000)=nvarchar(MAX)两种写法都行
4.如果字符串长度超过4000怎么办?(2005):用ntext,(2000):使用二进制存,或用数组。
5.smalldatetime与datetime区别:
datetime 1753 年 到9999 最小单位 3.33 毫秒
smalldatetime 1900 年 到 2079 最小单位 1 分钟(一般用这个就行,看情况了)
6.插入1条数据到表:
insert [user] (un,pwd,regtime) values('yang','123456',getdate())
7.上面,为什么user加[]:因为user是关键字,关键字做表,字段名时务必加[]
8.sql中的字符串可以用双引号不?:不行,只能单引。
9.获取当前时间用什么函数:MsSql用getdate(),MsAccess用Now()
10.6.中所示为什么不插入ID:ID是自增的情况下一定不要插入ID,否则会出错。
11.我要改密码,我的用户名是yang,我把密码改成1234:
update [user] pwd='1234' where un='yang'
12.where条件有哪些关键字:
and 同时2个
or 至少一个
not 不是: where not un='x'
in 在一个集合内 where un in ('yang','5411','ding')
between and 在一个连续集合内 where id between 10 and 20(id介于10和20间的)
<> 不等于
all 全部符合 where un=all(select un from [user])
any 符合一条就行 where un=any(select un from [user])
exists存在就行 where exists(select 1 from [user])
like 模糊匹配 %表示个字符_表示1个字符
13.删除名中带yang的:
delete [user] where un like '%yang%'
删除yang开头的:
delete [user] where un like 'yang%'
删除第二个字母是y的:
delete [user] where un like '_y%'
14.查询最后10个注册的用户
select top(10) * from [user] order by regtime desc
*是什么意思:查询全部
不用*而用id,un,pwd,regtime可以吗:可以,是一样的效果,id,un,pwd,regtime这样全列出来性能更高,但书写费时,真正做项目时尽量少用*
top后的()可以省略吗:部分语境下必须要,有一些还可有可无,为免除不必要的麻烦,尽量带。
这个还有其它写法吗?:id如果是自增的话也可以order by id desc一样的。
desc相反的那个是什么?desc为倒序,正序为asc可以省略,order by regtime asc=order by regtime
15.当前注册用户数量:
select count(*) from [user]
*不是效率不高嘛 ,那我们怎么办?:我通常select count(1) ...
select 后面是只能带字段和*吗?不是,任何常量也行 select 'yang',1,un,pwd from [user]也是合法
16.最第20-30个用户的用户名:
这是一个分页问题
select top(10) un from [user] where id not in( select top (20) id from [user] )
17.sql区分大小写吗?:不区分
18.Sql下注释怎么写?:--(两个减号)
19.什么是GUID:全球统一标识,微软创的,所随机生成的序列全世界也不可能相同形如:65D5ACD1-BA86-4f4e-9A83-689774A716F2
20.随机取10个用户名:
select top (10) un from [user] ORDER BY NEWID()
NewID()是干毛的函数:生成一个GUID。
30.生成的列名太死板了,我想自己定义名怎么办?:用as关键字,如:
select un as Username from [user]
我定义第二个表,Friend好友表
id uid1 uid2
bigint bigint bigint
uid1是第一个用户,uid2是第二个用户(的id)
31.列出id为11这个用户的所有好友的名字:
select un from [user] where id in ( select uid2 from friend where uid1=11 )
上面的这个不对uid1为11的要算,uid2为11时的uid1并没有被取出啊
id uid1 uid2
1 11 12
2 13 11
如上12被取出了,但13也是11的好友没被取出,应该怎么办?
select un from [user] where id in ( select uid2 from friend where uid1=11 union select uid1 from friend where uid2=11 )
union 是什么?:并集,将两个SQL的结果合并
union的前提:两个SQL语句select的字段数量相同,且类型对应,以2个下为错例:
select 1 union select 1,2 select 1,2 union select 1,'2'
32.去掉重复的数据。如取用户的密码列表(可能重,这就要去掉重复数据了)
select DISTINCT pwd FROM [user] ORDER BY pwd ;
33.删除用户名重复的用户(每个用户只留一个)
delete [user] where id not in(select max(id) from [user] group by un)
group by 是什么意思?按后面的字段分组,如果使用它一定要使用聚合函数(例如avg,max,min,sum,count)
什么是聚合函数:见上行。
34.取uid2为22的uid1的名(这回不取全好友关系了):
利用表关联:
select un from [user] inner join friend on friend.uid1=[user].id where friend.uid2=22
friend.uid2这么写有点长,有没有其它办法?
select un from [user] inner join friend as f on f.uid1=[user].id where f.uid2=22
除inner join(内联) 外还有什么?:outer join (外联)/left join(左联)和 right join(右联) 及cross join(迪卡尔积)
哪个性能高?:通常inner join 很少用另几个
上文这样写也行
select un from [user],[friend] where friend.uid2=22 and friend.uid1=[user].id
为什么我们通常写inner join :上面写法默认解析为outer join 效率低