转:以前遇见别人问的几个数据库的问题,我没有回答好,最近看些数据库的书籍把他们总结如下,以备后人之鉴。
1
、
用
select
语句,查询重复记录。(一般我们用的是
distinct
找不同的记录,问到重复的反而有点发愣)
假设,表名为
T1
子段为
A,B,C
select count(*) ,A,B,C from T1
group by A,B,C having count(*) > 1
测试数据:
A100 B100 C100
A101 B101 C101
A102 B102 C102
A102 B102 C100
A102 B102 C102
A102 B102 C102
A100 B100 C100
运行结果:
2 A100 B100 C100
3 A102 B102 C102
2
、
如果查询的结果某个字段是
Null
,用默认的值代替。
1
、)
Sql server
中:
select case when
字段名
1 is null
then
替代值
else
字段名
1
end +
case when
字段名
2 is null
then
替代值
else
字段名
2
end as
显示字段名
from
表名
注:字段名是表中的列。
经常如果某个字段是“”时(空格),也可以用某个字段代替,例如
customer
表:
执行下列语句:
select
custid,shipline1,shipline2, name ,
case when
Status =' ' then '0' else Status end as Status
from
customer
得到
(
如果
status
为
’ ’,
则让它视图显示“
0
”
)
:
执行进一步更复杂的要求,如果
name
为
’my’
显示‘
a
’
,
为
’yo’
显示‘
b
’
,
其他显示
’c’,sql
语句如下:
select
custid,shipline1,shipline2,
case
when
name='my'
then
'a'
when
name='yo'
then
'b'
else 'c'
end
as name ,
case when
Status ='' then '0' else Status end
as Status
from
customer order by custid asc
注:(附建表语句)
create table AppDta.dbo.customer(
custid int Not Null check(custid>0),
name char(30) Not Null check(name<>''),
shipline1 varchar(100) Not Null Default '',
shipline2 varchar(100) Not Null Default '',
Status
char(1) Not Null Default '',
CreditLimit Money Not Null check((CreditLimit Is NUll) or (CreditLimit>=0)));
2
、)
oracle
中:
下面用一个常见的数据显示来说明
decode
函数的用法。就是成绩单的显示。我想做开发的人员都遇到过这个,而且在大学期间也是常常接触成绩单,显示的是:姓名、语文、数学等。
实现脚本如下(
cjd.sql
):
--
建表
create table stud
(
sid varchar2(10),
kcbm varchar2(10),
cj int
);
--
插入测试数据
insert into stud values(''''1'''',''''
语文
'''',80);
insert into stud values(''''2'''',''''
数学
'''',90);
insert into stud values(''''3'''',''''
英语
'''',100);
commit;
--
创建视图,
decode
用法
create or replace view cjd as
select sid,
decode(kcbm,''''
语文
'''',cj,0)
语文
,
decode(kcbm,''''
数学
'''',cj,0)
数学
,
decode(kcbm,''''
英语
'''',cj,0)
英语
from stud
order by sid;
--
显示数据
select * from cjd;
执行过程如下:
SQL> create table stud(sid varchar2(10),
2 kcbm varchar2(10),
3 cj int);
表已创建。
WS$R=
业
@
网
VgoX
育
Yb
网
IlU
SQL> insert into stud values(''''1'''',''''
语文
'''',80);
已创建
1
行。
SQL> insert into stud values(''''2'''',''''
数学
'''',90);
已创建
1
行。
SQL> insert into stud values(''''3'''',''''
英语
'''',100);
已创建
1
行。
SQL> commit;
提交完成。
SQL> create or replace view cjd as
2 select sid,
3 decode(kcbm,''''
语文
'''',cj,0)
语文
,
4 decode(kcbm,''''
数学
'''',cj,0)
数学
,
5 decode(kcbm,''''
英语
'''',cj,0)
英语
6 from stud
7 order by sid;
视图已建立。
SQL> select * from cjd;
SID
语文
数学
英语
---------- ---------- ---------- ----------
1 80 0 0
2 0 90 0
3 0 0 100
3
、
存储过程和触发器的区别。
1
、)什么是存储过程呢?
定义:
将常用的或很复杂的工作,预先用
SQL
语句写好并用一个指定的名称存储起来
,
那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时
,
只需调用
execute,
即可自动完成命令。
讲到这里
,
可能有人要问:这么说存储过程就是一堆
SQL
语句而已啊?
Microsoft
公司为什么还要添加这个技术呢
?
那么存储过程与一般的
SQL
语句有什么区别呢
?
存储过程的优点:
1.
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般
SQL
语句每执行一次就编译一次
,
所以使用存储过程可提高数据库执行速度。
2.
当对数据库进行复杂操作时
(
如对多个表进行
Update,Insert,Query,Delete
时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.
存储过程可以重复使用
,
可减少数据库开发人员的工作量
4.
安全性高
,
可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.
系统存储过程:以
sp_
开头
,
用来进行系统的各项设定
.
取得信息
.
相关管理工作
,
如
sp_help
就是取得指定对象的相关信息
2.
扩展存储过程
以
XP_
开头
,
用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.
用户自定义的存储过程
,
这是我们所指的存储过程
常用格式
Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释
:
output
:表示此参数是可传回的
with {recompile|encryption}
recompile:
表示每次执行此存储过程时都重新编译一次
encryption:
所创建的存储过程的内容会被加密
如
:
表
book
的内容如下
编号
书名
价格
001 C
语言入门
$30
002 PowerBuilder
报表开发
$52
实例
1:
查询表
Book
的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例
2:
加入一笔记录到表
book,
并查询此表中所有书籍的总金额
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------
加密
as
insert book(
编号
,
书名,价格)
Values(@param1,@param2,@param3)
select @param4=sum(
价格
) from book
go
执行例子
:
declare @total_price money
exec insert_book '003','Delphi
控件开发指南
',$100,@total_price
print '
总金额为
'+convert(varchar,@total_price)
go
存储过程的
3
种传回值
:
1.
以
Return
传回整数
2.
以
output
格式传回参数
3.Recordset
传回值的区别
:
output
和
return
都可在批次程式中用变量接收
,
而
recordset
则传回到执行批次的客户端中
实例
3
:设有两个表为
Product,Order,
其表内容如下:
Product
产品编号
产品名称
客户订数
001
钢笔
30
002
毛笔
50
003
铅笔
100
Order
产品编号
客户名
客户订金
001
南山区
$30
002
罗湖区
$50
003
宝安区
$4
请实现按编号为连接条件
,
将两个表连接成一个临时表
,
该表只含编号
.
产品名
.
客户名
.
订金
.
总金额
,
总金额
=
订金
*
订数
,
临时表放在存储过程中
代码如下
:
Create proc temp_sale
as
select a.
产品编号
,a.
产品名称
,b.
客户名
,b.
客户订金
,a.
客户订数
* b.
客户订金
as
总金额
into #temptable from Product a inner join Order b on a.
产品编号
=b.
产品编号
if @@error=0
print 'Good'
else
print 'Fail'
go
2
)什么是触发器
定义:触发器是一种特殊的存储过程,当
insert,update,delete
语句修改表中的一个或多个行时,执行触发器。
分享到:
相关推荐
对于网站的安全性,是每个网站开发者和运营者最关心的问题。网站一旦出现漏洞,那势必将造成很大的损失。为了提高网站的安全性,首先网站要防...我在网上收集了以下3种方法 C#防SQL注入方法一 在Web.config文件中
[SQL]将Excel表数据导入SQL Server2005的几种方法归纳 数据库 2010-07-27 11:14:26 阅读201 评论0 字号:大中小 订阅 近日在巨轮着手车间负荷数据处理,反馈回来的数据是保存在Excel文件中的,我必须将其导入SQL ...
本文主要通过一下几个方面介绍:使用SQLDMV查找慢速查询、通过APM解决方案查询报告、SQLServer扩展事件、SQLAzure查询性能洞察等相关内容。本文来自博客园,由火龙果软件Anna编辑、推荐。SQLServer的一个重要功能是...
不仅描述了join的几种用法,还详细介绍了几种参数的用法
Apex SQL Log SQL Log Rescue 首先说第一个Log Explorer,第一个可能很多人都用过,我下载下来马上连上数据库,点view log,发现了很多条操作记录,不过不管怎么调,那日志的时间都是6月12日到6月16日,...
防范sql注入的方法无非有以下几种: 1.使用类型安全的SQL参数 2.使用参数化输入存储过程 3.使用参数集合与动态SQL 4.输入滤波 5.过滤LIKE条款的特殊字符 …如果有遗漏的也欢迎园子的大大们指教...
SQL Server数据库备份有两种方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志文件ldf的方式。本文主要讨论一下后者的备份与恢复。
下面小编就为大家带来一篇SQL中实现SPLIT函数几种方法总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。 本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库...
下面我们将介绍几种获取元数据的方法。 获取元数据 使用系统存储过程与系统函数访问元数据 获取元数据最常用的方法是使用 SQL Server 提供的系统存储过程与系统函数。 系统存储过程与系统函数在系统表和元...
Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 在获取便利操作的同时...
所幸的是此类问题还真有人遇到了,而且也有好几种解决方法。我就用了两种方法,分享一下吧: 方法一: 将要附加的文件拷贝到 SQL Server默认的 Data 目录,此时附加就会成功;即自己所安装的路径下 方法二: 使用...
在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题。其实,在SQL Server中集成了很多成批导入数据... 在使用这条语句的时候,需要注意几个方面的内容。 一是需要在目的数据库中先建立相关的表。如想把进销存
【赛迪网-IT技术报道】SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有...
总结Oracle 脚本编程中,动态SQL的几种用法
9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...
提高sql server xml字段的查询速度的几种方法,其中使用索引关键字方法在模糊查询中相当实用。
主要介绍了C# 中用 Sqlparameter 的几种用法,文中给大家列举了两种用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
书中还讲述了其他几种争议较多的构造(camstruct)——如临时表、动态执行、XML和.NET集成——它们在具有强大功能的同时,也具有极大的风险。 本书适合于需要编写或检查T-SQL代码的有经验的T-SQL程序员和数据库...
本次设计主要利用的是LABVIEW虚拟软件平台,配合我们在计算机中尝试用的访问数据库的几种方法,在LABVIEW中分析了常用的集中方式的好处与不利之处,主要对使用LABVIEW SQL访问数据库的方式进行主要的编程讲解,包括...