几个数据库案例分析

We will learn about several  function in the first place.

firstly,character string function

 

 

secondly, system function

 

 

thirdly,mathematic(al) function

 

finnally,Date and Time Functions

 

 

案例一

 

某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:
    卡里面的O0(哦和零)i1(哎和一),用户反映说看不清楚,公司决定,把存储在数据库中的密码中所有的都改成把所有的i都改成1
    请编写SQL语句实现以上要求;
    数据库表名:Card;密码字段名:PassWord;

分析:

答案一:
Update Card
Set    PassWord = Replace(Replace(PassWord ,'O','0'),'i','1')
答案二:

Update Card Set PassWord = Replace(PassWord ,'O','0')
Update Card Set PassWord = Replace(PassWord ,'i','1')

 

案例二

 

在数据库表中有以下字符数据,如:
14-1、14-2、 13-1、13-2、13-3、13-10、13-100、13-108、13- 18、13-11、13-15
现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进 行排序,然后再按照后半部分的数字进行排需,输出要排成这样:
13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13- 108、14-1、14-2
数据库表名:SellRecord;字段名:ListNumber;

这是更新语句,需要使用UPDATE语句;
 因为牵涉到字符串的替换,需要使用到SQL Server中的函数Replace;
答案一:
Update Card Set PassWord = Replace(Replace(PassWord ,'O','0'),'i','1')
答案二:
Update Card Set PassWord = Replace(PassWord ,'O','0')
Update Card Set PassWord = Replace(PassWord ,'i','1')

这是更新语句,需要使用UPDATE语句;
因为牵涉到字符串的替换,需要使用到SQL Server中的函数Replace;
 分析:
这是查询语句,需要使用SELECT语句
需要使用到ORDER BY进行排序,并且在ORDER BY的排序列中,也需要重新计算出排序的数字来
前半部分的数字,可以从先找到-符号的位置,然后,取其左半部分,最后再使用Convert函数将其转换为数字:
Convert(int, Left(ListNumber, CharIndex('-', ListNumber)-1))
后半部分的数字,可以先找到-符号的位置,然后把从第一个位置到该位置的全部字符替换为空格,最后再使用Convert函数将其转换为数字:
Convert(int, Stuff(ListNumber,1, Charindex('-', ListNumber), ''))
 答案:
SELECT ListNumber
FROM    SellRecord
ORDER BY
Convert(int, Left(ListNumber, CharIndex('-', ListNumber)-1)),
Convert(int, Stuff(ListNumber,1, Charindex('-', ListNumber), ''))
案例三
 
学员内部测试成绩查询的每次显示的都是学员的编号信息,
因为该表中只存储了学员的编号;
实际上最好显示学员的姓名,而姓名存储在学员信息表;
如何同时从这两个表中取得数据?
内联结
写法一:
 
SELECT S.SName,C.CourseID,C.Score
From Score AS C
INNER JOIN Students AS S
ON C.StudentID = S.SCode
写法二:
 
SELECT Students.SName, Score.CourseID, Score.Score
FROM Students,Score
WHERE  Students.SCode = Score.StudentID
写法三:
 
SELECT
S.SName AS 姓名, CS.CourseName AS 课程, C.Score AS 成绩
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID = C.CourseID)
左外联结:
 
SELECT S.SName,C.CourseID,C.Score
From Students AS S
LEFT JOIN Score AS C
ON C.StudentID = S.SCode
右外联结:
 
SELECT Titles.Title_id, Titles.Title, Publishers.Pub_name
FROM titles
RIGHT OUTER JOIN Publishers
ON Titles.Pub_id = Publishers.Pub_id
案例四
 
在数据库表中,数据行位置并不重要,但是一个单位中要根据奇数行和偶数行的数据来汇总,在这个汇总的基础上再得到一个数值,因此,要查询数据库表的奇数行和偶数行的总数
数据库表名:TBL
字段名:A
主键字段:IDKEY(标识列,种子:1;增长量:1)
分析:
 
只能依靠标识列的值来进行判断和选取
因为数据行可能存在增加、修改和删除,因此标识列的数据值并不完全可靠,例如标识列值为3,并不一定是第三行,因为如果第二行被删除了,它就是第二行,实际上也是偶数行
根据我们前面使用过的SELECTINTO,可以创建一张新表,顺便创建新的标识列,再在新的标识列上执行奇偶判断
奇数判断依据:标识列值%2不等于0;偶数判断依据:标识列值%2等于0
 答案:
SELECT A, IDENTITY(int,1,1) AS ID
INTO TEMPTABLE
FROM TBL
SELECT SUM(A) AS 奇数列汇总
FROM TEMPTABLE
WHERE ID%2 <> 0
SELECT SUM(A) FROM AS 偶数列汇总
FROM TEMPTABLE
WHERE ID%2 = 0
案例五
 
一家银行发行了新的信用卡,刚开始的时候推广得很好,但是逐渐废卡也越来越多(卡上的余额少于2元,并且用户长时间不使用该卡),因此银行在二月份把这些少于2元的卡从都数据库表中删除了,但是很快问题就来了,用户发现他的卡再也不能使用而投诉,因此只能再把这些卡恢复。
 
分析:
 
这种方式的数据插入,不是固定的数据项,而是从其它表中筛选数据再插入,因此要使用到INSERT INTOSELECT结构
SELECT的任务就是找出两个表中不同的项
在前面的联结查询中,使用INNER JOINON可以找出相同的项,取相反的情况,是否可以找出不同的项呢?编写以下T-SQL:
 SELECT M.CardID,2 FROM M INNER JOIN S ON (S.CardID<>M.CardID)
   此方法两个表之间是进行交叉对比的,而不是一一对比,所以会对比出很不同的项来;因此,这种方法不可行
考虑我们在上面的左外连接查询,能够查询出左表(From)中存在而相关表(left join)不存在的数据项,并以NULL填充
答案:
INSERT INTO S (S.CardID,S.Score)
SELECT M.CardID,2
FROM 信息表 as M
LEFT JOIN 帐号表 as S
ON (S.CardID=M.CardID)
WHERE S.CardID IS NULL
最后,使用WHERE S.CardID IS NULL可以判断数据项是否存在子表中;并且按 M.CardID,2 插入帐号和常量项 2(元)
编写SQL,把CardID为23、30等在子表中没有的记录插入到子表中,插入的数据Score项值为2……
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值