--创表示例
create table testtab(
id int primary key identity(20180,1), -- identity 是自增 (起始值,每次增值) -- primary key 主键唯一,且不能为空
name varchar(20), --字段设置唯一值(unique)(可为空) -- name varchar(20) unique
phone varchar(20),
age int,
birth date --时间2018-05-24 datetime(yy-mm-dd(hh-mm-ss))
);
--插
insert into testtab values('LX','15066668888',20,'2018-5-24'); --向表中插入数据 (默认对应列)
insert into testtab(name,phone,age,birth) values('LX','15066668888',20,'2018-5-24'); --向表中插入数据 (一一对应列)
--结构相同的子表
create table testtabson(
id int primary key identity(20180,1),
name varchar(20),
phone varchar(20),
age int,
birth date
);
--插表数据到子表(这种方法,可以用,简单易懂易操作;另一种是用数据库直接生成脚本,然后改下表名就可以了(就不示例了,想实践可联系我,也可查资料))
insert into testtabson (name,phone,age,birth)
select name,phone,age,birth
from testtab
--更新(修改)
update testtab set age=18 where id=1
--删除
drop table testtab --注意:要删除表,要确定表是其他表的外键,是,则删不掉的,必须找到关联的主表,删除后再删该表;或者删除外键后,再删除表
delete from testtab where id=1 --删除该行数据
--查(方法很多,多总结,也就那么几种常用的)
select * from testtab --最简单查最全(“*”表的所有字段)
select age from testtab where id=1 --查询满足条件的
select age as a from testtab --查询结果改列名 as可改列名 可改表名(连表时用,很简洁) --注意:虚拟存在,其实表结构(列名,表名)并没有修改,我是这样理解的;真正的修改是alter,后面会有示咧。
select name from testtab where age is null --查询age是空的name行 (不,请加not)
select name, 'sex' as 男 from testtab --常量 “sex”也是虚拟的字段,“男”是列值
select top 2 name from testtab --查询name的前两条
select top 20 percent name from testtab --查询name的20%
select * from where (not)in(all,any,exist) age>(select *....) where子查询,简单说一下,因为查询方式很多,就看你想要的是什么结果,还可以和聚合函数,分组,排序联合用;但结构差不多是这样的。
select SQnumber,t.score from(select Row_number() over(order by score desc)SQnumber,a.id,a.score from MP_partyscore a join MP_partymemberdata b on a.id=b.id)t where id= 满足条件的分数排名(上次自己遇到的问题) 这个其实也不复杂,难得想。
--排序
select name from testtab order by id desc --降序 升序(asc)
--“喜欢”才像
select * from testtab where name like 'L%' --注意:“like”只能查字符串,“%”代表省略的
--两者之间
select * from testtab where age between 18 and 20
--在里面(in)
select name from testtab where age in (20,18,16) --“in“括号里可换成查询语句,就是子查询了
--分组查询(gruop by 搭配having)
select id,count(name) as a from testtab group by id having id>20185 --group by要在聚合函数(count(),avg(),sum())中使用,having增加限制条件
--连表(现在就要用as来简化)
select * from testtab as a join testtabson as b on a.id=b.id --不加inner默认是内联 (left outer 左外 right outer 右外 当然也不列外,有左右内连)
--字段类型
image 存储图片
bit bool数字类型 默认true或false 值默认1或0 插入任何数字类型(除默认外)都显示值1,只有true和false以字符串的格式可插入,显示对应默认值1或0 (不能理解也没啥,bit不常用)
money 自然是存钱的咯,而且精度高
float 存储数字,单精度 小数,存进去是啥就是啥 可与数字类型比较,做运算
decimal 精确数字型 如:decimal(5,2) 共五位数,保留两位小数
text 字符型,存储大量的非统一编码型字符数据
--转换类型
--convert(数据类型[(长度)],表达式[格式])
select convert(nvarchar,name) return name 参数1:想要转成的数据类型;参数2:可以是表的列名,也可以是自定义参数值 注意:字符串转数字类型,要保证字符串是数字类型;通俗的说是:字符串转换后就必须是数字。
select N’年龄:’+convert(nvarchar,20) 加N编码汉字,不然数据库会不显示完整的汉字(可以说是乱码)
select convert(nvarchar ,getdate(),120) 返回 2018-05-25 12:22:21 getdate() 获取当前时间 也可以替换成某表的时间列字段(记得加上属于那个表哟) 120是固定值 如select convert(nvarchar,birth,120) from testtab
select convert(nvarchar(10) ,getdate(),120) 返回 2018-05-25 类型长度 截取想要的格式 还有其他的方法,改变固定值120,也可以达到不同的格式(111);百度一下,日期格式的转换,你就知道了。
--cast
select cast(20 as nvarchar) return 20 同理convert
select N’年龄:’+cast(20 as nvarchar) return 年龄:20
--截取(left,right,substring)
--left,right
--直接上示咧:left(‘love’,2) 参数一:要截取的字符串;参数二:从左往右截取两个 示咧:return lo 同样参数一可以换成表的列字段 如:select left(name,1) from testtab right与之类似,不过是从右往左罢了。
--substring
select substring('love20',2,2) 参数一:要截取的字符串;参数二:起始位置2开始截包含2(下标,索引从1开始);参数三:截取的长度。感觉是不是要高大上一点点。 return ov
--alter
--修改表字段类型
alter table testtab alter column age varchar(20) 注意:float转int有数据值时会失败,float可以和decimal间互转,decimal记得表明范围,否则默认为保留整数部分
--给表增加字段
alter table testtab add love varchar(20)
--给表删除字段
alter table testtab drop column love
--给表添加唯一键
alter table testtab add constraint uni unique (name,phone) 注意:如果表已经有数据(重复),修改会失败 uni自定义约束名
--给表添加主键
alter table testtabso add constraint pk_s primary key (id) 注意:限制id要不为空 pk_s自定义主键名,一张表有且仅有一个主键存在
--给表添加外键
alter table testtabson add constraint fk_sid foreign key (sid) references testtab(id); 注意:要分清楚究竟谁是谁的外键,再来关联,关联字段要匹配
--删除(主,外,唯一)键
alter table 表名 drop constraint 自定义名(如pk_s,fk_sid,uni)
--触发器(我觉得挺实用的,在一些表间有关联时,经常用,而且要同时保证数据,这触发器,就是神器了,只是我说的太LOW)
create trigger tri_cfq_del
on testtab
for delete
as
insert into testtabson(name,phone,age,birth) 注意:删除和插入在 搭配使用时,要用for 在之前就插入;如果说是插入的插入,after和for都可以;字段可多可少,根据需求来;还有就是delete对应deleted,insert对应insertd 说着逗累,上列子
select name,phone,age,birth from deleted update 更新也差不多,就不多说了,有问题可私聊我,或者查资料。删除触发器,drop trigger tri_cfq_del as后面的T-SQL语句,可根据需要修改,仅供参考。
--执行这个语句,就会触发 delete from testtab where id=20181
create trigger tri_cfq_ins
on testtab
for(after) insert
as
insert into testtabson(name,phone,age,birth)
select name,phone,age,birth from inserted
--同理 insert into testtab values('520','15066668888',20,'2018-5-24');
--存储过程
declare @a int
declare @sum int
set @a=1
set @sum=0
while @a<=100
begin
set @sum+=@a
set @a+=1
end
print @sum
待完善,会持续更新,关注俺,你逗会发现,其实我也很懒的,只是偶尔装B
第一次