SQL学习基础(个人学习笔记)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.列column 主键 primarykey 外键 foreignkey
2.数据类型 bit 相当于bool类型 只有0 ,1 char(10) 10个字符,当字符不满10个时,不够的位数用空格填充,nvarchar(Max)含有中文等,
几乎无限大字符串,varchar纯英文字符串,有几个数字就几个,不会想char不满时填充空格。
int 32位 , bigint 64位
1.建表 建表时必须建字段及设置字段类型,否则会提示错误 即 name varchar(20),
create table person
(
id varchar(8) not null,
name varchar(20),
)
2.删除表
drop table person
3,插入字段
insert into person(id,name)values(1,'张三')
insert into person1 (id,names)values(newid(),'王丽');
4.删除字段
delete person where id=1
delete Scores where name='拜仁' or name='奇才'
当将列字段属性的标示规范设置成 是 后,例如ID,当插入其他字段时,系统将ID值自增。
主键GUID select newid()
5.更新
update person set name=('小李') where id=1 OR age=20; 后还可以与 OR AND NOT 连用
例子:
create table gongzi
(
number int not null,
name varchar(20),
age int,
salary numeric(10,2),
primary key (number),
)
select * from gongzi order by age desc,salary asc 先按age降序排列,在按salary升序 --desc 降序 asc 升序--
select * from gongzi where salary>2000 order by salary asc --order by 要在 where 之后
select name as 姓名,salary as 月薪 from gongzi where salary<3000 and name='小李'
--as 给列取别名--
select count(*) from gongzi
select max(salary) from gongzi
select min(salary) from gongzi
select sum(salary) from gongzi
select avg(salary) from gongzi 求平均值
select * from gongzi where age like '_2' --列字段要用'' 括起来 '_'查询单个字符--
select * from gongzi where salary like '%3%' --%查询0或多个字符,like模糊查询--
select * from gongzi where age is not null
select * from gongzi where age in(22) --in包含22的--
select * from gongzi where age>22 and age<30
insert into gongzi(number,name,age,salary)values(001,'张磊',29,3000)
insert into gongzi(number,name,age,salary)values(003,'小李',22,2300)
1.分组查询 group by
select age from gongzi group by age --以年龄分组查询,一般以数字分组,无法对姓名等字段分组
2. 聚合函数不能出现在where子句中
select age,count(*) from gongzi where count(*)>1 group by age //错误语句
//聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
可以用having代替where 但必须是在select 后合法的字段,where是对原始数据的过滤,而having只是对分组以后的数据进行过滤
select age,count(*) from gongzi group by age having count(*)>1 having函数必须在group by后
3.限制范围函
数
top n 取前n个数据
select top 3 age from gongzi 取前3条数据
not in 排除,不包含
select top 3 * from gongzi where age not in (select top 3 age from gongzi order by age desc)
4.抑制数据重复
alter table gongzi add department varchar(20);
alter table gongzi add sub varchar(20);
update gongzi set department='财务部',sub='公司' where number=1
update gongzi set department='生产部',sub='子公司' where number>=2 and number<=10
select distinct sub from gongzi --distinct消除重复数据
5.Union 联合查询
select name,0 from gongzi
union
select name,id from person --使用union 将2个表的字段结果同时显示,
但查询的两个表的字段数量及类型要相同,使用union时会消除重复数据,要全部显示 union后 加all
6.函数
ABS() 求绝对值 ceiling() 舍入到最大数 floor 舍入到最小数 round 四舍五入
len()长度 lower()转小写 upper()转大写 ltrim()去除字符左侧空格 rtrim()去除右侧空格
substring(string,start_position,length) string主字符串,start_字符串中的起始位置,length字符串中的最大长度
getdate去日期 dateadd(datepart,number,date)计算增加以后的日期,date为待计算日期,number为增量,
datepart为计算单位 select dateadd(day,3,getdate())为计算日期date的3天后的日期 dateadd(month,-8,date)为计算date的8个月前的日期
datediff(datepart,startdate,enddate)计算2个日期的差额 datediff(hh,day,getdate())
datepart(datepart,date)返回一个日期的待定部分 datepart(hh,getdate()) 返回当前日期的小时
select getdate()
select dateadd(hh,3,getdate())
select datepart(year,getdate())
7.类型转换函数
cast(expression as data_type) select cast('2333' as int)
convert(data_type,expression) select convert(datetime,'2011-1-2')
isnull(name,sdf) 如果name存在,不改变,如果不存在 显示sdf
CASE函数用法
case expression
when value 1 then returnvalue 1
when value 2 then returnvalue 2
else defaultreturnvalue
end
例子:
select name,
(case
when salary>2000 then '高输入'
when salary<2000 then '低收入'
else '未知'
end) as '收入水平'
from gongzi
1.列子
create table Scores
(
Date datetime null,
name varchar(50),
scores varchar(50),
)
select * from Scores
delete Scores where name='拜仁' or name='奇才'
insert into Scores(Date,name,scores)values(cast('2008-8-8' as DateTime),'拜仁','胜')
insert into Scores(Date,name,scores)values(convert(DateTime,'2008-8-9'),'奇才','胜')
insert into Scores(Date,name,scores)values(convert(DateTime,'2008-8-9'),'湖人','胜')
insert into Scores(Date,name,scores)values(cast('2008-5-8' as DateTime),'拜仁','负')
insert into Scores
(Date,name,scores)values(convert(DateTime,'2008-4-9'),'拜仁','负')
insert into Scores(Date,name,scores)values(convert(DateTime,'2008-11-9'),'奇才','胜')
select name,
sum(
case scores
when '胜' then 1
else 0
end
)as 胜利,
sum(
case scores
when '负' then 1
else 0
end
)as 败
from Scores group by name
2.select top 5 * from seach order by datediff(second,stel,etel),number desc
--输出所有数据中通话时间最长的5条记录,order by datediff
select * from seach where tel like '1%'
--查询电话号码中以1开头的电话号码
select sum(datediff(second,stel,etel)) from seach where tel like '1%'
--查询以1开头得所有电话的总时长
select * from seach where datediff(month,stel,getdate())=0
--查询当月拨打电话记录
select top 3 number from seach
where datediff(month,stel,getdate())=0
group by number
order by sum(datediff(second,stel,etel)) desc
--输出前3个当月电话时间最长的人员编号
select number,count(*) from seach
group by number
order by count(*) desc
--按降序输出