SQL笔记 自动保存的.docx
- 文档编号:14593261
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:17
- 大小:937.20KB
SQL笔记 自动保存的.docx
《SQL笔记 自动保存的.docx》由会员分享,可在线阅读,更多相关《SQL笔记 自动保存的.docx(17页珍藏版)》请在冰点文库上搜索。
SQL笔记自动保存的
selectnameas姓名,ageas年龄,nicknameas昵称fromperson1whereAge<24;
selectnamefromperson1;
select*fromperson1;
selectGETDATE()as系统日期;
select1+1as列,GETDATE()as系统日期,NEWID()asGUID;
select1+2;
selectCOUNT(*)fromperson1as列数;
selectsum(Number)fromperson1whereage>22;
select*fromperson1orderbyAge;
select*fromperson1orderbyAgedesc,Numberdesc;
select*fromperson1whereage>22orderbyAgedesc,Numberdesc;
select*fromperson1whereNamelike'_n';
select*fromperson1whereNamelike'%j%';
select*fromperson1whereNickNameisnotnull;
select*fromperson1whereAge=20orAge=22orage=21;
select*fromperson1whereAgebetween20and22;
select*fromperson1whereAge>19andAge<23;
select*fromperson1whereAgein(20,21,22);
selectage,COUNT(*)fromperson1groupbyAge;
selectavg(Number),age,COUNT(*)fromperson1groupbyAge;
selectage,COUNT(*)fromperson1groupbyAgehavingCOUNT(*)>1;
selectage,COUNT(*)fromperson1whereNumber>2groupbyAge;
selectage,COUNT(*)fromperson1groupbyAgehavingNumber>1;
第六讲限制结果集行数
(用处是分页,用处很大,如新闻只显示十条)
1.Select*fromperson1orderbyagedesc;//表person1按age年龄进行降序排列。
2.Selecttop3*fromperson1orderbyagedesc;//先将表按age进行降序排列,然后选出表person1中年龄最大的三个人。
3.Selecttop3*fromperson1
Wherenumbernotin(selecttop5numberfromperson1orderbyagedesc)
Orderbyagedesc;//先将表person1按age降序排列,然后从年龄第六开始的前三个人的信息。
4.Rownumber函数简化实现
第七讲怎么去掉重复数据
createtableT_Employee11(FNumberVARCHAR(20),FNameVARCHAR(20),FAgeINT,FSalaryNUMERIC(10,2),PRIMARYKEY(FNumber));
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('DEV001','Tom',25,8300);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('DEV002','Jerry',28,2300.80);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('SALES001','John',23,5000);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('SALES002','Kerry',28,6200);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('SALES003','Stone',22,1200);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('HR001','Jane',23,2200.88);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('HR002','Tina',25,5200.36);
insertintoT_Employee11(FNumber,FName,FAge,FSalary)values('IT001','Smith',28,3900);
insertintoT_Employee11(FNumber,FAge,FSalary)values('IT002',27,2800);
//Alter用来向表中增加字段
AltertableT_EmployeeaddFSubCompanyVARCHAR(20);
AltertableT_EmployeeaddFDepartmentVARCHAR(20);
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='Development'
WHEREFNumber='DEV001';
UPDATET_EmployeeSETFSubCompany='ShenZhen',FDepartment='Development'
WHEREFNumber='DEV002';
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='HumanResource'
WHEREFNumber='HR001';
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='HumanResource'
WHEREFNumber='HR002';
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='InfoTech'
WHEREFNumber='IT001';
UPDATET_EmployeeSETFSubCompany='ShenZhen',FDepartment='InfoTech'
WHEREFNumber='IT002';
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='Sales'
WHEREFNumber='SALES001';
UPDATET_EmployeeSETFSubCompany='Beijing',FDepartment='Sales'
WHEREFNumber='SALES002';
UPDATET_EmployeeSETFSubCompany='ShenZhen',FDepartment='Sales'
WHEREFNumber='SALES003';
查询
SelectFDepartmentFROMT_Employee;//取员工所在的部门的信息
SelectdistinctFDepartmentFROMT_Employee;//取员工所以的部门的信息,而且是不重复的
SelectFDepartment,FSubCompanyFROMT_Employee;
SelectdistinctFDepartment,FSubCompanyFROMT_Emloyee;//去掉完全重复的数据行,FDpartment和FSubCompany都一样的数据行,distinct是针对这两个字段的,而不是某一个字段
第八讲联合结果集
先创建一个临时工信息表t_tempemployee
Createtablet_tempemployee(fidcardnumbervarchar(20),fnamevarchar(20),fageint,primarykey(fidcardnumber));
insertintot_tempemployee(fidcardnumber,fname,fage)values('1234567890121','Sarani',33);
insertintot_tempemployee(fidcardnumber,fname,fage)values('1234567890122','Tom',26);
insertintot_tempemployee(fidcardnumber,fname,fage)values('1234567890124','Yalaha',38);
insertintot_tempemployee(fidcardnumber,fname,fage)values('1234567890125','Tina',26);
insertintot_tempemployee(fidcardnumber,fname,fage)values('1234567890126','Konkaya',29);
把两个查询结果合在一起后返回,用union,上下两个字段个数要一样,数据类型要相容。
Union将合并结果中的重复行去掉,如果不想去掉就用unionall
Selectfname,fagefromt_tempemployee
Union
Selectfname,fagefromt_employee;
将上下的字段个数补成一样的就可以联结
Selectfnumber,fname,fage,fdepartmentfromt_employee
Union
Selectfidcardnumber,fname,fage,'临时工,无部门'fromt_tempemployee
Selectfnamefromt_employee
Union
Selectfnamefromt_tempemployee
Selectfnamefromt_employee
Unionall
Selectfnamefromt_tempemployee
Selectfname,fagefromt_employee
Union
Selectfname,fagefromt_tempemployee
案例1:
查询正式工和临时工的最高年龄和最低年龄
Select'正式员工最高年龄',max(fage)fromt_employee
Unionall
Select'正式员工最低年龄',min(fage)fromt_employee
Unionall
Select'临时工最高年龄',max(fage)fromt_tempemployee
Unionall
Select'临时工最低年龄',min(fage)fromt_tempemployee
案例2:
查询每位正式员工的信息,包括工号、工资,并且在最后一行加上所有员工工资额合计。
Selectfnumber,fsalaryfromt_emlpoyee
Union
Select'工资合计',sum(fsalary)fromt_empoyee
第九讲数字函数
1.Getdate()获得系统日期
2.Newid()GUID算法
3.Abs()求绝对值如selectabs(-3)
4.Ceiling():
舍入到最大的整数,3.33将被舍入为4,2.89将被舍入为3,-3.61将被舍入为-3。
Ceiling在英文中是天花板的意思。
5.Floor():
舍入到最小整数。
3.33将被舍入为3,2.89将被舍入为2,-3.61将被舍入为-4。
Floor—地板。
6.Round():
四舍五入。
舍入到“离我半径最近的数”。
Round-半径.如selectround(3.1425,2)结果为3.14。
round(m,n)中的n代表小数点后面的位数。
7.Len():
计算字符串的长度,如selectlen(‘abcd’).selectfname,len(fname)fromt_employee.
8.lower(),upper():
转大写小写。
9.ltrim()去掉字符串左边的空格,rtrim()去掉字符串右边的空格。
Selectltrim(‘b’),selectrtrim(‘b’),selectltrim(rtrim(‘b’))去掉两边的空格.
10.Substring(string,start_position,length)取string中的子字符串,start_position为开始的位置,length为取的位数。
如selectsubstring('abcdefghijk',2,3)结果为bcd
11.getdate():
取当前日期
12.Dateadd(datepart,number,date),计算增加以后的日期。
参数date为待计算的日期;参数number为增量;参数datepart为计量单位(yearyy,yyyy年份;quarterqq,q季度;monthmm,m月份;dayofyeardy,y当年度的第几天;daydd,d日;weekwk,ww当年度的第几周;weekdaydw,w星期几;hourhh小时;minutemi,n分;secondss,s秒;millisecondms毫秒):
selectdateadd(day,-3,getdate()),
Selectdateadd(hh,1,getdate()).
13.datediff(datepart,startdate,enddate):
计算两个日期间的差额。
Datepart为计量单位,startdate为开始日期,enddate为结束日期。
如:
selectdatediff(hh,getdate(),dateadd(day,-3,getdate())).
案例:
1.计算员工入职的年数
selectfname,findate,datediff(year,findate,getdate())fromt_employee
2.计算员工入职的年数并按照年数分组,如:
入职一两的有多少个,入职二两年的有多少个。
Selectdatediff(year,findate,getdate()),count(*)fromt_employee
Groupbydatediff(year,findate,getdate())
14.datepart(datepart,date):
返回一个日期的特定部分,如:
selectdatepart(year,getdate()),datepart(month,getdate())
如:
根据入职的年份进行分组,计算不同年份入职员工的个数
Selectdatepart(year,findate),count(*)
Fromt_employee
Groupbydatepart(year,findate)
类型转换函数
15.Cast(expressionasdata_type)如:
selectcast(‘123’asint),selectcast(‘2008-08-08’asdatetime)
16.convert(data_type,expression)如:
selectconvert(datetime,’2008-08-08’)
第十讲空值处理函数
Selectisnull(fname,'佚名')as姓名fromt_employee
Isnull(expression,value):
如果expression不为空则返回expression,否则返回value。
CASE函数的用法,相当于switchcase
Caseexpression
Whenvalue1thenreturnvalue1
Whenvalue2thenreturnvalue2
Whenvalue3thenreturnvalue3
Elsedefaultreturnvalue
End
落后
例:
情形一:
case后面有表达式,表达式的值与when后面的值比较
selectfname,
(
caseflevel
when1then'普通客户'
when2then'会员'
when3then'VIP'
else'未知客户类型'
end
)as客户类型
fromt_customer
情形二:
case的后面没有表达式,在when后面进行判断
selectfname,
(
case
whenfsalary<2000then'低收入'
whenfsalarybetween2000and5000then'中等收入'
else'高收入'
end
)as收入水平
fromt_employee
运行结果:
练习1:
创建表并输入数据
createtableT_Scores(Datedate,Namenvarchar(50),Scorenvarchar(4))
insertintoT_Scores(Date,Name,Score)values('2008-08-08',N'拜仁','胜')
insertintoT_Scores(Date,Name,Score)values('2008-08-09',N'奇才','胜')
insertintoT_Scores(Date,Name,Score)values('2008-08-09',N'湖人','胜')
insertintoT_Scores(Date,Name,Score)values('2008-08-10',N'拜仁','负')
insertintoT_Scores(Date,Name,Score)values('2008-08-08',N'拜仁','负')
insertintoT_Scores(Date,Name,Score)values('2008-08-12',N'奇才','胜')
执行:
selectname,
sum
(
case
whenScore=N'胜'then1
else0
end
)as胜,
sum
(
case
whenscore=N'负'then1
else0
end
)as负
fromt_scoresgroupbyName
练习2
1.selecttop5DATEDIFF(SECOND,startdatetime,enddatetime)
fromcallrecords1
orderbyDATEDIFF(SECOND,startdatetime,enddatetime)desc
2.selectsum(DATEDIFF(SECOND,startdatetime,enddatetime))as总时长fromcallrecords1wheretelnumlike'0%'
3.selecttop3callernumber,sum(DATEDIFF(SECOND,startdatetime,enddatetime))fromcallrecords1
Wheredatediff(month,startdatetime,'2010-07-01')=0
groupbycallernumber
orderbysum(DATEDIFF(SECOND,startdatetime,enddatetime))desc
4.selecttop3callernumber,COUNT(*)fromcallrecords1
Wheredatediff(month,startdatetime,'2010-07-01')=0
groupbycallernumber
orderbyCOUNT(*)desc
5.selectcallernumber,telnum,DATEDIFF(SECOND,startdatetime,enddatetime)fromCallRecords1
unionall
select'汇总',
CONVERT(nvarchar(20),
sum((
case
whentelnumlike'0%'thenDATEDIFF(SECOND,startdatetime,enddatetime)
else0
end
))
)as市话总时长,
sum(
(case
whentelnumnotlike'0%'thenDATEDIFF(SECOND,startdatetime,enddatetime)
else0
end
))as长途总时长
fromcallrecords1
索引index
1.全表扫描:
对数据进行检索(select)效率最差的是全表扫描,就是一条条的找。
2.索引相当于目录,如查字典用目录,提高查询效率。
select*fromcallrecords1whereCallerNumber='003'
3.经常在where中用到的字段,要建索引
4.索引多的话查询速度快,但比较占空间,插入更新删除要更新索引,因此速度慢。
5.即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换
表连接Join
Innerjoin、leftjoin、rightjoin
子查询
(select*fromt_orders)的结果也是一个表
Top,row_number()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL笔记 自动保存的 SQL 笔记 自动 保存