您的位置:首页 > 数据库

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条数据到表:

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 效率低
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: