- 浏览: 540142 次
- 性别:
- 来自: 南京
-
文章分类
- 全部博客 (168)
- java基础 (22)
- 面向对象编程 (2)
- 集合 (4)
- I/O操作 (5)
- 多线程 (9)
- java高级特性 (8)
- 网络编程 (0)
- sql基础 (23)
- JDBC (1)
- 数据结构与算法 (20)
- 软件测试 (1)
- 程序员小知识 (2)
- WEB开发 (15)
- 其他 (11)
- Struts (3)
- Hibernate (8)
- Spring (4)
- 设计模式 (5)
- java基础快速总结 (1)
- 正则表达式 (3)
- UML (3)
- XML操作 (0)
- 编译原理 (1)
- tomcat (2)
- EJB (0)
- javascript (4)
- 个人系统设计 (1)
- Extjs (3)
- 面试题总结 (4)
- 技术大综合 (2)
- 最经需要搞好多的开源软件,集中下 (0)
- java重写hashcode的分析(转) (1)
最新评论
-
jerry.zhao:
ybzshizds 写道这种用工厂模式解决的办法其实还是有一个 ...
InitialContext和lookup -
小土豆内特:
static class Queue
java实现队列 -
leizisdu:
感谢楼主讲解、分享!
工厂模式 -
kchiu:
写了没什么用
EXT组件xtype简介 -
u010271301:
大哥 能描述的跟详细点么?
浅谈write(byte[] b)和write(byte[] b,int off,int len)的区别
1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多
2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') ; 1--相同;否则不相同 encrypt('原始密码')
3.获取表的列
select name from syscolumns where id=object_id('salechance')
同
select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = 'salechance')
4.获取所有用户表
select Name from sysobjects where xtype='u' and status>=0
5.查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype='P'
6.把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') select * from 本地表
7.使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
SET NOCOUNT 为 OFF 时,返回计数
8.在SQL查询中:from后最多可以跟多少张表或视图:256
9.在SQL语句中出现 Order by,查询时,先排序,后取在SQL中。
10.一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。
技巧
首先准备数据
create table tab1(id int not null,tname varchar(20));
create table tab2(id int not null,tname varchar(20));
insert into tab1 values(1,'上海');
insert into tab1 values(2,'北京');
insert into tab1 values(3,'广州');
insert into tab1 values(4,'重庆');
insert into tab1 values(5,'兰州');
insert into tab2 values(1,'上海');
insert into tab2 values(2,'北京');
insert into tab2 values(3,'广州');
insert into tab2 values(4,'重庆');
insert into tab2 values(5,'深圳');
11.更新修改过的数据 (即如果t2和t1 tname不同,则将t1的tname修改为t2的tname)
update t1 set t1.tname=t2.tname
from tab1 t1,
tab2 t2
where t1.id=t2.id and(t1.tname <> t2.tname) ;
update tb1 set name=(select tb2.name from tb2 where tb2.id =tb1.id ) ;
例如号码段
create table phone(
city varchar(20) not null,
psection varchar(20) not null
)
create table tel(
telno varchar(20) not null,
city varchar(20)
)
insert into phone values('上海','1340200');
insert into phone values('北京','1369925');
insert into tel values('13925727238',null);
insert into tel values('13402000999',null);
insert into tel values('13699254553',null);
select * from phone;
select * from tel;
update tel SET tel.city=phone.city FROM tel,phone where tel.telno like phone.psection+'%';
执行前
上海1340200
北京1369925
-------------------
13925727238 null
13402000999 null
13699254553 null
执行后的结果是
13925727238 NULL
13402000999上海
13699254553 北京
12.插入新增的数据
insert into tab1 (id,tname)
select t2.id,t2.tname from tab2 t2
where not exists(select t1.id ,t1.tname from tab1 t1 where t1.id=t2.id );
13.删除已经删除的数据(如果需要的话)
delete t1 from tab1 t1 where not exists( select * from tab2 where id=t1.id)
delete from t1 from tab1 t1 where not exists( select * from tab2 where id=t1.id)
一次删除多个表的记录
delete from tab1 where tname='上海' delete from tab2 where tname='上海'
中间只有空格
一条SQL语句查询出成绩名次排名
1 张三 90
2 李四 85
3 王五 100
4 赵六 85
5 汪一 100
6 周九 78
7 何二 56
然后我希望排名次,因为这里有同分,所以必然会出现并列名次。网络上关于并列成绩名次排名有两种方式,其一是这样:
A
名次 姓名 成绩
1 王五 100
1 汪一 100
3 张三 90
4 赵六 85
4 李四 85
6 周九 78
7 何二 56
第二种还是这样:
B
名次 姓名 成绩
1 王五 100
1 汪一 100
2 张三 90
3 赵六 85
3 李四 85
4 周九 78
5 何二 56
SQL语句是一种很实用的技巧,希望和朋友们多交流,现在抛砖引玉把自己的3句SQL语句贴出来共享,抛砖引玉,希望大家多多指教,拍砖的轻点。
对于A方式,比较好办,以Access数据库为例(其他数据库语法大同小异,变化一下对应的即可),可以写成这样:
SELECT e.place AS 名次, d.name AS 姓名, d.mark AS 成绩
FROM [select a.id,count(b.id)+1 as place from sc a left join sc b on a.mark < b.mark group by a.id]. AS e INNER JOIN sc AS d ON e.id = d.id;
同时A方式也可以写成这样,效果等同,不过估计比上面那句效率低点:
SELECT e.place AS 名次, d.name AS 姓名, d.mark AS 成绩
FROM [select a.id,count(iif(b.id is null,null,b.id))+1 as place from sc a left join sc b on a.mark<b.mark group by a.id]. AS e INNER JOIN sc AS d ON e.id = d.id;
而B方式则比较棘手,写了半个钟头才写好.......:
SELECT e.place AS 名次, d.name AS 姓名, d.mark AS 成绩
FROM [select c.id,count(iif(c.mark is null,null,c.mark))+1 as place from (select a.id,b.mark from sc a left join sc b on a.mark < b.mark group by a.id,b.mark)c group by c.id]. AS e INNER JOIN sc AS d ON e.id = d.id;
普通SQL语句可以用Exec执行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
字段名,表名,数据库名之类作为变量时,必须用动态SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格
当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错
declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确
行列转换
1. 行列转换--普通
假设有张学生成绩表(CJ)如下
[姓名] [学科] [成绩]
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82
王五 数学 60
转换成
[姓名] [语文] [数学] [物理]
张三 80 90 85
李四 85 92 82
王五 null 60 null
declare @sql varchar(4000)
set @sql = 'select 姓名'
select @sql = @sql + ',sum(case 学科 when ''' 学科 ''' then 成绩 end) as ' 学科
from (select distinct 学科 from CJ) as a
set @sql = @sql ' from cj group by 姓名'
exec(@sql)
一般来说:
①.有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;
②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
用一条sql语句查询出“每门”课程都大于80分的学生姓名
select distinct name
from stu
where name not in
(select distinct name from stu where fengshu <=80);
查询各科成绩前2名
select sid,cid,Achievement
from Achievement a
where (select count(*) from Achievement where cid=a.cid and
Achievement>=a.Achievement)<=2
order by cid,Achievement desc
go
关于分页查询
SELECT DECODE(mod(COUNT(*),100),0,COUNT(*)/100,TRUNC(COUNT(*)/100,0)+1)
AS pages FROM XZQH
分页
SELECT x.* from (SELECT z.*,rownum numbers from XZQH z where rownum<101) x where x.numbers>90
注意oracle会先分配了行号,再根据字段排序
between 1 AND 3 是没问题的
但是 ROWNUM between 4 AND 6 就不可以了,ROWNUM必须从1开始!
row_number() over()函数试试看
select t2.* from
(select t.*,row_number()over(order by t.n_count desc) orderNumber from t_news t order by t.n_count desc)t2 where orderNumber between 1and 3;
以及
SELECT * FROM (
SELECT t.*,row_number() over(ORDER BY n_count DESC) r
FROM t_news t
ORDER BY t.n_count DESC
) t
WHERE r BETWEEN 4 AND 6
通用语法: 解析函数() over(partition by 字段 order by 字段)
当然也可以用老办法也能查出上面的结果,具体如下:
select s.*,s.r from(
select rownum r,t.* from
(select * from t_news ORDER BY n_count DESC) t ) s where s.r between 4 and 6;
不过效率要低点。
//oracle获取第二名的销售量
insert into tabb values('c1',1500);
insert into tabb values('c2',1000);
insert into tabb values('c3',900);
insert into tabb values('c4',1200);
insert into tabb values('c5',1400);
insert into tabb values('c3',1300);
insert into tabb values('c5',1100);
insert into tabb values('c6',1700);
select *
from (select name, sales, dense_rank() over(order by sales desc) pm from tabb s)
where pm = 2
//测试 rank(),dense_rank(),row_number()的区别
create table stu(
name varchar(20),
numb varchar(30),
kemu varchar(20),
fenshu number
);
insert into stu values('li','0113101 ','高数','90');
insert into stu values('zhang','0113102 ','高数','80');
insert into stu values('wang','0113103 ','高数','70');
insert into stu values('li','0113101 ','物理','80');
insert into stu values('zhang','0113102 ','物理','90');
insert into stu values('wang','0113103 ','物理','70');
select rank() over(partition by kemu order by fenshu desc) rk,t.* from stu t
select * from (select rank() over(partition by kemu order by fenshu desc) rk,t.* from stu t) y where y.rk<=2;
select rank() over(order by fenshu desc) rk,t.* from stu t; (1,1,3,3,5,5)
select dense_rank() over(order by fenshu desc) rk,t.* from stu t;(1,1,2,2,3,3)
select row_number() over(order by fenshu desc) rk,t.* from stu t;(1,2,3,4,5,6)
发表评论
-
mysql基础知识
2015-06-27 11:47 4241.BIT[M] 位字段类型,M表示每个值的位数,范围从1 ... -
decode及nvl等函数的区别
2010-10-26 21:31 1995NULL指的是空值,或者非法值。NVL (expr1, exp ... -
三种ORACLE锁机制细化解析
2010-09-19 08:21 1884ORACLE锁机制主要是为了 ... -
常用的学生、课程、成绩、教师表的查询
2010-09-10 08:42 3586Student(S#,Sname,Sage,Ssex) 学 ... -
Oracle基础三
2010-09-04 10:49 1668视图的优点 视点集中、简化操作、定制数据、合并分割数据、逻辑 ... -
oracle日期操作方法
2010-09-01 07:54 1113在oracle中有很多关于日期的函数,如: 1、add_ ... -
IO的几个概念
2010-08-24 13:00 2472在数据库优化和存储规划过程中,总会提到IO的一些重要概念,在这 ... -
Oracle基础二
2010-08-22 17:22 1680数据表基本操作 数据库的数据逻辑上是存储在表空间中,物 ... -
oracle基础一
2010-08-20 17:38 1346主码、外码 关系型数 ... -
数据库的查询优化方法分析
2010-08-18 17:26 36971. 尽量不要使用 or,使 ... -
sql中的注意点
2010-06-07 14:00 9921.注意not and or 优先级,先not ,再 and ... -
左连接查询的思考
2010-06-07 13:58 1183左连接查询 select u.Group_Id,u. ... -
oracle总结
2010-05-28 13:40 1514一.Oracle数据库中常用的数据类型 varchar2(长 ... -
ORACLE和SQL语法区别归纳
2010-05-28 13:36 1604SQL, ORACLE, 语法, 归纳, S ... -
isnull函数和 字段名 is null的区别
2010-05-27 16:21 2018select case when sc_amount is n ... -
sql语句常见总结
2010-05-11 11:33 1037主要是一些常用的,但是容易出错的 1.数据表别名的嵌套查询 ... -
union和unionall的区别
2010-05-07 10:11 1669sql union用法和sql union all用法,sql ... -
测试子查询
2010-04-21 16:42 13create table test( id varchar(1 ... -
呵呵,建标语句老是记不住,记下啊
2010-04-21 16:29 1000好记性不如烂键盘 建表 create table test ... -
项目实战之sql的order by用法
2010-04-21 15:02 2114表名:projectinfo 字段名 project_id ...
相关推荐
sql经典语句,汇集常见的sql语句。 sql经典语句,汇集常见的sql语句。 sql经典语句,汇集常见的sql语句。
SQL经典语句集,包含了很多SQL中常用到的比较经典的语句。很适合初级中级程序员使用。
SQL经典语句 清华大学荟萃 不愧名校教授整理
《SQL经典语句》则可能是一本实用手册,收集了大量常见的SQL语句示例,便于读者在实际工作中快速查找和参考。 通过这三本书的学习,你可以建立起完整的SQL知识体系,从简单的数据查询到复杂的数据库设计,从基础的...
下面我们将深入探讨一些SQL的基础知识,以及一些常用的SQL语句。 SQL是用于管理关系数据库的标准编程语言,它允许我们创建、更新、查询和操作数据。主要分为四大类:DQL(Data Query Language)、DDL(Data ...
2. **索引与视图**:包括创建索引、复合SQL语句、视图构建等中级操作。 3. **高级查询**:探讨了高级运算查询、使用EXCEPT和INTERSECT运算符、外连接应用等复杂查询技术。 4. **数据管理**:介绍了SQL分组、复制或...
SQL经典语句大全,收集我们在平时使用SQL时的一些语法语句汇集,比如创建、备份、删除数据库的SQL脚本,这些当然是比较简了,还有复杂点的像备份、创建索引、复合SQL语句、创建视图、高级运算查询、EXCEPT 运算符、...
sql语句sql语句sql语句sql语句sql语句
50个经典sql语句总结: mysql 单表查询,多表查询,分组查询,最大/小,和计算,平均数计算,复杂计算...
SQL经典语句大全 本文档主要介绍了 SQL 语言的经典语句大全,涵盖了 SELECT 语句、数学运算、空值处理、别名、连接列、排序输出、 WHERE 字段等多个方面。 一、SELECT 语句 SELECT 语句是 SQL 语言的基础语句,...
一个朋友整理的SQL语句拿出来大家分享下
SQL语句是数据库操作的核心,它用于查询、插入、更新和删除数据,是任何数据库管理系统中的基础工具。在IT行业中,编写SQL语句是一项必备技能,但手动编写和调试SQL语句可能会耗费大量时间和精力,尤其在处理复杂...
sql 语句学习 sql sql sqlsql 语句学习 sql sql sql
13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX...
经典SQL语句大全经典SQL语句大全经典SQL语句大全经典SQL语句大全经典SQL语句大全
sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明...
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...
SQL的经典语句和实例整理资料 ,sql非常经典的语句,看了这些语句,不用再担心sql不会写了。