sql 常用笔记,以及sql优化

sql过滤重复 重点a.id<id
select * from table1 a where not exists(select * from table1 where a.name=b.name and a.id<id)

修改库中某个字符用replace
select replace(address,九,十)--把九替换为十

如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN (‘男’,‘女’)


开窗函数:
rank() over(partition by dept order by salary) as rank
row_number()over(parition by .. order by ..)
dense_rank()over(parition by .. order by ..)
count()over(parition by .. order by ..)
max()over(parition by .. order by ..)
min()over(parition by .. order by ..)
sum()over(parition by .. order by ..)
avg()over(parition by .. order by ..)
first_value()over(parition by .. order by ..)
last_value()over(parition by .. order by ..)
lag()over(partition by .. order by ..)
lead()over(parition by .. order by ..)
lag和lead可以获取结果集中按一定排序所排列的当前行的上下
相邻若干offset的某个行的某个列,lag,lead分别是向前向后

存储过程使用游标影响性能,效率低,可使用while循环替换游标,如下:

1先建类似游标里要使用的字段
declare @reid int,@orderid varchar(20)
2.查询需要循环的数据到临时表
 SELECT REFID = IDENTITY(INT , 1, 1), DealFlg = 0,--
 ORDERID
  INTO #Temp_Lists
  FROM ORDERHD
  WHERE ORDERDATE = '2012-09-01' AND H.ORDERTYPE = 'Sales';

REFID 用来给这个结果编个号,类似rownumber
DealFlg 这条结果的一个状态,后面会用到
--获取临时表数据最小行号
select @reid =min(REFID) from #Temp_Lists where DealFlg = 0
--若不为空则进行循环
while @reid  is not null
begin
 --获取当前处理行的信息
select @orderid=ORDERID FROM  #Temp_Lists WHERE REFID = @reid  
/* 执行逻辑代码*/

--逻辑执行完后 更新临时表的状态,标注
update #Temp_Lists set DealFlg = 1  WHERE REFID = @reid 
--然后获取下一行的行号
select @reid =min(REFID) from #Temp_Lists where DealFlg = 0
 and REFID >@reid
end

表值函数
create function funtable()
return table 
  as 
return (select * from  table );

触发器
create trigger tgname on tablename
for或者after  update --delete 或insert 
as  
--逻辑代码

--创建学生表触发器
create trigger studelete on student for  delete as  
declare @course_id varchar(50)
select @course_id=course_id from delete 
if exists (select 1 from student where course_id=@course_id)
begin
print '表中存在学习改课程的学生'
end
else
begin
print '表中不存在学习该课程的学生'
delete course where course_id =@course_id
print 'course表中数据已删除'
end


建表
create table userinfo (
userid int identity(1,1)primary key,主键自增长
username nvarchar(20),
usergender vhar(2),
userroleid int not null
)
--主键 primary key (列名,..)
--外键 foreign key(列名) references 外键表(列名)
给已经存在的表添加主键
alter table 表名 add constraint pk_id primary key (id)
给存在的表添加外键
alter table 表名 add constraint fkid foreign key (id) references 外键表(id)

数据库设计第一范式(强调数据表的原始性)数据项不可再分
第二范式需满足第一范式,要求每个实例必须可以被唯一的区分
第三范式指每一个非主属性既不依赖也不传递于业务主键

select case 4 when 1 then '0' else '3'end 

select case when 1=1 then 1 else 2 end 

根据符号分隔字符串为行
CREATE  FUNCTION dbo.splitl (
    @String VARCHAR(MAX),
    @Delimiter VARCHAR(MAX)
)RETURNS @temptable TABLE (items VARCHAR(MAX)) AS
BEGIN
    DECLARE @idx INT=1
    DECLARE @slice VARCHAR(MAX)
    IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0
        RETURN
    WHILE @idx != 0
    BEGIN
        SET @idx = CHARINDEX(@Delimiter,@String)
        IF @idx != 0
            SET @slice = LEFT(@String,@idx - 1)
        ELSE
            SET @slice = @String
        IF LEN(@slice) > 0
            INSERT INTO @temptable(items) VALUES(@slice)
        SET @String = RIGHT (@String, LEN(@String) - @idx)
        IF LEN(@String) = 0
            BREAK
    END
    RETURN
END

sql优化 优先使用 inner join 如果是left join 左边结果尽量小


函数
concat(字段1,字段2)将多个字符串和并为一个字符串

cast(值 as 数据格式) 数据格式转换

创建索引
create index 索引名 on 表面(列名)
删除索引
alter table 表面 drop 索引名
drop Index 表面.索引名

.net core
httpWebRequest request=WebRequest.CreateHttp(picUrl);
request.Method="GET";
HttpWebRespons respons=(HttpWebResponse)request.GetResponse();
using(Stream respStream=response.GetResponseStream()){
using(FileStream fs=new FileStream("down.jpg",FileMode.Create)){
 respstream.CopyTo(fs);
 }
}


异步async
同步和异步主要用于修饰方法。当一个方法被调用时,调用者需等待方法执行完毕并返回才能继续执行,称为同步方法
当一个方法被调用时立即返回,并获取一个线程执行该方法内部的义务,调用者不用等待该方法执行完毕,称为异步方法;

static void main(string [] args){
for(int i=1;i<=10;i++){
 ThreadPool.QueueUserWorkItem(new WaitCallback((obj)=>{
Console.Wril
 }))
 }
}

如果在方法当中不需要等待返回值,只是一个异步调用的话,没必要去使用async,直接task.run去执行异步


使用async和await 不会阻塞主线程执行,如果没有这两个关键字,则会阻塞主线程,
static async voidshousync(){
for(int i=0;i<10;i++){
 console.writeline("异步1"+i);
await task.delay(1000)
 }
}

 C# 析构函数 ~class

定义泛型类
class genericClass<T>{
public genericClass(T msg){
console.writeline(msg);
 }
}
调用 
genericClass<string> str=new genericClass<string> ("hhhh");
泛型就是可以传多种数据类型的参数

js对象属性
声明对象
var person={name:"AA",age:20,displayname:function(){
alter(this.name)
}}
删除对象属性
delete person.age/person["age"]
调用对象方法
person.displayname()/person["displayname"]();

定时器
setTimeout() 定时只执行一次
setInterval()按照指定周期重复执行

将字符串解析为json
var json='{"aa":{"bb":"cc"}}'
var obj=JSON.parse(json);

C#高级
StringBuilder
Append(string)尾部追加字符串
Insert(int,string)在特定位置追加字符串
Remove(int,int)在特定位置移除指定数量的字符串
Replace(string,string)搜索字符串中指定的字符串,并将其替换

LINQ
var query=form cust in custmer where cust.city=='A' select cust

lamda表达式
student 学生=学生list.where(cs=>cs.name=='电工')

线程
thread thread=new thread(()=>{
this.dosomething('张三'); 
})
thread.priority=threadpriority.highest;//线程的优先级最高
thread thread1=new thread(()=>{
 this.DoSomething('张三');
 })
thread1.priority=threadpriority.lowest;//线程优先级最低
thread.start();
thread1.start();//线程开启后根据优先级来执行

实现两个委托多线程执行
private void callbackthread(action action1,action action2){
thread thread=new thread(()=>{
action1.invoke();
action2.invoke(); 
});
thread.start();
}
方法调用
action action1 =(=>{
this.dosomething('张三');
});
action action2=()=>{
this.dosomething(李四); }
callbackthread(action1,action2);//不会阻塞线程


负载均衡
1.http重定向实现负载均衡
2.DNS负载均衡
3.反向代理负载均衡

sql性能优化

减少表的查询
当筛选条件有多个字段同一张表筛选,可使用如下方法
select 字段 from table where (字段1,字段2)=
(select 字段1,字段2 fromtable2 where ...)
这样查询字段1对应字段1,字段2对应字段2
update 也可以使用此方法
update tab set (字段1,字段2..)=(select max(字段1),sum(字段2).. from table2)
where ....

create proc student 
@name varchar(10)='张三'
as 
 begin
select id,name,age,sex,from student where name=@name
end
go

exec student

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值