SQL常见面试题.docx
- 文档编号:11881595
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:43
- 大小:29.14KB
SQL常见面试题.docx
《SQL常见面试题.docx》由会员分享,可在线阅读,更多相关《SQL常见面试题.docx(43页珍藏版)》请在冰豆网上搜索。
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)
2.学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
12005001 张三 0001数学 69
22005002 李四 0001数学 89
32005001 张三 0001数学69
删除除了自动编号不同,其他都相同的学生冗余信息
A:
delete tablename where 自动编号 not in(select min(自动编号) from tablename group by 学
号,姓名,课程编号,课程名称,分数)
3. 表 A(单位名称,单位帐号), 表 B(单位编号,个人账号)
列出各单位的名称,账号,以及单位的人数
select A.name, A.dwzh, isnull(Ct.Quantity,'0') as Quantity from A
left join
(select dwzh, count(*) as Quantity from B
group by dwzh) as Ct
on A.dwzh = Ct.dwzh
4. 股票表(股票代码,买卖类型,数量)
按照股票代码列出,买的数量,卖的数量。
select isnull(a.StockID, b.StockID), isnull(a.S,'0'), isnull(b.B,'0') from (
select StockID,sum(quantity) as S from stocks
where sType = 's'
group by StockID ) a
full join (
select StockID,sum(quantity) as B from stocks
where sType = 'b'
group by StockID ) b
on a.StockID = b.StockID
5. select * from tempT where ','+ tempT.description + ',' like '%,1,%'
SQL Server 数据库的高级操作
(1) 批处理
(2) 变量
(3) 逻辑控制
(4) 函数
(5) 高级查询
*/
(1)批处理
将多条 SQL 语句作为一个整体去编译,生成一个执行计划,然后,执行!
理解批处理的关键在于"编译",对于由多条语句组成的一个批处理,
如果在编译时,其中,有一条出现语法错误,将会导致编译失败!
create table t
(
a int,
b int
)
-- 注释
-- 如果多行注释中包含了批处理的标识符 go
-- 在编译的过程中代码将会被 go 分割成多个部分来分批编译
-- 多行注释的标记将会被分隔而导致编译出错
-- 以下几条语句是三个非常经典的批处理
-- 你猜一下会添加几条记录!
/*
insert into t values (1,1)
go
*/
insert into t values (2,2)
go
/*
insert into t values (3,3)
*/
go
-- 查询看添加了几条记录
select * from t
truncate table t
(2)变量
-- 全局变量
SQL Server 中全局变量由系统定义、系统维护,用户一般仅可对其进行读取!
-- 查看 SQL Server 版本
print @@version
-- 服务器名称
print @@servername
-- 系统错误编号
insert into t values ('a','a')
print @@error
insert into t values ('a','a')
if @@error = 245
print 'Error'
-- SQL Server 版本的语言信息
print @@LANGUAGE
-- 一周的第一天从星期几算起
print @@datefirst
-- CPU 执行命令所耗费时间的累加
print @@cpu_busy
-- 获取最近添加的标识列的值
create table tt
(
a int identity(3, 10),
b int
)
insert into tt (b) values
(1)
print @@identity
select * from tt
-- 局部变量
局部变量由用户定义,仅可在同一个批处理中调用和访问
declare @intAge tinyint
set @intAge = 12
print @intAge
declare @strName varchar(12)
select @strName = 'state'
print @strName
select au_lname, @strName from authors
(3)逻辑控制
-- IF 条件判断
declare @i int
set @i = 12
if (@i > 10)
begin-- {
print 'Dadadada!
'
print 'Dadadada!
'
end-- }
else
begin
print 'XiaoXiao!
'
print 'XiaoXiao!
'
end
-- While 循环控制
declare @i int;
set @i = 12;
print @i
return;
while (@i < 18)
begin
print @i;
set @i = @i + 1;
if @i < 17
continue;
if @i > 15
break;
end;
-- CASE 分支判断
select au_lname, state, '犹他州' from authors where state = 'UT'
select au_lname, state, '密西西比州' from authors where state = 'MI'
select au_lname, state, '肯塔基州' from authors where state = 'KS'
select au_lname, state,
case state
when 'UT' then '犹他州'
when 'MI' then '密西西比州'
when 'KS' then '肯塔基州'
when 'CA' then '加利福利亚'
else state
end
from authors
(4.1)系统函数
-- 获取指定字符串中左起第一个字符的 ASC 码
print ascii('ABCDEF')
-- 根据给定的 ASC 码获取相应的字符
print char(65)
-- 获取给定字符串的长度
print len('abcdef')
-- 大小写转换
print lower('ABCDEF')
print upper('abcdef')
-- 去空格
print ltrim('abcd dfd df ')
print rtrim('abcd dfd df ')
-- 求绝对值
print abs(-12)
-- 幂
-- 3 的 2 次方
print power(3,2)
print power(3,3)
-- 随机数
-- 0 - 1000 之间的随机数
print rand() * 1000
-- 获取圆周率
print pi()
-- 获取系统时间
print getdate()
-- 获取 3 天前的时间
print dateadd(day, -3 , getdate())
-- 获取 3 天后的时间
print dateadd(day, 3 , getdate())
-- 获取 3 年前的时间
print dateadd(year, -3 , getdate())
-- 获取 3 年后的时间
print dateadd(year, 3 , getdate())
-- 获取 3 月后的时间
print dateadd(month, 3 , getdate())
-- 获取 9 小时后的时间
print dateadd(hour, 9 , getdate())
-- 获取 9 分钟后的时间
print dateadd(minute, 9 , getdate())
-- 获取指定时间之间相隔多少年
print datediff(year, '2005-01-01', '2008-01-01')
-- 获取指定时间之间相隔多少月
print datediff(month, '2005-01-01', '2008-01-01')
-- 获取指定时间之间相隔多少天
print datediff(day, '2005-01-01', '2008-01-01')
-- 字符串合并
print 'abc' + 'def'
print 'abcder'
print 'abc' + '456'
print 'abc' + 456
-- 类型转换
print 'abc' + convert(varchar(10), 456)
select title_id, type, price from titles
-- 字符串连接必须保证类型一致(以下语句执行将会出错)
-- 类型转换
select title_id + type + price from titles
-- 正确
select title_id + type + convert(varchar(10), price) from titles
print '123' + convert(varchar(3), 123)
print '123' + '123'
print convert(varchar(12), '2005-09-01',110)
-- 获取指定时间的特定部分
print year(getdate())
print month(getdate())
print day(getdate())
-- 获取指定时间的特定部分
print datepart(year, getdate())
print datepart(month, getdate())
print datepart(day, getdate())
print datepart(hh, getdate())
print datepart(mi, getdate())
print datepart(ss, getdate())
print datepart(ms, getdate())
-- 获取指定时间的间隔部分
-- 返回跨两个指定日期的日期和时间边界数
print datediff(year, '2001-01-01', '2008-08-08')
print datediff(month, '2001-01-01', '2008-08-08')
print datediff(day, '2001-01-01', '2008-08-08')
print datediff(hour, '2001-01-01', '2008-08-08')
print datediff(mi, '2001-01-01', '2008-08-08')
print datediff(ss, '2001-01-01', '2008-08-08')
-- 在向指定日期加上一段时间的基础上,返回新的 datetime 值
print dateadd(year, 5, getdate())
print dateadd(month, 5, getdate())
print dateadd(day, 5, getdate())
print dateadd(hour, 5, getdate())
print dateadd(mi, 5, getdate())
print dateadd(ss, 5, getdate())
-- 其他
print host_id()
print host_name()
print db_id('pubs')
print db_name(5)
-- 利用系统函数作为默认值约束
drop table ttt
create table ttt
(
stu_name varchar(12),
stu_birthday datetime default (getdate())
)
alter table ttt
add constraint df_ttt_stu_birthday default (getdate()) for stu_birthday
insert into ttt values ('ANiu', '2005-04-01')
insert into ttt values ('ANiu', getdate())
insert into ttt values ('AZhu', default)
sp_help ttt
select * from ttt
(4.2)自定义函数
select title_id
from titles
where type = 'business'
select stuff(title_id,1,3,'ABB'), type
from titles
where type = 'business'
select count(title_id) from titles where type = 'business'
select title_id from titles where type = 'business'
select *,count(dbo.titleauthor.title_id)
FROM dbo.authors INNER JOIN
dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id
select au_id, count(title_id)
from titleauthor
group by au_id
SELECT dbo.authors.au_id, COUNT(dbo.titleauthor.title_id) AS '作品数量'
FROM dbo.authors left outer JOIN
dbo.titleauthor ON dbo.authors.au_id = dbo.titleauthor.au_id
GROUP BY dbo.authors.au_id
order by '作品数量'
-- 自定义函数的引子(通过这个子查询来引入函数的作用)
-- 子查询
-- 统计每个作者的作品数
-- 将父查询中的作者编号传入子查询
-- 作为查询条件利用聚合函数 count 统计其作品数量
select au_lname,
(select count(title_id)
from titleauthor as ta
where ta.au_id = a.au_id
) as TitleCount
from authors as a
order by TitleCount
-- 是否可以定义一个函数
-- 将作者编号作为参数统计其作品数量并将其返回
select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount
from authors
order by TitleCount
-- 根据给定的作者编号获取其相应的作品数量
create function GetTitleCountByAuID(@au_id varchar(12))
returns int
begin
return (select count(title_id)
from titleauthor
where au_id = @au_id)
end
-- 利用函数来显示每个作者的作品数量
create proc pro_CalTitleCount
as
select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount
from authors
order by TitleCount
go
-- 执行存储过程
execute pro_CalTitleCount
-- vb 中函数定义格式
function GetTitleCountByAuID(au_id as string) as integer
.......
GetTitleCountByAuID = ?
end function
-- SALES 作品销售信息
select * from sales
-- 根据书籍编号查询其销售记录(其中,qty 表示销量)
select * from sales where title_id = 'BU1032'
-- 根据书籍编号统计其总销售量(其中,qty 表示销量)
select sum(qty) from sales where title_id = 'BU1032'
-- 利用分组语句(group by),根据书籍编号统计每本书总销售量(其中,qty 表示销量)
select title_id, sum(qty) from sales group by title_id
-- 是否可以考虑定义一个函数根据书籍编号来计算其总销售量
-- 然后,将其应用到任何一条包含了书籍编号的查询语句中
select title_id, title, dbo.GetTotalSaleByTitleID(title_id) as TotalSales
from titles
order by TotalSales
-- 定义一个函数根据书籍编号来计算其总销售量
create function GetTotalSaleByTitleID(@tid varchar(24))
returns int
begin
return(select sum(qty) from sales where title_id = @tid)
end
-- 统计书籍销量的前 10 位
-- 其中,可以利用函数计算结果的别名作为排序子句的参照列
select top 10 title_id, title, dbo.GetTotalSaleByTitleID(title_id) as TotalSales
from titles
order by TotalSales desc
-- 根据书籍编号计算其销量排名
create function GetTheRankOfTitle(@id varchar(20))
returns int
begin
return(select count(TotalSales)
from titles
where ToalSales >(
select TotalSales
from titles
where title_id=@id))
end
-- 根据书籍编号计算其销量排名
select dbo.GetTheRankOfTitle('pc1035') from titles
select count(title_id) + 1
from titles
where dbo.GetTotalSaleByTitleID(title_id) > dbo.GetTotalSaleByTitleID('pc1035')
-- 删除函数
drop function GetRankByTitleId
-- 根据书籍编号计算其销量排名
create function GetRankByTitleId(@tid varchar(24))
returns int
begin
return (select count(title_id) + 1
from titles
where dbo.GetTotalSaleByTitleID(title_id) > dbo.GetTotalSaleByTitleID(@tid))
end
-- 在查询语句中利用函数统计每本书的总销量和总排名
select title_id, title,
dbo.GetTotalSaleByTitleID(title_id) as TotalSales,
dbo.GetRankByTitleId(title_id) as TotalRank
from titles
order by TotalSales desc
-- 查看表结构
sp_help titles
-- 查看存储过程的定义内容
sp_helptext GetRankByTitleId
sp_helptext sp_helptext
sp_helptext xp_cmdshell
-- [ORDER DETAILS] 订单详细信息
select * from [order details]
select * from [order details] where productid = 23
-- 根据产品编号在订单详细信息表中统计总销售量
select sum(quantity) from [order details] where productid = 23
-- 构造一个函数根据产品编号在订单详细信息表中统计总销售量
create function GetTotalSaleByPID(@Pid varchar(12))
returns int
begin
return(select sum(quantity) from [order details] where productid = @Pid)
end
select * from products
-- 在产品表中查询,统计每一样产品的总销量
select productid, productname, dbo.GetTotalSaleByPID(productid) from products
--
CREATE FUNCTION LargeOrderShippers ( @FreightParm money )
RETURNS @OrderShipperTab TABLE
(
ShipperIDint,
ShipperNamenvarchar(80),
OrderIDint,
ShippedDatedatetime,
Freightmoney
)
AS
BEGIN
INSERT @OrderShipperTab
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 常见 试题